किसी अन्य फ़ाइल की सामग्री को पढ़कर मेकफाइल में एक वैरिएबल बनाएं


82

मैं मेकफाइल से एक ऑन-द-फ्लाई कैसे बना सकता हूं, इसका मान किसी अन्य डेटा फ़ाइल की संपूर्ण सामग्री होगी।

जवाबों:


49

मैं अनुमान लगा रहा हूं कि आप अपने मेकफाइल में किसी अन्य फ़ाइल की सामग्री के लिए एक चर सेट करना पसंद करते हैं:

FILE=test.txt
VARIABLE=`cat $(FILE)`

target:
    echo $(VARIABLE)

3
दरअसल, मैं VARIABLE की परिभाषा को सब से ऊपर नहीं रख सकता: क्योंकि PATH_TO_MY_DATA_FILE तब तक मौजूद नहीं है जब तक कि कुछ कमांड्स सभी में नहीं चलाए गए हों: लक्ष्य। एक विकल्प के रूप में, मैंने जो किया है वह यह है कि मैंने चीजों को दो मेकफाइल्स (एक सब-मेक बनाया) में विभाजित किया है और उप-मेक के शीर्ष पर VARIABLE घोषित किया है और यह अब एक आकर्षण की तरह काम करता है।
श्रीनाथ

26
यह गलत उत्तर है। मूल्य VARIABLEएक स्ट्रिंग cat $(FILE)(उद्धरण में) है जो केवल शेल द्वारा एक नुस्खा में विस्तारित होता है। इसके मान को प्रिंट करने का प्रयास करें $(info ${VARIABLE})
मैक्सिम एगोरुस्किन

4
@MaximEgorushkin यह गलत नहीं है। आपको सिर्फ VARIABLEएक वादा के रूप में विचार करना है । यह एकमात्र संस्करण है जो पुराने संस्करणों के साथ काम करता है make। दोनों :=और $(shell ...)जीएनयू विस्तार है।
13

7
नीचा दिखाया। यह catनियम निष्पादित होने पर हर बार निष्पादित करेगा । यह आमतौर पर इरादा नहीं है और इसके खिलाफ चेतावनी दी जानी चाहिए, क्योंकि यह धीमा है। इसके अलावा, अगर फ़ाइल एक पाइप है, तो इसके अनपेक्षित दुष्प्रभाव हैं। असाइनमेंट इस प्रकार होना चाहिए :=कि नियम का मूल्यांकन तब नहीं किया जाएगा जब चर को बदल दिया जाएगा लेकिन जब चर को परिभाषित किया जाएगा। प्रतिस्थापन मान $(shell cat $(FILE))इतना होना चाहिए कि catकमांड को इन-प्लेस द्वारा निष्पादित किया जाता है, न कि बाद में नुस्खा नियमों द्वारा।
क्रिश्चियन हुजेर

2
@antred, मानक मानक UNIX / POSIX टूलसेट का हिस्सा है जिसमें बिल्ली भी शामिल है। यदि आप इसे स्थापित करते हैं तो अन्य सभी बुनियादी उपकरणों को स्थापित करना सामान्य है और बहुत ही दुर्लभ परिस्थितियां हैं जहां यह किसी भी कठिनाइयों का कारण होगा। catजटिल वैकल्पिक नियमों के बजाय भरोसा करने से आपके मेकफाइल्स को समझने में बहुत सरल और लगभग पोर्टेबल या कभी-कभी अधिक पोर्टेबल हो जाएगा।
माइकल

82

जीएनयू बनाने पर विचार:

file := whatever.txt
variable := $(shell cat ${file})

4
@ इस्चिंग मानक GNU मेक का उपयोग करें। सोलारिस मेक नॉन-पोर्टेबल एप्लिकेशन है।
मैक्सिम एगोरुस्किन

8
गन्नू मेला न तो मानक है और न ही सोलारिस मेक से अधिक पोर्टेबल है। "लोकप्रिय" आपका शब्द है। यदि हम गंभीरता और पोर्टेबिलिटी के बारे में गंभीरता से विचार करते हैं, तो पॉज़िक्स के साथ रहें।
盐 留 在

3
मैं इस मामले में "लोकप्रिय" के साथ जाना चाहता हूं - गैर-जीएनयू मेक बस बहुत आदिम है। यदि आप 1990 के ऑपरेटिंग सिस्टम का समर्थन जारी रखने का लक्ष्य बना रहे हैं, तो @ bb-generation का जवाब शायद वही है जिसकी आपको आवश्यकता है (हालांकि यह आपको कई मामलों में परेशानी में डाल देगा)। अन्य सभी मामलों में, जीएनयू मेक या तो आसानी से उपलब्ध है या - अधिक संभावना है - डिफ़ॉल्ट, इसलिए कृपया इसका उपयोग करें।
Guss

1
GNU कहीं भी रन बनाते हैं इसलिए हाँ यह किसी भी अन्य मेक की तुलना में बहुत अधिक पोर्टेबल है। "मानक" व्यक्तिपरक, दी जा सकती है।
मार्क

28

GNU संस्करण 4.2 फाइल रीडिंग ऑपरेशन का समर्थन करता है, इसलिए मैक्सिम इगोरुस्किन के महान जवाब के संबंध में अब इस समस्या को हल करने का एक वैकल्पिक तरीका है:

FILE     := test.txt
variable :=$(file < $(FILE))

एक त्रुटि तय की। चर नाम केस-संवेदी होते हैं। 'फू', 'फू' और 'फू' नाम सभी अलग-अलग चर का उल्लेख करते हैं। ( gnu.org/software/make/manual/html_node/Using-Variables.html )
यारोस्लाव

उद्धरणों की भी आवश्यकता नहीं है, $ (फ़ाइल <"$ (फ़ाइल)") "test.txt" को खोलने की कोशिश करता है।
18

16

catविंडोज पर मौजूद नहीं है। समाधान जो लिनक्स और विंडोज के लिए काम करता है:

cat := $(if $(filter $(OS),Windows_NT),type,cat)
variable := $(shell $(cat) filename)

स्पष्टीकरण: ऐसा लगता है कि विंडोज पर हमेशा OSपर्यावरण चर को 'Windows_NT' के बराबर माना जाता है। इस तरह, विंडोज typeकमांड के लिए, गैर-विंडोज के catलिए उपयोग किया जाता है।


9

$(file op filename)जोड़ा गया था के बाद से बहुत सरल :

VARIABLE = $(file < my_file.txt)

मैनुअल पेज यहां: https://www.gnu.org/software/make/manual/html_node/File-Function.html#index-file_002c-reading-from


1
यह मेरे लिए GNU मेक 4.2.1 के तहत काम करता है, अन्य सुझाए गए समाधानों के विपरीत :)
TabeaKischka

3
यह जीएनयू मेक 4 में पेश किया गया था, और मैकओएस अभी भी 2019 में 3.81 के साथ जहाज करता है :-(
मिचेल बी बी

4

यदि आप GNU मेक का उपयोग कर रहे हैं, तो इस आशय का एक और तरीका एक मेकफाइल के "शामिल" का उपयोग करना है:

Makefile से:

include "./MyFile.mak"

एक फ़ाइल बनाएँ "MyFile.mak" सामग्री के साथ:

FILE := "my file content"
FILE += "more content 1"
FILE += "more content 2"

यह काम करने के लिए प्रतीत नहीं होता है, मुझे लगता हैMakefile:1: "./MyFile.mak": No such file or directory
knocte

इसका मतलब है कि आप किसी भी GNU संस्करण का उपयोग नहीं कर रहे हैं .... या GNU मेक का वास्तव में पुराना संस्करण है ... प्रयास करें: "मेक -v"
बिल मूर

मैक का उपयोग करते हुए, निश्चित नहीं कि बंडल या होमब्रे द्वारा स्थापित किया गया है, make -vदेता हैGNU Make 3.81
knocte

क्या आप सुनिश्चित करते हैं कि आपने MakeFile में TAB वर्णों को SPACE वर्णों में परिवर्तित नहीं किया है? मेक इस संबंध में अजगर के रूप में लगभग परेशान है।
बिल मूर

मुझे अपने मैक पर उद्धरण चिह्नों को हटाकर काम करने के लिए मिला, जैसे: include ./MyFile
चार्ली ट्रान

3

जैसा कि प्लेटफ़ॉर्म निर्दिष्ट नहीं किया गया है, यह वह तरीका है जो सोलारिस पर काम करता है:

VERSION:sh = cat VERSION

all:
        echo $(VERSION)

0

यहां एक अधिक पोर्टेबल समाधान है, जो MAKEसंस्करण 3 के साथ काम करता है , जहां fileनिर्देश उपलब्ध नहीं है। नकारात्मक पक्ष यह है कि इसके लिए प्रक्रिया में एक अस्थायी फ़ाइल बनाने की आवश्यकता होती है।

$(shell echo define my_variable > file.tmp)
$(shell cat my_file.txt >> file.tmp)
$(shell echo endef >> file.tmp)
include file.tmp

मुख्य विचार defineनिर्देश का उपयोग करना है , जिसे विशेष रूप से बहुस्तरीय चर घोषित करने के लिए डिज़ाइन किया गया है। बेशक, आप उपयोग करने से बच सकते हैं shellऔर एक अस्थायी फ़ाइल यदि आप स्पष्ट रूप से मेकफाइल उपयोग के लिए फ़ाइल सामग्री लिख सकते हैं।

ध्यान रखें कि, यदि आपकी फ़ाइल में $चिह्न हैं, MAKEतो उन्हें my_variableविस्तारित होने पर (या जब आप इसे परिभाषित करते हैं, तब :=) चर / निर्देशों के रूप में विस्तारित करने का प्रयास करेंगे । यदि आप इससे बचना चाहते हैं, तो आपको फ़ाइल सामग्री को शामिल करने से पहले इनसे बचना होगा। उदाहरण के लिए, catआप के बजाय यह कर सकते हैं:

$(shell sed 's/\$$/$$$$/g' my_file.txt >> file.tmp)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.