मैं मेकफाइल से एक ऑन-द-फ्लाई कैसे बना सकता हूं, इसका मान किसी अन्य डेटा फ़ाइल की संपूर्ण सामग्री होगी।
जवाबों:
मैं अनुमान लगा रहा हूं कि आप अपने मेकफाइल में किसी अन्य फ़ाइल की सामग्री के लिए एक चर सेट करना पसंद करते हैं:
FILE=test.txt
VARIABLE=`cat $(FILE)`
target:
echo $(VARIABLE)
VARIABLE
एक स्ट्रिंग cat $(FILE)
(उद्धरण में) है जो केवल शेल द्वारा एक नुस्खा में विस्तारित होता है। इसके मान को प्रिंट करने का प्रयास करें $(info ${VARIABLE})
।
VARIABLE
एक वादा के रूप में विचार करना है । यह एकमात्र संस्करण है जो पुराने संस्करणों के साथ काम करता है make
। दोनों :=
और $(shell ...)
जीएनयू विस्तार है।
cat
नियम निष्पादित होने पर हर बार निष्पादित करेगा । यह आमतौर पर इरादा नहीं है और इसके खिलाफ चेतावनी दी जानी चाहिए, क्योंकि यह धीमा है। इसके अलावा, अगर फ़ाइल एक पाइप है, तो इसके अनपेक्षित दुष्प्रभाव हैं। असाइनमेंट इस प्रकार होना चाहिए :=
कि नियम का मूल्यांकन तब नहीं किया जाएगा जब चर को बदल दिया जाएगा लेकिन जब चर को परिभाषित किया जाएगा। प्रतिस्थापन मान $(shell cat $(FILE))
इतना होना चाहिए कि cat
कमांड को इन-प्लेस द्वारा निष्पादित किया जाता है, न कि बाद में नुस्खा नियमों द्वारा।
cat
जटिल वैकल्पिक नियमों के बजाय भरोसा करने से आपके मेकफाइल्स को समझने में बहुत सरल और लगभग पोर्टेबल या कभी-कभी अधिक पोर्टेबल हो जाएगा।
जीएनयू बनाने पर विचार:
file := whatever.txt
variable := $(shell cat ${file})
GNU संस्करण 4.2 फाइल रीडिंग ऑपरेशन का समर्थन करता है, इसलिए मैक्सिम इगोरुस्किन के महान जवाब के संबंध में अब इस समस्या को हल करने का एक वैकल्पिक तरीका है:
FILE := test.txt
variable :=$(file < $(FILE))
cat
विंडोज पर मौजूद नहीं है। समाधान जो लिनक्स और विंडोज के लिए काम करता है:
cat := $(if $(filter $(OS),Windows_NT),type,cat)
variable := $(shell $(cat) filename)
स्पष्टीकरण: ऐसा लगता है कि विंडोज पर हमेशा OS
पर्यावरण चर को 'Windows_NT' के बराबर माना जाता है। इस तरह, विंडोज type
कमांड के लिए, गैर-विंडोज के cat
लिए उपयोग किया जाता है।
$(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
यदि आप 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
make -v
देता हैGNU Make 3.81
include ./MyFile
यहां एक अधिक पोर्टेबल समाधान है, जो 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)