簡體   English   中英

makefile:如果變量為空,則在單個make目標上失敗

[英]makefile: fail on single make target if variable empty

我是構建Makefile的新手,正在嘗試確定如果變量為空的構建目標將如何失敗。 我希望能夠將變量作為環境變量或make參數傳遞。

說我有一個這樣的makefile:

VER ?=

step0:
    echo "step0 should work"

step1: 
    echo "step1 should enforce variable"
    ifeq($(VER), "")
    $(error VER is not set)
    endif 
    echo "Success: Value of Ver ${VER}"

step2:
    echo "step2 should work"

我希望能夠運行以下測試用例:

VER="foo" make step1  
# should result in printing the "Success:" line

要么

export VER=foo
make step1  
# should result in printing the "Success:" line

要么

make step1 VER=foo  
# should result in printing the "Success:" line

要么

make step1  
# should result in printing "VER is not set"

但是,當我使用上述任何一個運行make step時,我總是得到VER is not set錯誤。

簡而言之,如何在特定的make目標中測試變量並在未設置錯誤消息的情況下進行響應? (但是其他make目標將不在乎是否設置了變量)

有兩件事:

首先,必須將Make命令和shell命令整齊地分開。 這個:

ifeq ($(A),$(B))
...
endif

Make語法。 如果將ifeq (...)傳遞給shell,可能會遇到麻煩。 makefile配方中的命令是要傳遞給shell的shell命令。 要在規則中間使用“使ifeq條件”,請執行以下操作:

step1:
    some command
ifeq ($(A),$(B))
    another command
endif
    yet another command

請注意, ifeqendif之前沒有TAB; 這些不是要傳遞給外殼程序的命令,它們由Make使用。

第二,這個:

ifeq(...)

應該是這樣的:

ifeq (...)

空間很重要(至少在我的Make版本中)。

第三,這個:

ifeq ($(VER), "")

應該是這樣的:

ifeq ($(VER),)

除非您實際上打算讓變量包含字符串“””。

(您可能已經發現了最后一批自己的東西,孤立地與ifeq一起玩;請始終孤立地測試新工具。)

完成這些更改后,makefile對我有用。 如果對您不起作用,請告訴我,我們會盡快解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM