संक्षिप्त उत्तर: क्योंकि makeअच्छा नहीं है। यहां तक कि सी के मोर्चे पर आपको कई विकल्प दिखाई देते हैं।
लंबे उत्तर: makeकई दोष हैं जो इसे सी संकलन के लिए मुश्किल से उपयुक्त बनाते हैं, और जावा को संकलित करने के लिए अनुपयुक्त हैं। आप इसे जावा को संकलित करने के लिए बाध्य कर सकते हैं, यदि आप चाहते हैं, लेकिन मुद्दों में चलने की उम्मीद करते हैं, जिनमें से कुछ के पास उपयुक्त समाधान या समाधान नहीं है। यहाँ कुछ है:
निर्भरता का संकल्प
makeस्वाभाविक रूप से फ़ाइलों की अपेक्षा है कि वे एक-दूसरे पर एक पेड़ की तरह निर्भरता रखते हैं, जिसमें एक फ़ाइल कई अन्य लोगों के निर्माण का उत्पादन है। हेडर फ़ाइलों से निपटने के दौरान यह पहले से ही सी में बैकफ़ायर करता है। इसकी हेडर फ़ाइलों पर C फ़ाइल की निर्भरता का प्रतिनिधित्व करने के लिए makeएक आवश्यक makeफ़ाइल को शामिल करने के लिए फ़ाइल को शामिल करने की आवश्यकता होती है , इसलिए बाद में एक परिवर्तन से पहले पुनर्निर्माण का कारण होगा। हालाँकि, चूंकि सी फ़ाइल स्वयं (केवल पुनर्निर्माण) फिर से नहीं बनाई गई है, इसलिए अक्सर लक्ष्य को निर्दिष्ट करने की आवश्यकता होती है.PHONY । सौभाग्य से, GCC उन फ़ाइलों को स्वचालित रूप से बनाने का समर्थन करता है।
जावा में, निर्भरता परिपत्र हो सकती है, और makeप्रारूप में ऑटो-जनरेटिंग क्लास निर्भरता के लिए कोई उपकरण नहीं है । antके Dependकार्य कर सकते हैं, बजाय, वर्ग फ़ाइल को पढ़ने सीधे, जो निर्धारित कक्षाओं यह आयात, और वर्ग फ़ाइल को नष्ट करता है, तो उनमें से किसी को पुराने हो चुके हैं। इसके बिना, किसी भी गैर-तुच्छ निर्भरता के परिणामस्वरूप आपको बार-बार साफ बिल्ड का उपयोग करने के लिए मजबूर किया जा सकता है, बिल्ड टूल का उपयोग करने के किसी भी लाभ को हटा दिया जाता है।
फ़ाइल नाम में रिक्त स्थान
हालांकि, न तो जावा और न ही सी आपके स्रोत कोड फ़ाइलनामों में रिक्त स्थान का उपयोग करने के लिए प्रोत्साहित करते हैं, इसमें makeसमस्या तब भी हो सकती है जब रिक्त स्थान फ़ाइल पथ में हों। उदाहरण के लिए, यदि आपका स्रोत कोड मौजूद है, तो विचार करें C:\My Documents\My Code\program\src। यह तोड़ने के लिए पर्याप्त होगा make। ऐसा इसलिए है क्योंकि makeफाइलनामों को तार के रूप में माना जाता है। antपथ को विशेष वस्तु मानते हैं।
बिल्ड के लिए स्कैनिंग फ़ाइलें
makeप्रत्येक लक्ष्य के लिए कौन सी फाइलें बनानी हैं, यह स्पष्ट रूप से निर्धारित करने की आवश्यकता है। antएक फ़ोल्डर को निर्दिष्ट करने की अनुमति देता है जो स्रोत फ़ाइलों के लिए ऑटो-स्कैन किया जाना है। यह एक छोटी सी सुविधा की तरह लग सकता है, लेकिन विचार करें कि जावा में प्रत्येक नए वर्ग को एक नई फ़ाइल की आवश्यकता होती है। प्रोजेक्ट में फ़ाइलें जोड़ना एक बड़ी परेशानी बन सकता है।
और सबसे बड़ी समस्या make:
बनाना POSIX- निर्भर है
जावा का आदर्श वाक्य "हर जगह एक बार चलने वाला संकलन" है। लेकिन उस संकलन को POSIX- आधारित सिस्टमों तक सीमित करना, जिसमें जावा समर्थन वास्तव में सबसे खराब है, इरादा नहीं है।
नियमों का निर्माण makeअनिवार्य रूप से छोटी bashलिपियों में है। हालांकि एक बंदरगाह हैmake विंडोज है, लेकिन इसे ठीक से काम करने के लिए, इसे एक पोर्ट के साथ बंडल करना होगा bash, जिसमें फाइल सिस्टम के लिए एक POSIX इम्यूलेशन परत शामिल है।
यह दो किस्मों में आता है:
MSYS जो POSIX अनुवाद को फ़ाइल पथों तक सीमित करने की कोशिश करता है, और इसलिए विशेष रूप से इसके लिए नहीं बनाए गए बाहरी उपकरणों को चलाने पर अप्रिय गोच हो सकता है।
cygwinजो एक पूर्ण POSIX अनुकरण प्रदान करता है। हालाँकि, परिणामी कार्यक्रम अभी भी उस अनुकरण परत पर निर्भर हैं।
इस कारण से, विंडोज पर, मानक बिल्ड टूल बिल्कुल भी नहीं है make, बल्कि MSBuild, जो कि XML- आधारित टूल भी है, सिद्धांत के करीब हैant ।
इसके विपरीत, antजावा में बनाया गया है, हर जगह चल सकता है, और इसमें आंतरिक उपकरण शामिल हैं, जिन्हें "कार्य" कहा जाता है, फाइलों में हेरफेर करने और एक प्लेटफॉर्म-स्वतंत्र तरीके से कमांड निष्पादित करने के लिए। यह पर्याप्त रूप से बहुमुखी है कि आप वास्तव में उपयोग करने की antतुलना में विंडोज में सी प्रोग्राम बनाने का एक आसान समय बना सकते हैं make।
और एक आखिरी नाबालिग:
यहां तक कि सी कार्यक्रमों का उपयोग मूल रूप से नहीं करते हैं
आप शुरू में इसे नोटिस नहीं कर सकते हैं, लेकिन सी प्रोग्राम आमतौर पर ए के साथ शिप नहीं किए जाते हैं Makefile। उन्हें एक CMakeLists.txt, या एक bashकॉन्फ़िगरेशन स्क्रिप्ट के साथ भेज दिया जाता है , जो वास्तविक उत्पन्न करता है Makefile। इसके विपरीत, एक जावा प्रोग्राम के स्रोत का उपयोग करके बनाया antके साथ एक भेज दिया जाता है antस्क्रिप्ट पहले से बने। A Makefileअन्य उपकरणों का एक उत्पाद है - यह है कि makeअपने आप एक बिल्ड टूल बनने के लिए कितना अनुपयुक्त है।antस्टैंडअलोन है, और किसी भी अतिरिक्त आवश्यकताओं या निर्भरता के बिना आपकी जावा बिल्ड प्रक्रिया के लिए आपको जो कुछ भी चाहिए, उससे संबंधित है।
जब आप antकिसी भी प्लेटफ़ॉर्म पर चलते हैं , तो जस्ट वर्क्स (tm)। आप ऐसा नहीं कर सकते make। यह अविश्वसनीय रूप से मंच और विन्यास पर निर्भर है।
make। और एक मेकफाइल होना जो केवल एक प्रणाली पर काम करता है क्रॉस-प्लेटफॉर्म भाषा के लिए बहुत अच्छा नहीं है।