वास्तव में CMake कैसे काम करता है?


158

मैं यह सिर्फ अपने लिए नहीं पूछ रहा हूं। मुझे उम्मीद है कि यह प्रश्न मेरे जैसे कई नए लोगों के लिए एक संदर्भ होगा, यह पूरी तरह से इस बात से हैरान है कि इतनी छोटी CMakeLists.txtफ़ाइल के लिए वास्तव में पर्दे के पीछे क्या चल रहा था?

cmake_minimum_required (VERSION 2.6)
project(Tutorial)
add_executable(Tutorial tutorial.cpp)

और इस तरह के एक छोटे से tutorial.cpp

int main() { return 0; } 

बहुत सारी फाइलें उत्पन्न होती हैं

CMakeCache.txt  cmake_install.cmake  Makefile
CMakeLists.txt  tutorial.cpp

और CMakeFilesकई फ़ाइलों और फ़ोल्डरों के साथ एक फ़ोल्डर

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

समझ में नहीं आ रहा था कि पर्दे के पीछे क्या चल रहा था (यानी: ऐसा क्यों हो सकता है कि फाइलें बननी थीं और उनका उद्देश्य क्या था), सीएमके सीखने में सक्षम होने में सबसे बड़ी बाधा थी।

यदि किसी को पता है, तो क्या आप कृपया इसे पश्चाताप के लिए समझा सकते हैं? इन फ़ाइलों का उद्देश्य क्या है, और जब मैं टाइप करता हूं cmake ., तो प्रोजेक्ट बनाने से पहले वास्तव में cmake कॉन्फ़िगर करना और उत्पन्न करना क्या है?


1
मुझे आउट-ऑफ-सोर्स बिल्ड की जानकारी है। मामले में किसी ने भी स्रोत निर्माण से बाहर नहीं किया है और अभी भी उत्पन्न फ़ाइलों को साफ करने का एक तरीका खोज रहा है, यह तकनीक अच्छी तरह से काम करती है: stackoverflow.com/a/12055610/453673
Nav

3
इसमें अद्भुत विवरण है: aosabook.org/en/cmake.html और संभवत: गहराई से प्रश्न का उत्तर (जिसे संक्षेप में यहां संक्षेप में प्रस्तुत नहीं किया जा सकता है)।
११:०६ पर

@SebTu टूटी लिंक। Cmake.html पेज मौजूद नहीं है।
नव

3
@Nav याप, मार्कअप सिंटैक्स को गड़बड़ कर दिया, क्षमा करें। इस प्रकार, यहाँ सही संस्करण: नए लोगों के लिए मैं वास्तव में cmake की वास्तुकला पढ़ने की सलाह देता हूं । यह केवल एक जानकारी प्राप्त करने के लिए पर्याप्त जानकारी प्रदान करता है कि कैसे cmake विवरण में खुद को खोए बिना काम करता है।
सेबनाग

जवाबों:


92

रहस्य यह है कि आपको यह समझने की जरूरत नहीं है कि उत्पन्न फाइलें क्या करती हैं।

CMake बिल्ड सिस्टम में बहुत अधिक जटिलता का परिचय देता है, जिनमें से अधिकांश जटिल सॉफ़्टवेयर प्रोजेक्ट्स के निर्माण के लिए उपयोग करने पर ही भुगतान करता है।

अच्छी खबर यह है कि सीएमके इस गड़बड़झाले को आपसे दूर रखने का एक अच्छा काम करता है: आउट-ऑफ-सोर्स बिल्ड का उपयोग करें और आपको जनरेट की गई फाइलों को देखने की जरूरत नहीं है। यदि आपने अभी तक ऐसा नहीं किया है (जो मुझे लगता है कि मामला है, क्योंकि आपने लिखा है cmake .), कृपया आगे बढ़ने से पहले उन्हें देखें । बिल्ड और सोर्स डायरेक्टरी को मिलाना वास्तव में CMake के साथ दर्दनाक है और यह नहीं है कि सिस्टम का उपयोग कैसे किया जाना चाहिए।

संक्षेप में: इसके बजाय

cd <source_dir>
cmake .

हमेशा उपयोग करें

cd <build_dir_different_from_source_dir>
cmake <source_dir>

