2017-08-08 24 views
0

我正在使用一箇舊版庫,並試圖在一些單元測試中努力幫助我進行開發。在這方面,我發現如果我可以在依賴關係上創建特定於目標的過濾器,那麼將使它們的makefile適合我的單元測試更容易一些。目前,我會做這樣的事情makefile中的目標的自定義依賴過濾器

var_list = input1 input2 
    out_list = $(var_list:%=%.txt) 

    all_deps = dep1 dep2 dep3 

    input1_filter = dep2 
    input2_filter = dep1 dep3 

    all: $(out_list) 

    input1.txt: %.txt: % $(filter-out $(input1_filter),$(all_deps)) 
     @echo "reqs = $?" 
     @echo "$< > [email protected]" 
     @echo $< > [email protected] 

    input2.txt: %.txt: % $(filter-out $(input2_filter),$(all_deps)) 
     @echo "reqs = $?" 
     @echo "$< > [email protected]" 
     @echo $< > [email protected] 

    clean: 
     @rm $(out_list) 

顯然,以規則爲input1.txtinput2.txt幾乎是一樣的,所以這將是巨大的,如果一個能寫

var_list = input1 input2 
    out_list = $(var_list:%=%.txt) 

    all_deps = dep1 dep2 dep3 

    input1_filter = dep2 
    input2_filter = dep1 dep3 

    all: $(out_list) 

    $(out_list): %.txt: % $(filter-out $(%_filter),$(all_deps)) 
     @echo "reqs = $?" 
     @echo "$< > [email protected]" 
     @echo $< > [email protected] 

    clean: 
     @rm $(out_list) 

這意味着對於每一個目標我做,我只需要指定一個相應的_filter變量,其餘的將由makefile來完成。但是我仍然無法獲得這個工作。我發現可以在規則的主體中引用這些變量,例如,可以在主體中寫入$(filter-out $($<_filter),$(all_deps)),但不能在依賴列表中寫入。

+0

我從來沒見過? –

+0

對不起,這只是一個錯字,應該是$,我會修復它 –

回答

1

foreach-eval-call(GNU只作)是一個選項:

var_list = input1 input2 
out_list = $(var_list:%=%.txt) 

all_deps = dep1 dep2 dep3 

input1_filter = dep2 
input2_filter = dep1 dep3 

all: $(out_list) 

define MY_rule 
$(1).txt: $(1) $$(filter-out $$($(1)_filter),$$(all_deps)) 
    @echo "reqs = $$?" 
    @echo "$$< > [email protected]" 
    @echo $$< > [email protected] 
endef 
$(foreach v,$(var_list),$(eval $(call MY_rule,$(v)))) 

clean: 
    @rm $(out_list) 

注重雙$$,它們是重要的。有關此構造的詳細解釋,請參閱this other answer以獲得類似的問題。

編輯:函數應該這樣`&(filter_out ...`之前(我的意思是,'&'標誌調用使函數)是什麼讓您使用的是過濾出

+0

是的,似乎工作,謝謝。所以我想沒有辦法擴展依賴關係中的模式子,並且它也評估我也修復了一些你最初是我的拼寫錯誤的答案錯誤 –

+0

@JonasGlesaaen我不明白你的問題你是什麼意思* *依賴*中的模式子*和*評估* *? –

+0

基本上,當編寫依賴關係時,我期望$(%_ filter)模式匹配$(input1_filter)(因爲在這種情況下,詞幹應該是input1或input2),然後查找它,但似乎並非如此。也許它會將本地文件夾放在主幹上?例如。該詞幹實際上是./input1,這意味着它匹配$(./ input1_filter),它不是一個變量。 –