对于使用cmake 3.15或更高版本并且还将Ninja用作生成器的用户,我想将新的JOB_POOL参数设置为一些大的add_custom_command()块。对于其他用户,我希望我的add_custom_command()保持相同(没有JOB_POOL)。
在前面的步骤中,我检查版本和生成器并设置$ {JOB_POOLS},并且还设置了一个变量,以便应使用池的用户可以看到(类似):
出于历史原因,尽管@Tsyvarev,我还是将其留在这里 指出这是我问题的根源! 此处不需要双引号!
set(USE_POOL "JOB_POOL pool_A")
不使用池的用户将不会设置该变量。
现在如何在我的自定义命令中利用该变量...?
1。)生成器表达式不起作用,仅包含前一行的文本...
add_custom_command(
...
$<USE_POOL>
)
2。)我似乎不能简单地将变量放置在命令中,而是仅在前一行中包含变量内容。例如,将$ {JOB_POOL}设置为字符串“ JOB_POOL pool_A”时,此代码...
出于历史原因,尽管@Tsyvarev,我还是将其留在这里 指出这是我问题的根源! 不要使用STRING!没有双引号!
add_custom_command(
OUTPUT foo
DEPENDS bar
# Comment line here...
${USE_POOL}
COMMAND
${CMAKE_COMMAND} -E ...
)
给出此错误...
ninja: error: '../path/to/src/dir/JOB_POOL pool_A', needed by 'path/to/src/dir/foo', missing and no known rule to make it
它只是认为$ {JOB_POOL}字符串是另一个依赖项!
3。)我不能使用add_custom_command()的“ APPEND”功能。只是被忽略了...
if (${USE_POOL})
add_custom_command(
...
APPEND
JOB_POOL pool_A
)
endif()
似乎唯一可行的方法是在我的周围加上一个“如果” 整个命令,因为我不想重复太多代码,这冒犯了我的敏感性...
if(${USE_POOL})
add_custom_command(
...many lines...
JOB_POOL pool_A
)
else()
add_custom_command(
...many lines...
)
endif()
您有个更好的主意吗??
这是@tsyvarev的独立示例:
cmake_minimum_required(VERSION 3.15)
project foo
set_property(GLOBAL PROPERTY JOB_POOLS pool_A=2)
# For historical reasons, I leave this here, although @Tsyvarev
# points out that this is the source of my problem!
# Don't use a STRING! No double-quotes!
set(USE_POOL "JOB_POOL pool_A")
add_custom_command(
OUTPUT foo.out
DEPENDS foo.in
${USE_POOL}
COMMAND
${CMAKE_COMMAND} -E copy foo.in foo.out
COMMENT "Converting foo.in -> foo.out"
VERBATIM
)
add_custom_target(foo-out
DEPENDS foo.out
)
% cmake -GNinja .
% ninja foo-out
ninja: error: 'JOB_POOL pool_A', needed by 'foo.out', missing and no known rule to make it
它将字符串视为依赖项...如果将USE_POOL移至注释后,则将其视为注释的一部分...如果将其移至命令后,则将其视为命令的一部分...
答案 0 :(得分:1)
您的JOB_POOL
选项供用户选择。您可以创建另一个变量,该变量包含add_custom_command
的相关参数序列:
if(JOB_POOL)
set(JOB_POOL_PARAMS JOB_POOL pool_A) # Will add 'JOB_POOL pool_A' sequence of params
else()
set(JOB_POOL_PARAMS) # Will add nothing
endif()
然后直接在add_custom_command
调用中使用新变量:
add_custom_command(
...
${JOB_POOL_PARAMS} # Will expand to additional parameters when needed
)