在我的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))))))
答案 0 :(得分:1)
在将规则添加到规则列表之前处理函数调用,您可以通过运行make -Rpn
来验证这一点。
$(call target_names,%)
- >替换foo-$(1) bar-$(1)
,其中$1
== %
- >返回foo-% bar-%
- > foo-% bar-%: foobar-%
已添加到规则列表