2010-09-10 37 views
12

所以我需要確保如果我正在爲設置了shell變量的特定目標進行交叉編譯。如果變量未設置,則make應顯示一條消息,然後退出。如果兩個shell變量的狀態爲特定狀態,則退出make文件

我在我的Makefile以下規則:

.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 $CROSS_COMPILE 
whatever 
$> 

和$變量沒有定義:

$> echo $VARIABLE 
$> 

它確實不退出make並且默認目標被創建。好吧,我知道我可以使用嵌套ifeq來做到這一點,但我想讓它變得漂亮(並且瞭解更多關於makefile的知識)。

回答

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一切都前文件名稱爲Makefile,並決定開始執行checksource

3

在make中做它總是比使用shell更好(無論是通過$(shell)還是配方)。如果你確實在配方中進行檢查,那麼這意味着Makefile可以包含其他不需要此特定斷言的目標。

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

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

P.S.如果您使用--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.