2008-10-14 27 views
8

में "स्विच" करने का अच्छा तरीका मैं काम पर एक अद्यतन निर्माण प्रणाली के साथ प्रयोग कर रहा हूं; वर्तमान में, मैं लक्ष्य मंच के आधार पर कंपाइलर & झंडे सेट करने का एक अच्छा तरीका खोजने का प्रयास कर रहा हूं।मेकफ़ाइल

मैं करना चाहते हैं क्या की तरह

switch $(PLATFORM)_$(BUILD_TYPE) 
    case "Linux_x86_release" 
    CFLAGS = -O3 
    case "Linux_x86_debug" 
    CFLAGS = -O0 -g 
    case "ARM_release" 
    CC = armcc 
    AR = armlink 
    CFLAGS = -O2 -fx 
    ... 

कुछ जो जीएनयू द्वारा समर्थित नहीं है सुनिश्चित है। अब, तो मेरा पहला विचार सिर्फ

-include $(PLATFORM)_$(BUILD_TYPE) 

जो एक बहुत सभ्य समाधान है क्या करना था, तथापि, यह, नहीं है कि मैं लेखन के लिए आगे देख रहा हूँ उल्लेख करने के लिए यह मुश्किल क्या फ़ाइलों के बीच अलग के एक सिंहावलोकन प्राप्त करने के लिए बनाता है & अच्छी 60-80 फ़ाइलों को बनाए रखने, प्रत्येक में परिवर्तनीय परिभाषाओं का एक सेट होता है।

क्या किसी को इसे पूरा करने के लिए एक बेहतर तरीका पता है? अर्थात। किसी अन्य चर के आधार पर झंडे और अन्य विकल्पों का एक सेट सेट करना?

उत्तर

4

एक प्रणाली है जो इसके लिए आप (automake/autoconf) आसान हो सकता करता है पर स्विच किया जा ...

+0

मेरा उपयोग-मामला वास्तव में है कि मेरे पास मेकफ़ाइल-आधारित सिस्टम है जो घटकों का एक बड़ा सेट बनाता है, जिनमें से कुछ ने स्क्रिप्ट को कॉन्फ़िगर किया है जिन्हें ठीक से संचालित करने की आवश्यकता है। बिल्ड सिस्टम प्रति आउटपुट लक्ष्य को $ (arch)-जैसी स्ट्रिंग के साथ अलग रखता है जिसे config.sub पर पास नहीं किया जा सकता है, इसलिए मुझे एक केस स्टेटमेंट चाहिए जो हमारे $ (arch) को --host के मान में परिवर्तित करता है कॉन्फ़िगर स्क्रिप्ट पर पास किया जाना चाहिए। हमें वास्तव में बिल्ड सिस्टम के शीर्ष पर '$ (PLATFORM) _ $ (BUILD_TYPE)' जैसे कुछ से $ (arch) मिलता है। –

6

ऐसे पैरामीटर को कॉन्फ़िगर करना configure स्क्रिप्ट का कार्य होगा।

कहा जा रहा है कि आप conditionals और conditional functions के लिए वाक्यविन्यास देख सकते हैं। उदाहरण के लिए, आप की कोशिश कर सकते हैं:

ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_release) 
    CFLAGS = -O3 
endif 
ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_debug) 
    CFLAGS = -O0 -g 
endif 
+0

हां, लेकिन यह वाक्यविन्यास जीएनयूमेक-विशिष्ट है (मेकफ़ाइल भाषा का पोर्टेबल हिस्सा बहुत छोटा है। लगभग हर गैर-तुच्छ मेकफ़ाइल गैर पोर्टेबल है) – bortzmeyer

+2

अच्छा, या तो जीएमके पर निर्भर करता है और ifeq/endif का उपयोग करता है, या इस पर निर्भर करता है pmake और # if/# endif का उपयोग करें, या bmake पर निर्भर करें और .if/.endif का उपयोग करें, या मेकफ़ाइल-जनरेटर पर निर्भर करें। – ephemient

16

कैसे के बारे में:

CFLAGS_Linux_x86_release  = -O3 
CFLAGS_Linux_x86_debug   = -O0 -g 


CFLAGS = ${CFLAGS_${PLATFORM}_${BUILD}} 
+0

धन्यवाद, साफ चाल। सोलारिस मेकफ़ाइल के लिए भी काम करता है, जो मुझे सोलारिस और लिनक्स पर एक ही मेकफ़ाइल का उपयोग करने की अनुमति देता है। –

4

Makefilegit द्वारा उपयोग किया गया मेकफ़ाइल का एक अच्छा उदाहरण है जो मेकफ़ाइल में गैर-तुच्छ विन्यास कार्य करता है (जैसे मेजबान प्रकार पर स्विच करना)। यह वास्तव में उपयोग करने के लिए काफी पठनीय और उचित रूप से सरल है।

+0

सामान 'ifeq'/'endif' को फ़ाइल [' config.mak.uname'] में स्थानांतरित कर दिया गया है (https://git.kernel.org/cgit/git/git.git/tree/config.mak.uname)। कृपया अपना उत्तर अपडेट करें और कुछ उदाहरण दें। चीयर्स ;-) (नया साल मुबारक हो) – olibre

+3

एह, नहीं, मैं अपने समय को छः साल के पुराने उत्तर को अपडेट करने में नहीं जा रहा हूं क्योंकि गिट डेवलपर्स ने अपनी मेकफ़ाइल बदलने का फैसला किया है। मेरे पास करने के लिए मजेदार चीजें हैं। :) – JesperE

+0

ठीक है, मैं वैसे भी आपके जवाब को ऊपर उठाता हूं। अगर कोई अपडेट देखना चाहता है, तो वह मेरी टिप्पणी पढ़ सकता है। हालांकि मैं आपको अपने उत्तरों को अपडेट करने में कुछ खुशी लेने की सराहना करता हूं ... चीयर्स और नया साल मुबारक हो। – olibre