C अनुप्रयोगों का निर्माण जो Windows, MacOS और Linux में विश्वसनीय रूप से चल रहे हैं, को पोर्टेबल सोर्स कोड की तुलना में अधिक आवश्यकता होती है- यह एक निर्माण प्रणाली की मांग करता है जो प्रत्येक प्लेटफॉर्म के मूल टूलींग को अनुकूल बनाता है। Cमेक, एक ओपन-सोर्स बिल्ड सिस्टम जनरेटर, इसे एक सरल विन्यास फ़ाइल में एक बार अपनी परियोजना को परिभाषित करने और फिर मंच-विशिष्ट बिल्ड फ़ाइलों (मेकफ़ाइल्स, विजुअल स्टूडियो समाधान फ़ाइलों, Xcode परियोजनाओं आदि) का निर्माण करके हल करता है। यह लेख Cमेक के साथ C परियोजनाओं के लिए एक क्रॉस-प्लेटफॉर्म निर्माण प्रणाली बनाने के लिए एक संपूर्ण, व्यावहारिक गाइड प्रदान करता है, जो बुनियादी सेटअप से निर्भरता प्रबंधन, परीक्षण और क्रॉस-संकलन जैसी उन्नत तकनीकों तक सब कुछ को कवर करता है।

क्या है Cमेक?

Cमेक एक मेटा-निर्माण प्रणाली है: यह कोड को सीधे संकलित नहीं करता है लेकिन अन्य निर्माण प्रणालियों के लिए इनपुट फाइलें उत्पन्न करता है। आप अपनी परियोजना को में एक डोमेन-विशिष्ट भाषा का उपयोग करके फ़ाइलों का वर्णन करते हैं। Cमेक तब इन फ़ाइलों को पढ़ता है और लक्ष्य मंच के लिए उचित निर्माण निर्देश उत्पन्न करता है।

Cमेक की प्रमुख विशेषताओं में शामिल हैं:

  • Platform-agnostic syntax:] वही यूनिक्स, विंडोज और मैकओएस पर काम करता है।
  • एकाधिक जनरेटर: मेक, निंजा, विजुअल स्टूडियो, एक्सकोड और अन्य का समर्थन करता है।
  • आउट-ऑफ-सोर्स बिल्ड: स्रोत कोड से अलग कलाकृतियों का निर्माण करता है।
  • Extensibility: मॉड्यूल, कार्य और मैक्रो पुन: प्रयोज्य निर्माण तर्क की अनुमति देते हैं।
  • पैकेज खोज:] ] स्थापित पुस्तकालयों और हेडर का पता लगाता है।
  • ]CI/CD के साथ एकीकरण: स्वचालित पाइपलाइनों में आसानी से काम करता है।

Cमेक C और C++ पारिस्थितिकी तंत्र में क्रॉस-प्लेटफॉर्म डेवलपमेंट के लिए डीफैक्टो मानक बन गया है, जिसका उपयोग परियोजनाओं द्वारा LLVM, MySQL और पूरे KDE डेस्कटॉप वातावरण के रूप में भिन्न किया गया है।

Cमेक फॉर क्रॉस-प्लेटफॉर्म C डेवलपमेंट के लाभ

