有没有一种方法可以使makefile自动下载另一个makefile?

时间:2019-05-30 17:34:28

标签: makefile build-automation

我知道可以通过简单地像这样包含它们来在makefile上执行标准规则

hi:; echo hello

include hi

但是通过某种方式,可以通过某种方式来获取外部输入(例如ftp服务器),或者可以说aws s3来获取“新生” makefile,然后将其包含到项目中?在运行时? 喜欢

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

2 个答案:

答案 0 :(得分:1)

make实用程序不具有内置下载支持(甚至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以指定他们拥有的命令行下载器(也许用curl而不是wget),或者设置了其网络环境的任何标志要求。


要使下载成为无条件下载,请使用不可构建的不存在的目标

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玩游戏)。

答案 1 :(得分:1)

如前所述,无法包含URL。但是,您可以使用GNU make的auto-re-make feature做几乎一样的事情。

为此,请包含您下载的本地文件 并创建一条知道如何下载的规则:

include newmk.mk

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

在这种情况下,如果(且仅当)newmk.mk不存在,则将调用配方,将下载文件,然后make将重新执行以读取该文件。

>