如何创建一个函数来为 make 中的目标生成先决条件列表

How to create a function to generate a list of pre-requisites for a target in make

我试过几种方法都没有成功。

我有一些目标具有相同结构的先决条件。所以我试图想出一个自定义函数来简化这些先决条件的编写。

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

示例文件夹结构:

a/
 + Dockerfile
 + overlay/
          + file1
          + file2

建议在 Makefile 中重用样式:

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

在 Makefile 中生成了 target/prerequisites 行:

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

如何使用可重复使用的机制实现此目的?

让我们分阶段进行。

这是您要为 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

这将不起作用,因为像 $* 这样的自动变量通常在先决条件列表中不可用,Make 也不会等到您选择目标后才会扩展 wildcard 调用。不正常。但是如果你使用 Secondary Expansion 它会起作用,你只需要小心转义 $ 符号:

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