बजाय। मैं आमतौर पर buildनिर्माण निर्देशिका के रूप में अपने स्रोत निर्देशिका के अंदर एक खाली सबफ़ोल्डर का उपयोग करता हूं।

आपके दर्द को कम करने के लिए, मुझे संबंधित फाइलों का त्वरित अवलोकन करने दें, जो सीएमके उत्पन्न करता है:

  • प्रोजेक्ट फाइलें / मेकफाइल्स - आप वास्तव में क्या रुचि रखते हैं: चयनित जनरेटर के तहत अपनी परियोजना बनाने के लिए आवश्यक फाइलें। यह यूनिक्स मेकफाइल से विज़ुअल स्टूडियो समाधान तक कुछ भी हो सकता है।
  • CMakeCache.txt - यह एक सतत कुंजी / मान स्ट्रिंग संग्रहण है जिसका उपयोग रनों के बीच मूल्य को कैश करने के लिए किया जाता है। यहां संग्रहित मूल्य पुस्तकालय की निर्भरता के लिए पथ हो सकते हैं या क्या एक वैकल्पिक घटक का निर्माण किया जाना है। चर की सूची अधिकतर एक जैसा कि आप देख जब चल रहा है के समान है ccmakeया cmake-gui। यह समय-समय पर देखने के लिए उपयोगी हो सकता है, लेकिन मैं किसी भी संभव मूल्यों को बदलने के लिए उपरोक्त उपकरणों का उपयोग करने की सिफारिश करूंगा।
  • जेनरेट की गई फाइलें - यह मैक्रो को एक्सपोर्ट करने के लिए ऑटोजेनरेटेड सोर्स फाइल्स से कुछ भी हो सकता है जो कि आपके द्वारा बनाए गए प्रोजेक्ट को अन्य CMO प्रोजेक्ट्स के साथ फिर से इंटीग्रेट करने में मदद करता है। इनमें से अधिकांश केवल मांग पर उत्पन्न होते हैं और आपके प्रश्न से एक साधारण परियोजना में प्रकट नहीं होंगे।
  • निर्माण प्रणाली को खुश रखने के लिए कुछ और बहुत ज्यादा शोर है। विशेष रूप से, मुझे किसी भी चीज की परवाह करने की आवश्यकता नहीं है जो CMakeFilesउपनिर्देशिका के अंदर चल रही है ।

सामान्य तौर पर आपको सीएमके आपके लिए उत्पन्न होने वाली किसी भी फाइल के साथ खिलवाड़ नहीं करना चाहिए। सभी समस्याओं को CMakeLists.txtएक या दूसरे तरीके से हल किया जा सकता है । जब तक परिणाम आपकी परियोजना को उम्मीद के मुताबिक बनाता है, तब तक आप शायद ठीक हैं। गोरखधंधे के बारे में बहुत ज्यादा चिंता न करें - जैसा कि सीएमके ने आपको पहले स्थान पर छोड़ने की कोशिश की थी।


धन्यवाद। स्रोत के निर्माण के बारे में पता था, लेकिन जैसा कि आप देखेंगे, इस प्रश्न को पूछने का उद्देश्य अधिक समझना था। आपके उत्तर के CMakeCache.txt ने वास्तव में मदद की। यह इस तरह की व्याख्या है जिसकी मुझे तलाश थी। इसके अलावा, मेरे प्रश्न का अंतिम वाक्य: " प्रोजेक्ट बनाने से पहले वास्तव में cmake कॉन्फ़िगर और जेनरेट क्या होता है "
Nav

1
CMakeFilesनिर्देशिका में है CMakeError.logऔर CMakeOutput.logसीएमके बिल्ड समस्या निवारण के लिए महत्वपूर्ण है।
सर्ज रोजैग

