दिलचस्प पोस्ट
java.rmi.ServerException: रिमोट एक्सपेक्शन सर्वर धागे में हुआ (ClassNotFoundException) सफ़ारी, क्रोम, आईई, फ़ायरफ़ॉक्स और ओपेरा ब्राउज़र का पता कैसे लगाया जाता है? क्या सूची बनाई जा सकती है जो स्वयं नाम के आधार पर इनपुट ऑब्जेक्ट नाम है? 100% की ऊंचाई के साथ पूर्ण स्क्रीन आइफ्रेम कैसे निकालें RVM jQuery आईडी से शुरू होता है क्रोम में गलत MIME प्रकार के साथ फ़ॉन्ट-चेहरे एक TabHost गतिविधि से एक परिणाम (startActivityForResult) वापस कैसे करें? सफ़ारी या UIWebView में HTTPS पर QuickTime फिल्में नहीं देख सकते आईआईएस एक्सप्रेस 8 बीटा को 64-बिट प्रक्रिया के रूप में वेबसाइट चलाने के लिए नहीं मिल सकता है ग्रहण विंडोज 7 पर शुरू नहीं हो रहा है IOS 7 के लिए UIAlertView के अंदर सबव्यू कैसे जोड़ें? संगतता: सी ++ 11 मेमोरी मॉडल में परमाणु और अस्थिर अजगर रेगुलर एक्सप्रेशन में मिलान वाले यूनिकोड वर्ण दो शब्द स्ट्रिंग में दोनों शब्दों के पहले अक्षर को कैपिटल बनाएँ

सेट और चर का उपयोग करने के लिए CMake वाक्यविन्यास क्या है?

मैं अगली बार जब मैं सीमके का इस्तेमाल करता हूं तो मैं इसे अपने लिए याद दिलाता हूं। यह कभी चिपक नहीं आता है, और Google के परिणाम बहुत अच्छे नहीं हैं।

CMake में चर सेट और उपयोग करने के लिए वाक्यविन्यास क्या है?

Solutions Collecting From Web of "सेट और चर का उपयोग करने के लिए CMake वाक्यविन्यास क्या है?"

सीमके स्क्रिप्ट लिखते समय सीमेंक के बारे में आपको बहुत कुछ पता होना चाहिए और CMake में चर का उपयोग कैसे करना है।

सिंटैक्स

set() का उपयोग कर स्ट्रिंग्स set() :

  • set(MyString "Some Text")
  • set(MyStringWithVar "Some other Text: ${MyString}")
  • set(MyStringWithQuot "Some quote: \"${MyStringWithVar}\"")

या string() साथ string() :

  • string(APPEND MyStringWithContent " ${MyString}")

set() का उपयोग करके सूचियां set() :

  • set(MyList "a" "b" "c")
  • set(MyList ${MyList} "d")

या list() साथ बेहतर list() :

  • list(APPEND MyList "a" "b" "c")
  • list(APPEND MyList "d")

फ़ाइल नाम की सूची:

  • set(MySourcesList "File.name" "File with Space.name")
  • list(APPEND MySourcesList "File.name" "File with Space.name")
  • add_excutable(MyExeTarget ${MySourcesList})

दस्तावेज़ीकरण

  • सीमके / भाषा सिंटैक्स
  • सीमके: चर स्ट्रिंग्स
  • सीमके: उपयोगी चर
  • CMake set() कमान
  • सीमके string() कमान
  • सीमके list() कमान
  • सीमेक: जेनरेटर एक्सप्रेशंस

क्षेत्र या "मेरे वैरिएबल का मूल्य क्या है?"

