2012-11-27 113 views
7

的區別是什麼,在cmake的,像之間:

set(any_new_var ${old_var}) 

set(any_new_var "${old_var}") 

任何重要的區別?我何時使用其中一種或另一種形式?

例如,我嘗試與下一個小測試

# test.cmake 

# Variable 'a' isn't defined. 
set(hola "${a}") 

# message(${hola}) 
message("${hola}") 

這個小型試驗的輸出(cmake的-P test.cmake)是一個空行(因爲「a」沒有定義) 。如果我取消了第一條消息,cmake的拋出消息錯誤:

CMake Error at prueba.cmake:6 (message): 
    message called with incorrect number of arguments 

爲什麼在第二種情況下它不會引發和錯誤,但一個空行?

+1

一個有用的語法描述供將來參考:http://www.cmake.org/Wiki/CMake/Language_Syntax – raek

+0

非常有用的那個頁面。作爲newcommers的主要參考:) –

回答

8

CMake字符串可以解釋爲列表。規則很簡單:形成列表以分號分隔字符串。例如,字符串值one;two;three可以被認爲是三個元素的列表:one,twothree

要調用一個命令,你需要在括號中寫出命令名和一些單詞。然而,這些詞做而不是對應於命令以一對一方式接收的參數。每個單詞變成零個或多個參數,並將所有參數連接在一起。 除非一個單詞被引用,否則它被視爲一個列表並被擴展爲多個參數。引用的單詞總是成爲單個參數。

例如,假設X勢必one;two;threeY被綁定到空字符串,並且Z勢必foo。下面的命令調用有三個詞,但命令接收四個參數:

some_command(${X} ${Y} ${Z}) 
# The command receives four arguments: 
# 1. one 
# 2. two 
# 3. three 
# 4. foo 

如果我們將所引述的話,該命令會得到三個參數:

some_command("${X}" "${Y}" "${Z}") 
# The command receives three arguments: 
# 1. one;two;three 
# 2. (the empty list) 
# 3. foo 

要返回到原來的問題:message命令可以接收不同數量的參數。它接受所有參數,將它們連接成一個字符串,然後打印該字符串。不過,由於某種未知的原因,它不接受零參數。

行爲message有多個參數並不是非常有用的,所以你會使用它一個單引號的說法:

set(SOURCES foo.c hoo.h) 
message(${SOURCES}) # prints foo.cfoo.h 
message("${SOURCES}") # prints foo.c;foo.h 

此外,當set接收多個參數,它建立的分離參數字符串用分號分隔。該變量然後被設置爲該字符串。

+0

我應該注意的是,$ {...}語法意味着字符串替換,幾乎可以在任何地方使用(甚至可以嵌套!)。CMake是一種面向字符串的語言。 – raek