如何创建一个函数来为 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_image
、c_image
和其他方法,因此显而易见的方法是模式规则:
%_image: $*/Dockerfile $*/overlay $(wildcard $*/overlay/*)
@echo THIS WILL NOT WORK
这将不起作用,因为像 $*
这样的自动变量通常在先决条件列表中不可用,Make 也不会等到您选择目标后才会扩展 wildcard
调用。不正常。但是如果你使用 Secondary Expansion 它会起作用,你只需要小心转义 $
符号:
.SECONDEXPANSION:
%_image: $$*/Dockerfile $$*/overlay $$(wildcard $$*/overlay/*)
@echo Prereqs: $^
我试过几种方法都没有成功。
我有一些目标具有相同结构的先决条件。所以我试图想出一个自定义函数来简化这些先决条件的编写。
先决条件:"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_image
、c_image
和其他方法,因此显而易见的方法是模式规则:
%_image: $*/Dockerfile $*/overlay $(wildcard $*/overlay/*)
@echo THIS WILL NOT WORK
这将不起作用,因为像 $*
这样的自动变量通常在先决条件列表中不可用,Make 也不会等到您选择目标后才会扩展 wildcard
调用。不正常。但是如果你使用 Secondary Expansion 它会起作用,你只需要小心转义 $
符号:
.SECONDEXPANSION:
%_image: $$*/Dockerfile $$*/overlay $$(wildcard $$*/overlay/*)
@echo Prereqs: $^