2017-10-20 63 views
0

我想补充一个CMake的目标其中,发时,将触发以下内容:在cmake命令中使用子壳体或管道?

rm $(find "${CMAKE_SOURCE_DIR}" -name "*.rej" -or -name "*.orig") 

我尝试这样做:

add_custom_target(pclean 
    COMMAND bash -c "rm $(find \"${CMAKE_SOURCE_DIR}\" -name \"*.rej\" -or -name \"*.orig\")") 

这:

​​

但既不工程。我应该如何做到这一点?我应该使用类似add_custom_command

注意:这里的问题不是引号。因此,如果我使用:

add_custom_target(pclean 
    COMMAND bash -c "find "${CMAKE_SOURCE_DIR}" -name \"*.rej\" -or -name \"*.orig\"") 

我得到的*.orig*.rej文件列表。

+0

@Florian:引号不是问题。 – einpoklum

+0

你可以使用'ADDITIONAL_MAKE_CLEAN_FILES'属性吗? 例如'SET(addfiles foo bar) set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES“$ {addfiles}”)'要获取要删除的文件列表,可以使用'file(GLOB ...)'命令。 – vre

+0

@vre:我不知道这件事...会考虑它。 ...哦,等等,这不会导致'make clean'去除这些文件吗?我不希望这种情况发生。 – einpoklum

回答

0

这是一个不完整的答案。

看来我们面临的问题是,COMMAND后的参数被三次解释:

  • 首先由CMake的,
  • 然后通过GNU制作,
  • 然后最后由壳。

当它只是最后一个 - 你只需要逃跑的水珠字符*

find some/where -name \*.rej -or -name \*.orig | xargs rm 

时很Makefile,你需要的东西,如:

bash -c "find some/where -name \\*.rej -or -name \\*.orig | xargs rm" 

最后,在CMake命令中,您需要另一个级别的转义,所以您需要:

add_custom_target(pclean 
    COMMAND bash -c "find \"${CMAKE_SOURCE_DIR}\" -name \\\\*.rej -or -name \\\\*.orig \\| xargs rm") 

但是,我还没有设法让命令工作,其中也设置,然后使用shell变量 - 总是弄乱了。因此,在我的问题中,第二个变体没有运气,或者在find命令后使用| while read f; do rm "$f"; done。 PS:正如评论者所指出的,很显然,find命令本身也可以删除这些文件(使用-exec或)。

+0

转义和反斜杠部分听起来像你只需要在'add_custom_target()'调用中添加'VERBATIM'。 – Florian

+0

@弗洛里安:你能把它发展成一个答案吗? – einpoklum

0

谈到我的意见为答案

我可以重现你的问题,并添加VERBATIM关键字到add_custom_target()并解决它。

下面做工作:

cmake_minimum_required(VERSION 2.6) 

project(SubShell NONE) 

add_custom_target(
    pclean 
    COMMAND bash -c "rm $(find \"${CMAKE_SOURCE_DIR}\" -name \"*.rej\" -or -name \"*.orig\")" 
    VERBATIM 
) 

如果你开始在你的自定义命令“逃逸”的东西,这是一个提示你应该使用VERBATIM

所有参数的命令将被转义正确地为构建工具,以便调用的命令接收每个参数不变。请注意,在add_custom_target甚至可以看到参数之前,CMake语言处理器仍然使用一级转义。

所生成makefile的提取物没有VERBATIM

CMakeFiles/pclean: 
    bash -c rm\ $(find\ "/mnt/c/temp/StackOverflow/SubShell"\ -name\ "*.rej"\ -or\ -name\ "*.orig") 

并用VERBATIM

CMakeFiles/pclean: 
    bash -c "rm \$$(find \"/mnt/c/temp/StackOverflow/SubShell\" -name \"*.rej\" -or -name \"*.orig\")" 

参考