cmake 3.15将作业JOB_POOL添加到add_custom_command SOMETIMES

时间:2019-09-11 21:11:28

标签: cmake

对于使用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移至注释后,则将其视为注释的一部分...如果将其移至命令后,则将其视为命令的一部分...

1 个答案:

答案 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
)