क्या आप टैब अक्षरों के बिना वैध मेकफाइल्स बना सकते हैं?


114
target: dependencies
    command1
    command2

मेरे सिस्टम (मैक ओएस एक्स) पर, makeआवश्यकता होती है कि मेकफाइल्स के पास प्रत्येक commandपंक्ति की सामग्री से पहले एक टैब वर्ण हो , या यह एक सिंटैक्स त्रुटि फेंकता है।

मेकफाइल्स बनाते या संपादित करते समय यह एक झुंझलाहट है क्योंकि मेरे पास मेरे संपादक को सभी स्थान-सभी-समय पर स्थापित करने के लिए है।

क्या आप टैब अक्षरों के बिना वैध मेकफाइल्स बना सकते हैं?


4
मैंने अपने संपादक को भी रिक्त स्थान के साथ टैब का अनुकरण करने के लिए कॉन्फ़िगर किया है। लेकिन, मेरा संपादक मुझे दुर्लभ अवसरों में Ctrl-Tab टाइप करने की अनुमति देता है, जब मैं बिल्कुल, सकारात्मक रूप से एक टैब होना चाहिए, जैसा कि मेकफाइल्स में है। शायद आपके संपादक भी करते हैं।
टूलिक

जवाबों:


118

यह एक सिंटैक्स विषमता / आवश्यकता है make, इसका मैक ओएस एक्स के साथ कोई लेना-देना नहीं है। दुर्भाग्य से, अगर आप उपयोग करने जा रहे हैं तो इसके बारे में कुछ भी नहीं है make

संपादित करें : जीएनयू मेक अब एक कस्टम नुस्खा उपसर्ग का समर्थन करता है। इस जवाब को देखें ।

आप इस पहलू को नापसंद करने वाले पहले व्यक्ति नहीं हैं makeयूनिक्स हैटर्स हैंडबुक को उद्धृत करने के लिए :

डेनिस के मेकफाइल के साथ समस्या यह है कि जब उन्होंने टिप्पणी लाइन को जोड़ा, तो उन्होंने अनजाने में लाइन 2 की शुरुआत में टैब चरित्र से पहले एक स्थान डाला। टैब चरित्र मेकफाइल्स के सिंटैक्स का एक बहुत महत्वपूर्ण हिस्सा है। सभी कमांड लाइन (हमारे उदाहरण में cc से शुरू होने वाली लाइनें) टैब से शुरू होनी चाहिए। उसके बाद उसने अपना परिवर्तन किया, पंक्ति 2, इसलिए त्रुटि नहीं हुई।

"तो क्या?" आप पूछते हैं, "इसमें गलत क्या है?"

इसमें कुछ भी गलत नहीं है, अपने आप से। यह सिर्फ इतना है कि जब आप विचार करते हैं कि अन्य प्रोग्रामिंग टूल यूनिक्स में कैसे काम करते हैं, तो सिंटैक्स के हिस्से के रूप में टैब का उपयोग करना द ग्रीन बेरेट्स में उन पेन्जी स्टिक ट्रैप्स की तरह है: कैनसस का गरीब बच्चा जॉन वेन और नॉन के सामने चल रहा है। t यात्रा के तार देखें। आखिरकार, कंसास के मकई के खेतों में देखने के लिए कोई ट्रिप वायर नहीं है। वैम!


5
टैब के साथ समस्या पहली चीज है जो कोई भी सीखता है का उपयोग करके - मैंने इसे कभी भी वास्तविक समस्या नहीं पाया है।

2
@ नील, मुझे न तो: मैंने कभी नहीं कहा कि मैं यूएचएच से सहमत हूं, मैं सिर्फ यह कह रहा था कि कुछ लोगों को यह पसंद नहीं है। :-)
आलोक सिंघल

2
Cmake का उपयोग करने के लिए एक अच्छा प्लग की तरह लगता है। वाक्य रचना बनाने में केवल निराशाजनक विषमता नहीं।
orodbhen

3
मैंने अभी gnu.org/software/make/manual/html_node/Special-Variables.html (देखें .RECIPEPREFIX) पाया । नीचे दिए गए उत्तरों में से एक का भी उल्लेख है, और मेरा के बजाय "सही" के रूप में चिह्नित किया जाना चाहिए। stackoverflow.com/a/21920142
आलोक सिंघल

3
यह बहुत बड़ी समस्या नहीं है, लेकिन यह कष्टप्रद है। उठते बैठते। यह मज़बूती से कष्टप्रद है, और यह \ omicron रैखिक समय में कष्टप्रद है।
पार्थियन शॉट

60

मूल रूप से यह सवाल पूछे जाने के बाद से, जीएनयू मेक का एक संस्करण जारी किया गया है जो आपको Tabउपसर्ग चरित्र के अलावा कुछ और उपयोग करने की अनुमति देता है । मेलिंग सूची घोषणा से :

नया विशेष चर: .RECIPEPREFIX आपको डिफॉल्ट (TAB) से रेसिपी परिचय चरित्र को कुछ और में रीसेट करने की अनुमति देता है। इस चर मूल्य का पहला चरित्र नया नुस्खा परिचय चरित्र है। यदि चर को रिक्त स्ट्रिंग पर सेट किया जाता है, तो TAB का फिर से उपयोग किया जाता है। यह सेट किया जा सकता है और इच्छा पर रीसेट किया जा सकता है; जब वे पहली बार पार्स किए गए थे, तब व्यंजनों सक्रिय मूल्य का उपयोग करेंगे। इस सुविधा का पता लगाने के लिए $ (। RECIPEPREFIX) का मान जांचें।

यह सुविधा जुलाई 2010 में जारी जीएनयू मेक 3.82 में जोड़ी गई थी, (इस प्रश्न के मूल पूछने की तारीख के छह महीने बाद)। चूँकि यह बदले में तीन साल हो गया है और उसके बाद से बदल रहा है, इसलिए यह संभावना है कि अन्य मेक फ्लेवर्स ने जीएनयू मेक का अनुसरण किया है।


51

टैब के बिना वैध मेकफाइल रखने का एक जटिल तरीका है।

यदि आप पढ़ने के लिए अपना बदलाव करते हैं:

target: dependencies; command1; command2

अगर काम होगा। यदि आप इसे एक से अधिक लाइन पर चाहते हैं, तो आप ऐसा कर सकते हैं:

target: dependencies; \
command1; \
command2

गन्दा, लेकिन यह काम करता है।


मेक कि समर्थन .RECIPEPREFIXका एक संस्करण के लिए उन्नयन शायद सबसे अच्छा तरीका है। हालाँकि, जब से मुझे ऐसा करने का मन नहीं हुआ, मैंने इस पर आधारित एक समाधान का उपयोग करके समाप्त कर दिया। पंक्ति 1:, target:\ पंक्ति 2: [चार-स्थान इंडेंटेशन] इसके बाद;command
LS

33

यदि आपके प्रोफ़ाइल में vimrc है तो आप इस लाइन को जोड़ सकते हैं ताकि vim को रिक्त स्थान में बदलने से रोका जा सके:

autocmd FileType make setlocal noexpandtab

मैं भी इससे जूझ रहा था और इसने इसे मेरे लिए ठीक कर दिया। अच्छी बातों को फैलाएं!


19

यदि आप रिक्त स्थान का उपयोग करना चाहते हैं तो यह मेरे लिए करता है

.RECIPEPREFIX +=

उदाहरण


किस संस्करण का समर्थन करता है? यह GNU मेक 4.1 में काम नहीं करता है।
सेरिन

2
GNU बनाओ 4.1 x86_64-pc-linux-gnu के लिए बनाया गया है, मुझे खेद है, लेकिन यह काम करता है
neok

शायद, यह उल्लेख करने की आवश्यकता है, कि इस चर को फ़ाइल के अंदर ही बनाने की जरूरत है (पूर्व में स्थित डॉट को आसान नहीं)
urusai_na

कम से कम 4.2 संस्करण में, यह काम करना चाहिए। दस्तावेज़ीकरण उस के स्पष्टीकरण में कहता .RECIPEPREFIXहै "यदि चर खाली है (जैसा कि डिफ़ॉल्ट रूप से है ) कि चरित्र मानक टैब वर्ण है।" इसका मतलब है कि चर डिफ़ॉल्ट रूप से परिभाषित किया गया है। इसका उपयोग करके पुष्टि की जाती है ifeq ($(origin .RECIPEPREFIX), undefined)। क्योंकि +=संलग्न एक भी अंतरिक्ष और एलएचएस को आरएचएस, var +=सेट varएक भी अंतरिक्ष (प्लस एक खाली स्ट्रिंग) के रूप में लंबे समय के रूप varमें पहले से ही परिभाषित किया जा चुका है। (यदि varपरिभाषित नहीं किया गया है, +=जैसा है =।)
ynn

1
यह जवाब अब काम नहीं करता है। नवीनतम समाधान के लिए मेरा उत्तर देखें ।
ynn

11

विम के इंसर्ट मोड में, आप Ctrl-v <TAB>शाब्दिक टैब डालने के लिए उपयोग कर सकते हैं , भले ही आपने स्पेस डालने के लिए टैब कुंजी सेट की हो। यह आपके प्रश्न का उत्तर नहीं देता है, लेकिन शाब्दिक टैब की आवश्यकता से बचने के लिए उपलब्ध तरीकों का एक विकल्प हो सकता है।


10

यदि आप EditorConfig का उपयोग कर रहे हैं , तो आप .editorconfigअपनी आईडीई को रिक्त स्थान के बजाय इंडेंटेशन के लिए टैब का उपयोग करने के लिए मजबूर करने के लिए अपनी फ़ाइल में निम्न पंक्तियाँ जोड़ सकते हैं Makefile:

[Makefile]
indent_style = tab

4

जीएनयू मेक 4.2 तक

स्टीवन पेनी का जवाब काम करता है।

.RECIPEPREFIX +=

इस कार्य का कारण मेरी टिप्पणी में वर्णित है ।


चूंकि GNU मेक 4.3 (19 जनवरी 2020 को जारी)

+=ऑपरेटर के व्यवहार को पिछड़े-असंगत तरीके से बदल दिया गया है । यदि बाएं ऑपरेंड का कोई रिक्त मान है, तो कोई स्थान अब जोड़ा नहीं गया है।

आप इसके बजाय उपयोग कर सकते हैं

.RECIPEPREFIX := $(.RECIPEPREFIX)<space>

, जहां <space>एक ही स्थान है। हालाँकि $(.RECIPEPREFIX)इसे एक खाली मान के रूप में विस्तारित किया गया है, लेकिन यह आवश्यक नहीं है कि GNU मेक को अनदेखा करें <space>। ध्यान दें कि यह कोड GNU पर भी काम करता है। संस्करण 4.3 से अधिक पुराना करें।


1

उबंटु में: vi मेकफाइल्स स्थान को टैब द्वारा प्रतिस्थापित करते हैं (या कुछ और जो आप चाहते हैं):

:%s/<space chars>/^I/g

पूर्व के लिए टैब द्वारा 8 स्थान बदलें:

:%s/        /^I/g

ध्यान रखें: ^ मैं टैब कुंजी के साथ सम्मिलित करता हूं , ^ और मैं वर्ण: D


-6

कुछ भी नहीं। पूरी तरह से टैब वर्ण बनाने के कुछ जायके की आवश्यकता होती है। रिक्त स्थान पर टैब पसंद करने का एक और कारण :-)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.