2012-07-21 39 views
7

假设我有以下CMake的片段:CMake的:如何输出分号(;)在ADD_CUSTOM_TARGET命令选项

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 

这会导致语法错误。

我试图用\来逃脱;但无济于事。

我该怎么办?

回答

11

有一个特殊的记号,因为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逐字参数。

0

CMake的管理使用分号名单,所以我看不出有什么更好的办法不是仅仅写文件的消息和git tag -F file

+0

是的。 :-)但我想知道更通用的解决方案。 – 2012-07-23 07:04:02

相关问题