2010-09-10 19 views
12

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

$> echo $CROSS_COMPILE 
whatever 
$> 

और $ VARIABLE परिभाषित नहीं है:

.PHONY: checksource 

all: checksource default 

checksource: 
    $(if $(and $(ifeq ($(CROSS_COMPILE), whatever)), $(ifeq ($(VARIABLE),))), \ 
    ($(shell echo "Error! VARIABLE not defined!") \ 
    $(shell exit 2))) 

हैं $CROSS_COMPILE जो कुछ भी करने के लिए सेट है:

$> echo $VARIABLE 
$> 

यह करता

मैं अपने Makefile में निम्नलिखित नियम है मेक से बाहर निकलें और डिफ़ॉल्ट लक्ष्य बनाया गया है। ठीक है, मुझे पता है कि मैं इसे करने के लिए नेस्टेड ifeq का उपयोग कर सकता हूं लेकिन मैं इसे सुंदर बनाना चाहता हूं (और मेकफ़ाइल के बारे में कुछ और सीखना चाहता हूं)।

उत्तर

13

$(ifeq) जैसी कोई चीज़ नहीं है। मैं अब भी लगता है कि आप लक्ष्यों में से एक के रूप में makefile अपने आप में जांच करना चाहिए, नहीं:

ifeq ($(CROSS_COMPILE),whatever) 
ifeq ($(VARIABLE),) 
$(error Variables not set correctly.) 
endif 
endif 

और तुम नेस्टेड ifeq से बचने के लिए है तो:

ifeq ($(or $(subst whatever,,$(CROSS_COMPILE)),$(VARIABLE)),) 
$(error Variables not set correctly.) 
endif 

लेकिन मैं यह देखने के लिए असफल यह कैसे सुधार है। आप एक लक्ष्य में यह करने के लिए चाहते हैं, सिर्फ खोल का उपयोग करें और मेकअप कार्यों के साथ परेशान नहीं है:

checksource: 
    @if [ "$(CROSS_COMPILE)" = whatever -a -z "$(VARIABLE)" ]; then \ 
     echo "Error: Variables not set correctly"; exit 2; \ 
    else true; fi 

मैं अभी भी, पहला विकल्प के साथ जाना चाहते हैं क्योंकि आप को रोक सकता है इससे पहले कि यह stat सभी s फाइलें Makefile में नाम करती हैं और checksource निष्पादित करने का निर्णय लेती हैं।

3

इसे बनाने में हमेशा खोल का उपयोग करने से बेहतर होता है (चाहे $(shell) या नुस्खा के माध्यम से)। यदि आप नुस्खा में चेक करते हैं, तो इसका मतलब है कि मेकफ़ाइल में ऐसे अन्य लक्ष्य हो सकते हैं जिन्हें इस विशेष जोर की आवश्यकता नहीं है।

assert = $(if $(filter whatever,${CROSS_COMPILE}),$(if ${VARIABLE},,$(error Urk! Variable problem))) 

checksource: 
     ${assert}some shell commands... 

पीएस यदि आपने --warn-undefined-variables के साथ अपना मूल निर्माण चलाया है तो आपको कुछ सुराग मिल सकता है कि आपके मैक्रोज़ ठीक से क्यों विस्तार नहीं कर रहे थे:

$ make -f 1.mak CROSS_COMPILE=whatever --warn-undefined-variables 
1.mak:6: warning: undefined variable `ifeq (whatever, whatever)' 
make: *** No rule to make target `default', needed by `all'. Stop. 
संबंधित मुद्दे