有没有办法让一个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

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

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 $@