2010-10-30 6 views
38

मैं लिनक्स और विंडोज़ पर निर्माण के लिए एक ही मेकफ़ाइल रखना चाहता हूं। मैं डिफ़ॉल्ट जीएनयू का उपयोग लिनक्स पर और mingw32- (जीएनयू) विंडोज पर बनाते हैं।मेकफ़ाइल जो विंडोज और यूनिक्स जैसी प्रणालियों के बीच भेद करता है

मैं मेकफ़ाइल को यह पता लगाने के लिए चाहता हूं कि यह विंडोज या लिनक्स पर चल रहा है या नहीं।

clean: 
    del $(DESTDIR_TARGET) 

लेकिन लिनक्स पर:

clean: 
    rm $(DESTDIR_TARGET) 

इसके अलावा, मैं विंडोज (\) और लिनक्स पर अलग निर्देशिका विभाजक उपयोग करना चाहते हैं


उदाहरण के लिए विंडोज पर make clean आदेश की तरह दिखता है (/)।


यह Makefile में विंडोज ऑपरेटिंग सिस्टम का पता लगाने के लिए संभव है?

पुनश्च: मैं विंडोज पर लिनक्स का अनुकरण नहीं करना चाहते (cygwin आदि)

समान सवाल ही नहीं है: OS detecting makefile, लेकिन मैं इस सवाल का जवाब यहाँ नहीं मिला।

+4

विंडोज दोनों स्लैश "/" और "\" बराबर हैं संभाल करने में सक्षम है। – Ency

+0

यदि यह एक पर्याप्त परियोजना के लिए है, तो मुझे आश्चर्य है कि क्या ऑटोटूल कुछ पोर्टेबिलिटी सामानों को संभालने के लिए लायक होगा? – Cascabel

+0

@ जेफ्रोमी: ऑटोोटूल एक मूल यूनिक्स टूलसेट (sh, m4, sed, rm, ...) मानते हैं। @tomp: उन्हें विंडोज़ (MSYS या GnuWin से) पर भी स्थापित कर सकते हैं और अधिक चुनौतीपूर्ण पोर्टेबिलिटी मुद्दों पर अपने प्रयासों को खर्च कर सकते हैं। – ephemient

उत्तर

38

तरह मैं एक env चर है कि केवल खिड़कियों पर स्थापित किया जाएगा की तलाश द्वारा इस हल होगा।

ifdef SYSTEMROOT 
    RM = del /Q 
    FixPath = $(subst /,\,$1) 
else 
    ifeq ($(shell uname), Linux) 
     RM = rm -f 
     FixPath = $1 
    endif 
endif 

clean: 
    $(RM) $(call FixPath,objs/*) 

क्योंकि% SystemRoot% विंडोज निर्देशिका के लिए पथ सभी विंडोज कंप्यूटरों पर सेट होना चाहिए लेकिन लिनक्स पर नहीं होना चाहिए।

ब्लॉक तब विभिन्न प्रोग्रामों के लिए वैरिएबल सेट अप करते हैं और आगे की स्लैश को बैकस्लाश में परिवर्तित करने के लिए एक फ़ंक्शन सेट अप करते हैं।

जब आप बाहरी कमांड को कॉल करते हैं तो आपको $ (कॉल फिक्सपाथ, पथ) का उपयोग करना होगा (आंतरिक आदेश ठीक काम करते हैं)। तो

objs$(/)* 
कि प्रारूप बेहतर तरह

अगर आप

/ :=/

और: आप की तरह कुछ इस्तेमाल कर सकते हैं।

+2

इसके लिए धन्यवाद। मैं लिनक्स पर विंडोज और जीसीसी पर मिनीजीडब्लू के बीच स्विच करता हूं, यह बहुत अच्छा काम करता है। – Imbue

+1

mingw में यह अपरकेस – SystemParadox

+1

में 'SYSTEMROOT' होना चाहिए, आप कॉमस्पेक की भी जांच कर सकते हैं, जिसे केवल Windows – kebs

7

आपको कुछ फ़ाइलों को हटाने के लिए शायद $ (आरएम) चर का उपयोग करना चाहिए।

3

मैं लिनक्स और विंडोज़ पर निर्माण के लिए एक ही मेकफ़ाइल रखना चाहता हूं।

शायद तुम CMake

36

SystemRoot चाल Windows XP पर मेरे लिए काम नहीं किया है, लेकिन ऐसा किया:

ifeq ($(OS),Windows_NT) 
    #Windows stuff 
    ... 
else 
    #Linux stuff 
    .... 
endif 
संबंधित मुद्दे