1
दो चीजें जो कभी-कभी आपको CMakeFiles/target_name.dirनिर्देशिका में जांचने की आवश्यकता होती हैं वे हैं flags.makeऔर link.txtफाइलें। मुझे जटिल प्रोजेक्ट में इनकी जांच करनी है, जो कि अपस्ट्रीम प्रोजेक्ट्स से झंडे / लिंक किए गए सामान को विरासत में मिला है। जैसे,: मेरी कुछ त्रुटियां थीं क्योंकि टीपीएल ए में टीपीएल बी पर निर्भरता थी। साथ ही मेरी परियोजना में बी पर निर्भरता थी, जो स्थानीय स्तर पर स्थापित थी; लेकिन ए ने मेरे सिस्टम से बी के एक संस्करण का उपयोग किया (मेरे स्थानीय इंस्टॉल के बजाय) जिसमें अलग-अलग सक्षम विकल्प थे, और यह पहले आया, जिससे मेरी परियोजना में त्रुटियां हुईं। केवल link.txt को देखकर मुझे पता चल गया था कि यह हो रहा था।
bartgol

13

जैसा कि इसकी वेबसाइट पर कहा गया है:

Cmake एक कंपाइलर-स्वतंत्र पद्धति का उपयोग करके सॉफ़्टवेयर की बिल्ड प्रक्रिया के प्रबंधन के लिए क्रॉस-प्लेटफ़ॉर्म, ओपन-सोर्स बिल्ड सिस्टम है

ज्यादातर मामलों में इसका उपयोग प्रोजेक्ट / फाइल बनाने के लिए किया जाता है - आपके उदाहरण में इसका उत्पादन हुआ है Makefileजो आपके सॉफ़्टवेयर (ज्यादातर लिनक्स / यूनिक्स मंच पर) बनाने के लिए उपयोग किया जाता है।

Cmake क्रॉस प्लेटफ़ॉर्म बिल्ड फ़ाइलें प्रदान करने की अनुमति देता है जो प्लेटफ़ॉर्म विशिष्ट प्रोजेक्ट जनरेट करेगा / विशेष संकलन / प्लेटफ़ॉर्म के लिए फ़ाइलें बनाएगा।

उदाहरण के लिए, आप अपने सॉफ़्टवेयर को विजुअल स्टूडियो के साथ विंडोज पर संकलित करने का प्रयास कर सकते हैं, फिर अपनी CMakeLists.txtफ़ाइल में उचित सिंटैक्स के साथ आप लॉन्च कर सकते हैं

cmake .

विंडोज प्लेटफॉर्म पर आपके प्रोजेक्ट की डायरेक्टरी के अंदर, Cmake सभी आवश्यक प्रोजेक्ट / सॉल्यूशन फाइल ( .slnआदि) उत्पन्न करेगा ।

यदि आप लिनक्स / यूनिक्स प्लेटफॉर्म पर अपने सॉफ़्टवेयर का निर्माण करना चाहते हैं, तो आप बस स्रोत निर्देशिका में जाएंगे, जहाँ आपकी CMakeLists.txtफ़ाइल cmake .होगी और उसी को ट्रिगर किया जाएगा और यह आपके लिए आवश्यक सभी फाइलों को सरल makeया सॉफ्टवेयर के माध्यम से बनाने के लिए उत्पन्न करेगा make all

यहाँ आपके पास Cmake कार्यक्षमताओं के बारे में कुछ बहुत अच्छी प्रस्तुति है http://www.elpauer.org/stuff/learning_cmake.pdf

संपादित करें

यदि आप प्लेटफ़ॉर्म आश्रित पुस्तकालय बनाना चाहते हैं, तो इसमें / वैरिएबल परिभाषाएँ आदि शामिल हैं। आप CMakeLists.txtफ़ाइल में इस सिंटैक्स का उपयोग कर सकते हैं

IF(WIN32)
   ...do something...
 ELSE(WIN32)
   ...do something else...
 ENDIF(WIN32)

ऐसे बहुत सारे कमांड भी हैं जिनके उपयोग से आप बिल्ड को विफल होने से रोक सकते हैं और इसके स्थान पर Cmake आपको सूचित करेगा कि उदाहरण के लिए आपके पास लायब्रेरीज़ को बढ़ावा देने filesystemऔर regexआपके सिस्टम पर स्थापित नहीं है । ऐसा करने के लिए आप निम्नलिखित सिंटैक्स का उपयोग कर सकते हैं:

find_package(Boost 1.45.0 COMPONENTS filesystem regex)

जाँचने के बाद कि यह उचित प्रणाली / IDE / संकलक के लिए मेकफाइल्स उत्पन्न करेगा।


