有没有办法让一个makefile自动下载另一个makefile?
我知道,通过像这样简单地包含标准规则,就可以在makefile上执行标准规则有没有办法让一个makefile自动下载另一个makefile?,makefile,build-automation,Makefile,Build Automation,我知道,通过像这样简单地包含标准规则,就可以在makefile上执行标准规则 hi:; echo hello include hi 但是,通过这样做,有某种方法可以获取外部输入,比如ftp服务器,或者说aws s3,获取一个“新生的”makefile,然后将其包含到项目中?在运行时? 像 make实用程序没有内置的下载支持(甚至连GNU的make都没有,它有时似乎有厨房水槽),但是因为它可以运行任意命令,所以你可以伪造它 最简单的情况是类似于 your_primary_target: new
hi:; echo hello
include hi
但是,通过这样做,有某种方法可以获取外部输入,比如ftp服务器,或者说aws s3,获取一个“新生的”makefile,然后将其包含到项目中?在运行时?
像
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
。如前所述,没有办法包含URL。然而,您可以使用GNU make做一些几乎一样好的事情
为此,请包含下载的本地文件,并创建知道如何下载的规则:
include newmk.mk
newmk.mk:
wget https://s3.bucket.domain.com/newmk.mk -O $@
在这种情况下,如果(且仅当)
newmk.mk
不存在,则将调用配方,下载文件,然后make将重新执行自身以读取该文件。我这样做,只是不知道只有旧文件不存在时才会下载新文件。谢谢我会找到一种方法来解决这个问题。你想在每次运行make时下载这个文件吗,即使它已经存在?你的问题中没有这么说。我对“新生”文件的解释是,你只想在它不存在的情况下创建它。是的,这样做的目的是在执行任何命令之前,该文件会自动更新。我通过添加一个selfdestroy规则并在文件末尾包含它来解决这个问题。工作完美
include newmk.mk
newmk.mk:
wget https://s3.bucket.domain.com/newmk.mk -O $@