如何创建函数以生成make中目标的先决条件列表

时间:2019-08-24 20:49:26

标签: makefile gnu-make

我尝试了几种失败的方法。

我有一些目标,这些目标具有相同结构的先决条件。因此,我试图提出一个自定义函数,以简化编写这些先决条件的过程。

先决条件:“ overlay”文件夹下的所有文件+文件:Dockerfile

示例文件夹结构:

a/
 + Dockerfile
 + overlay/
          + file1
          + file2

在Makefile中建议的重用样式:

a_image: $(call GetDockerFiles,$@)
# or whatever else that is recommended

Makefile中生成的目标/先决条件行:

a_image: a/Dockerfile a/overlay a/overlay/file1 a/overlay/file2

如何使用可重用机制来实现这一目标?

1 个答案:

答案 0 :(得分:1)

让我们分阶段进行吧。

这是您要为a_image构造的规则:

a_image: a/Dockerfile a/overlay a/overlay/file1 a/overlay/file2
    ...

首先,您要动态构建overlay/的内容列表:

a_image: a/Dockerfile a/overlay $(wildcard a/overlay/*)
    ...

第二,您希望此方法适用于b_imagec_image和其他方法,因此显而易见的方法是模式规则:

%_image: $*/Dockerfile $*/overlay $(wildcard $*/overlay/*)
    @echo THIS WILL NOT WORK

这将不起作用,因为先决条件列表中通常不提供诸如$*之类的自动变量,也不会等待您选择目标,然后再扩展wildcard调用。不正常。但是,如果您使用Secondary Expansion可以正常工作,则只需小心转义$符号:

.SECONDEXPANSION:
%_image:  $$*/Dockerfile $$*/overlay $$(wildcard $$*/overlay/*)
    @echo Prereqs: $^