2010-08-03 7 views
5

चलाता है तो मेरे पास एक प्रोजेक्ट है जिसका मेकफ़ाइल विशेष रूप से जीएनयू मेक के लिए विशेषताओं का उपयोग करता है। अफसोस की बात है कि ऐसे प्लेटफ़ॉर्म हैं जिन्हें हमें समर्थन देना चाहिए जहां make चलाते समय जीएनयू बनाना अभी भी डिफ़ॉल्ट नहीं है।पता लगाना (गैर-) जीएनयू जब कोई 'मेक'

मेरे सहयोगियों में से एक इस द्वारा काटा गया था, जब एक गैर-जीएनयू कार्यान्वयन हमारे कोड को सही तरीके से बनाने में विफल रहा (यह एक स्वचालित चर को एक खाली स्ट्रिंग में विस्तारित करता है)। मैं इसके बजाय एक स्पष्ट त्रुटि संदेश उत्पन्न करके, फिर से होने से रोकना चाहता हूं।

गैर-जीएनयू बनाने से जीएनयू बनाने में अंतर करने के लिए Makefile में मैं क्या लिख ​​सकता हूं, एक स्पष्ट त्रुटि प्रिंट कर सकता हूं, और बाहर निकल सकता हूं?

मैं पहले से ही GNUmakefile करने के लिए अपने असली makefile का नाम बदलने, और Makefile में एक छोटा सा ठूंठ डालने में कोई समाधान खोज निकाला है, लेकिन मैं नहीं बल्कि कुछ और था प्रत्यक्ष।

बीटा और दान मोल्डिंग द्वारा जवाब वास्तव में अच्छा और सरल हैं, लेकिन AIX 6.1 पर, मेकअप कार्यान्वयन उनमें से या तो संभाल नहीं कर सकते हैं:

$ cat testmake 

foo: 
     touch foo 

ifeq ($(shell $(MAKE) -v | grep GNU),) 
$(error this is not GNU Make) 
endif 

ifeq "${MAKE_VERSION}" "" 
$(info GNU Make not detected) 
$(error ${MIN_MAKE_VER_MSG}) 
endif 


$ /usr/bin/make -f testmake 
"testmake", line 5: make: 1254-055 Dependency line needs colon or double colon operator. 
"testmake", line 6: make: 1254-055 Dependency line needs colon or double colon operator. 
"testmake", line 7: make: 1254-055 Dependency line needs colon or double colon operator. 
"testmake", line 8: make: 1254-055 Dependency line needs colon or double colon operator. 
"testmake", line 11: make: 1254-055 Dependency line needs colon or double colon operator. 
"testmake", line 12: make: 1254-055 Dependency line needs colon or double colon operator. 
"testmake", line 13: make: 1254-055 Dependency line needs colon or double colon operator. 
make: 1254-058 Fatal errors encountered -- cannot continue. 

मैं दोनों पुरातन और आधुनिक पर इसी तरह के मुद्दों में चलाने सन के निर्माण के संस्करण (सोलारिस 8 & 10)। वह कम महत्वपूर्ण है, लेकिन प्रबंधन करना अच्छा होगा।

+0

जीएनयू बनाने का कौन सा संस्करण आप चल रहे हैं? – bta

+0

आप सही हैं। जिस दृष्टिकोण को मैंने लिया था वह जीएनयूइज्म पर बहुत अधिक निर्भर था, इसलिए गैर-जीएनयू कार्यान्वयन के साथ * सभी * काम नहीं कर सकता है। अब मैं संदेह कर रहा हूं कि केवल एक मेकफ़ाइल (यानी शेल स्क्रिप्ट या अन्य बाहरी संसाधनों का उपयोग किए बिना) का उपयोग करके अपना लक्ष्य प्राप्त करने का एक पोर्टेबल तरीका है। मैंने अपना जवाब रद्द कर दिया है। –

उत्तर

2

मुझे किसी भी आंतरिक सुविधा के बारे में पता नहीं है जो निश्चित रूप से GNUMake के लिए अद्वितीय है, लेकिन यहां एक क्लज है: "मेक-वी" पर कॉल करें और "जीएनयू" के लिए आउटपुट पार्स करें (क्योंकि ऐसा लगता है कि एक गैर-जीएनयू मेक एक जीएनयू को MAKE सेट होता है के साथ):

ifeq ($(shell $(MAKE) -v | grep GNU),) 
$(error this is not GNU Make) 
endif 

संपादित करें:
की तरह दान मोल्डिंग, मैं इस समस्या की असली आकार देखने के लिए शुरू कर रहा हूँ। लिखित के रूप में, इसे मेकफ़ाइल की आवश्यकता होती है जो मेक के सभी संस्करणों में वाक्य रचनात्मक रूप से सही है। मेरे पास सन मेक तक पहुंच नहीं है (और मुझे इसके लिए मैनुअल नहीं मिल रहे हैं) इसलिए मुझे नहीं पता कि यह भी संभव है, या इसे लिखने के तरीके के बारे में, या अगर मैंने किया तो इसका परीक्षण कैसे करें।