1
धन्यवाद Patryk। सहायक उत्तर, लेकिन जिस पीडीएफ से आप जुड़े हैं, वह सीएमके सीखने के दूसरे चरण की व्याख्या करती है, जो मूल रूप से सीएमके का कार्यान्वयन है। मैं पहले चरण के स्पष्टीकरण के बारे में पूछ रहा हूं, जहां एक व्यक्ति को समझना होगा कि पृथ्वी पर सीएमके में क्या चल रहा है!
नव

@Nav मैंने अपने उत्तर का थोड़ा विस्तार किया है। आप अभी भी अधिक जानकारी के लिए वेब पर खोज कर सकते हैं।
पैट्रिक जूल

यह पूछे गए सवाल का जवाब देने से काफी दूर है।
सेनहोरलुकस

1

वास्तव में CMake कैसे काम करता है यह डेवलपर्स के लिए एक प्रश्न है, इसलिए इस प्रश्न का उत्तर यहां नहीं दिया जा सकता है।

हालाँकि हम उपयोगी मार्गदर्शन का एक स्पर्श दे सकते हैं जहाँ तक आपको सीएमके का उपयोग करना चाहिए और जब आपको इस बारे में चिंता करने की आवश्यकता है कि यह कैसे काम करता है। मैं "ओह यह बस काम करता है" का प्रशंसक नहीं है, या तो जवाब देता है - क्योंकि, विशेष रूप से सॉफ्टवेयर में, कभी नहीं "बस काम करता है" और आपको हमेशा कुछ बिंदुओं पर नॉटी-ग्रिटि विवरण में जाना होगा।

CMake एक औद्योगिक शक्ति उपकरण है। यह कई बहुत जटिल प्रक्रिया को स्वचालित करता है और कई चर को ध्यान में रखता है, जिनके बारे में आपको जानकारी नहीं हो सकती है, विशेष रूप से एक काफी नए डेवलपर के रूप में, शायद सभी ऑपरेटिंग सिस्टम के सीमित ज्ञान के साथ काम कर रहे हैं और उपकरण सीएमके संभाल सकते हैं। इतनी सारी फाइलें उत्पन्न होती हैं और क्यों चीजें इतनी जटिल लगती हैं, क्योंकि वे सभी अन्य प्रणालियां जटिल हैं और उनका हिसाब और स्वचालित होना जरूरी है। इसके अतिरिक्त "कैशिंग" और टूल के अन्य समय की बचत सुविधाओं के मुद्दे भी हैं। सीएमके में सब कुछ समझने के लिए इन बिल्ड टूल और ओएस के इन चर के सभी संभावित संयोजनों को समझना होगा, जिसे आप कल्पना कर सकते हैं।

यह ध्यान रखना महत्वपूर्ण है कि यदि आप एक बड़े क्रॉस-प्लेटफ़ॉर्म बिल्ड सिस्टम के प्रबंधन के प्रभारी नहीं हैं, और आपका कोड आधार कुछ KLOC है, तो शायद 100KLOG तक, CMake का उपयोग करना थोड़ा सा लगता है जैसे 100,000 डॉलर के वनीकरण वृक्ष को हटाने के लिए मशीन 2 फुट फूल बगीचे से अपने 2 फुट से मातम को दूर करने के लिए। (वैसे, अगर आपने ऐसी मशीन कभी नहीं देखी है, तो आपको यूट्यूब पर एक को देखना चाहिए, वे अद्भुत हैं)

यदि आपकी निर्माण प्रणाली छोटी और सरल है, तो बेहतर है कि आप केवल अपने स्वयं के मेकफाइल्स को हाथ से लिखें या उन्हें स्वयं लिपि करें। जब आपका मेकफ़िल्स कमज़ोर हो जाता है या आपको किसी अन्य प्लेटफ़ॉर्म पर अपने सिस्टम का एक संस्करण बनाने की आवश्यकता होती है, तो आप सीएमके पर स्विच कर सकते हैं। उस समय, आपको हल करने के लिए बहुत सारी समस्याएं होंगी और आप इसके बारे में अधिक ध्यान केंद्रित प्रश्न पूछ सकते हैं। इस बीच, सीएमके बारे में लिखी गई कुछ महान पुस्तकों की जांच करें, या इससे भी बेहतर, एक स्वयं लिखें! 8)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.