Cमेक को अपनाने से सरल पोर्टेबिलिटी से परे कई ठोस फायदे मिलते हैं:

  • "एकल स्रोत of सच्चाई: एक बार तर्क का निर्माण करें और हर मंच के लिए फाइलें उत्पन्न करें, नाजुक खोल स्क्रिप्ट या मंच-विशिष्ट मेकफ़ाइल को नष्ट करें।
  • IDE एकीकरण: टीमें विजुअल स्टूडियो, क्लियोन, एक्सकोड या वीएस कोड में उसी को साझा करते हुए काम कर सकती हैं ]].
  • ]मॉड्यूलर परियोजना संरचना: का उपयोग अपनी निर्भरता के साथ प्रबंधनीय घटकों में बड़ी परियोजनाओं को विभाजित करने के लिए।
  • ]Conditional तर्क: पूरी विन्यास को दोहराए बिना, केवल जरूरत पड़ने पर प्लेटफार्म-विशिष्ट झंडे, स्रोत फ़ाइलों, या पुस्तकालयों को लागू करें।
  • ]ऑटोमेटेड निर्भरता हैंडलिंग: ]] और ] तीसरे पक्ष के पुस्तकालयों का उपयोग करके सरल।
  • टेस्टिंग और पैकेजिंग: CTest और CPack को कसकर एकीकृत किया जाता है, जिससे परीक्षण जोड़ने और इंस्टॉल करने वालों को बनाने में इसे विफल बनाया जाता है।
  • ]बिल्ड प्रदर्शन: CCache के साथ संयुक्त निंजा जनरेटर नाटकीय रूप से पुनर्निर्माण समय कम कर देता है।
  • ]सक्रिय समुदाय: थोरफ ]official document]]] और मॉड्यूल और ट्यूटोरियल के एक संपन्न पारिस्थितिकी तंत्र।

शुरू हो रहा है: CTO के लिए CTOM की स्थापना

यह अनुभाग स्थापना से लेकर तीन प्रमुख प्लेटफार्मों पर एक संकलित निष्पादन योग्य तक पूर्ण कार्यप्रवाह के माध्यम से चलता है।

1. Cake स्थापित करें

cmake.org से नवीनतम द्विआधारी डाउनलोड करें या अपने सिस्टम के पैकेज मैनेजर का उपयोग करें:

  • ]Linux (Debian/Ubuntu): ]]]
  • macOS (Homebrew):] ]]
  • Windows: इंस्टॉलर चलाएँ और यह सुनिश्चित करें कि “Cमेक टू सिस्टम PATH” को जोड़ा जाए।

के साथ स्थापना सत्यापित करें। संस्करण 3.10 या उससे अधिक यहाँ चर्चा की गई सुविधाओं के लिए सिफारिश की जाती है।

2. एक मिनिमल Cमेकलिस्ट लिखें.txt

अपनी परियोजना जड़ में नामक एक फ़ाइल बनाएं। नीचे एक एकल स्रोत सी परियोजना के लिए एक न्यूनतम उदाहरण है:

cmake_minimum_required(VERSION 3.10)
project(HelloWorld C)

add_executable(hello main.c)

ब्रेकडाउन:

  • ] न्यूनतम Cमेक संस्करण सेट करता है। यह नीतिगत अद्यतनों को सक्षम करता है जो व्यवहार में सुधार करता है।
  • ] परियोजना का नाम और भाषा को परिभाषित करता है। निर्दिष्ट CMK को C++ compilers के लिए स्कैनिंग से रोकता है।
  • ]] Cमेक को बताता है कि लक्ष्य ]]] से बनाया जाना चाहिए।

थोड़ा यथार्थवादी उदाहरण कम्पाइलर झंडे और एक हेडर-केवल निर्भरता को जोड़ता है:

cmake_minimum_required(VERSION 3.15)
project(Calculator C)

set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)

add_executable(calc main.c parser.c)
target_include_directories(calc PRIVATE include)

यहाँ ]] ]]]]] को कम्पाइलर के हेडर खोज पथ में केवल लक्ष्य के लिए कहते हैं।

3. फाइल्स का निर्माण

एक निर्माण निर्देशिका बनाएँ और Cमेक चलाएँ:

mkdir build
cd build
cmake ..

लिनक्स/macOS पर यह डिफ़ॉल्ट रूप से एक मेकफ़ाइल उत्पन्न करता है। विजुअल स्टूडियो के साथ विंडोज पर स्थापित, यह एक फ़ाइल उत्पन्न करता है। एक अलग जनरेटर का अनुरोध करने के लिए, का उपयोग करें।

बाद में, आप समय के साथ विकल्प पारित कर सकते हैं:

cmake .. -DCMAKE_BUILD_TYPE=Release -DMY_FEATURE=ON

इन चरों को में संग्रहीत किया जाता है और बाद में रनों पर पुन: उपयोग किया जाता है।

