2012-11-27 21 views
7

gibi bir şey arasındaki cmake farkı, nedir:

set(any_new_var ${old_var}) 

ve

set(any_new_var "${old_var}") 

Herhangi önemli bir farkla? Bir veya diğer formu ne zaman kullanmalıyım?

Örneğin, (nedeniyle, 'a' tanımlanmamıştır) aşağıdaki test mini

# test.cmake 

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

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

bu mini testin çıkışı (cmake -P test.cmake) boş bir çizgi ile deneyin .

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

Neden ikinci durumda bunun atmaz ve hatayı ama boş bir satır: Ben ilk mesaj yorumsuz, cmake bir mesaj hatası atar?

+1

İleride başvurmak için kullanışlı bir sözdizimi açıklaması: http://www.cmake.org/Wiki/CMake/Language_Syntax – raek

+0

Bu sayfa için çok kullanışlıdır. Benim gibi yeni gelenler için bir ana referans :) –

cevap

8

CMake dizelerinde listeler olarak yorumlanabilir. Kural basittir: listeyi oluşturmak için dizeyi noktalı virgüllerle ayırın. Örneğin, one;two;three dize değeri, üç öğenin bir listesi olarak düşünülebilir: one, two ve three.

Bir komutu çağırmak için komut adını ve bazı sözcükleri parantez içinde yazarsınız. Ancak, bu sözcükler, numaralı komutunun bire bir şekilde aldıkları argümanlara karşılık gelmez. Her kelime sıfır veya daha fazla argüman haline gelir ve tüm argümanlar birlikte birleştirilir. Sözcük kullanılmadığı sürece, bir liste olarak ele alınır ve birden çok bağımsız değişkene genişletilir. Alıntı yapılan bir kelime her zaman tek bir argüman olur. Örneğin

, Xone;two;three için, Y boş zincirine bağlı bağlıdır ve Zfoo bağlı olduğunu varsayalım. Aşağıdaki komut çağırma iki kelime var, ama komuta dört argüman alır: asıllarla dönmek için

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

: kelimeleri alıntı olsaydı, komut üç argüman almış olacağı

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

soru: message komutu, çeşitli sayıda argüman alabilir. Tüm argümanlarını alır, bunları bir dizide birleştirir ve daha sonra bu dizeyi basar. Bilinmeyen bir nedenden ötürü, sıfır argümanları kabul etmez. Onunla tek alıntı argüman kullanma eğiliminde yüzden

message birden argümanlarla vardır davranış, çok kullanışlı değildir: set birden fazla argüman aldığında Ayrıca

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

, bu ayrılmış argümanlar bir dizi oluşturur noktalı virgülle. Değişken daha sonra bu dizeye ayarlanır.

+0

$ {...} sözdiziminin dize yer değiştirme anlamına geldiği ve hemen hemen her yerde kullanılabileceğine dikkat etmeliyim (ve hatta yuva yapabilir!).CMake, ağır dize odaklı bir dildir. – raek