जवाबों:
आपके पास अपने मेकफाइल के बाहर से वैरिएबल सेट करने के लिए कई विकल्प हैं:
पर्यावरण से - प्रत्येक पर्यावरण चर एक नाम और मूल्य के साथ एक बदलावशील चर में बदल जाता है।
आप -e
विकल्प (उर्फ --environments-override
) को भी सेट करना चाह सकते हैं , और आपके पर्यावरण चर, मेकफाइल में किए गए असाइनमेंट को ओवरराइड कर देंगे (जब तक कि ये असाइनमेंट स्वयं override
निर्देश का उपयोग नहीं करते हैं । हालांकि, यह अनुशंसित नहीं है, और यह ?=
असाइनमेंट (सशर्त चर) का उपयोग करने के लिए बहुत बेहतर और लचीला है। असाइनमेंट ऑपरेटर, इसका केवल तभी प्रभाव पड़ता है जब चर को अभी तक परिभाषित नहीं किया गया है):
FOO?=default_value_if_not_set_in_environment
ध्यान दें कि कुछ चर पर्यावरण से विरासत में नहीं मिले हैं:
MAKE
स्क्रिप्ट के नाम से प्राप्त होता हैSHELL
या तो मेकफाइल में सेट किया गया है, या डिफॉल्ट के लिए /bin/sh
(औचित्य: कमांड्स मेकफाइल के भीतर निर्दिष्ट किए गए हैं, और वे शेल-विशिष्ट हैं)।कमांड लाइन से - make
लक्ष्य के साथ घुलमिल जाने पर, उसकी कमांड लाइन के हिस्से के रूप में परिवर्तनशील कार्य कर सकते हैं:
make target FOO=bar
लेकिन फिर जब तक आप असाइनमेंट में निर्देश का उपयोग नहीं करेंगे, तब तक मेकफाइल के भीतर परिवर्तन करने के सभी असाइनमेंट को FOO
नजरअंदाज कर दिया जाएगा । (प्रभाव पर्यावरण चर के लिए विकल्प के साथ ही है )।override
-e
पैरेंट मेक से एक्सपोर्ट - अगर आप मेकफिल से मेक कहते हैं, तो आपको आमतौर पर इस तरह से वेरिएबल असाइनमेंट नहीं लिखना चाहिए:
# Don't do this!
target:
$(MAKE) -C target CC=$(CC) CFLAGS=$(CFLAGS)
इसके बजाय, इन चरों को निर्यात करने के लिए बेहतर समाधान हो सकता है। एक चर निर्यात करना इसे हर शेल इनवॉइस के वातावरण में बनाता है, और इन कमांड से कॉल करें इन पर्यावरण चर को ऊपर बताए अनुसार चुनें।
# Do like this
CFLAGS=-g
export CFLAGS
target:
$(MAKE) -C target
आप सभीexport
तर्कों का उपयोग बिना तर्क के भी कर सकते हैं ।
export PROJECT_MAKE_ARGS = CC=$(CC) CFLAGS=$(CFLAGS)
इसे परिभाषित करने और इसे पास करने के लिए हो सकता है make -C folder $(PROJECT_MAKE_FLAGS)
। अगर पर्यावरण को नजरअंदाज करने के लिए लाइब्रेरी के मेफाइल को बताने का कोई तरीका है, तो यह आदर्श (-ई के विपरीत) होगा।
make target FOO=bar
make FOO=bar target
?
सबसे सरल तरीका है:
make foo=bar target
फिर अपने मेकफाइल में आप का उल्लेख कर सकते हैं $(foo)
। ध्यान दें कि यह उप-स्वचालित रूप से प्रचारित नहीं करेगा।
यदि आप उप-मेक का उपयोग कर रहे हैं, तो इस लेख को देखें: एक उप-बनाने के लिए चर का संचार
included
मुख्य मेकफाइल में मेकफिल से आपका तात्पर्य है ?
से मैनुअल :
मेक इन वेरिएबल्स उस वातावरण से आ सकते हैं जिसमें मेक रन किया जाता है। प्रत्येक पर्यावरण चर जो बनाता है जब देखता है कि यह एक ही नाम और मूल्य के साथ एक परिवर्तनशील चर में बदल जाता है। हालाँकि, मेकफाइल में या कमांड तर्क के साथ एक स्पष्ट असाइनमेंट, पर्यावरण को ओवरराइड करता है।
तो आप (bash से) कर सकते हैं:
FOOBAR=1 make
FOOBAR
आपके Makefile में एक चर के परिणामस्वरूप ।
यहां एक और विकल्प का हवाला नहीं दिया गया है जो स्टेलमैन और मैकग्राथ द्वारा जीएनयू मेक बुक में शामिल है (देखें http://www.chemie.fu-berlin.de/chemnet/use/info/make/make_7.html )। यह उदाहरण प्रदान करता है:
archive.a: ...
ifneq (,$(findstring t,$(MAKEFLAGS)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
यदि किसी दिए गए पैरामीटर में यह दिखाई देता है तो यह सत्यापित करना शामिल है MAKEFLAGS
। उदाहरण के लिए .. मान लीजिए कि आप c ++ 11 में थ्रेड्स के बारे में पढ़ रहे हैं और आपने अपना अध्ययन कई फ़ाइलों ( class01
, ..., classNM
) में विभाजित किया है और आप चाहते हैं: सभी को संकलित करें और व्यक्तिगत रूप से चलाएं या एक बार में संकलित करें समय और इसे चलाएं यदि एक ध्वज निर्दिष्ट किया गया है ( -r
उदाहरण के लिए)। तो, आप निम्नलिखित के साथ आ सकते हैं Makefile
:
CXX=clang++-3.5
CXXFLAGS = -Wall -Werror -std=c++11
LDLIBS = -lpthread
SOURCES = class01 class02 class03
%: %.cxx
$(CXX) $(CXXFLAGS) -o $@.out $^ $(LDLIBS)
ifneq (,$(findstring r, $(MAKEFLAGS)))
./$@.out
endif
all: $(SOURCES)
.PHONY: clean
clean:
find . -name "*.out" -delete
उसके बाद, आप:
make -r class02
;make
या बनाएँ make all
;make -r
(मान लें कि उन सभी में कुछ खास तरह के ऐशो-आराम के सामान हैं और आप बस उन सभी का परीक्षण करना चाहते हैं)ऐसा लगता है
कमांड आर्ग्स पर्यावरण चर को अधिलेखित कर देता है
makefile
send:
echo $(MESSAGE1) $(MESSAGE2)
उदाहरण चलाते हैं
$ MESSAGE1=YES MESSAGE2=NG make send MESSAGE2=OK
echo YES OK
YES OK
यदि आप मेकफाइल नामक फाइल बनाते हैं और इस $ (unittest) की तरह एक वैरिएबल जोड़ते हैं तो आप वाइल्डकार्ड के साथ भी मेकफाइल के अंदर इस वैरिएबल का उपयोग कर पाएंगे
उदाहरण :
make unittest=*
मैं BOOST_TEST का उपयोग करता हूं और पैरामीटर --run_test = $ (unittest) को वाइल्डकार्ड देता हूं, तब मैं अपनी अभिव्यक्ति के परीक्षण के लिए नियमित अभिव्यक्ति का उपयोग कर सकूंगा, जो मैं चाहता हूं कि मेरा मेकफाइल चले।
make A='"as df"'