2009-03-20 14 views
7

मैं नियम-आधारित मेकफ़ाइल चलाने के लिए GNUMake का उपयोग करना चाहता हूं जो निर्देशिका संरचना (विंडोज फ़ाइल सिस्टम पर) में सी फ़ाइलों का एक सेट बनाता है।रिक्त स्थान वाले फ़ाइल नामों के साथ GNUMake का उपयोग करने का सबसे विश्वसनीय तरीका क्या है?

रूट निर्देशिका, कुछ उप-निर्देशिकाएं और कुछ फ़ाइलों में रिक्त स्थान होते हैं।

उदाहरण फ़ाइल: "C:\Documents and Settings\<username>\My Documents\Test Dir\Build Me.c"

GNUMake वास्तव में काम नहीं करता है जब फ़ाइल पथ रिक्तियाँ। मैंने इस समस्या के आसपास काम करने के संभावित तरीकों के बारे में पढ़ा है (8.3 प्रारूप का उपयोग करके, मेरे प्रारूप में रिक्त स्थान को हटाकर ? या \\ आदि के साथ स्थान को प्रतिस्थापित करना) लेकिन उनमें से कोई भी सही नहीं है (या वे हैं?)

क्या कोई चांदी की बुलेट है जो इस समस्या को हल करेगी?

बीटीडब्ल्यू मैं जीएनकेक के साथ फंस गया हूं, मैं एक अलग मेक टूल का उपयोग नहीं कर सकता।

उत्तर

2

आप अपने makefile में रिक्त स्थान से बचने के लिए सक्षम हो सकता है यानी:

$(CC) $(CFLAGS) 'C:\Documents\ and\ Settings\<username>\My\ Documents\Test\ Dir\Build Me.c' 

मैं सिर्फ मामले में एकल उद्धरण जोड़ दिया है, लेकिन मैं अगर यह काम करता है अगर आप नहीं जानते विंडोज टर्मिनल का उपयोग (सिगविन इत्यादि के बजाय)।

+0

प्रकट तो यह काम हो सकता है के लिए विस्तारित, या यह नहीं हो सकता है? –

+0

सक्षम हो सकता है, क्योंकि मेरे पास यह सुनिश्चित करने के लिए परीक्षण करने के लिए एक विंडोज़ इंस्टॉल आसान नहीं है। मैं एक कारण के बारे में नहीं सोच सकता कि यह क्यों काम नहीं करेगा। –

3

सबसे आसान बात यह है कि फ़ाइल नामों को ठीक करना वास्तव में है।

हालांकि, फ़ाइल नामों के चारों ओर डबल कोट्स डालने के लिए अपने आदेश लिखें। सबसे आसान और सुरक्षित बात यह है कि सभी फाइल नाम मैक्रोज़ में डालें; चाल यह है कि आपको डबल कोट्स से बचना है, जो मेक अन्यथा खुद को खाना चाहता है।

तो: एफ एन = "\" सी: \ My Documents \ myfiles.c \ "" FN2 = "C: \ मेरे दस्तावेज़ \ myfile2.c"

या $ का उपयोग (सीसी) $ (CFLAGS) "$ (FN2)"

चाल यहाँ गूंज

echo $(CC) $(CFLAGS) "$(FN2)" 

साथ अपने आदेश पंक्ति गूंज या make -d का उपयोग क्या कर ऐसा करने के लिए कोशिश कर रहा है के सभी विवरण प्राप्त करने के लिए है।

आप आपके पास उस डायरेक्ट्री माउंट कर सकते हैं, इस के साथ के बारे में हैक करने के लिए थोड़ा, विशेष रूप से, आप

+10

"फाइल नामों को ठीक करें"? नाम टूटा नहीं है। उपकरण जो रिक्त स्थान को संभाल नहीं सकते हैं टूटा हुआ है। उदाहरण के पथ एक एमएस मानक है, यहां तक ​​कि (मुझे लगता है यह एक रणनीति के पुश करने के लिए डेवलपर्स उनके टूटे उपकरण है कि रिक्त स्थान नहीं संभाल सकता है ठीक करने के लिए किया गया था।) – Qwertie

+1

नहीं, यह उपकरण है कि फ़ाइल नामों का उपयोग कि यूनिक्स मानक से मेल नहीं खाते है कि टूटे हैं। ऑपरेटिंग सिस्टम भी। –

+0

ऑपरेटिंग सिस्टम और टूल्स जो * अनुमति देते हैं * रिक्त स्थान टूटा हुआ है ?! – Qwertie

0

पलायन अप दोगुना करने के लिए रिक्त स्थान ही पथ नाम की "रूट" भाग में हैं, तो आवश्यकता हो सकती है आवश्यकता हो सकती है रिक्त स्थान के बिना एक रास्ते पर। ऐसा करने के कई तरीके हैं: कमांड लाइन ("नेट यूज" या "सबस्ट") या एक्सप्लोरर (टूल्स> मैप नेटवर्क ड्राइव) से। तो सी: \ दस्तावेज़ और सेटिंग्स \\ मेरे दस्तावेज़ \ टेस्ट डिर "एक्स बन सकते हैं: \ BuildMe.c

