cmake
चर और गुण
खोज…
परिचय
बुनियादी सीएमके चर की सादगी पूर्ण चर वाक्यविन्यास की जटिलता को स्वीकार करती है। यह पृष्ठ विभिन्न चर मामलों का उदाहरण देता है, उदाहरण के लिए, और बचने के लिए नुकसान बताते हैं।
वाक्य - विन्यास
- सेट (variable_name मान [CACHE प्रकार विवरण [बलपूर्वक]])
टिप्पणियों
चर नाम केस-संवेदी होते हैं। उनके मूल्य प्रकार स्ट्रिंग के हैं। एक चर के मान को संदर्भित किया जाता है:
${variable_name}
और एक उद्धृत तर्क के अंदर मूल्यांकन किया जाता है
"${variable_name}/directory"
कैश्ड (ग्लोबल) वेरिएबल
set(my_global_string "a string value"
CACHE STRING "a description about the string variable")
set(my_global_bool TRUE
CACHE BOOL "a description on the boolean cache entry")
यदि कैशेड वैरिएबल कैश में पहले से ही परिभाषित है, जब सीएमके संबंधित लाइन (जैसे सीएमके फिर से शुरू होता है) को संसाधित करता है, तो इसे परिवर्तित नहीं किया जाता है। डिफ़ॉल्ट को अधिलेखित करने के लिए, अंतिम तर्क के रूप में FORCE
जोड़ें:
set(my_global_overwritten_string "foo"
CACHE STRING "this is overwritten each time CMake is run" FORCE)
स्थानीय चर
set(my_variable "the value is a string")
डिफ़ॉल्ट रूप से, एक स्थानीय चर केवल वर्तमान निर्देशिका में जोड़ा जाता है और add_subdirectory
कमांड के माध्यम से जोड़ा गया कोई उपनिर्देशिका।
एक चर के दायरे का विस्तार करने के लिए दो संभावनाएँ हैं:
CACHE
इसे, जो इसे विश्व स्तर पर उपलब्ध कराएगाPARENT_SCOPE
उपयोगPARENT_SCOPE
, जो इसे मूल दायरे में उपलब्धPARENT_SCOPE
। पैरेंट स्कोप या तो पैरेंट डायरेक्टरी मेंCMakeLists.txt
फाइल है या करंट फंक्शन का कॉलर है।तकनीकी रूप से मूल निर्देशिका
CMakeLists.txt
फ़ाइल होगी जिसमेंadd_subdirectory
कमांड के माध्यम से वर्तमान फ़ाइल शामिल थी।
तार और सूची
यह जानना महत्वपूर्ण है कि सीएमके सूचियों और सादे तारों के बीच कैसे भिन्न होता है। जब आप लिखते हैं:
set(VAR "ab c")
आप "ab c"
मान के साथ एक स्ट्रिंग बनाते हैं। लेकिन जब आप इस पंक्ति को बिना उद्धरण के लिखते हैं:
set(VAR abc)
आप इसके बजाय तीन मदों की एक सूची बनाएँ: "a"
, "b"
और "c"
।
गैर-सूची चर वास्तव में भी सूची हैं (एक तत्व के)।
सूचियों को list()
कमांड के साथ संचालित किया जा सकता है, जो सूचियों को सुगम बनाने, उन्हें खोजने, मनमाने तत्वों तक पहुंचने और सूची के प्रलेखन () ) की अनुमति देता है।
थोड़ा भ्रमित, एक सूची भी एक स्ट्रिंग है । रेखा
set(VAR abc)
के बराबर है
set(VAR "a;b;c")
इसलिए, सूचियों को संक्षिप्त करने के लिए कोई भी set()
कमांड का उपयोग कर सकता है:
set(NEW_LIST "${OLD_LIST1};${OLD_LIST2})"
चर और वैश्विक चर चर
अधिकतर आप "सामान्य चर" का उपयोग करेंगे:
set(VAR TRUE)
set(VAR "main.cpp")
set(VAR1 ${VAR2})
लेकिन CMake को वैश्विक "कैश्ड वैरिएबल" ( CMakeCache.txt
में CMakeCache.txt
) भी पता है। और अगर मौजूदा नाम के सामान्य और कैश्ड वैरिएबल मौजूदा दायरे में मौजूद हैं, तो सामान्य वैरिएबल कैश्ड को छिपा देते हैं:
cmake_minimum_required(VERSION 2.4)
project(VariablesTest)
set(VAR "CACHED-init" CACHE STRING "A test")
message("VAR = ${VAR}")
set(VAR "NORMAL")
message("VAR = ${VAR}")
set(VAR "CACHED" CACHE STRING "A test" FORCE)
message("VAR = ${VAR}")
पहले रन का आउटपुट
VAR = CACHED-init
VAR = NORMAL
VAR = CACHED
दूसरा रन का आउटपुट
VAR = CACHED
VAR = NORMAL
VAR = CACHED
नोट: FORCE
विकल्प भी सामान्य स्कोप को मौजूदा स्कोप से अप्रसन्न / हटा देता है।
कैश्ड चर के लिए मामलों का उपयोग करें
आमतौर पर दो उपयोग के मामले हैं (कृपया वैश्विक चरों के लिए इनका दुरुपयोग न करें):
आपके कोड में एक मान आपके प्रोजेक्ट के उपयोगकर्ता जैसे कि
cmakegui
,ccmake
याcmake -D ...
विकल्प के साथ परिवर्तनशील होना चाहिए:CMakeLists.txt / MyToolchain.cmake
set(LIB_A_PATH "/some/default/path" CACHE PATH "Path to lib A")
कमांड लाइन
$ cmake -D LIB_A_PATH:PATH="/some/other/path" ..
यह इस मान को कैश में प्री-सेट करता है और उपरोक्त लाइन इसे संशोधित नहीं करेगी।
सीएमके जीयूआई
जीयूआई में उपयोगकर्ता पहले कॉन्फ़िगरेशन प्रक्रिया शुरू करता है, फिर किसी भी कैश किए गए मूल्य को संशोधित कर सकता है और बिल्ड पर्यावरण निर्माण शुरू करने के साथ खत्म कर सकता है।
इसके अतिरिक्त CMake कैश सर्च / टेस्ट / कंपाइलर आइडेंटिटी रिजल्ट्स देता है (इसलिए जब भी कॉन्फ़िगरेशन या जेनरेशन रि-रन करता है तो इसे दोबारा करने की जरूरत नहीं होती है)
find_path(LIB_A_PATH libA.a PATHS "/some/default/path")
यहाँ
LIB_A_PATH
कैश्ड वैरिएबल के रूप में बनाया गया है।
मुनाफाखोरी का उपयोग करने के लिए CMake में प्रोफाइलिंग झंडे जोड़ना
यहाँ की घटनाओं की श्रंखला निम्नानुसार काम करने वाली है:
- -Pg विकल्प के साथ संकलन कोड
- -Pg विकल्प के साथ लिंक कोड
- प्रोग्राम चलाओ
- कार्यक्रम gmon.out फ़ाइल उत्पन्न करता है
- ग्रिफ़िट प्रोग्राम चलाएं
प्रोफाइलिंग झंडे जोड़ने के लिए, आपको अपने CMakeLists.txt में जोड़ना होगा:
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -pg")
संकलन और लिंक करने के लिए झंडे जोड़ना चाहिए, और कार्यक्रम को निष्पादित करने के बाद उपयोग करना चाहिए:
gprof ./my_exe
यदि आपको कोई त्रुटि मिलती है जैसे:
gmon.out: No such file or directory
इसका मतलब है कि संकलन ने प्रोफाइलिंग जानकारी को ठीक से नहीं जोड़ा।