2012-05-21 74 views
30

是它在某種程度上可能能夠有一個並行構建無論哪個構建工具使用?如何在CMake中配置可移植並行版本?

在Unix系統下,我們可以添加make -jN其中N是我加入CXX_FLAG "/MP"線程 和Windows下的號碼,然後在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() 
+1

不蘇無論如何,不​​要認爲它是一個好主意。 CMake描述了這個項目是如何構建的,以及它如何與CMake完全不同。 – Lap

+0

只需將'-DMULTIREREEDED_BUILD = 12'添加到cmake的命令行即可。並刪除了'set(MULTITHREADED_BUILD ...)' – bikram990

+0

在我的情況與Eclipse CDT導致錯誤: 「在/ usr/bin中/讓-j8」 所有 不能運行程序 「的/ usr/bin中/讓-j8」:未知原因 錯誤:計劃 「在/ usr/bin中/讓-j8」 不是在PATH –

回答

10

如果你有cmake v2.8.8或更高版本,你可以使用ninjaGNU make

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 

ninja默認使用所有可用的內核,並優化IO訪問。但是,它的JSON配置不容易手工編寫,我始終使用高級工具生成它,如cmake。 (ninja是一個低級構建系統。)

Qt Creator v2.6(也許其他IDE)可以使用忍者。因此,不需要CMAKE_MAKE_PROGRAM,構建是並行運行的。

http://clausklein.github.io/ninja/參見在MS-Windows(MinGW的/ MSYS/Cygwin的)搬運。

4

你不能這樣做跨平臺的。 -jN選項是要生成的參數,而不是生成的Makefile的一部分。但是,您可以讓CMake使用-jN(其中腳本查找您擁有的核心數)生成一個運行make的bash腳本。

+4

對於Visual Studio:'的MSBuild your_project.sln/maxcpucount:N' –

+2

@JeanDavy:你甚至可以通過調用'cmake的--build通過使用CMake的構建工具此參數。 -/maxcpucount:8',因爲CMake將「empty」 - - 後的所有參數傳遞給構建工具。 –

+0

@RolandSarrazin是的,我現在的腳本是'cmake --build。 --target install --config release -/m',它似乎可以在所有內核上運行。感謝[本次討論](https://cmake.org/pipermail/cmake/2011-November/047784.html)。我也建議不要指定確切的數字,在這種情況下,MSBuild會認爲構建必須在所有可用內核上執行,但不能超過現有內核。 –

3

由於這個職位已經有點老了,

我的方法,我落戶到正在寫一個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() 
# ========================================================================================================================================