2013-05-31 20 views
1

我有一些使用ifdef進行檢查的基於某些變量存在的靈活Makefiles。有點煩人,我不得不在命令行中設置變量等於某些東西。 make all DEBUG不會觸發ifdefmake all DEBUG=1。也許我只是在不屬於它的地方使用C預處理器方法。在make命令行上指定空變量

Q1)是否可以在命令行中指定變量爲空?沒有更多的字符? Q2)對於這樣的布爾參數,make的首選方法是什麼?

回答

1

由於@MadScientist幾分鐘前解釋,

make all DEBUG 

爲您的品牌添加目標DEBUG。幸運的是,有一種解決方法:

ifneq (,$(filter DEBUG,$(MAKECMDGOALS))) 
    DEBUG:=1 # or do whatever you want 
    DEBUG: all; @echo -n 
endif 

重要的是要提供一個虛設規則(例如回聲什麼,如上述)與虛擬的目標。然後將此語句放在makefile的底部,或者像示例中那樣明確指定必備目標。否則,make可能會錯誤地選擇調試目標而不是全部

請注意,這不是一個首選的方法;該慣例就像使用V=1打開回聲。

另一個需要注意的是,make會按順序處理命令行目標,例如, make A B將首先處理A的目標,然後是B目標,無論這些目標是獨立的還是相互依賴的。因此,編寫make DEBUG PERFECTmake PERFECT DEBUG可能會產生不同的結果。但是參數的順序是不相關的,因此make PERFECT=1 DEBUG=1make DEBUG=1 PERFECT=1是等效的。

+0

積分爲創造力...但正如你所說,這不會是一個首選的方法。 :] 謝謝。 – altendky

+0

你問了兩個問題,我回答了兩個問題。 –

2

我假設你的意思是make all DEBUG=在這裏吧?如果沒有=,make會認爲DEBUG是構建目標,而不是變量賦值。

本手冊指定具有非空值的變量會導致ifdef返回true。不存在或存在但包含空字符串的變量會導致ifdef返回false。注意ifdef不是擴展該變量,它只是測試變量是否有任何價值。

可以使用$(origin ...)函數測試變量是否真的不是在所有定義或定義,但空的,就像這樣:

ifeq ($(origin DEBUG),undefined) 
    $(info Variable DEBUG is not defined) 
else 
    $(info Variable DEBUG is defined) 
endif 
+0

顯然我沒有閱讀關於ifdef的手冊。 :[ – altendky

0

它已經闡明瞭爲什麼你不能只使用DEBUG。但我想補充一點。

您可以使用shell腳本運行之前進行,你需要設置所有的變量,因此,例如在Linux shell中它看起來就像這樣:

$source debug_setup.sh 
$make all 
Make is starting... 
Debug is enabled 
... 

其中debug_setup.sh包含所有環境你需要的變量設置:

export DEBUG=1 
export DEBUG_OPTION=some_option 

這是很好的,因爲你可以提出意見那裏,你可以註釋掉,如果你不此刻需要的東西,並會以保持未來,等等。

然後你可以有幾個安裝腳本,必須/可以用作標準例程的一部分。這一切都取決於你需要設置多少變量,你想擁有多少變量集合等。

請注意,最好通知用戶選擇哪組變量。