我有一个子模块(添加了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_COMPILE
和CMAKE_JOB_POOL_LINK
全局使用,或者通过设置目标属性JOB_POOL_COMPILE
和JOB_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开发团队进行讨论。
免责声明:我从来没有真正尝试过,我不知道它是否有效。