我有一个函数,它接受一个参数列表,我想将这些参数传递给目标中的函数。仅当我尝试使用该多值参数时,它才会将第二个和更多参数放在下一行上,而不是全部放在以空格分隔的一行上。
这是我的函数的最小版本。将其保存在名为
CMakeLists.txt
. 的文件中
cmake_minimum_required(VERSION 3.22.1)
function(MyFunc)
set(options VERBOSE)
set(oneValueArgs PROJECT_NAME)
set(multiValueArgs PROJECT_ARGS)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
project(${ARG_PROJECT_NAME})
add_custom_command(
OUTPUT sample
COMMAND echo "starting..."
COMMAND echo "ARG_PROJECT_ARGS = [${ARG_PROJECT_ARGS}]"
COMMAND echo "done..."
)
add_custom_target(${PROJECT_NAME} DEPENDS sample)
endfunction()
MyFunc(
PROJECT_NAME testing
PROJECT_ARGS
--some additional
--parameters here
--to-test)
要生成,请使用:
cmake .
要运行结果,请使用:
make testing
输出正确的第一个参数,但以下参数位于下一行并解释为命令,而不仅仅是
echo ...
字符串中的参数。
[100%] 生成样本
开始...
ARG_PROJECT_ARGS = [--一些
/bin/sh: 1: 附加: 未找到
/bin/sh: 1: --参数:未找到
/bin/sh: 1: 此处:未找到
/bin/sh: 1: --to-test]: 未找到
make[3]: *** [CMakeFiles/testing.dir/build.make:74: 示例] 错误 127
make[2]: *** [CMakeFiles/Makefile2:83: CMakeFiles/testing.dir/all] 错误 2
make[1]: *** [CMakeFiles/Makefile2:90: CMakeFiles/testing.dir/rule] 错误 2
make: *** [Makefile:124: 测试] 错误 2
我需要做什么才能将列表用作字符串,而不是像上面那样以多行结尾?
发现从cmake 3.12开始我们可以像这样使用list JOIN命令:
list(JOIN <list-var-name> <separator> <output-var-name)
因此,在上面,我可以在
add_custom_target()
之前使用它,并将变量名称替换为输出:
list(JOIN ARG_PROJECT_ARGS " " ARGUMENTS)
add_custom_command(
OUTPUT sample
COMMAND echo "starting..."
COMMAND echo "ARG_PROJECT_ARGS -> ARGUMENTS = [${ARGUMENTS}]"
COMMAND echo "done..."
)
现在我得到一行,并且“完成...”按预期打印在输出中。