2016-11-16 83 views
1

我只是似乎無法圍繞CMake的逃生規則我的頭。鑑於:CMake的報價逃避connadrum

set(X A B C) 
add_custom_target(works COMMAND DUMMY=0 X="${X}" env | grep ^X= COMMENT "This works") 
add_custom_target(fails COMMAND X="${X}" env | grep ^X= COMMENT "This fails") 

意圖是執行命令X="A B C" env。自定義目標works正確構建命令,其中爲fails正確執行:

X=\"A B C\" env ... 

但是,爲什麼?

+1

可能重複的[cmake:何時引用變量?](http://stackoverflow.com/questions/35847655/cmake-when-to-quote-variables)嘗試'設置(X「ABC」)'不要'不要在'$ {X}'周圍加引號。 – Florian

+0

@Florian,'set(X「A B C」)'導致:'「X = \」A B C \「」env',這仍然是錯誤的。 – Ben

+0

我有完全相同的問題,'ExternalProject_Add_Step(COMMAND build --args =「my args」)'會執行'build --args = \「我的args \」'這是不正確的。如果我今晚找不到解決方案,我將開始賞金。 –

回答

0

其實你遇到了兩個問題:

  1. 不要引用CMake的變量自定義命令。 CMake會爲你做必要的轉義序列。
  2. COMMAND之後的第一個字面假定爲命令名或文件。所以CMake試圖把它作爲一個單獨的「字符串」處理。

所以我改變了報價和env呼叫,以下爲我所做的工作:

cmake_minimum_required(VERSION 2.8) 

project(QuotedStrings) 

set(X "A B C") 
add_custom_target(works COMMAND env DUMMY=0 X=${X} | grep ^X= COMMENT "This works") 
add_custom_target(fails_no_more COMMAND env X=${X} | grep ^X= COMMENT "This works too") 

欲瞭解更多細節和可能性看: