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
)