web-dev-qa-db-ja.com

CMakeでポータブルパラレルビルドを構成するにはどうすればよいですか?

どのビルドツールが使用されていても、どういうわけか並列ビルドが可能ですか?

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()
39
Gabriel

CMake 3.12ではこれが可能です。リリースノートから:

「cmake(1)」ビルドツールモード(「cmake –build」)には、並列ビルドレベルを指定するための「– parallel []」および「-j []」オプションが追加されました。これらは、ネイティブビルドツールの対応するオプションにマップします。

dkgで述べたように 、環境変数CMAKE_BUILD_PARALLEL_LEVEL

CMakeのドキュメントへのリンク:

24
usr1234567

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コアの数と同じ量のメモリを提供する必要があります。

11
olibre

このクロスプラットフォームを行うことはできません。 -jNオプションはmakeのパラメーターであり、生成されるMakefileの一部ではありません。ただし、CMakeで-jNを使用してプロジェクトのmakeを実行するBashスクリプトを生成することもできます(スクリプトは使用しているコアの数を検索します)。

3
bossbarber

私は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()
# ========================================================================================================================================
2
Gabriel