के भीतर $ (वाइल्डकार्ड) को कैसे कॉल करें मैं अपने मेकफ़ाइल के लिए जेनेरिक बिल्ड टेम्पलेट बनाने की कोशिश कर रहा हूं, जैसे कि वे eval documentation में चर्चा करते हैं।
मुझे वाइल्डकार्ड फ़ंक्शन को एक eval के भीतर काम करने के लिए प्रतीत नहीं होता है। मूल कोड जिसमें मुझे समस्याएं आ रही हैं, इस तरह दिखती हैं।
SRC_DIR = ./src/
PROG_NAME = test
define PROGRAM_template
$(1)_SRC_DIR = $(join $(SRC_DIR), $(1)/)
$(1)_SRC_FILES = $(wildcard $$($(1)_SRC_DIR)*.c)
endef
$(eval $(call PROGRAM_template, $(PROG_NAME)))
all:
@echo $(test_SRC_DIR)
@echo $(test_SRC_FILES)
@echo $(wildcard $(wildcard $(test_SRC_DIR)*.c)
जब मैं इस के साथ बनाने के चलाने के लिए, उत्पादन
./src/test
[correct list of all .c files in ./src/test/]
असल में, PROGRAM_template भीतर वाइल्डकार्ड कॉल के रूप में मैं यह उम्मीद eval'd नहीं जा रहा है। कॉल एक खाली सूची में परिणाम।
हालांकि कॉल कॉल सही तरीके से eval'd किया जा रहा है।
तो, मैं गलत क्या कर रहा हूं? मेरा अनुमान है कि
$$($(1)_SRC_DIR)
सही नहीं है, लेकिन मैं इसे करने का सही तरीका नहीं समझ सकता।
संपादित करें एक बार यह हल हो जाने के बाद, मेरे लिए eval के साथ एक और मुद्दा हिट करने में लंबा समय नहीं लगा। मैं Workaround for GNU Make 3.80 eval bug
धन्यवाद! मैं टिप्पणी करने वाला था कि यह काम नहीं करता था, फिर मैं वापस आया और आपका संपादन देखा। ऐसा लगता है कि $ (1) _SRC_DIR = $$ ($$ (SRC_DIR), $ (1) /) में भी शामिल है, जिस तरह से मेरे पास है, लेकिन $ (वाइल्डकार्ड) लाइन के लिए, आपको आवश्यकता है $$। – bengineerd
@bengineerd: हाँ, मैंने तब से अपना जवाब थोड़ा सा स्पष्ट किया है। आपको 'join' और' SRC_DIR' पर डबल एस्केप की आवश्यकता नहीं है क्योंकि उन्हें केवल एक विस्तार के बाद * पूर्ण * विस्तारित किया जाता है। लेकिन, जैसा कि मैंने कहा है, यह हमेशा डबल-एस्केप का उपयोग करने के लिए जीवन को आसान बनाता है। जब जरूरत नहीं होती है तो वे कुछ भी नुकसान नहीं पहुंचाएंगे। –