सीएमके में सोर्सफाइल्स को निर्दिष्ट करने का सबसे अच्छा तरीका उन्हें स्पष्ट रूप से सूचीबद्ध करना है ।
खुद CMake के निर्माता ग्लोबिंग का उपयोग नहीं करने की सलाह देते हैं ।
देखें: https://cmake.org/cmake/help/v3.15/command/file.html?highlight=glob#file
(हम आपके स्रोत वृक्ष से स्रोत फ़ाइलों की सूची एकत्र करने के लिए GLOB का उपयोग करने की अनुशंसा नहीं करते हैं। यदि कोई स्रोत जोड़ा या हटाए जाने पर कोई CMakeLists.txt फ़ाइल परिवर्तित नहीं होती है, तो उत्पन्न बिल्ड सिस्टम को पता नहीं चल सकता है कि CMake को पुन: उत्पन्न करने के लिए कब कहा जाए।)
बेशक, आप जानना चाहते होंगे कि डाउनसाइड क्या हैं - पर पढ़ें!
जब ग्लोबिंग विफल होता है:
ग्लोबिंग के लिए बड़ा नुकसान यह है कि फ़ाइलों को बनाना / हटाना स्वचालित रूप से बिल्ड-सिस्टम को अपडेट नहीं करेगा।
यदि आप फ़ाइलों को जोड़ने वाले व्यक्ति हैं, तो यह स्वीकार्य व्यापार-बंद लग सकता है, हालांकि इससे आपके कोड के निर्माण में अन्य लोगों के लिए समस्याएँ पैदा होती हैं, वे प्रोजेक्ट को संस्करण-नियंत्रण से अद्यतन करते हैं, बिल्ड बनाते हैं, फिर आपसे संपर्क करते हैं, शिकायत करते हैं कि
"बिल्ड का टूटा हुआ"।
मामलों को बदतर बनाने के लिए, विफलता आमतौर पर कुछ लिंकिंग त्रुटि देती है जो समस्या के कारण को कोई संकेत नहीं देती है और समय की समस्या का निवारण नहीं होता है।
जिस प्रोजेक्ट में मैंने काम किया था, उसमें हमने ग्लोबिंग शुरू कर दिया था, लेकिन जब नई फाइलें जोड़ी गईं, तो इतनी शिकायतें मिलीं कि ग्लोबिंग के बजाय फाइलों को स्पष्ट रूप से सूचीबद्ध करना पर्याप्त कारण था।
यह आम गिट वर्क-फ्लो
( git bisect
और फीचर शाखाओं के बीच स्विच) को भी तोड़ता है ।
इसलिए मैं इसकी सिफारिश नहीं कर सकता, इससे जो समस्याएँ दूर होती हैं, वे सुविधा से बाहर हो जाती हैं, जब कोई व्यक्ति आपके सॉफ़्टवेयर का निर्माण नहीं कर सकता है, क्योंकि वे समस्या को ट्रैक करने के लिए या बस हार मानने में बहुत समय लगा सकते हैं।
और एक और ध्यान दें, बस याद रखना CMakeLists.txt
हमेशा पर्याप्त नहीं होता है, स्वचालित बिल्ड के साथ जो ग्लोबिंग का उपयोग करता है, मुझे हर बिल्ड से cmake
पहले दौड़ना पड़ता था क्योंकि फाइलें पिछले बिल्डिंग के बाद से जोड़ी / हटा दी गई हो सकती हैं।
नियम के अपवाद:
ऐसे समय होते हैं जब ग्लोबिंग बेहतर होता है:
CMakeLists.txt
मौजूदा परियोजनाओं के लिए एक फाइल स्थापित करने के लिए जो CMake का उपयोग नहीं करते हैं।
इसका सभी स्रोत को संदर्भित करने का एक तेज़ तरीका है (एक बार बिल्ड सिस्टम के चलने पर - स्पष्ट फ़ाइल सूचियों के साथ ग्लोबिंग को बदलें)।
- जब CMake का उपयोग प्राथमिक बिल्ड-सिस्टम के रूप में नहीं किया जाता है, उदाहरण के लिए यदि आप एक प्रोजेक्ट का उपयोग कर रहे हैं जो CMake का उपयोग नहीं कर रहे हैं, और आप इसके लिए अपना स्वयं का बिल्ड-सिस्टम बनाए रखना चाहते हैं।
- किसी भी स्थिति के लिए जहां फ़ाइल सूची इतनी बार बदलती है कि इसे बनाए रखना अव्यावहारिक हो जाता है। इस मामले में यह उपयोगी हो सकता है, लेकिन फिर आपको एक विश्वसनीय / सही निर्माण (जो सीएमके के इरादे के खिलाफ जाता है - भवन से कॉन्फ़िगरेशन को विभाजित करने की क्षमता) प्राप्त करने के लिए हर बार
cmake
बिल्ड-फाइल्स को चलाने के लिए चलना स्वीकार करना होगा ।
* हां, मैं अपडेट के पहले और बाद में डिस्क पर फ़ाइलों के पेड़ की तुलना करने के लिए एक कोड लिख सकता था, लेकिन यह इतना अच्छा वर्कअराउंड नहीं है और बिल्ड-सिस्टम के लिए कुछ बेहतर है।