【问题标题】:How to create a function to generate a list of pre-requisites for a target in make如何创建一个函数来为 make 中的目标生成先决条件列表
【发布时间】:2019-12-29 16:08:36
【问题描述】:

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

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

先决条件:“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

如何使用可重复使用的机制来实现这一点?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案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
    

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

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

    【讨论】:

    • 非常感谢。它立即给了我我需要的东西。
    • 如果你要让它更加可重用,并将所有这些先决条件放在一个函数中,那会是什么样子?谢谢
    • 类似于PREREQS := $$*/Dockerfile $$*/overlay $$(wildcard $$*/overlay/*) 然后%_image: $(PREREQS)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 2016-10-03
    相关资源
    最近更新 更多