लेकिन मैं एक ऐसा दृष्टिकोण सुझा सकता हूं जो काम कर सके। हो सकता है कि कुछ इस तरह सार्वभौमिक बनाया जा सकता है:

default: 
    ./runGNUMake.pl 

यह है कि, कि पूरे makefile है। फिर पर्ल (या बाश, या जो कुछ भी आपको पसंद है) में runGNUMake स्क्रिप्ट लिखें जो मेरे "मेक-वी" क्लड की तरह कुछ करेगी और फिर या तो त्रुटि संदेश मुद्रित करें या "मेक-एफ रियलमेकफाइल" चलाएं।

+0

मैंने इसे बाहरी स्क्रिप्ट में करने का विचार किया था जो बनाने से पहले भाग गया था, लेकिन मैंने इसे मेकफ़ाइल में एम्बेड करने का विचार नहीं किया था। – Novelocrat

+0

AIX 6.1 पर काम नहीं करता है :-( – Novelocrat

+0

नोवेलोक्रेट: वास्तव में? यह कैसे असफल हो जाता है, क्या गैर-जीएनयू बनाते हैं जो एक 'मेक' होता है जो एक जीएनयू मेक पर सेट होता है, या एक जीएनयू बनता है गैर-जीएनयू? (मुझे लगता है कि हम क्रमशः उन "झूठी सकारात्मक" और "झूठी नकारात्मक" को बुला सकते हैं।) – Beta

6

के रूप में बताया गया है, जीएनयू GNUmakefile के लिए make चेकों makefile या Makefile से पहले, मैं एक तुच्छ ठीक उपयोग किया है इस तरह के रूप में आप का वर्णन किया, एक डिफ़ॉल्ट (प्रलोभन) Makefile कि एक त्रुटि/चेतावनी का कारण बनता है:

default: 
    @echo "This requires GNU make, run gmake instead" 
    exit 70 

जीएनयू make documentationGNUmakefile नाम का उपयोग करने की सिफारिश करता है जब Makefile जीएनयू विशिष्ट बनाता है, तो यह मेरा पसंदीदा समाधान है।

प्लेटफ़ॉर्म पर जहां देशी make एक अलग मेकफ़ाइल नाम पसंद करते हैं, तो आप इस पर भिन्नता कर सकते हैं, उदा।फ्रीबीएसडी पर मेरे पास BSDmakefile में उपरोक्त डिस्को है जिसका उपयोग Makefile वरीयता में किया जाता है (इस प्रकार सिस्टम को make को मेरे निर्माण को मैंगलिंग से रोकता है)। एएक्स या सोलारिस make के पास एक वैकल्पिक नाम नहीं है जिसका आप इस तरह उपयोग कर सकते हैं।

एक रैपर Makefile के साथ एक समस्या जो जीएनयू make पर कॉल करने का प्रयास करती है, सभी तर्कों को पार कर रही है।

एक उचित रूप में पोर्टेबल परीक्षण (अब तक, मैं इसे प्राचीन OSF1 का मिश्रण पर काम करने की मिल गया है, बीएसडी और Solaris सिस्टम) आप SOMETHING=$(shell ...) का उपयोग करता है, तो जीएनयू make चल रहा है पता लगाने के लिए कर सकते हैं, गैर जीएनयू संस्करणों SOMETHING सेट नहीं करेगा । deferred evaluation of variables की वजह से, आप इसे जितनी आसानी से उम्मीद की जा सकती है उतनी आसानी से इसका उपयोग नहीं कर सकते हैं। $() (यानी $(shell foo)function के बजाय एक चर/मैक्रो नाम के रूप में विस्तारित होने पर रिक्त स्थान के साथ मैक्रो नामों को चुपचाप कार्यान्वित करने पर निर्भर करता है, भले ही उस कार्यान्वयन में ऐसे नाम के असाइनमेंट में त्रुटि हो)।

केवल पोर्टेबल जिस तरह से आप एक स्पष्ट त्रुटि मुद्रित कर सकते हैं, एक डमी लक्ष्य है कि हमेशा चलाने के लिए ऊपर चाल का उपयोग कर रहा है:

GNUMAKE=$(shell echo GNUMAKE) 

default: gnumake all 

gnumake: 
     @[ "$(GNUMAKE)" = "GNUMAKE" ] || { echo GNU make required ; exit 70; } 

इसका मतलब यह है कि आप एक POSIX sh खोल दिया है।

(मैं परीक्षण जो $(MAKE) -v असफल जब दोनों प्रणाली और GNU "make", प्रणाली make आप के खिलाफ conspires और invokes जीएनयू make ... आप कुछ ध्यान से वातावरण चर की जाँच आवश्यकता होगी PATH कहा जाता है बनाने के निरीक्षण को देखा है, प्रत्येक मामले को संभालने के लिए MAKE और संभवतः SHELL।)