我知道可以通过简单地像这样包含它们来在makefile上执行标准规则
hi:; echo hello
include hi
但是通过某种方式,可以通过某种方式来获取外部输入(例如ftp服务器),或者可以说aws s3来获取“新生” makefile,然后将其包含到项目中?在运行时? 喜欢
include https://s3.bucket.domain.com/newmk.mk
答案 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将重新执行以读取该文件。