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

这会导致语法错误。

我曾试图用\逃避;但无济于事。

我应该怎么办?

4

2 回答 2

16

从 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,不需要使用单独的参数 VERBATIM 参数。

于 2013-09-14T18:36:48.133 回答
0

CMake 使用分号管理列表,所以我认为没有比仅将消息写入文件和git tag -F file

于 2012-07-23T05:22:48.847 回答