2012-05-21 58 views
30

どのビルドツールが使用されていても、何とか並列ビルドが可能ですか? UNIXでCMakeで移植可能な並列ビルドを設定するには?

Nは、私はその後、構築平行するには、Visual Studioで使用されているCXX_FLAG "/MP"に追加スレッド とWindowsの下で多数のどこ我々はmake -jNを追加することができますか...? 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() 
+1

ないのsuとにかくその良いアイデアを考えないでください。 CMakeは、プロジェクトがどのようにビルドされ、どのようにmakeがCMakeとは異なるレベルにあるのかを記述します。 – Lap

+0

あなたのアプローチを抜けて、 '-DMULTITHREADED_BUILD = 12'をcmakeのコマンドラインに追加するだけです。 "SET(MULTITHADED_BUILD ...)"を削除してください – bikram990

+0

私の場合Eclipse CDTの結果でエラーが発生します: "/ usr/bin/make -j8" "/ usr/bin/make -j8"プログラムを実行できません:不明理由 エラー: "/ usr/bin/make -j8"というプログラムがPATHに見つかりません –

答えて

10

、あなたは

mkdir build 
cd build 
cmake -G Ninja .. 
cmake --build . # Parallel build using ninja 

ninjaは、デフォルトですべての利用可能なコアを使用し、IOアクセスを最適化しGNU make

mkdir build 
cd build 
cmake -G Ninja .. 
ninja    # Parallel build (no need -j12) 

または

の代替として ninjaを使用することができます。しかし、JSONの設定は手で書くのは簡単ではなく、私は常に cmakeという高水準のツールを使ってそれを生成します。 ( ninjaは下位レベルのビルドシステムです)

Qt Creator v2.6(そして多分他のIDE)でも忍者を使用できます。したがって、CMAKE_MAKE_PROGRAMを必要とせずに、ビルドは並行して実行されます。

MS-Windows(MinGW/MSYS/Cygwin)の移植についてはhttp://clausklein.github.io/ninja/も参照してください。

4

あなたはこのクロスプラットフォームを行うことはできません。 -jNオプションは生成するパラメータであり、生成されたMakefileの一部ではありません。しかし、CMakeが-jN(あなたが持っているコアの数を調べるスクリプト)を使ってプロジェクトのmakeを実行するbashスクリプトを生成することができます。あなたがcmake v2.8.8以上をお持ちの場合は

+4

Visual Studioの場合: 'msbuild your_project.sln/maxcpucount:N' –

+2

@JeanDavy:このパラメータは、' cmake --build 'を呼び出してCMakeビルドツールを使って渡すこともできます。 -/maxcpucount:8' CMakeはビルドツールに "空"の '--'に続くすべてのパラメータを渡します。 –

+0

@RolandSarrazinええ、私の現在のスクリプトは 'cmake --buildです。 --target install --config release -/m'を実行すると、すべてのコアで動作しているようです。 [このディスカッション](https://cmake.org/pipermail/cmake/2011-November/047784.html)に感謝します。また、正確な数値を指定しないことをお勧めします。この場合、MSBuildは使用可能なすべてのコアでビルドを実行する必要があると考えますが、それ以上は存在しません。 –

3

このポストはすでに少し古いですとおり:

私のアプローチ私はこれがここで行われUnix Makefilesベースジェネレータ ためparallelmake.shスクリプトを書いているに落ち着いています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() 
# ======================================================================================================================================== 
関連する問題