पहले "सामान्य वैरिएबल" और चीजें हैं जिन्हें आप अपने क्षेत्र के बारे में जानना चाहते हैं:

  • सामान्य चर CMakeLists.txt लिए दृश्यमान होते हैं जो वे सेट होते हैं और सब कुछ जिसे वहां से कहा जाता है ( add_subdirectory() , include() , macro() और function() )।
  • add_subdirectory() और function() कमांड विशेष होते हैं, क्योंकि वे अपने स्वयं के दायरे को खोलते हैं
    • अर्थ चर set(...) वहां केवल दिखाई दे रहे हैं और वे उन सभी सामान्य चर की एक प्रति बनाते हैं जो वे स्कोप स्तर से बुलाए जाते हैं (जिन्हें माता-पिता के क्षेत्र कहा जाता है)।
    • इसलिए यदि आप उप-डायरेक्टरी या फंक्शन में हैं तो आप set(... PARENT_SCOPE) साथ माता-पिता के क्षेत्र में पहले से मौजूद चर को संशोधित कर सकते हैं set(... PARENT_SCOPE)
    • आप फ़ंक्शन पैरामीटर के रूप में चर नाम को पारित करके इस तरह के फ़ंक्शन का उपयोग कर सकते हैं। एक उदाहरण function(xyz _resultVar) होगा function(xyz _resultVar) सेट है set(${_resultVar} 1 PARENT_SCOPE)
  • दूसरी तरफ, include() आप सेट करते include() या macro() स्क्रिप्ट्स में वेरिएबल्स को सीधे उस स्थान के दायरे में संशोधित करेंगे जहां से कहा जाता है।

दूसरा "ग्लोबल वेरिएबल्स कैश" है कैश के बारे में आपको जानना आवश्यक चीजें:

  • अगर दिए गए नाम के साथ कोई सामान्य चर परिभाषित नहीं किया गया है, तो वर्तमान में कैमेक मिलान कैश प्रविष्टि की खोज करेगा।
  • कैश मान आपकी बाइनरी आउटपुट निर्देशिका में CMakeCache.txt फ़ाइल में संग्रहीत किए जाते हैं।
  • सीकेके के जीयूआई अनुप्रयोग में उत्पन्न होने से पहले कैश में मानों को संशोधित किया जा सकता है। इसलिए वे – सामान्य चर की तुलना में – एक type और एक docstring मैं सामान्यतः जीयूआई का इस्तेमाल नहीं करता हूं इसलिए मैं अपने वैश्विक और लगातार मूल्यों को सेट करने के लिए set(... CACHE INTERNAL "") का उपयोग करता हूं।

    कृपया ध्यान दें कि INTERNAL कैश चर प्रकार FORCE दर्शाता है

  • यदि आप set(... CACHE ... FORCE) सिंटैक्स का उपयोग करते हैं, तो एक सीमके स्क्रिप्ट में आप केवल मौजूदा कैश प्रविष्टियों को बदल सकते हैं। इस व्यवहार का उपयोग सीमके द्वारा ही किया जाता है, क्योंकि यह सामान्य रूप से कैश प्रविष्टियों को स्वयं के लिए मजबूर नहीं करता है और इसलिए आप इसे दूसरे मान के साथ पूर्व-परिभाषित कर सकते हैं।

  • आप वाक्यविन्यास cmake -D var:type=value साथ कैश में प्रविष्टियों को सेट करने के लिए कमांड लाइन का उपयोग कर सकते हैं cmake -D var:type=value , बस cmake -D var=value या cmake -C CMakeInitialCache.cmake
  • आप unset(... CACHE) साथ कैश में प्रविष्टियों को अनसेट नहीं कर सकते।

कैश वैश्विक है और आप उन्हें अपने सीमके स्क्रिप्ट्स में लगभग कहीं भी सेट कर सकते हैं। लेकिन मैं आपको दो बार के बारे में सोचने की सलाह देता हूँ कि कैशे चर का उपयोग करने के लिए (वे वैश्विक हैं और वे लगातार हैं)। मैं सामान्य रूप से set_property(GLOBAL PROPERTY ...) और set_property(GLOBAL APPEND PROPERTY ...) वाक्यविन्यास को पसंद करता हूं जो कि मेरी अपनी गैर-स्थिर वैश्विक वैरिएबल को परिभाषित करता है।

परिवर्तनीय नुकसान और "कैसे चर परिवर्तन डीबग करने के लिए?"

