2016-10-02 28 views
1

在我的Makefile中,我有一個生成多個文件的配方。事情是這樣的:函數調用作爲隱式規則中的目標

foo-% bar-%: foobar-% 
    grep "foo" $^ > foo-$* 
    grep "bar" $^ > bar-$* 

預期其工作原理:

$ make foo-lol 
grep "foo" foobar-lol > foo-lol 
grep "bar" foobar-lol > bar-lol 

在我的現實情況下,目標和前提文件路徑是一個複雜得多(見最後),所以我放在其他地方使用在功能邏輯,像這樣:

target_names = foo-$(1) bar-$(1) 

,並試圖使用它在我的食譜

$(call target_names,%): foobar-% 
    grep "foo" $^ > foo-$* 
    grep "bar" $^ > bar-$* 

這出乎我的意料,還曾:

$ make foo-lol 
grep "foo" foobar-lol > foo-lol 
grep "bar" foobar-lol > bar-lol 

我不明白爲什麼它的工作原理。 Make如何找到這個配方?我一直認爲Make會通過所有食譜中的目標列表。但是,如果是這樣,那麼在代替目標文件名時會有一個函數調用,它背後的邏輯是什麼? Make如何找到返回想要的目標的函數調用的正確輸入?


正如我所說,我實際的例子是相當有8個目標和2個先決條件更爲複雜:

target_names = \ 
    $(foreach tissue, $(TISSUE), \ 
    $(foreach chain, $(CHAIN), \ 
     $(foreach direction, R1 R2, \ 
     $(foreach read, $(filter %_$(direction)_001.fastq, $(1)), \ 
      $(patsubst data/%_$(direction)_001.fastq, \ 
        results/%-$(tissue)-$(chain)-$(direction).fastq, \ 
        $(read)))))) 

回答

1

函數調用處理之前的規則被添加到規則列表中,您可以通過運行make -Rpn來驗證這一點。

$(call target_names,%)

- >替換foo-$(1) bar-$(1),其中$1 == %

- >返回foo-% bar-%

- >foo-% bar-%: foobar-%被添加到規則

列表