2014-12-05 166 views
4

我有一個在make文件中定義的列表,並且用戶應該設置一個我需要在這個列表中找到的環境變量。有沒有辦法使用GNU make來做到這一點?在製作任何目標之前,我想在任何配方之外進行此操作。這是一個確保用戶設置env的QA檢查。變量爲範圍/列表中的值。GNU-make檢查元素是否存在於列表/數組中

在終端:

setenv ENV_PARAM x 

在Makefile中:

PARAMS := a b c 

if ${ENV_PARAM} exists in $(PARAMS) 
    true 
else 
    false 
endif 

@ MadScientist的答案作品。有沒有辦法用foreach循環來包裝if塊來測試多個參數?

KEYS := PARAMS FACTORS 
PARAMS := a b c 
FACTORS := x y z 

foreach v in ($(KEYS)) { 
    ifneq ($(filter $(ENV_$(v)),$(v)),) 
    $(info $(ENV_$(v)) exists in $(v)) 
    else 
    $(info $(ENV_$(v)) does not exist in $(v)) 
    endif 
} 
+0

你給的例子不夠清楚。有兩個不同的地方可以使用這樣的測試:您可能想要在目標的配方中進行該測試,或者在開始構建目標之前,您可能想在任何配方之外進行測試。它們的語法非常不同,因此您需要提供更多關於您想要完成的內容的信息。 – MadScientist 2014-12-06 14:15:23

+0

我剛編輯我的問題。 – Wilderness 2014-12-06 19:06:59

回答

8

可以使用filter功能來做到這一點:

PARAMS := a b c 

ifneq ($(filter $(ENV_PARAM),$(PARAMS)),) 
    $(info $(ENV_PARAM) exists in $(PARAMS)) 
else 
    $(info $(ENV_PARAM) does not exist in $(PARAMS)) 
endif 

閱讀:「如果搜索在PARAMS的ENV_PARAM值的結果是不是空的,運行‘真’塊其他運行'假'塊「。

UPDATE

你的第二個問題,確實不能完全根據您提供的信息回答。爲了瞭解最好的方法,我們需要知道你在if語句中的真正內容,當條件是真的,假的時候。你打算申報更多的變數?創建一些規則?還有別的嗎?有很多方法可以做你想做的事情,最乾淨的做法可能會有所不同,取決於你想做什麼。

然而,一個通用的解決方案將涉及使用define創建循環的內容,然後使用foreacheval,這樣的事情:

KEYS := PARAMS FACTORS 
PARAMS := a b c 
FACTORS := x y z 

define LOOPBODY 
    ifneq ($$(filter $$(ENV_$(v)),$(v)),) 
    $$(info $$(ENV_$(v)) exists in $(v)) 
    else 
    $$(info $$(ENV_$(v)) does not exist in $(v)) 
    endif 
endef 

$(foreach v,$(KEYS),$(eval $(LOOPBODY))) 

您可能會感興趣的關於一組帖子我做元編程在GNU make:http://make.mad-scientist.net/category/metaprogramming/

+0

太棒了!謝謝。 – Wilderness 2014-12-06 19:46:34

+0

更進一步,有沒有辦法將這個ifneq塊封裝在一個foreach塊中?我想對多個參數進行測試。我做了很多搜索,但找不到任何顯示類似用法的示例。我已經用我想要的更新了我的問題。 – Wilderness 2014-12-07 02:13:34

+0

你的意思是,測試是否有任何一個參數存在?你可以給「filter」的第一個參數賦予多個單詞,它會返回匹配的任何一個:'$(filter $(P1)$(P2)$(P3),$(PARAMS))' – MadScientist 2014-12-07 15:10:59

相關問題