makefile
चर
खोज…
एक चर को संदर्भित करना
एक चर में संग्रहित मूल्य का उपयोग करने के लिए, कोष्ठक या घुंघराले ब्रेस से घिरे चर नाम के बाद डॉलर चिह्न का उपयोग करें।
x = hello
y = $(x)
# y now contains the value "hello"
y = ${x}
# parentheses and curly braces are treated exactly the same
यदि एक चर का नाम केवल एक वर्ण लंबा है, तो कोष्ठक / ब्रेसिज़ को छोड़ा जा सकता है (जैसे, $x
)। यह अभ्यास स्वचालित चर (नीचे देखें) के लिए उपयोग किया जाता है, लेकिन सामान्य-उद्देश्य वाले चर के लिए अनुशंसित नहीं है।
सरल-विस्तारित चर
बस-विस्तारित चर पारंपरिक प्रोग्रामिंग भाषाओं से चर की तरह व्यवहार करते हैं। दाईं ओर की अभिव्यक्ति का मूल्यांकन किया जाता है, और परिणाम चर में संग्रहीत किया जाता है। यदि दाईं ओर के हिस्से में एक चर संदर्भ होता है, तो असाइनमेंट होने से पहले उस चर का विस्तार किया जाता है।
x := hello
y := $(x)
# Both $(x) and $(y) will now yield "hello"
x := world
# $(x) will now yield "world", and $(y) will yield "hello"
एक वैकल्पिक रूप डबल-कोलोन असाइनमेंट का उपयोग करना है:
x ::= hello
सिंगल- और डबल-कोलोन असाइनमेंट समकक्ष हैं। POSIX मानक को केवल ::=
रूप का उल्लेख करता है, इसलिए सख्त मानकों के अनुपालन वाले कार्यान्वयन एकल-कोलोन संस्करण का समर्थन नहीं कर सकते हैं।
पुनरावर्ती-विस्तारित चर
एक पुनरावर्ती-विस्तारित चर को परिभाषित करते समय, दाईं ओर की सामग्री को-के रूप में संग्रहीत किया जाता है। यदि कोई चर संदर्भ मौजूद है, तो संदर्भ स्वयं संग्रहीत होता है (चर का मान नहीं)। चर संदर्भ का विस्तार करने के लिए प्रतीक्षा करें जब तक कि चर वास्तव में उपयोग नहीं किया जाता है।
x = hello
y = $(x)
# Both $(x) and $(y) will now yield "hello"
x = world
# Both $(x) and $(y) will now yield "world"
इस उदाहरण में, y
की परिभाषा पुनरावर्ती है। $(x)
का संदर्भ तब तक विस्तारित नहीं होता जब तक कि $(y)
का विस्तार नहीं हो जाता। इसका मतलब यह है कि जब भी x
का मान बदलता है, तो y
का मान भी बदल जाएगा।
पुनरावर्ती-विस्तारित चर एक शक्तिशाली लेकिन आसानी से गलत समझा जाने वाला उपकरण है। उनका उपयोग उन निर्माणों को बनाने के लिए किया जा सकता है जो टेम्पलेट या फ़ंक्शंस से मिलते-जुलते हैं, या यहां तक कि स्वचालित रूप से एक मेकफाइल के कुछ हिस्सों को उत्पन्न करने के लिए। वे हार्ड-टू-डीबग समस्याओं का स्रोत भी हो सकते हैं। जब आवश्यक हो केवल पुनरावर्ती-विस्तारित चर का उपयोग करने के लिए सावधान रहें।
स्वचालित चर
एक व्यक्तिगत नियम के संदर्भ में, मेक स्वचालित रूप से कई विशेष चर को परिभाषित करता है। ये चर एक मेकफाइल में प्रत्येक नियम के लिए एक अलग मान हो सकते हैं और लेखन नियमों को सरल बनाने के लिए डिज़ाइन किए गए हैं। ये चर केवल एक नियम के नुस्खा भाग में उपयोग किए जा सकते हैं।
परिवर्तनशील | विवरण |
---|---|
$@ | नियम के लक्ष्य का फ़ाइल नाम |
$% | लक्ष्य सदस्य का नाम, यदि नियम का लक्ष्य एक संग्रह है |
$< | पहली शर्त का फ़ाइल नाम |
$^ | सभी आवश्यक शर्तों की सूची |
$? | उन सभी पूर्वापेक्षाओं की सूची जो लक्ष्य से नई हैं |
$* | एक अंतर्निहित या पैटर्न नियम का "स्टेम" |
निम्न उदाहरण एक सामान्य नियम उत्पन्न करने के लिए स्वचालित चर का उपयोग करता है। यह निर्देश एक ही नाम के साथ .c फ़ाइल से .o फ़ाइल बनाने का तरीका बताता है। चूँकि हम प्रभावित फ़ाइलों के विशिष्ट नाम को नहीं जानते हैं, $@
हम आउटपुट फ़ाइल के नाम के लिए प्लेसहोल्डर के रूप में $@
उपयोग करते हैं और $^
पूर्वापेक्षा सूची के लिए प्लेसहोल्डर के रूप में (इस मामले में, इनपुट फ़ाइलों की सूची)।
%.o: %.c
cc -Wall $^ -c $@
सशर्त चर असाइनमेंट
?=
ऑपरेटर एक ऐसा एक्सटेंशन है जो =
जैसा व्यवहार करता है, सिवाय इसके कि असाइनमेंट केवल तब होता है जब चर पहले से सेट नहीं होता है।
x = hello
x ?= world
# $(x) will yield "hello"
मौजूदा चर के लिए पाठ लागू करना
+=
ऑपरेटर एक सामान्य विस्तार है जो निर्दिष्ट सामग्री को चर के अंत में जोड़ता है, जिसे एक स्थान द्वारा अलग किया जाता है।
x = hello
x += world
दाएं हाथ के पक्ष में चर संदर्भों का विस्तार किया जाएगा यदि और केवल मूल चर को एक साधारण रूप से विस्तारित चर के रूप में परिभाषित किया गया हो।