cmake中的并行命令
我有一个(简化的)CMAKE文件,如下所示:cmake中的并行命令,cmake,Cmake,我有一个(简化的)CMAKE文件,如下所示: cmake_minimum_required( VERSION 3.6 ) function(BUILD_SIMULINK model) set(OUTPUT_FILE ${model}.dll) set(SOURCE_FILE ${model}.slx) set(EXECUTE_COMMAND matlab -nojvm -nodisplay -nodesktop -nosplash -wait -r "rtwb
cmake_minimum_required( VERSION 3.6 )
function(BUILD_SIMULINK model)
set(OUTPUT_FILE ${model}.dll)
set(SOURCE_FILE ${model}.slx)
set(EXECUTE_COMMAND
matlab -nojvm -nodisplay -nodesktop -nosplash -wait -r "rtwbuild(${model})"
)
add_custom_target(
${model} ALL
DEPENDS ${OUTPUT_FILE}
)
add_custom_command(
COMMAND ${EXECUTE_COMMAND}
DEPENDS ${SOURCE_FILE}
OUTPUT ${OUTPUT_FILE}
)
install( TARGETS ${OUTPUT_FILE}
DESTINATION lib
)
endfunction(BUILD_SIMULINK)
project(SimulinkBuild VERSION 1.0.0)
build_simulink( model1 )
build_simulink( model2 )
build_simulink( model3 )
...
build_simulink( modeln ) # Arbitrarily large number of models
我的问题是,执行一个干净的构建需要几个小时,因为我一次调用一个命令,一次只使用一个内核。我想并行构建我的文件,利用我机器上的多核我们如何实现从cmake执行并行命令?
当我构建时,我会这样做:
cmake ..
cmake --build . --target install
解决方案是如何调用cmake,而不是cmake文件本身的一部分
cmake ..
cmake --build . -- /m # Visual Studio
cmake --build . -- -j # Gnu make
添加了In-support,因此无论您使用的生成器是什么,您都可以通过以下方式启动并行构建(如果支持):
cmake——构建--目标安装-j
但是对于cmake的早期版本,在-之后的任何参数都会传递给正在使用的构建系统。因此,对于makefile:
cmake --build . --target install -- -j <number of threads>
cmake——构建--目标安装--j
或对于msvc版本:
cmake --build . --target install -- /m <number of threads>
cmake——构建--目标安装--/m
Build完全由Build工具控制,您可以根据该工具配置CMake项目。因此,这取决于构建工具是否支持并行构建。例如,make
在这种情况下有-j
选项。我也使用cmake--build
来调用build。我想我只是通过了cmake--build--使用make时的目标安装--j4
。但是,我现在正在使用VisualStudio来测试这一点,这需要在命令行选项中使用/MP
指令。我希望有一种独立于工具的方法来实现这两种功能。Visual Studio(生成器)的可能副本似乎不支持这些选项之一。最接近的是MSVC支持一个/MP
开关,但我没有使用MSVC,我在执行我自己的命令,所以这不起作用。不过,我错了。你真是个天才!解决方案是运行:cmake--build--目标安装--/m
用于visual studio和cmake--build--目标安装--j
用于make/ninja。这解决了我的问题。尽管有一个独立于生成器的解决方案还是不错的。只是想提示在并行执行依赖于同一库的目标时要注意竞争条件。
cmake --build . --target install -- /m <number of threads>