如何在 cmake 中使用多值参数,以便它在 echo 命令中打印为一个字符串?

问题描述 投票:0回答:1

我有一个函数,它接受一个参数列表,我想将这些参数传递给目标中的函数。仅当我尝试使用该多值参数时,它才会将第二个和更多参数放在下一行上,而不是全部放在以空格分隔的一行上。

这是我的函数的最小版本。将其保存在名为

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

我需要做什么才能将列表用作字符串,而不是像上面那样以多行结尾?

list function cmake arguments
1个回答
0
投票

发现从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..."
)

现在我得到一行,并且“完成...”按预期打印在输出中。

© www.soinside.com 2019 - 2024. All rights reserved.