有没有办法让一个 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 自己读取它文件。
我知道可以通过像
这样简单地包含它们来在 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 自己读取它文件。