どのビルドツールが使用されていても、どういうわけか並列ビルドが可能ですか?
Unixではmake -jN
を追加できます(Nはスレッドの数です)。WindowsではCXX_FLAG "/MP"
に追加し、Visual Studioで並列ビルドに使用します...(?) CMakeを実行したときにCMAKE_MAKE_PROGRAM
が常に拡張されないようなバージョン
一般的な解決策は何ですか?
私はこれを思いつきました:
# Add some multithreaded build support
MARK_AS_ADVANCED(MULTITHREADED_BUILD)
set(MULTITHREADED_BUILD 12 CACHE STRING "How many threads are used to build the project")
if(MULTITHREADED_BUILD)
if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
message(STATUS ${CMAKE_BUILD_TOOL})
set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j${MULTITHREADED_BUILD}")
message(STATUS "Added arguments to CMAKE_BUILD_TOOL: ${CMAKE_MAKE_PROGRAM}")
elseif(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
message(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
endif()
endif()
CMake 3.12ではこれが可能です。リリースノートから:
「cmake(1)」ビルドツールモード(「cmake –build」)には、並列ビルドレベルを指定するための「– parallel []」および「-j []」オプションが追加されました。これらは、ネイティブビルドツールの対応するオプションにマップします。
dkgで述べたように 、環境変数CMAKE_BUILD_PARALLEL_LEVEL
。
CMakeのドキュメントへのリンク:
CMake v2.8.8以降をお持ちの場合、 GNUmake
の代わりに Ninja を使用できます:
mkdir build
cd build
cmake -G Ninja ..
ninja # Parallel build (no need -j12)
または
mkdir build
cd build
cmake -G Ninja ..
cmake --build . # Parallel build using Ninja
ご覧のとおり、CMAKE_MAKE_PROGRAM
を使用する必要はありません。ビルドはデフォルトで並行して実行され、利用可能なCPUコアに応じてジョブ数が最適化されます。
Ninjaは、起動フェーズを高速化するための低レベルJSON構成に基づいています。したがって、そのJSON構成は手作業で書くのは簡単ではなく、常に高レベルのツール/ IDEを使用して生成します。
C++ビルドは多くのメモリを必要とすることが多いため、コンピューターはCPUコアの数と同じ量のメモリを提供する必要があります。
このクロスプラットフォームを行うことはできません。 -jNオプションはmakeのパラメーターであり、生成されるMakefileの一部ではありません。ただし、CMakeで-jNを使用してプロジェクトのmakeを実行するBashスクリプトを生成することもできます(スクリプトは使用しているコアの数を検索します)。
私はparallelmake.sh
のスクリプトUnix Makefiles
ベースのジェネレータ。これはここで行われます: https://github.com/gabyx/ApproxMVBB
CMakeファイルの関連部分:
https://github.com/gabyx/ApproxMVBB/blob/master/CMakeLists.txt#L89
# Add some multithreaded build support =====================================================================================================
MARK_AS_ADVANCED(MULTITHREADED_BUILD)
SET(MULTITHREADED_BUILD ON CACHE BOOL "Parallel build with as many threads as possible!")
if(MULTITHREADED_BUILD)
if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
file(COPY ${ApproxMVBB_ROOT_DIR}/cmake/parallelmake.sh DESTINATION ${PROJECT_BINARY_DIR}
FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
NO_SOURCE_PERMISSIONS
)
SET(CMAKE_MAKE_PROGRAM "${PROJECT_BINARY_DIR}/parallelmake.sh")
MESSAGE(STATUS "Set make program to ${PROJECT_BINARY_DIR}/parallelmake.sh")
elseif(MSVC)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" "/MP")
MESSAGE(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
endif()
endif()
# ========================================================================================================================================