2010-01-12 14 views
12

में फ़ाइल नामों में कोलन से बचना क्या जीएनयू को कॉलन वाले फ़ाइल नामों के साथ सही तरीके से काम करने का कोई तरीका है?मेकफ़ाइल

मैं जिस विशिष्ट समस्या में चल रहा हूं वह पैटर्न नियम को शामिल करने के लिए होता है।

% 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-redhat-linux-gnu 
% cat Makefile 
COLON := \: 
all: ; true 
%.bar: ; cp $< [email protected] 
x.bar: x.foo 
%.foo: ; touch [email protected] 
a$(COLON)b.bar: a$(COLON)b.foo 
all: x.bar a$(COLON)b.bar 
clean: ; rm -f *.foo *.bar 
% make clean 
rm -f *.foo *.bar 
% make 
touch x.foo 
cp x.foo x.bar 
cp a\:b.bar 
cp: missing destination file operand after `a:b.bar' 
Try `cp --help' for more information. 
make: *** [a\:b.bar] Error 1 

एक शाब्दिक साथ $ (कोलन) की जगह: उत्पादन बिल्कुल वैसा ही परिणाम यहाँ एक सरलीकृत संस्करण है कि काटने और चिपकाने टैब वर्ण पर निर्भर नहीं करता है। बैकस्लैश के बिना, यह इस करता है:

Makefile:6: *** target pattern contains no `%'. Stop. 

उत्तर

2

निम्नलिखित हैक मेरे लिए काम किया, हालांकि दुर्भाग्य से यह $ (खोल) पर निर्भर करता है।

# modify file names immediately 
PRE := $(shell rename : @[email protected] *) 
# example variables that I need 
XDLS = $(wildcard *.xdl) 
YYYS = $(patsubst %.xdl,%.yyy,$(XDLS)) 
# restore file names later 
POST = $(shell rename @[email protected] : *) 

wrapper: $(YYYS) 
    @# restore file names 
    $(POST) 

$(YYYS): 
    @# show file names after $(PRE) renaming but before $(POST) renaming 
    @ls 

क्योंकि पूर्व के साथ असाइन किया गया है: =, उसके संबंधित शेल कमांड से पहले XDLS चर का मूल्यांकन किया जाता चलाया जाता है। कुंजी को स्पष्ट रूप से $ (POST) का आविष्कार करके तथ्य के बाद कोलों को वापस स्थानांतरित करना है।

+0

बहुत अच्छा हैक! मैं $ (खोल) के साथ ठीक हूं, मेरा सवाल जीएनयू को वैसे भी विशिष्ट था। मुझे लगता है कि यह एक "अजीब अस्थायी फ़ाइल व्यवस्था" का एक उदाहरण होगा जिसका दूसरा जवाब बात कर रहा था। मुझे इस मामले में क्या होता है, इस बारे में थोड़ी चिंता कीजिए जहां "एलएस" चीज विफल होने के लिए प्लेसहोल्डर है और $ (POST) इस प्रकार नहीं चलती है। मेरा मतलब है कि मुझे लगता है कि यह शायद अधिकतर ठीक है क्योंकि $ (PRE) बेवकूफ है, है ना? और यदि आपके पास अपने फ़ाइल नामों में वास्तविक @ COLON @ s हो सकता है, तो आप बस एक लंबे और अधिक हास्यास्पद प्लेसहोल्डर का उपयोग कर सकते हैं, शायद इसमें एक लंबे यादृच्छिक स्ट्रिंग के साथ एम्बेडेड .... – zaphod

0

मैं positivie नहीं कर रहा हूँ कि यह काम करना चाहिए, लेकिन कारण यह कहते हैं, "गंतव्य फ़ाइल लापता" सरल है:

%.bar: ; cp $< [email protected] 

कि लाइन लक्ष्य कॉपी करने के लिए कहते हैं से पहले निर्भरता से। आपका ए: बी.बार में कोई निर्भरता नहीं है, इसलिए सीपी विफल रहता है। आप इसे कॉपी करना चाहते थे? ए: बी.फू? उस स्थिति में, आप की आवश्यकता होगी:

%.bar: %.foo ; cp $< [email protected] 
+0

सामान्य नियम की कोई निर्भरता नहीं है, लेकिन मैं बाद के नियमों में दो विशिष्ट मामलों के लिए पहली निर्भरता प्रदान करता हूं। हाँ, मुझे एहसास नहीं हुआ कि आप इसे भी कर सकते हैं, लेकिन यह पता चला है कि आप कर सकते हैं। आप देखेंगे कि x.foo से x.bar को ठीक से कैसे बनाया जाए, यह पता लगाने में सक्षम है। – zaphod

9

मुझे शक है यह संभव है: this discussion about colons in Makefiles देखते हैं। संक्षेप में, जीएनयू ने कभी भी फाइलनामों के साथ अच्छी तरह से काम नहीं किया है जिसमें व्हाइटस्पेस या कोलन शामिल हैं। रखरखाव, पॉल डी। स्मिथ कहते हैं कि भागने के लिए समर्थन जोड़ना break existing makefiles होगा। इसके अलावा, इस तरह के समर्थन जोड़ने के लिए कोड में महत्वपूर्ण बदलाव की आवश्यकता होगी।

आप किसी प्रकार की ग़लत अस्थायी फ़ाइल व्यवस्था के साथ काम करने में सक्षम हो सकते हैं।

शुभकामनाएं!

+0

अच्छा खोज। यही वह था जब मैंने कहा कि मैं सकारात्मक नहीं था, इसे काम करना चाहिए! – Bahbar

+0

वाह! इसमें कोई मज़ा नहीं है। मेक मेरे वर्कफ़्लो के अभिन्न अंग है। मुझे लगता है कि यह संभव नहीं है – AndyL

1

फाइलफ्रेम (कोलन युक्त) को परिभाषित मेकफ़ाइल चर के साथ व्यवहार करते समय आज मुझे एक और तरीका मिला है।

# definition 
SOME_FNAME = $(NAME)__colon__$(VERSION) 

# usage in target 
foo: 
    $(do_something) $(subst __colon__,:,$(SOME_FNAME))