【问题标题】:CMake variable with semicolons带分号的 CMake 变量
【发布时间】:2020-06-09 17:43:03
【问题描述】:

假设有一个程序需要以<prog> --param "one;two;three" 的形式输入:标志--param 后跟一个由分号分隔的单词字符串(用引号括起来)。例如,可以使用以下 Bash 脚本:

flag=${1}
items=(${2//;/ })

echo "flag: ${flag}"
echo "items: ${items[@]}"

显然,输出将是:

flag: --param
items: one two three

分隔符;是必须的,因此我们需要传递一个用引号括起来的字符串,否则shell会将分号之间的内容视为单独的命令。

这个问题有点类似于this one,但那里提出的答案不适用于以下问题。

考虑这个CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.16.2)
project(clumsy)

add_custom_command(OUTPUT foo.txt
    COMMAND bash ${CMAKE_SOURCE_DIR}/script.sh --param "one;two;three" &>> foo.txt
    WORKING_DIRECTORY ${CMAKE_BUILD_DIR}
    VERBATIM
)
add_custom_target(foo DEPENDS foo.txt)

set(PARAMS "one;two;three")
add_custom_command(OUTPUT bar.txt
    COMMAND bash ${CMAKE_SOURCE_DIR}/script.sh --param "${PARAMS}" &>> bar.txt
    WORKING_DIRECTORY ${CMAKE_BUILD_DIR}
    VERBATIM
)
add_custom_target(bar DEPENDS bar.txt)

配置后运行make foo按预期工作:

[100%] Generating foo.txt
flag: --param
items: one two three  <----
[100%] Built target foo

但是make bar 导致错误的输出,因为变量PARAMS 被扩展为列表并且实际输入是--param one two three 而不是--param "one;two;three"

[100%] Generating bar.txt
flag: --param
items: one  <----
[100%] Built target bar

如何使用变量PARAMS 并且仍然使外部命令的输入包含两个参数

更新

我使用涉及&amp; 的输出重定向(如&amp;&gt;&gt;)使CMakeLists.txt 的代码更加复杂,这与使用VERBATIM 标志冲突,这对于使变量引用工作很重要。

【问题讨论】:

  • 唯一真正使foo 起作用的是VERBATIM 选项,如果没有它,它也会由于列表扩展而分崩离析。
  • 所以你想要--param "${PARAMS}"?哦,我明白了。你想按字面意思传递;
  • 是的,我想按原样传递;。也就是说,取消了列表扩展。
  • 所以引用它。 "${PARAMS}"
  • 不,我在问题中提到了这一点。

标签: cmake cmake-language


【解决方案1】:

在思考了为什么变量用法与字面用法(用于定义变量)不同之后,我决定发布此答案以说明问题。

正如@KamilCuk 所建议的,使用带引号的变量--params "${PARAMS}" 有效,但 如果VERBATIM 选项也被使用。在大多数情况下,这不是问题,但由于 CMake 缺乏将输出重定向到文件的支持,因此无法在 VERBATIM 模式下使用 &amp;&gt;&gt;(它被引号包围)。

因此,add_custom_command 中似乎不可能有重定向和非扩展变量,您可能只有其中任何一个。

【讨论】:

    【解决方案2】:

    我可能误解了这个问题,但是您尝试过escaping 吗?例如,--param "one\;two\;three"。如果是${PARAMS},则必须将; 替换为\;

    【讨论】:

      猜你喜欢
      • 2012-11-05
      • 2021-04-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 2022-01-20
      • 2022-11-16
      • 2022-07-14
      • 2016-09-27
      相关资源
      最近更新 更多