हालांकि, अगर फ़ाइल नामों में रिक्त स्थान हैं, या" रूट "निर्माण निर्देशिका के नीचे निर्देशिकाओं में हैं, तो शायद कोई भी सही समाधान नहीं है। मैंने आपके द्वारा सुझाए गए अन्य सुझावों का उपयोग किया है (8.3 नाम, एक अलग चरित्र के साथ रिक्त स्थान बदलना) और इन कामों में उनकी समस्याएं हैं।

+0

इसे सभी मामलों में काम करने की जरूरत है। यानी जब मूल निर्देशिका में एक स्थान होता है, साथ ही साथ उपनिर्देशिकाएं भी होती हैं, और फ़ाइल नाम स्वयं भी होते हैं। – demoncodemonkey

2

मुझे http://www.mail-archive.com/[email protected]/msg05201.html पर एक महान प्रेरणा मिली जो मुझे जा रहा है।मेरे स्वयं के टेस्ट एप्लिकेशन में यूट्यूब से डाउनलोड की गई डब्ल्यूडब्ल्यू 2-युग जैज़ एफएलवी फाइलों और एक ऑडियो उपनिर्देशिका की निर्देशिका शामिल है जिसमें मैं प्रत्येक के ओजीए ऑडियो संस्करणों को स्टोर करना चाहता हूं। और, ज़ाहिर है, फ़ाइल नामों में रिक्त स्थान हैं। मैं तो

यहाँ GNUMake Makefile है कि मैं एक साथ काट दिया गया है काम करने के लिए है करने के लिए ffmpeg2theora चलाने के लिए चाहते हैं। इस साइट पर सभी संकेतों और उपरोक्त संदर्भित साइट के लिए धन्यवाद!

sq = $(subst $(sp),?,$1) 
qs = $(subst ?,$(sp),$1) 

e := 
sp := $(e) $(e) 

FLVS := $(foreach file,var,$(call sq,$(wildcard *.flv))) 
FLVS := $(subst .flv?,.flv ,$(FLVS)) 

AUDIOS := $(patsubst %.flv,audio/%.oga,$(FLVS)) 

.PHONY: audios show 

audios: $(AUDIOS) 

$(AUDIOS) : $(FLVS) 
    ffmpeg2theora --novideo -o "$(call qs,[email protected])" "$(call qs,$(notdir $(patsubst %.oga,audio/%.flv,[email protected])))" 

show: 
    echo $(FLVS) 
    echo $(AUDIOS) 
+0

या आप अन्य पात्रों को प्रतिस्थापित कर सकते हैं और आवश्यकता होने पर उन्हें रिक्त स्थान पर वापस कर सकते हैं। 's + = $ (subst \, +, $ 1)' '+ S = $ (subst +, \, $ 1)' '$ (कॉल s +, foo बार): $ (कॉल s +, बार baz) ' ' @echo $ (कॉल + एस, $ @) $ (कॉल + एस, $ <) से $ बनाना –

1

मैंने आमतौर पर सैना के जवाब और ब्रायन योडर के जवाब दाना के संयोजन के संयोजन का उपयोग किया है।

तुम बस बच गए रिक्त स्थान के साथ रिक्त स्थान की सभी आवृत्तियां को बदलने के लिए $(subst) समारोह का उपयोग करें। ईजी:

empty := 
space := $(empty) $(empty) 
program_files := $(subst $(space),\$(space),$(ProgramFiles)) 

(ध्यान दें कि Windows पर बनाने के कुछ पुराने संस्करण आप भी एक और $(subst) उपयोग करने के लिए स्लैश करने के लिए पथ बैकस्लैश बदलने के लिए की आवश्यकता होगी के साथ)

0

मैं बस हमलावर स्ट्रिंग के आसपास 'सिंगल कोट्स' जोड़ें : - '$ (TARGET_DIR)'

उदाहरण: (यह मेरे खिड़कियों पर सही ढंग से काम करने के लिए erlang.mk मिल में मदद की!)

app:: $(C_SRC_ENV) 
    @mkdir -p priv/ 
    $(c_src_verbose) $(CC) $(CFLAGS) $(C_SRC_DIR)/*.c -fPIC -shared -o $(C_SRC_OUTPUT) \ 
     -I '$(ERTS_INCLUDE_DIR)' $(C_SRC_OPTS) 

'$(ERTS_INCLUDE_DIR)' अब सही तरीके से 'c:/Program Files/erl7.0/erts-7.0/include/'

make -d का उपयोग कर भी मदद करता है अवैध रास्तों