有没有办法让一个 makefile 自动下载另一个 makefile?

Is there a way to make a makefile autodownload another makefile?

我知道可以通过像

这样简单地包含它们来在 makefile 上执行标准规则
hi:; echo hello

include hi

但是有一些方法可以通过这样做来获取外部输入,例如 ftp 服务器,或者说,aws s3 来获取 "newborn" 生成文件,然后将其包含到该项目?在运行时? 喜欢

include https://s3.bucket.domain.com/newmk.mk

make 实用程序没有 built-in 下载支持(甚至连 GNU 的 make 都不支持,有时似乎有厨房水槽),但因为它可以 运行 任意命令,你可以伪造它

最简单的情况是这样的片段

your_primary_target: newmk.mk

#...
WGET=wget
WGET_FLAGS=-q

newmk.mk: 
    $(WGET) $(WGET_FLAGS) https://s3.bucket.domain.com/newmk.mk
#...

仅当不存在此类文件时才会尝试下载该文件。

这里的主要困难是您的用户可能需要编辑 makefile 以指定他们拥有的 command-line 下载器(也许 curl 而不是 wget),或者它设置任何标记他们的网络环境需要。


要使下载无条件使用不可构建的,non-existent 目标

WGET=wget
WGET_FLAGS=-1

newmk.mk: ALWAYS
    $(WGET) $(WGET_FLAGS) https://s3.bucket.domain.com/newmk.mk

# Here "ALWAYS" is *not* the name of a file existing in the file-system
ALWAYS:

(或者GNU-make中有可以用.PHONY玩的游戏)。

如前所述,无法包含 URL。但是,您可以使用 GNU make 的 auto-re-make feature.

做一些几乎一样好的事情

为此,包括您下载的本地文件创建一个知道如何下载它的规则:

include newmk.mk

newmk.mk:
        wget https://s3.bucket.domain.com/newmk.mk -O $@

在这种情况下,如果(且仅当)newmk.mk 不存在,那么将调用配方,下载文件,然后 make 将 re-exec 自己读取它文件。