我是否可以告诉 CMake 特定目标及其依赖项不应并行构建?



我有一个子模块(添加了add_subdirectory(,它有一个应该用-j1构建的目标。我可以更改CMakeLists.txt以确保它始终以这种方式构建吗?我目前的解决方法是在构建使用它的目标之前单独构建这个目标

如果您使用Ninja,则可以使用JOB_POOL机制:

仅限忍者:可用池的列表。

池是一个命名的整数属性,它定义了分配给池的规则可以启动的最大并发作业数。JOB_POOLS属性是一个由分号分隔的对列表,使用语法NAME=integer(等号后面没有空格(。

例如:

set_property(GLOBAL PROPERTY JOB_POOLS two_jobs=2 ten_jobs=10)

定义的池可以通过设置CMAKE_JOB_POOL_COMPILECMAKE_JOB_POOL_LINK全局使用,或者通过设置目标属性JOB_POOL_COMPILEJOB_POOL_LINK按目标使用。自定义命令和自定义目标可以使用选项JOB_POOL指定池。使用未由JOB_POOLS定义的池会导致ninja在构建时出错。

如果未设置,此属性将使用CMAKE_JOB_POOLS变量的值。

CMake提供的用于个人交互使用的构建目标(如安装(会自动放置在控制台池中。

您需要执行以下操作:

set_property(GLOBAL APPEND PROPERTY JOB_POOLS "no_parallel=1")
set_property(TARGET your_target_name PROPERTY JOB_POOL_COMPILE "no_parallel")
get_property(target_deps TARGET your_target_name PROPERTY LINK_LIBRARIES)
set_target_propertes(${target_deps} PROPERTIES JOB_POOL "no_parallel")
unset(target_deps)

关于为依赖项设置它的部分——如果任何依赖项都在生成器表达式中,我不确定它是否有效。如果没有,您可以与CMake开发团队进行讨论。

免责声明:我从来没有真正尝试过,我不知道它是否有效。

最新更新