makefile
GNU पैटर्न नियम
खोज…
बुनियादी पैटर्न नियम
लक्ष्य में एकल %
वर्ण द्वारा एक पैटर्न नियम का संकेत दिया जाता है। %
एक गैर-रिक्त स्ट्रिंग से मेल खाता है जिसे स्टेम कहा जाता है। फिर स्टेम को हर उस %
लिए प्रतिस्थापित किया जाता है जो पूर्वावश्यक सूची में दिखाई देता है।
उदाहरण के लिए, यह नियम:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
.o
में समाप्त होने वाले किसी भी लक्ष्य से मेल खाएगा। यदि लक्ष्य foo.o
था, तो स्टेम foo
होगा और यह foo.c
को foo.o
संकलित करेगा। लक्ष्य और पूर्वापेक्षाएँ स्वचालित चर का उपयोग करके प्राप्त की जा सकती हैं।
कई पैटर्न नियमों से मेल खाते लक्ष्य
यदि कोई लक्ष्य कई पैटर्न नियमों से मेल खाता है, तो बनाने वाला उसी का उपयोग करेगा जिसका पूर्वापेक्षा मौजूद है या बनाया जा सकता है। उदाहरण के लिए:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
foo.o
लिए foo.c
संकलित करेगा या foo.s
लिए foo.o
को इकट्ठा foo.o
, जिसके आधार पर foo.c
या foo.s
मौजूद है।
यदि कई नियमों में किसी और चीज की मौजूदगी है या बनाई जा सकती है, तो नियम उस नियम का उपयोग करेगा जो सबसे छोटे तने से मेल खाता है। उदाहरण के लिए:
f%r:
@echo Stem is: $*
fo%r:
@echo Stem is: $*
लक्ष्य को foo.bar
बनाने के लिए दूसरे नियम का उपयोग करेगा, Stem is: o.ba
गूंज Stem is: o.ba
यदि कई नियम सबसे छोटे तने से मेल खाते हैं, तो मेकफाइल में पहले का उपयोग किया जाएगा।
पैटर्न नियमों में निर्देशिकाएँ
यदि लक्ष्य पैटर्न में स्लैश नहीं होते हैं, तो मिलान से पहले बनाने का प्रयास कर रही निर्देशिका से निर्देशिका भाग को हटा देगा। फिर डायरेक्टरी को स्टेम के सामने रखा जाएगा। जब स्टेम का उपयोग लक्ष्य नाम और पूर्वापेक्षाएँ बनाने के लिए किया जाता है, तो निर्देशिका का हिस्सा उससे छीन लिया जाता है, स्टेम को %
स्थान पर प्रतिस्थापित किया जाता है और अंत में निर्देशिका को स्ट्रिंग के सामने रखा जाता है। उदाहरण के लिए:
foo%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
के साथ lib/foobar.o
मिलान करेंगे:
- स्टेम (
$*
):lib/bar
- लक्ष्य नाम (
$@
):lib/foobar.o
- आवश्यक शर्तें (
$<
,$^
):lib/foobar.c
इस उदाहरण में, एक lib/foo%.o
नियम, foo%.o
नियम पर पूर्ववर्तीता लेगा क्योंकि यह एक छोटे स्टेम से मेल खाता है।
कई लक्ष्यों के साथ पैटर्न नियम
पैटर्न नियमों में कई लक्ष्य हो सकते हैं, लेकिन सामान्य नियमों के विपरीत, नुस्खा सभी लक्ष्यों को बनाने के लिए जिम्मेदार है। उदाहरण के लिए:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o
$(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o
एक वैध नियम है, जो दोनों डिबग का निर्माण करेगा और वस्तुओं को जारी करेगा जब उनमें से एक का निर्माण करना होगा। अगर हमने कुछ ऐसा लिखा है:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
यह तब काम करेगा जब केवल एक debug/*.o
या release/*.o
का निर्माण किया गया हो, लेकिन यह केवल पहला लक्ष्य बनाएगा (और दूसरे को अप-टू-डेट माना जाएगा) जब दोनों का निर्माण किया जाना है।