2011-05-30 17 views
8

मुझे लगता है कि पूरे सेमेक समुदाय मुझे टोल कर रहा है। "ट्यूटोरियल" या संसाधनों में से कोई भी मुझे कोई समझ नहीं आता है। ऐसा लगता है कि मुझे कुछ याद आ रहा है। मुझे लगता है कि मुझे सबसे ज्यादा भ्रमित करने वाली भाषा क्या है और मैंने जो ट्यूटोरियल देखा है, उनमें से कोई भी ऐसा नहीं है जो सेमेक को समझाने में सभ्य होने के करीब भी हो, जिसकी छोटी यूनिक्स हो और अनुभव हो।क्या कोई मुझे इस सेमेक स्क्रिप्ट को समझा सकता है?

वैसे भी, मैं फायरब्रेट के साथ काम कर रहा हूं और यह बड़े पैमाने पर सेमेक का उपयोग करता है, मुझे लगता है कि इसका समय मैं प्रोजेक्ट फ़ाइलों को सीधे बदलने के बजाए इसका उपयोग कैसे करना चाहता हूं।

जड़ CMakeLists.txt फ़ाइल निम्न शामिल हैं:

cmake_minimum_required (VERSION 2.6) 
set (CMAKE_BACKWARDS_COMPATIBILITY 2.6) 

Project(${PLUGIN_NAME}) 

file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} 
    [^.]*.cpp 
    [^.]*.h 
    [^.]*.cmake 
    ) 

include_directories(${PLUGIN_INCLUDE_DIRS}) 

# Generated files are stored in ${GENERATED} by the project configuration 
SET_SOURCE_FILES_PROPERTIES(
    ${GENERATED} 
    PROPERTIES 
     GENERATED 1 
    ) 

SOURCE_GROUP(Generated FILES 
    ${GENERATED} 
    ) 

SET(SOURCES 
    ${GENERAL} 
    ${GENERATED} 
    ) 

मैं होता वास्तव में इसकी सराहना करता है, तो किसी ने मुझे प्रत्येक पंक्ति समझा सकता है। विशेष रूप से ${GENERAL} और ${GENERATED} हैं।

उत्तर

19

सबसे पहले, सेमेक सिंटैक्स वास्तव में सरल है। इसमें "कमांड" और "तर्क" शामिल हैं। यह इतना आसान है कि इसमें डुबकी लगने में कुछ समय लगता है। सब कुछ "आदेश (तर्क)" है। इसके अतिरिक्त, कमांड नाम केस-असंवेदनशील होते हैं। पहले उन्हें सभी सीएपीएस होना था, लेकिन संस्करण 2.6 (मुझे लगता है) के बाद से कोई फर्क नहीं पड़ता। हालांकि तर्क केस-संवेदी हैं।

cmake_minimum_required (VERSION 2.6) 

यह आदेश किसी परियोजना के लिए सेमेक के न्यूनतम आवश्यक संस्करण को सेट करता है। यदि cmake का वर्तमान संस्करण 2.6 से कम है तो यह प्रसंस्करण बंद कर देगा और एक त्रुटि की रिपोर्ट करेगा। यह उपकरण के प्राचीन संस्करणों का समर्थन करने से रोकता है।

set (CMAKE_BACKWARDS_COMPATIBILITY 2.6) 

वैरिएबल CMAKE_BACKWARDS_COMPATIBILITY को मान 2.6 पर सेट करें। यह वास्तव में आपके द्वारा प्रस्तुत CMakeLists.txt फ़ाइल में एक मामूली बग है, क्योंकि CMAKE_BACKWARDS_COMPATIBILITY का उपयोग 2.6 और उसके बाद के लिए नहीं किया जाना चाहिए। स्क्रिप्ट शायद cmake_policy का उपयोग करना चाहिए। यह निर्दिष्ट करना है कि सेमेक के पिछले संस्करणों में असंगतताओं का सामना करते समय सेमीकेक के नए संस्करणों का व्यवहार कैसे करना चाहिए। आज स्क्रैच से लिखने वाली कोई भी स्क्रिप्ट इस बारे में चिंता करने की आवश्यकता नहीं होगी।

Project(${PLUGIN_NAME}) 

