首页 > 解决方案 > 有没有办法让一个makefile自动下载另一个makefile?

问题描述

我知道可以通过简单地包含它们来在生成文件上执行标准规则

hi:; echo hello

include hi

但是有一些方法可以通过这样做来获取外部输入,例如 ftp 服务器,或者,可以说,aws s3 来获取“新生”生成文件,然后将其包含到项目中?在运行时?像

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

标签: makefilebuild-automation

解决方案


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:

.PHONY(或者您可以在 GNU-make中玩一些游戏)。


推荐阅读