2013-02-21 93 views
6

के लक्ष्य में स्थान की अनुमति दें क्या make.exe का उपयोग करते समय लक्ष्य नामों के अंदर रिक्त स्थान प्राप्त करने का कोई तरीका है?जीसीसी मेकफ़ाइल

"foo bar baz": $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

... तीन के रूप में व्यवहार करने के लिए लग रहे हैं: http://savannah.gnu.org/bugs/?712

संदर्भ के लिए, बड़ी समस्या makefile के टुकड़े आदेशों की तरह है: यह है कि अगर यह वास्तव में प्राचीन बग रिपोर्ट सही है असंभव प्रतीत हो रहा है अलग-अलग कमांड: एक बनाने के लिए "foo (शामिल करें नोट"), एक बार बनाने के लिए, और आखिरकार, एक को बनाने के लिए "(फिर से,")। ऐसा इसलिए है क्योंकि make.exe एक डिलीमीटर के रूप में अंतरिक्ष का उपयोग कर रहा है।

हालांकि, यह मानना ​​उचित है कि कोई "हैलो वर्ल्ड.एक्सई" उदाहरण के लिए बनाना चाहता है। यह संभव प्रतीत नहीं होता है। डबल उद्धरण काम नहीं करते, और न तो करता है अलग शब्द बचने (मैं पढ़ा है कि कहीं न कहीं, लिंक याद नहीं है):

"foo\\ bar\\ baz": $(OBJ) 
    $(CPP) $(LINKOBJ) -o $(BIN) $(LIBS) 

तो इसे ठीक करने के लिए किसी भी अन्य रास्ता नहीं है? आधिकारिक मैनुअल केवल tokenize-दर-रिक्त स्थान सामान की पुष्टि करता है, लेकिन किसी भी अन्य उद्देश्य के लिए स्थान का उपयोग करने का तरीका प्रदान नहीं करता है: http://www.gnu.org/software/make/manual/make.html#Rule-Syntax

संपादित करें: के रूप में सुझाव दिया है, मैं एक स्लैश भी कोशिश की है, लेकिन इन्हें डबल स्लेश के समान सटीक प्रभाव पड़ता है। बनाने की शिकायत यह पहला शब्द के लिए नियमों को नहीं मिल रहा है:

mingw32-make.exe: *** No rule to make target `foo', needed by `all'. Stop. 

निष्पादन "foo बार baz.exe" सही ढंग से हालांकि उत्पादन किया जाता है, लेकिन जोड़ने प्रति शब्द हर बार किया जाता है।

उत्तर

1

डबल बैकस्लैश के बजाय एकल का उपयोग करें। निम्नलिखित Makefile (कम से कम gnu मेकअप के लिए) काम करता है:

goal: foo\ bar 

foo\ bar: 
    gcc -o "foo bar" "foo bar.c" 
+0

यह काम नहीं लगता है, संपादन देखें। – Orwell

+0

@ ऑरवेल: फिर, यह ऑपरेटिंग सिस्टम का मामला प्रतीत होता है। आप अपने खोल पर रिक्त स्थान वाली फ़ाइल को कैसे निर्दिष्ट करते हैं? – Matthias

1

के रूप में मथायस ने कहा, यह "\" की बात है, लेकिन दोहरे उद्धरण का भी। यहाँ कैसे मैं इस में succeded है:

EXECUTABLE=foo\ bar\ baz 
all: $(SOURCES) $(EXECUTABLE) 
$(EXECUTABLE): $(OBJECTS) 
       $(CC) $(OBJECTS) -o "[email protected]" $(LDFLAGS) 

नोट $ को दोहरे उद्धरण चिह्नों @ मुझे ऐसा लगता है कि जब मेकअप लक्ष्य "$ (निष्पादन योग्य)" यह "\" फैलता है, इसलिए आदेश तक पहुँचने लाइन

gcc file.o -o foo bar baz -LFlags 

जो आप नहीं चाहते हैं, तो आप फ़ाइल के नाम के चारों ओर डबल कोट्स चाहते हैं।

अब आप विंडोज़ पर हैं और मुझे याद नहीं है कि यह नामों में रिक्त स्थान से कैसे निपटता है, इसलिए मैथियस ने कहा, पहले जांच करें कि कैसे "cmd.exe" रिक्त स्थान से संबंधित है (आसपास के नाम को डबल कोट्स के साथ छोड़कर ...)

0

एक साधारण मेकफ़ाइल पर विचार करना आसान हो सकता है, जो मानक targetRule: dependencies आमंत्रण में निर्भरताओं को अनदेखा करता है। ओपी विंडोज के लिए है, और नीचे bash खोल में लिनक्स पर किया गया है; लेकिन यह अनुमान है कि bash खोल का उपयोग करके cygwin के माध्यम से विंडोज़ पर लागू होना चाहिए, मुझे लगता है।मैं अपने Makefile में निम्नलिखित है (ध्यान दें, वहाँ echo आदेशों से पहले एक टैब है, जो इतनी रिक्त स्थान में धर्मान्तरित होना चाहिए):

testA: 
    echo "testA" 

unrelated: 
    echo "unrelated" 

testA\ clean: 
    echo "testA clean" 

clean: 
    echo "clean" 

अगर मैं bash खोल टर्मिनल में लक्ष्य clean या testA साथ make फोन , मैं उम्मीद परिणाम प्राप्त:

$ make testA 
echo "testA" 
testA 
$ make clean 
echo "clean" 
clean 

अब, अगर मैं make testA clean फोन बस के रूप में, bash खोल रिक्त स्थान पर बहस विभाजित होगा, इसलिएलिखादो तर्क प्राप्त करेंगे, और उन्हें अलग से चलेंगे:

$ make testA clean 
echo "testA" 
testA 
echo "clean" 
clean 

... लेकिन अगर मैं लक्ष्य उद्धरण में make को आपूर्ति की लपेट - या अगर मैं अंतरिक्ष से बच - खोल समझ जाएगा कि यह माना जाता है एक अंतरिक्ष के अंदर के साथ एक एकल तर्क हो सकता है, और make के लिए इस तरह के रूप में यह प्रचार होगा, जो निष्पादित करने के लिए क्या testA\ clean लक्ष्य नियम के रूप में लिखा है आगे बढ़ना होगा: इस के

$ make "testA clean" 
echo "testA clean" 
testA clean 
$ make testA\ clean 
echo "testA clean" 
testA clean 

एक परिणाम यह है, कि दुर्भाग्य से आप नहीं कर सकते है " टैब "testA\ clean के स्वत: पूर्ण करने के लिए कमांड लाइन पर; यदि आप कमांड लाइन पर make teटैब टाइप करते हैं, तो केवल testA स्वचालित रूप से स्वत: पूर्ण हो जाएगा (और testA\ clean स्वत: पूर्ण विकल्प के रूप में नहीं दिखाया जाएगा)।