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))))))