2013-02-24 7 views
11

सारांश:
मैं जीएनयू एक यूनिक्स की तरह सिस्टम पर (3.81) बनाने का उपयोग कर रहा है और मैं एक मुद्दा जहां $(wildcard, pattern) समारोह करने में असमर्थ है आई है पहले निष्पादित नुस्खा (संभवतः/स्पष्ट रूप से?) द्वारा उत्पन्न फ़ाइल ढूंढें, जबकि अन्य प्रोग्राम (जैसे एलएस) इसके अस्तित्व को सत्यापित करने में सक्षम हैं। मैं जानना चाहता हूं कि क्यों वाइल्डकार्ड फ़ंक्शन कुछ भी वापस नहीं कर रहा है, जब इसे विस्तारित किया गया है (खाली स्ट्रिंग पर), और जेनरेट की गई फ़ाइल को ढूंढने के लिए मैं इसे कैसे प्राप्त कर सकता हूं।जीएनयू वाइल्डकार्ड समारोह क्रम उत्पन्न फ़ाइलों नहीं मिल रहा है बनाने के

टेस्ट मामला:
निम्नलिखित परीक्षण का मामला समस्या को दिखाता है।
Makefile सामग्री:

.PHONY: build clean 

test: 
    @echo "Creating test file 'test'." 
    @echo "this is a test file" > test 

build: test 
    @echo "Directory contents:" 
    @ls 
    @echo "Test file contents:" 
    @cat test 
    @echo "Wildcard output:" 
    @echo $(wildcard test) 

clean: 
    @rm -f test 

makefile चल रहा है दो बार (तब की सफाई) से पता चलता है कि केवल पर इसके दूसरे भाग करता है यह बनाई गई फ़ाइल का पता लगाने।
आउटपुट:

Creating test file 'test'. 
Directory contents: 
makefile test 
Test file contents: 
this is a test file 
Wildcard output: 

Directory contents: 
makefile test 
Test file contents: 
this is a test file 
Wildcard output: 
test 

पुन: पेश करने के लिए:
सहेजें एक खाली निर्देशिका में makefile, फिर "का निर्माण करते हैं; निर्माण करते हैं; स्वच्छ बनाने के" चलाते हैं।

अनुसंधान:
जिस क्रम में एक लक्ष्य की आवश्यक शर्तें independent of the order in which they appear in the list after the colon है कार्रवाई की जाती है, इसलिए स्पष्ट अंतर-शर्त निर्भरता यदि आप वे किस क्रम में संसाधित कर रहे हैं परिभाषित करना चाहते हैं शुरू की जानी चाहिए।

हालांकि, मुझे नहीं लगता कि मैं नीचे निर्भरता किसी भी अधिक पट्टी कर सकते हैं; buildtest पर निर्भर करता है, और test एक फ़ाइल जो मौजूद नहीं है और उसके नुस्खा द्वारा उत्पन्न होता है से मेल खाती है। मैंने माना कि यह तब तक उपस्थित होगा जब build के लिए नुस्खा संसाधित किया जाना था।

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

N.B. इस सवाल का उद्देश्य बस इस समस्या से संबंधित वाइल्डकार्ड फ़ंक्शन के कार्यकलापों की समझ प्राप्त करना है; एक व्यावहारिक उपयोग केस है जिसमें से मैंने इस पानी के नीचे संस्करण को आसवित किया है, लेकिन मुझे इस मामले में अधिक दिलचस्पी है।

उत्तर

4

जीएनयू मेकअप किसी भी क्रियान्वित उनमें से से पहले सभी लक्ष्य के लिए आदेशों की फैलता है। इस संदर्भ में, "विस्तार" का अर्थ है "सभी वैरिएबल संदर्भों को उनके मानों (पुनरावर्ती) से प्रतिस्थापित करें, और किसी भी फ़ंक्शन संदर्भों का मूल्यांकन करें।" $(wildcard) बेशक एक समारोह संदर्भ है। चूंकि किसी भी आदेश को निष्पादित करने से पहले विस्तार होता है, निश्चित रूप से फ़ाइल test नहीं मिल सकती है - यह अभी तक नहीं बनाई गई है। दूसरी बार आप का निर्माण चलाने के लिए, test पहले से मौजूद है, तो $(wildcard) पा सकते हैं।

अपने बयान है कि जिस क्रम में आवश्यक शर्तें कार्रवाई की जाती है के बारे में: तकनीकी रूप से जीएनयू मेकअप आदेश के बारे में कोई गारंटी नहीं देता है, लेकिन व्यावहारिक रूप से बोल prereqs कार्रवाई की जाती है बाएँ-से-सही, और शुद्धतावादियों के प्रयासों को बदलने के लिए के बावजूद कि (उन लोगों के साथ छेड़छाड़ करने के एकमात्र उद्देश्य के लिए जिन्होंने पूरी तरह से निर्भरताएं निर्दिष्ट नहीं की हैं), जीएनयू बनाने की संभावना वास्तव में बदल जाएगी कि कार्यान्वयन विवरण विलुप्त रूप से छोटा है। हालांकि आप केवल सीरियल बिल्ड में उस ऑर्डरिंग पर भरोसा कर सकते हैं। यदि आप समानांतर में निर्माण चलाते हैं, तो चीजें थोड़ा सा ट्रिकियर प्राप्त करती हैं: जीएनयू अभी भी बाएं से दाएं क्रम में प्रीरेक्स को संसाधित करता है, लेकिन अब यह अगले को शुरू करने से पहले समाप्त होने की प्रतीक्षा नहीं करता है, इसलिए असल में इंटर-प्रीरेक निर्भरताओं के अधीन, यादृच्छिक या "किसी भी" क्रम में संसाधित प्रतीत हो सकता है, यही कारण है कि उन निर्भरताओं को निर्दिष्ट करना एक अच्छा अभ्यास है।

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