जो कुछ चर PLUGIN_NAME में है के मूल्य के प्रोजेक्ट का नाम सेट करता है। यह मान कुछ आईडीई में प्रोजेक्ट नाम के रूप में दिखाया गया है। एक चर को मान लिखने के लिए, आप set(PLUGIN_NAME myName) का उपयोग कर सकते हैं और ${} सिंटैक्स का उपयोग करने वाले मान को पढ़ने के लिए: "${PLUGIN_NAME}" का उपयोग कर सकते हैं। कुछ आदेश भी वैरिएबल को भी लिखते हैं, लेकिन आप उन्हें set कमांड के समान तरीके से उपयोग करते हैं।

file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} 
    [^.]*.cpp 
    [^.]*.h 
    [^.]*.cmake 
    ) 

file एक आदेश है। इसका पहला तर्क GLOB का अर्थ है "डिस्क पर फ़ाइलों को वापस करें जिनके नाम पैटर्न के अनुरूप हैं जो मैं तर्क के रूप में दूंगा"। अगला तर्क GENERAL वह चर है जो परिणाम set के साथ संग्रहीत किया जाता है, यह परिणाम वैरिएबल को लिखता है और बाद में आप ${GENERAL} के साथ इसे पढ़ सकते हैं। RELATIVE और पथ का अर्थ उस पथ से संबंधित फ़ाइल नामों को वापस करना है, पूर्ण पथ नहीं। तो "सी: \ कुछ \ long \ path \ src \ foo.cpp" या "/home/me/some/path/src/foo.cpp" के बजाय आपको "src \ foo.cpp" या "src/foo.cpp "। परिवर्तनीय CMAKE_CURRENT_SOURCE_DIR एक "जादू चर" है जो सीएमके आपके लिए भरता है और यह वर्तमान में संसाधित होने वाली स्रोत निर्देशिका के पथ को संदर्भित करता है, जहां यह CMakeLists.txt फ़ाइल रहता है। तर्कों की अंतिम सूची उन फ़ाइलों के पैटर्न हैं जिनसे मिलान किया जाएगा। असल में, कुछ भी जो फ़ाइल एक्सटेंशन cpp, h या cmake है।

include_directories(${PLUGIN_INCLUDE_DIRS}) 

फ़ाइलों में शामिल हैं के लिए संकलक द्वारा खोजा गया उन लोगों के लिए ${PLUGIN_INCLUDE_DIRS} में निर्देशिका जोड़ें। उदाहरण के लिए, यदि आप gcc के साथ संकलित करते हैं तो इसका अतिरिक्त "-I" तर्क होगा।

# Generated files are stored in ${GENERATED} by the project configuration 

# से शुरू होने वाली रेखाएं टिप्पणियां हैं।

SET_SOURCE_FILES_PROPERTIES(
     ${GENERATED} 
     PROPERTIES 
      GENERATED 1 
     ) 

फ़ाइलों के साथ जुड़े कुंजी/मूल्य जोड़े हो सकते हैं, और इससे यह प्रभावित होता है कि वे कैसे बनाए जाते हैं। यहां परिवर्तनीय ${GENERATED} में सूचीबद्ध फ़ाइलों में "GENERATED" संपत्ति को मूल्य 1 पर सेट किया गया है। इसका क्या अर्थ है? खैर, सीएमके अब डिस्क पर "$ {GENERATED}" फ़ाइलों को न देखने के बारे में जानता है, क्योंकि वे किसी अन्य निर्माण चरण में बनाए जाएंगे। स्निपेट पोस्ट किए गए, कोई भी चर ${GENERATED} सेट करता है। मुझे कल्पना है कि यह परियोजना फाइलों में कहीं और सेट हो जाता है। संपत्ति के साथ परिवर्तनीय ${GENERATED} मिश्रण न करें! यह एक सूक्ष्म बिंदु है, और संभवतया परिवर्तनीय GENERATED_FILES भ्रम से बचने के लिए होना चाहिए, यानी SET_SOURCE_FILES_PROPERTIES(${GENERATED_FILES} PROPERTIES GENERATED 1)

SOURCE_GROUP(Generated FILES ${GENERATED}) 

यह एक समूह है, जो दृश्य स्टूडियो में एक फ़ाइल टैब में तब्दील हो, बुलाया "जनरेट किया गया" है कि चर ${GENERATED} में फ़ाइलें हैं पैदा करता है।

SET(SOURCES ${GENERAL} ${GENERATED}) 

