2010-06-22 7 views
12

मैं निम्नलिखित पुनरावर्ती makefile है:जब पैटर्न शासन की घोषणा के रूप में जाली, यह ट्रिगर नहीं है

.PHONY: all clean 

%.subdir: 
    $(MAKE) -C src $* 
    $(MAKE) -C dict $* 

all: all.subdir 

clean: clean.subdir 

और यह ठीक काम करता है:

$ make all 
make -C src all 
make[1]: Entering directory `/or-1.3.6-fix/src' 
make[1]: Nothing to be done for `all'. 
make[1]: Leaving directory `/or-1.3.6-fix/src' 
make -C dict all 
make[1]: Entering directory `/or-1.3.6-fix/dict' 
make[1]: Nothing to be done for `all'. 
make[1]: Leaving directory `/or-1.3.6-fix/dict' 

लेकिन यह %.subdir परिभाषित करने के लिए अधिक तार्किक होगा फोनी के रूप में नियम:

.PHONY: all clean all.subdir clean.subdir 

और अब मैं काम करना बंद कर देता हूं जैसा कि मैं चाहता हूं:

$ make all 
make: Nothing to be done for `all'. 
$ make -d all 
... 
Updating goal targets.... 
Considering target file `all'. 
File `all' does not exist. 
    Considering target file `all.subdir'. 
    File `all.subdir' does not exist. 
    Finished prerequisites of target file `all.subdir'. 
    Must remake target `all.subdir'. 
    Successfully remade target file `all.subdir'. 
Finished prerequisites of target file `all'. 
Must remake target `all'. 
Successfully remade target file `all'. 
make: Nothing to be done for `all'. 

क्या कोई मुझे समझा सकता है (या दस्तावेज़ीकरण करने के लिए मुझे बेहतर बिंदु क्यों)?

उत्तर

17

आप सही हैं, यह सबडीर नियमों को फोन के रूप में परिभाषित करने के लिए और अधिक समझदारी होगी। लेकिन बनाओ PHONY लक्ष्यों के लिए निहित नियमों पर विचार नहीं करता है, इसलिए आपको उस नियम को फिर से लिखना होगा। मैं निम्नलिखित सुझाव:

SUBDIR_TARGETS = all.subdir clean.subdir 
.PHONY: all clean $(SUBDIR_TARGETS) 

$(SUBDIR_TARGETS): %.subdir: 
    $(MAKE) -C src $* 
    $(MAKE) -C dict $* 

all: all.subdir 
clean: clean.subdir 
+1

अच्छा संकेत के लिए धन्यवाद! बहुत अच्छा। मैं थोड़ा और अधिक प्रसन्नता करूंगा और 'PHONY_TARGETS: = सभी साफ' कहूंगा और फिर 'PHONY: $ (PHONY_TARGETS) $ (adduffix .subdir, $ (PHONY_TARGETS)) ' –

+1

उन दो कोलन दिखने वाले लक्ष्य/dep के लिए प्रलेखन मिला यदि कोई दिलचस्पी लेता है तो लाइन: https://www.gnu.org/software/make/manual/html_node/Static-Usage.html#Static-Usage – solstice333

7

आप जीएनयू बनाने का उपयोग कर रहे हैं, तो the official Make manual

मेक कुछ नहीं कर रहा है, क्योंकि यह करने के लिए किसी भी फाइल नहीं देखा है (क्योंकि वे सभी जाली हैं) देखें। सुनिश्चित करें कि आपका डिफ़ॉल्ट निहित लक्ष्य नकली नहीं है जिससे कि निर्माण करने के लिए कुछ बनाया जा सके।

अद्यतन: मेकअप मैनुअल की this section से:

चूंकि यह जानता है कि जाली लक्ष्य वास्तविक फ़ाइलें है कि अन्य फ़ाइलों से पुनर्निर्माण हो सकता है नाम नहीं, स्किप के के लिए अंतर्निहित नियम खोज करते हैं फोनी लक्ष्य।

इसलिए, आपके निहित लक्ष्यों की खोज कभी नहीं की जाती क्योंकि वे नकली हैं।

आप जो भी कर रहे हैं उसे हासिल कर सकते हैं। इसे आज़माएं:

