2015-11-10 8 views
5

पर मैं लंबे समय से इस तरह के अजीब नियमों का उपयोग कर रहा हूं, लेकिन अचानक वे एक नए वातावरण पर टूट रहे हैं।% और * निर्भरता रेखा

क्या ऐसा करने का कोई मजबूत तरीका है?

all: test.1.out 

test.%.out: %/test*.out 
    /bin/cp -f $< [email protected] 

मेरी बॉक्स पर (ubuntu):

alishan:~/Dropbox/make_insanity> make --version 
GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

This program built for x86_64-pc-linux-gnu 
alishan:~/Dropbox/make_insanity> make 
/bin/cp -f 1/test.out test.1.out 

अन्य लोगों के Macs पर कोड, ubuntu मशीन, ubuntu आभासी मशीनों के इस प्रकार के साथ कोई समस्या नहीं है। अपने सभी संस्करणों को नहीं जानते हैं, लेकिन यह ठीक कोड जैसा लगता है।

समाशोधन के बाद उसी निर्देशिका में मेरे mageia सर्वर पर।

[[email protected] make_insanity]$ make --version 
GNU Make 3.82 
Built for x86_64-mageia-linux-gnu 
Copyright (C) 2010 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 
[[email protected] make_insanity]$ make 
make: *** No rule to make target `test.1.out', needed by `all'. Stop. 
[[email protected] make_insanity]$ 

उपयुक्त पाठ "फिक्स" के लिए समस्या या तो% या * बदलने, लेकिन निश्चित रूप से वांछित व्यापकता का उत्पादन नहीं करता।

+0

मुझे यह सुझाव दिया गया है कि 3.81 से 3.82 बनाने का परिवर्तन संभावित अपराधी है। मैंने रिलीज नोट्स को देखा लेकिन आवेदन करने लगते कुछ भी नहीं मिला। https://lists.gnu.org/archive/html/make-alpha/2010-07/msg00025.html –

उत्तर

1

मैं बिल्कुल यकीन नहीं है, लेकिन मैं आप चाहते हैं

test.<name>.out 

से

<name>/test.out 

किए जाने के लिए (अगर यह मौजूद है) लगता है। यदि यह सही है, तो आप इसे रिवर्स-इंजीनियरिंग द्वारा लक्ष्य के नाम से प्रत्येक लक्ष्य के लिए पूर्व शर्त के नाम से मजबूती से कर सकते हैं।

targs := test.1.out test.a.out 

define src_of = 
$(patsubst .%,%,$(suffix $(basename $(1))))/$(basename $(basename $(1)))$(suffix $(1)) 
endef 

all: $(targs) 

test.%.out: $(call src_of,test.%.out) 
    cp -f $< [email protected] 

clean: 
    rm -f *.*.out 

यह स्वीकार्य रूप से एक मुट्ठी भर है।

तो एक डेमो जहां आवश्यक शर्तें मौजूद अगर हम पूर्व की व्यवस्था:

$ ls -LR 
.: 
1 a Makefile 

./1: 
test.out 

./a: 
test.out 
$ make 
cp -f 1/test.out test.1.out 
cp -f a/test.out test.a.out 
+0

धन्यवाद। यह बनाने के बारे में अच्छी चीजें सीखने के मामले में उपयोगी है, लेकिन मैं * बिना मूल नियम का उपयोग कर पूरा कर सकता हूं। साथ ही, इस विशेष आवेदन में, यह महत्वपूर्ण है कि नियम पठनीय हो। यह सरल नियम विभिन्न प्लेटफार्मों पर थोड़ी देर के लिए काम कर रहा था। यह अच्छा होगा अगर मैं इसे कुछ सरल से बचा सकता हूं। –

0

आप इस secondary expansion और वाइल्डकार्ड फ़ंक्शन का उपयोग कर सकते हैं। ध्यान दें कि यह इसके बिना कभी मान्य नहीं था, इसलिए जो भी कोड आपने देखा वह टूटा माना जाना चाहिए।

.SECONDEXPANSION: 

all: test.1.out 

test.%.out: $$(wildcard $$*/test*.out) 
    @echo Prerequisites found: $^ 

नोट पैटर्न मैच के लिए $* बजाय % का उपयोग (automatic variables देखें) एक अतिरिक्त $ से बच रहा है, और पूरी बात दो बार विस्तार करने के लिए तो मूल्यों के दोनों सेट विस्तारित किए जाते हैं निर्धारित है।

यह कहा जा रहा है कि यह पूरा लेआउट गलत दिखता है। आप $< का उपयोग कर रहे थे जो कि केवल वाइल्डकार्ड के साथ पहले से ही आवश्यकता के पहले शब्द से मेल खाता है, आप उनमें से बहुत से हो सकते हैं। Mike's answer शायद आपके मेकफ़ाइल को फिर से संगठित करने के लिए एक बेहतर शर्त है जहां वास्तव में मजबूत हो।

+0

धन्यवाद।यही वही था जो मैं चाहता था। मैं समझता हूं कि आप दोनों संरचना के बारे में क्या कह रहे हैं। इस विशेष उपयोग-मामले में लोग वास्तविक समय में थोड़ा असंगत नामों के साथ फाइलों की आपूर्ति करते थे, इसलिए मैं खराब संरचना से फंस गया था (निश्चित रूप से मैं उस अपस्ट्रीम को ठीक करने की कोशिश कर सकता था, लेकिन मुझे आमतौर पर सब कुछ के लिए पहले लगता है)। मुझे पहले स्थान पर कहा जाना चाहिए था। –

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