नुकसान से बचने के लिए आपको चर के बारे में निम्नलिखित जानना चाहिए:

  • सीमके में सूचीएं सेमीकोलन सीमांकक के साथ स्ट्रिंग हैं और इसलिए उद्धरण चिह्न महत्वपूर्ण हैं
    • set(MyVar abc) "a;b;c" और set(MyVar "abc") है "abc"
    • सिफारिश यह है कि जब आप सूची के रूप में सूची देना चाहते हैं, तब आप हमेशा एक अपवाद के साथ उद्धरण चिह्नों का उपयोग करते हैं
    • list() को संभालने के लिए आम तौर पर list() कमांड पसंद करते हैं
  • संपूर्ण दायरा मुद्दा ऊपर वर्णित है। विशेष रूप से macros() की बजाय functions() का उपयोग करने की सिफारिश की गई है क्योंकि आप अपने स्थानीय चर को माता-पिता के क्षेत्र में दिखाने के लिए नहीं चाहते हैं
  • CMake द्वारा उपयोग किए जाने वाले बहुत सारे चर project() और enable_language() कॉल के साथ सेट होते हैं इसलिए ये उन कमांड्स का उपयोग करने से पहले कुछ वैरिएबल सेट करना महत्वपूर्ण हो सकता है
  • पर्यावरण चर भिन्न हो सकते हैं जहां सेमके ने पर्यावरण बनाने के लिए जनरेट किया था और जब फ़ाइलों को बनाने के लिए उपयोग किया जाता है।
    • एक वातावरण चर में परिवर्तन पीढ़ी प्रक्रिया को पुन: ट्रिगर नहीं करता है।
    • विशेष रूप से एक जेनरेटेड आईडीई पर्यावरण आपकी कमांड लाइन से अलग हो सकती है, इसलिए इसे आपके वातावरण चर को कैश्ड में कुछ स्थानांतरित करने की अनुशंसा की जाती है।

कभी-कभी केवल डीबगिंग चर मदद करता है निम्नलिखित आपकी सहायता कर सकते हैं:

  • बस message() कमांड का उपयोग कर पुराने printf डिबगिंग शैली का उपयोग करें यहां कुछ भी मॉड्यूल का उपयोग करने के लिए तैयार है जो खुद को ही सीमके के साथ भेजता है: CMakePrintHelpers.cmake , CMakePrintSystemInformation.cmake
  • अपने बाइनरी आउटपुट निर्देशिका में CMakeCache.txt फ़ाइल में देखें। यह फाइल तब भी उत्पन्न होती है जब आपके मेक पर्यावरण की वास्तविक पीढ़ी विफल हो जाती है।
  • यह देखने के लिए कि आपके चर को पढ़ / लिखा / निकाला गया है, जहां चर_वॉच () का उपयोग करें
  • डायरेक्टरी गुण CACHE_VARIABLES और वर्जन देखें
  • cmake --trace ... कॉल करें – cmake --trace ... की पूरी पार्सिंग प्रक्रिया देखने के लिए। यह पिछले आरक्षित की तरह है, क्योंकि यह बहुत सारे आउटपुट उत्पन्न करता है