4. परियोजना का निर्माण

एक बार जब फाइलें उत्पन्न होती हैं, तो संकलन:

  • मेक/निंजा: ] (सभी प्लेटफार्मों और जनरेटर पर काम करता है)
  • ]Visual Studio: [[FLT::28]]]]
  • Xcode:] [[FLT::29]]]]

] आदेश क्रॉस-प्लेटफॉर्म है और प्लेटफॉर्म-विशिष्ट चालानों से बचाता है। [[FLT: 31]] का उपयोग करने के लिए निर्माण को गति देना।

CMA प्रौद्योगिकी

बुनियादी बातों से परे, Cमेक उन सुविधाओं को प्रदान करता है जो बड़े या अधिक जटिल निर्माण को सुव्यवस्थित करते हैं। इन मास्टरिंग से समय बचाने और त्रुटियों को कम करने में मदद मिलेगी।

find package के साथ प्रबंध निर्भरता

] आदेश स्थापित पुस्तकालयों का पता लगाता है और उनके पथ और पुस्तकालय फ़ाइलों को शामिल करने के लिए चर सेट करता है। आधुनिक Cमेक स्वच्छ निर्भरता के प्रचार के लिए ] आयातित लक्ष्य का उपयोग करने के लिए प्रोत्साहित करता है:

find_package(SDL2 REQUIRED)
target_link_libraries(my_app PRIVATE SDL2::SDL2)

आयातित लक्ष्य स्वचालित रूप से ले जाने के लिए निर्देशिकाओं, संकलन परिभाषाओं और लिंक झंडे शामिल हैं। यदि पुस्तकालय Cमेक विन्यास फ़ाइलों को प्रदान नहीं करता है, तो आपको एक खोज मॉड्यूल की आवश्यकता हो सकती है। cmake-developer[ पर समुदाय के लोगों पर अपना खुद का लिखना या भरोसा करना।

सिस्टम-वाइड इंस्टॉलेशन के बिना निर्भरता के लिए, डाउनलोड और कॉन्फ़िगर समय पर स्रोत कोड को एकीकृत करता है:

include(FetchContent)
FetchContent_Declare(
 zlib
 GIT_REPOSITORY https://github.com/madler/zlib.git
 GIT_TAG v1.3
)
FetchContent_MakeAvailable(zlib)
target_link_libraries(my_app PRIVATE zlib)

यह दृष्टिकोण विशिष्ट संस्करणों को पिन करके पुन: प्रयोज्य निर्माण सुनिश्चित करता है।

CTest के साथ टेस्ट जोड़ना

Cमेक CTest के माध्यम से परीक्षण को एकीकृत करता है। इसे सक्षम करें और अपने में परीक्षण को परिभाषित करें]:

enable_testing()

add_executable(test_parser test_parser.c)
target_link_libraries(test_parser PRIVATE parser_lib)

add_test(NAME ParserTest COMMAND test_parser)

साथ में परीक्षण रन:

ctest --output-on-failure

CTest परीक्षण जुड़नार, लेबल, टाइमआउट और समानांतर निष्पादन का समर्थन करता है। अधिक व्यापक परीक्षण के लिए, अपने पुस्तकालय को जोड़ने और [[FLT: 0] का उपयोग करके एक इकाई-परीक्षण ढांचे के साथ संयोजन पर विचार करें।

क्रॉस-संकलन

Cमेक क्रॉस-संकलन को toolchain फ़ाइलों के माध्यम से सरल बनाता है। एक टूलचेन फ़ाइल कम्पाइलर, sysroot, और लक्ष्य वास्तुकला सेट करती है। की तरह एक फ़ाइल बनाएं]:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_SYSROOT /path/to/sysroot)

फिर टूलचेन के साथ Cमेक को बुलाएं:

cmake -DCMAKE_TOOLCHAIN_FILE=arm-cross.cmake ..