इस लाइन जो कुछ चर ${GENERAL} और ${GENERATED} में है करने के लिए चर स्रोत सेट। इससे पहले हमने वर्तमान स्रोत निर्देशिका में मौजूद सीपीपी, एच और सेमेक फाइलों की सूची होने के लिए ${GENERAL} सेट किया था। सी-जैसे छद्म कोड में यह "स्रोत = सामान्य + सामान्य" जैसा है। कार्यान्वयन के विवरण के रूप में, मूल्य SOURCES वास्तव में एक सूची है और इसकी सामग्री ";" से अलग होती है वर्ण। आम तौर पर ऐसा किया जाता है ताकि बाद में आप हर 2 अन्य चर को दोहराने के बजाय परिवर्तनीय ${SOURCES} का उपयोग कर लाइब्रेरी या निष्पादन योग्य बना सकें।

+0

धन्यवाद! काश मैं आपको एक से अधिक वोट दे सकता हूं। यह एक जबरदस्त मदद है। –

6

कभी-कभी, मैं सेमेक ट्यूटोरियल्स के बारे में आपकी भावनाओं को समझ सकता हूं। मैं ऑनलाइन दस्तावेज़ों और कुछ सेमेक-प्रोजेक्ट्स को देखने की अनुशंसा करता हूं: उदा। ओग्रे, वीटीके, केडीई।

आप को देखने के लिए CMakeLists.txt ऐसा लगता है कि इसे किसी बाहरी सीएमके-प्रोजेक्ट (add_subdirectory के साथ) कहा जाता है, क्योंकि यह PLUGIN_NAME, PLUGIN_INCLUDE_DIRS और जेनरेटेड चर को संदर्भित करता है।

आपके सवालों के जवाब के लिए:

cmake_minimum_required (VERSION 2.6) 
set (CMAKE_BACKWARDS_COMPATIBILITY 2.6) 
Project(${PLUGIN_NAME}) 

यह आपके cmakefile तैयार करता है, cmake है कि यह संस्करण 2.6 या उच्चतर होना चाहिए बताता है और है कि आप एक नाम के साथ एक परियोजना PLUGIN_NAME चर के रूप में विनिर्दिष्ट शुरू कर रहे हैं।

file (GLOB GENERAL RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} 
    [^.]*.cpp 
    [^.]*.h 
    [^.]*.cmake 
    ) 

इस भाग वर्तमान स्रोत निर्देशिका के माध्यम से globs (जहां आपने cmakelists.txt है) और सभी * सीपीपी, * ज और * .cmake फ़ाइलें एकत्र करता है। नतीजा मौजूदा पथ निर्देशिका में शोध के साथ सापेक्ष फ़ाइल पथों का एक सेट/सूची है और इसे एक परिवर्तनीय सामान्य में संग्रहीत किया जाता है।

# Generated files are stored in ${GENERATED} by the project configuration 
SET_SOURCE_FILES_PROPERTIES(
    ${GENERATED} 
    PROPERTIES 
     GENERATED 1 
    ) 

SOURCE_GROUP(Generated FILES 
    ${GENERATED} 
    ) 

जाहिर है, वहाँ चर जनित (इस प्रकार नहीं सामान्य) में संग्रहीत स्रोत फ़ाइलों का सेट हो जाएगा। बिल्ड-जेनरेट की गई स्रोत फ़ाइलों के मामले में, ये फाइलें सीएमके के पहले निर्माण पर नहीं हैं और सीएमके को यह जानने की आवश्यकता होगी कि ये उत्पन्न होते हैं।Set_source_files_properties कमांड के साथ, उन्हें "जेनरेट" संपत्ति मिलती है, जिसे सीएमके के लिए सही निर्भरता-जांच करने की आवश्यकता होती है।

SET(SOURCES 
    ${GENERAL} 
    ${GENERATED} 
    ) 

तो अब हमारे पास परिवर्तनीय सामान्य में संग्रहीत फ़ाइल (GLOB ...) कॉल से स्रोत फ़ाइलों का एक सेट है। और हमारे पास परिवर्तनीय जेनरेटेड में संग्रहीत सॉस फाइलों का एक सेट है जो कहीं और बनाया गया है। इन दो सेटों को स्रोत-फ़ाइलों की एक सूची में जोड़ा गया है और वेरिएबल SOURCES में संग्रहीत हैं।

सामान्य परिस्थितियों में मैं उम्मीद होती है एक add_library कॉल: add_library ($ {PLUGIN_NAME} {स्रोत})

यह CMake को निर्दिष्ट करता है कि एक नए पुस्तकालय बनाया है और स्रोत में स्रोत फ़ाइलों से बनाया जाना है ।

संबंधित मुद्दे