函数调用作为隐式规则中的目标

时间:2016-10-02 22:14:11

标签: makefile gnu-make

在我的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 个答案:

答案 0 :(得分:1)

在将规则添加到规则列表之前处理函数调用,您可以通过运行make -Rpn来验证这一点。

$(call target_names,%)

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

- >返回foo-% bar-%

- > foo-% bar-%: foobar-%已添加到规则列表