2010-07-13 13 views
22

से प्रभावित मैं एक makefile कि कमांड लाइनफोर्स GNU संकलन परिभाषा

make OPTION_1=1 

मूल्य के आधार पर पर विकल्प लेता है यह वस्तुओं के एक सबसेट के लिए अतिरिक्त संकलक परिभाषाएँ जोड़ देगा है वस्तुओं के पुनर्निर्माण के लिए बनाते हैं।

ifeq ($(OPTION_1), 1) 
CC_FLAGS += -DOPTION_1_ON 
endif 

परिभाषा में परिवर्तन शामिल हेडर फाइल की सामग्री को प्रभावित करता है - एक ठूंठ या एक कार्यान्वयन वस्तु फ़ाइलों के संपर्क में है।

मैं इस विकल्प के द्वारा 'प्रभावित' फ़ाइलों को पुनर्निर्माण कैसे कर सकता हूं?

उत्तर

39

मैं एक फ़ाइल का उपयोग इस तरह के विकल्पों में से अंतिम मान, इस तरह याद करने के लिए:

.PHONY: force 
compiler_flags: force 
    echo '$(CC_FLAGS)' | cmp -s - [email protected] || echo '$(CC_FLAGS)' > [email protected] 

cmp || echo सा मतलब है फ़ाइल compiler_flags केवल छुआ है जब सेटिंग में बदलाव होने, इसलिए अब आप

की तरह कुछ लिख सकते हैं
$(OBJECTS): compiler_flags 

एक $(OBJECTS) के पुनर्निर्माण जब भी संकलक झंडे को बदलने का कारण है। Compiler_flags के लिए नियम हर बार निष्पादित किया जाएगा, लेकिन $(OBJECTS) का पुनर्निर्माण केवल तभी ट्रिगर किया जाएगा जब compiler_flags फ़ाइल वास्तव में संशोधित की गई थी।

+0

उदाहरण के लिए धन्यवाद। शर्म की बात यह है कि यह एक temp फ़ाइल के बिना ऐसा करने के लिए संभव नहीं दिखता है। – Oliver

+0

'compiler_flags.tmp' बनाने से बचने के लिए संपादित, यह थोड़ा साफ दिखता है। मुझे संदेह है कि इसका मतलब यह नहीं है कि आपका क्या मतलब है। सेटिंग को याद रखने के लिए * कुछ * फ़ाइल बनाने के आसपास कोई रास्ता नहीं है, क्योंकि कई आमंत्रणों में राज्य को संरक्षित करने का कोई अन्य तरीका नहीं है। – slowdog

+1

यदि आपका निर्माण बड़ा हो जाता है तो यह एक टैड अक्षम से अधिक है। यह एक शेल आमंत्रण का तात्पर्य है और एक फ़ाइल को अद्यतित निर्माण के लिए भी पढ़ा जाता है। इन परिस्थितियों में, _filename_ में कंपाइलर झंडे को एन्कोड करें। – bobbogo

0

उन्हें एक लक्ष्य में डाल दें और प्रत्येक फ़ाइल पर कॉल स्पर्श करें।

संबंधित मुद्दे