2017-10-20 61 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\")" 

參考