CMake:如何在ADD_CUSTOM_TARGET中输出分号(;)作为命令选项

时间:2012-07-21 14:52:54

标签: cmake

假设我有以下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 个答案:

答案 0 :(得分:12)

自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}
)

请注意,使用separate_arguments不需要add_custom_command的VERBATIM参数。

答案 1 :(得分:0)

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

更好的方法了