【问题标题】:cmake 3.15 adding JOB_POOL to add_custom_command SOMETIMEScmake 3.15 将 JOB_POOL 添加到 add_custom_command SOMETIMES
【发布时间】: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


    【解决方案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
    )
    

    【讨论】:

    • 对不起@Tsyvarev。当我尝试这种方法时(正如我试图在上面指出的那样),${JOB_POOL_PARAMS} 变量的内容与上面的行合并。如果它是命令,那么它是附加到命令的垃圾。如果它是一个依赖项,那么它就是一个没有人知道如何构建的垃圾。如果是评论,那么我的评论文本中会添加垃圾。我的观点是这种方法似乎是合理的如果我知道在它前面放什么。上面代码框中的“...”必须用什么代替?
    • "上面代码框中的“...”必须用什么代替?" - 与您问题中的代码相同。请显示您使用的 exact 命令。如果不查看它,很难说它有什么问题。还要确保您运行的 CMake 完全是 3.15 版本(并且已对应 cmake_minimum_required)。
    • 您将变量设置为"JOB_POOL pool_A",但查看我的代码:里面没有没有双引号,既没有设置变量,也没有使用它。跨度>
    • 谢谢!而已!我是最好的 bash 脚本,所以我总是被诸如“;”之类的东西烧伤出现,列表与字符串,我认为是“cmake”中的字符串,但不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多