我可以告诉CMake一个特定的目标和它的依赖项不应该并行构建吗?

t2a7ltrp  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(128)

我有一个子模块(用add_subdirectory添加的),它有一个应该用-j1构建的目标。我能改变CMakeLists.txt以确保它总是这样构建吗?我目前的解决方法是在构建使用它的目标之前单独构建这个目标。

q8l4jmvw

q8l4jmvw1#

Ninja only:可用池的列表。
池是一个命名的整数属性,它定义分配给池的规则可以启动的并发作业的最大数量。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开发团队进行讨论。
免责声明:我从来没有真正尝试过这个,我不知道它是否工作。

相关问题