Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cmake中的并行命令_Cmake - Fatal编程技术网

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文件,如下所示:

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>