cmake 3.15 有时将 JOB_POOL 添加到 add_custom_command
cmake 3.15 adding JOB_POOL to add_custom_command SOMETIMES
对于使用 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"
整个命令,这冒犯了我的敏感性,因为我不喜欢重复这么多代码...
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 移到注释之后,它会认为它是注释的一部分...如果我将它移到命令之后,它认为它是命令的一部分...
您的JOB_POOL
选项供用户选择。您可以创建另一个变量,其中包含 相关参数序列 for 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
调用中直接使用new变量:
add_custom_command(
...
${JOB_POOL_PARAMS} # Will expand to additional parameters when needed
)
对于使用 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" 整个命令,这冒犯了我的敏感性,因为我不喜欢重复这么多代码...
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 移到注释之后,它会认为它是注释的一部分...如果我将它移到命令之后,它认为它是命令的一部分...
您的JOB_POOL
选项供用户选择。您可以创建另一个变量,其中包含 相关参数序列 for 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
调用中直接使用new变量:
add_custom_command(
...
${JOB_POOL_PARAMS} # Will expand to additional parameters when needed
)