我有一些使用ifdef
進行檢查的基於某些變量存在的靈活Makefiles。有點煩人,我不得不在命令行中設置變量等於某些東西。 make all DEBUG
不會觸發ifdef
但make all DEBUG=1
。也許我只是在不屬於它的地方使用C預處理器方法。在make命令行上指定空變量
Q1)是否可以在命令行中指定變量爲空?沒有更多的字符? Q2)對於這樣的布爾參數,make的首選方法是什麼?
我有一些使用ifdef
進行檢查的基於某些變量存在的靈活Makefiles。有點煩人,我不得不在命令行中設置變量等於某些東西。 make all DEBUG
不會觸發ifdef
但make all DEBUG=1
。也許我只是在不屬於它的地方使用C預處理器方法。在make命令行上指定空變量
Q1)是否可以在命令行中指定變量爲空?沒有更多的字符? Q2)對於這樣的布爾參數,make的首選方法是什麼?
由於@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 PERFECT
和make PERFECT DEBUG
可能會產生不同的結果。但是參數的順序是不相關的,因此make PERFECT=1 DEBUG=1
和make DEBUG=1 PERFECT=1
是等效的。
我假設你的意思是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
顯然我沒有閱讀關於ifdef的手冊。 :[ – altendky
它已經闡明瞭爲什麼你不能只使用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
這是很好的,因爲你可以提出意見那裏,你可以註釋掉,如果你不此刻需要的東西,並會以保持未來,等等。
然後你可以有幾個安裝腳本,必須/可以用作標準例程的一部分。這一切都取決於你需要設置多少變量,你想擁有多少變量集合等。
請注意,最好通知用戶選擇哪組變量。
積分爲創造力...但正如你所說,這不會是一個首選的方法。 :] 謝謝。 – altendky
你問了兩個問題,我回答了兩個問題。 –