Cमेक स्वचालित रूप से निर्दिष्ट क्रॉस-कंपाइलर का उपयोग करेगा और पुस्तकालयों के लिए sysroot की खोज करेगा। यह तकनीक एम्बेडेड सिस्टम, मोबाइल प्लेटफॉर्म और किसी भी परिदृश्य के लिए काम करती है जहां निर्माण मशीन लक्ष्य मशीन से अलग होती है। आधिकारिक Cमेक के साथ संकलन क्रोस्स।

स्थापना और पैकेजिंग

] का प्रयोग करके यह परिभाषित किया जा सकता है कि आपकी परियोजना कैसे तैनात की जानी चाहिए:

install(TARGETS my_app DESTINATION bin)
install(FILES config.ini DESTINATION etc)

इसके बाद CPack इंस्टॉलर उत्पन्न करता है: DEB, RPM, NSIS, DMG, आदि। अपने के अंत में जोड़ें:

include(CPack)

]]] को एक डेबियन पैकेज का उत्पादन करने के लिए चलाएं। CPack सभी स्थापित नियमों को विरासत में मिला है और जैसे चर के माध्यम से अनुकूलन की अनुमति देता है।

सामान्य पिटफॉल और सर्वश्रेष्ठ प्रैक्टिस

यहां तक कि अनुभवी डेवलपर्स ने स्नैग को मारा। यहां अक्सर मुद्दे होते हैं और उनसे कैसे बचना है:

पिटफ: हार्डकोडिंग पथ

]] में कभी भी पूर्ण पथ का उपयोग नहीं किया जाता है। ] और ]]] का उपयोग स्रोत पेड़ के सापेक्ष किया जाता है। रनटाइम फ़ाइल स्थानों के लिए, का उपयोग पथ एम्बेड करने के लिए या स्थापना निर्देशिकाओं पर भरोसा करने के लिए किया जाता है।

पिटफ: जेनरेटर एक्सप्रेशन की पहचान करना

जेनरेटर अभिव्यक्ति (]) का मूल्यांकन निर्माण समय पर किया जाता है, समय को कॉन्फ़िगर नहीं किया जाता है। वे प्रति विन्यास सेटिंग्स के लिए आवश्यक हैं:

target_compile_definitions(my_app PRIVATE
 $<$<CONFIG:Debug>:_DEBUG>
)

यह केवल डेबग निर्माण के लिए ] जोड़ता है। का उपयोग करने से बचें क्योंकि बहु-config जनरेटर (Visual Studio, Xcode) कॉन्फ़िगर समय पर सेट नहीं करते हैं।

पफॉल: ओवरयूज ग्लोबल कमांड

] जैसे कमांड, , और ] सभी लक्ष्यों को प्रभावित करते हैं। ]], ], और ]]]] जैसे लक्ष्य-विशिष्ट कमांड को बेहतर ढंग से इनकैप्सुलेशन के लिए।

पिटफ: खोज के लिए उचित क्षेत्र का उपयोग नहीं करना

]]] का दायरा उचित रूप से सेट करें आधुनिक Cमेक के साथ, को पसंद करते हैं और फिर इसके लक्ष्य को लिंक करते हैं। ] का उपयोग न करें और पूरी तरह से आवश्यक होने तक मैन्युअल रूप से लिंक निर्देशिकाओं को सेट करें।

निष्कर्ष

Cमेक बहु-प्लेटफॉर्म C विकास की चुनौती को एक प्रबंधनीय, दोहराने योग्य प्रक्रिया में बदल देता है। निर्माण निर्देशों का एक सेट लिखने के द्वारा, आप सभी प्रमुख ऑपरेटिंग सिस्टम में मूल प्रदर्शन, IDE समर्थन और मजबूत निर्भरता प्रबंधन हासिल करते हैं। एक सरल के साथ शुरू करें और धीरे-धीरे उन्नत सुविधाओं को अपनाने - परीक्षण, क्रॉस-संकलन, पैकेजिंग - जैसा कि आपकी परियोजना बढ़ती है। Cमेक सीखने में निवेश हर बार जब आप निर्माण, परीक्षण या निर्माण कोड की एक लाइन को फिर से लिखने के बिना एक अलग मंच पर तैनात करते हैं।