【发布时间】:2019-09-11 21:11:28
【问题描述】:
对于使用 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 指出这是我问题的根源! 不要使用字符串!没有双引号!
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 移动到注释之后,它认为它是注释的一部分...如果我将它移动到命令之后,它认为它是命令的一部分...
【问题讨论】:
标签: cmake cmake-custom-command