【发布时间】: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 并且仍然使外部命令的输入包含两个参数?
更新
我使用涉及& 的输出重定向(如&>>)使CMakeLists.txt 的代码更加复杂,这与使用VERBATIM 标志冲突,这对于使变量引用工作很重要。
【问题讨论】:
-
唯一真正使
foo起作用的是VERBATIM选项,如果没有它,它也会由于列表扩展而分崩离析。 -
所以你想要
--param "${PARAMS}"?哦,我明白了。你想按字面意思传递;。 -
是的,我想按原样传递
;。也就是说,取消了列表扩展。 -
所以引用它。
"${PARAMS}" -
不,我在问题中提到了这一点。
标签: cmake cmake-language