2012-11-27 12 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 -पी test.cmake) एक खाली पंक्ति है के साथ प्रयास करें (क्योंकि 'एक' परिभाषित नहीं है) ।

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

दूसरे मामले में ऐसा क्यों है फेंक नहीं है और त्रुटि लेकिन एक खाली पंक्ति: यदि मैं पहले संदेश uncomment, cmake एक संदेश त्रुटि फेंकता है?

+1

भविष्य के संदर्भ के लिए एक उपयोगी वाक्यविन्यास विवरण: http://www.cmake.org/Wiki/CMake/Language_Syntax – raek

+0

पृष्ठ का बहुत उपयोगी है। मेरे रूप में नए आने वालों के लिए एक मुख्य संदर्भ :) –

उत्तर

8

सीएमके तारों में सूचियों के रूप में व्याख्या की जा सकती है। नियम सरल है: सूची बनाने के लिए अर्धविरामों पर स्ट्रिंग को विभाजित करें। उदाहरण के लिए, स्ट्रिंग मान one;two;three को तीन तत्वों की सूची के रूप में माना जा सकता है: one, two, और three

कमांड का आह्वान करने के लिए आप कमांड नाम और कोष्ठक के बीच कुछ शब्द लिखते हैं। हालांकि, ये शब्द एक-एक-एक फैशन में प्राप्त आदेशों के अनुरूप हैं। प्रत्येक शब्द शून्य या अधिक तर्क बन जाता है, और सभी तर्क एक साथ मिलकर मिलते हैं। जब तक कोई शब्द उद्धृत नहीं किया जाता है, इसे एक सूची के रूप में माना जाता है और इसे कई तर्कों में विस्तारित किया जाता है। एक उद्धृत शब्द हमेशा एक तर्क बन जाता है।

उदाहरण के लिए, मान लेते हैं कि X बाध्य है one;two;three को, Y रिक्त स्ट्रिंग के लिए बाध्य है, और Zfoo के लिए बाध्य है। निम्न आदेश मंगलाचरण तीन शब्द है, लेकिन आदेश चार तर्क प्राप्त करता है:

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

मुझे ध्यान दिया जाना चाहिए कि $ {...} वाक्यविन्यास का मतलब स्ट्रिंग प्रतिस्थापन है और लगभग कहीं भी उपयोग किया जा सकता है (और यहां तक ​​कि घोंसला भी!)।सीएमके एक भारी स्ट्रिंग उन्मुख भाषा है। – raek