विशेष सिंटेक्स

  • पर्यावरण चर
    • आप $ENV{...} पढ़ सकते हैं और set(ENV{...} ...) लिख सकते set(ENV{...} ...) पर्यावरण चर
  • जनरेटर अभिव्यक्तियाँ
    • जेनरेटर एक्सप्रेशन $<...> का मूल्यांकन केवल तब किया जाता है जब सीमके के जनरेटर मेक पर्यावरण लिखते हैं (यह सामान्य चर के साथ तुलना करता है जो पारसर द्वारा "इन-प्लेस" में बदल जाते हैं)
    • बहुत आसान उदा। कंपाइलर / लिंकर कमांड लाइन में और बहु-कॉन्फ़िगरेशन वातावरण में
  • संदर्भ
    • ${${...}} आप चर नामों को एक वैरिएबल में दे सकते हैं और इसकी सामग्री संदर्भित कर सकते हैं।
    • फ़ंक्शन / मैक्रो पैरामीटर के रूप में एक चर नाम देने पर अक्सर इसका उपयोग किया जाता है
  • लगातार मान (देखें if() कमांड)
    • if(MyVariable) आप सही / गलत के लिए कोई चर जांच कर सकते हैं ( ${...} लिए यहां कोई आवश्यकता नहीं है)
    • सही है अगर निरंतर 1 , ON , YES , TRUE , Y , या एक शून्य-शून्य संख्या।
    • झूठी अगर निरंतर 0 , OFF , NO , FALSE , N , NOTFOUND , NOTFOUND , रिक्त स्ट्रिंग, या प्रत्यय में खत्म होता है -NOTFOUND
    • इस सिंटैक्स का उपयोग अक्सर if (MSVC) जैसे कुछ के लिए किया जाता है, लेकिन यह किसी ऐसे व्यक्ति के लिए भ्रामक हो सकता है जो इस वाक्यविन्यास शॉर्टकट को नहीं जानता।
  • पुनरावर्ती प्रतिस्थापन
    • आप वैरिएबल के नाम से चर का निर्माण कर सकते हैं। CMake चर प्रतिस्थापित किया गया है के बाद, यह फिर से जांच अगर परिणाम एक चर खुद है यह बहुत ही शक्तिशाली विशेषता है जो कि set(CMAKE_${lang}_COMPILER ...) में प्रयोग किया जाता है जैसे कि एक टेम्पलेट set(CMAKE_${lang}_COMPILER ...)
    • लेकिन ध्यान रखें कि if () आज्ञाओं में सिरदर्द मिल सकता है यहां एक उदाहरण है जहां CMAKE_CXX_COMPILER_ID "MSVC" और MSVC "1" :
      • if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") सही है, क्योंकि यह if ("1" STREQUAL "1") लिए मूल्यांकन करता है
      • if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") गलत है, क्योंकि यह if ("MSVC" STREQUAL "1") लिए मूल्यांकन करता है
      • तो सबसे अच्छा समाधान यहां होगा – ऊपर देखें – if (MSVC) सीधे if (MSVC)
    • अच्छी खबर यह है कि यह CMake0054 में नीति के साथ CMake 3.1 में तय हो गई थी। मैं हमेशा cmake_policy(SET CMP0054 NEW) सेट करने की सलाह देता हूं "केवल if() तर्कों को चर या कीवर्ड के रूप में व्याख्या नहीं करता है, जो बिना किसी न तो।"
  • option() कमांड
    • मुख्य रूप से केवल तार कैश किए गए हैं जो केवल ON या OFF हो सकते हैं और वे कुछ विशेष हैंडलिंग की अनुमति देते हैं जैसे कि निर्भरताएं
    • लेकिन सावधान रहें , set कमांड के साथ option को गलती न करें। option को दिया गया मान वास्तव में केवल "प्रारंभिक मूल्य" है (पहले कॉन्फ़िगरेशन चरण के दौरान कैश में एक बार स्थानांतरित किया गया) और उसके बाद से उपयोगकर्ता को सीमके के जीयूआई के माध्यम से परिवर्तित करना है।

संदर्भ

  • सीमके कैसे इस्तेमाल किया जाता है?
  • cmake, वैश्विक चर की अवधारणा (और PARENT_SCOPE या add_sub डायरेक्ट्री विकल्प) में खो गया
  • स्ट्रिंग सूची पर लूपिंग
  • कैसे CMake बिल्ड सेटिंग्स को स्टोर करने के लिए
  • सीएमके स्ट्रक्क्ल के साथ रिक्त स्ट्रिंग की तुलना में विफल रहे
  • cmake: जब चर को उद्धृत करने के लिए?

त्वरित और गंदे आरंभ करने के लिए यहां कुछ बुनियादी उदाहरण दिए गए हैं

एक आइटम चर

चर सेट करें:

 SET(INSTALL_ETC_DIR "etc") 

चर का उपयोग करें:

 SET(INSTALL_ETC_CROND_DIR "${INSTALL_ETC_DIR}/cron.d") 

बहु-आइटम चर (यानी सूची)

चर सेट करें:

 SET(PROGRAM_SRCS program.c program_utils.c a_lib.c b_lib.c config.c ) 

चर का उपयोग करें:

 add_executable(program "${PROGRAM_SRCS}") 

वेक्सिएबल पर डॉक्स

$ENV{FOO} उपयोग के लिए, जहां FOO चर पर्यावरण चर से उठाया जा रहा है अन्यथा ${FOO} रूप में उपयोग करें, जहां FOO कुछ अन्य चर है सेटिंग के लिए, सेमीक में SET(FOO "foo") का उपयोग किया जाएगा