2012-11-27 60 views
7

Qual è la differenza, in CMake, tra qualcosa di simile:

set(any_new_var ${old_var}) 

e

set(any_new_var "${old_var}") 

Qualsiasi differenza importante? Quando devo usare l'una o l'altra forma?

Ad esempio, provo con successiva mini prova

# test.cmake 

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

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

L'uscita di questo mini-test (cmake -P test.cmake) è una linea vuota (perché 'un' non è definito) . Se io Rimuovere il commento il primo messaggio, CMake genera un messaggio di errore:

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

Perché nel secondo caso esso non gettare e l'errore, ma una riga vuota?

+1

Una descrizione della sintassi utile per riferimento futuro: http://www.cmake.org/Wiki/CMake/Language_Syntax – raek

+0

Molto utile quella pagina. Un riferimento principale per i neofiti come me :) –

risposta

8

In CMake le stringhe possono essere interpretate come elenchi. La regola è semplice: per formare la lista dividi la stringa al punto e virgola. Ad esempio, il valore di stringa one;two;three può essere considerato come un elenco di tre elementi: one, two e three.

Per richiamare un comando si scrive il nome del comando e alcune parole tra parentesi. Tuttavia, queste parole fanno non corrispondono agli argomenti che il comando riceve in modo one-to-one. Ogni parola diventa zero o più argomenti e tutti gli argomenti vengono concatenati insieme. A meno che non venga citata una parola, viene considerata come un elenco ed estesa a più argomenti. Una parola quotata diventa sempre un singolo argomento.

Ad esempio, supponiamo che X è destinata a one;two;three, Y è legato alla stringa vuota, e Z è destinato a foo. Il comando seguente invocazione ha tre parole, ma il comando riceve quattro argomenti:

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

Se avessimo citato le parole, il comando avrebbe ricevuto tre argomenti:

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

Per tornare alla originale domanda: il comando message può ricevere un numero variabile di argomenti. Prende tutti i suoi argomenti, li concatena insieme in una stringa e quindi stampa quella stringa. Per qualche ragione sconosciuta, tuttavia, non accetta argomenti zero.

Il comportamento message ha con più argomenti non è molto utile, quindi si tende ad utilizzare un unico argomento citato con esso:

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

Inoltre, quando set riceve più argomenti si costruisce una serie di argomenti separati con punto e virgola. La variabile viene quindi impostata su quella stringa.

+0

Dovrei notare che la sintassi $ {...} significa sostituzione di stringa e può essere utilizzata quasi ovunque (e può persino annidare!).CMake è un linguaggio fortemente orientato alle stringhe. – raek