SUBDIRS := all clean 
.PHONY: $(SUBDIRS) 

$(SUBDIRS): 
    echo $(MAKE) -C src [email protected] 
    echo $(MAKE) -C dict [email protected] 
+0

उत्तर के लिए धन्यवाद। मैंने डॉकू पढ़ा है, इसलिए यदि आप मुझे डॉकू से सटीक उद्धरण इंगित करते हैं, तो मैं आपके उत्तर को रेट कर सकता हूं। गैर-फोनी डिफ़ॉल्ट लक्ष्य के बारे में आपके सुझाव पर अधिक गलत है। –

+0

उत्तर को वित्तीय नियमों और निहित लक्ष्यों के साथ-साथ समस्या तक पहुंचने के वैकल्पिक तरीके के बारे में एक विशिष्ट अनुभाग के साथ अद्यतन किया गया है। – bta

+0

धन्यवाद, अब बहुत बेहतर दिखता है। –

7

जीएनयू आवश्यक लक्ष्यों को स्पष्ट रूप से .PHONY के रूप में घोषित पहले से ही अन्य उत्तर है, जो भी इस के लिए कुछ उपाय प्रदान की में कहा गया है कि बनाने के।

इस अतिरिक्त उत्तर में मैं एक परिवर्तन जोड़ना चाहता हूं, जैसा कि मैंने परीक्षण किया है, "फोनी" व्यवहार को जोड़ती है, यानी यह लक्ष्य हर बार ट्रिगर होता है चाहे कोई भी नाम की फाइल मौजूद न हो (उन्हें अनदेखा किया जाता है)। विकल्प इस प्रकार है:

.PHONY: phony_explicit 

phony_explicit: 

%.subdir: phony_explicit 
    $(MAKE) -C src $* 
    $(MAKE) -C dict $* 

यह परिसर पर काम करता है कि केवल स्पष्ट लक्ष्य .PHONY, जो कुछ भी एक इसलिए स्पष्ट जाली लक्ष्य पर निर्भर करता है के रूप में स्थापित किया जा सकता है, जबकि खुद को जाली विशेषताएं (सभी मेरी जानकारी के लिए) बहुत इनहेरिट है । एक अंतर्निहित, यानी पैटर्न मिलान लक्ष्य %.subdir जैसा कि ऊपर .PHONY (जो असंभव है क्योंकि यह स्वयं स्पष्ट नहीं है) में जोड़ा जा रहा है, फिर भी इसके प्रीरेक्साइट फोनी phony_explicit के माध्यम से नकली बन रहा है।

यह प्रत्येक नियम - पैटर्न मिलान के माध्यम से भी अंतर्निहित है - जो इसकी पूर्व शर्त में एक स्पष्ट फोनी लक्ष्य (यानी एक लक्ष्य जो .PHONY में जोड़ा गया है) इस निर्भरता के माध्यम से एक नकली शैली में भी निष्पादित होता है (हर बार, अनजाने में फाइल सिस्टम के गलती से एक फ़ाइल नाम के साथ फाइल है)।

दरअसल जीएनयू प्रलेखन का उल्लेख है FORCEtarget, जो जीएनयू के कुछ संस्करणों है कि एक .PHONY लक्ष्य नहीं करते हैं में आंशिक रूप से emulates .PHONY व्यवहार करते हैं। यहां प्रस्तुत विकल्प इस FORCE लक्ष्य एप्रोच का उपयोग करता है, फिर भी क्योंकि जीएनयू बनाने का उपयोग किया जाता है, यह FORCE को .PHONY के रूप में लक्षित करता है जो संभावित नामों की वास्तविक फ़ाइलों से संबंधित संभावित संघर्षों से परहेज करता है।

इस समाधान के साथ

भी एक

touch clean.subir; make clean.subdir 

make -C src clean 
make -C dist clean 

के वांछित मंगलाचरण क्या इस विकल्प का एक संभावित समर्थक बिंदु हो सकता है निकलेगा कि यह clean.subdir और all.subdir की कोई स्पष्ट घोषणा की जरूरत है , लेकिन वास्तव में अंतर्निहित %.subdir पैटर्न मिलान का उपयोग कर रहा है।

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