CMake:如何将分号(;)作为ADD_CUSTOM_TARGET命令选项进行输出

13

假设我有以下的CMake片段:

MACRO(ADD_CUSTOM_TARGET_COMMAND tag OUTPUT file)
     ADD_CUSTOM_TARGET(tag
        ${ARGN}
     )

     ADD_CUSTOM_TARGET(OUTPUT file
        ${ARGN}
     )
ENDMACRO()

ADD_CUSTOM_TARGET_COMMAND(tag
    OUTPUT file
    COMMAND git tag -a -m "${msg}" 1.0.0 HEAD
    VERBATIM
)
如果msg包含分号,例如"msg1;msg2",那么实际的命令将被扩展为:
git -a -m "msg1" "msg2" 1.0.0. HEAD

这会导致语法错误。

我尝试使用 \ 来转义 ;,但是没有成功。

我该怎么办?

2个回答

17
自2.8.11版本以来有一个特殊的标记:$<SEMICOLON> (http://www.cmake.org/cmake/help/v2.8.11/cmake.html#command:add_custom_command)。 我举例说明如何在find命令中使用它:
find /path/to/search -name some\*name \! -path excluded\*Pattern -exec ln -sf "{}" \;

以下是方法:

set(
    FIND_ARGUMENTS
    "${SEARCH_PATH} -name some\\*name \\! -path exclued\\*Pattern -exec ln -sf {} \\$<SEMICOLON>"
)

separate_arguments(FIND_ARGUMENTS)

add_custom_command(TARGET ${PROJECT}
    POST_BUILD
    COMMAND "find" ${FIND_ARGUMENTS}
    WORKING_DIRECTORY ${WORKING_PATH}
)

请注意,对于add_custom_command,使用separate_arguments VERBATIM参数是不必要的。


0

CMake使用半角分号管理列表,因此我认为没有比将消息写入文件并git tag -F file更好的方法。


真的。 :-) 但我想知道更通用的解决方案。 - Ding-Yi Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接