在 Makefile 中包装 scons 构建过程

Wrap a scons build process in a Makefile

我写了一个 scons 从一个小的 C 项目构建链,但恐怕用户不喜欢被告知 "You should install SCons first. Besides, it's really cool!"(特别是我的教授,因为他有点来自老守卫)。

有没有一种方法可以设置一个包装 scons 的 Makefile,而不需要将其安装在目标系统上?

在前段时间寻找这样的解决方案后,我最终为此编写了一个 Makefile。

因为 SCons 也是一个嵌入式用户空间包 scons-local(请参阅 download page), one can fetch in and run it. Here is a dissectioned and commented version of my Makefile, which I also uploaded as a gist

all: get_scons
       @$(SCONS_EXE)

↑ 默认操作取决于 scons 可用,并简单地运行 scons 命令(稍后在脚本中设置)(@ 符号阻止 make 打印命令)

SCONS_VERSION=2.3.4

scons-local-%.tar.gz:
    curl -L http://sourceforge.net/projects/scons/files/scons-local/$(SCONS_VERSION)/scons-local-$(SCONS_VERSION).tar.gz > scons-local-$(SCONS_VERSION).tar.gz
    touch scons-local-$(SCONS_VERSION).tar.gz

scons-local: scons-local-$(SCONS_VERSION).tar.gz
    mkdir -p scons-local
    tar xzf scons-local-$(SCONS_VERSION).tar.gz --directory scons-local
    touch scons-local

↑ 设置获取tarball的规则并解压到scons-local目录

NATIVE_SCONS=$(strip $(shell which scons 2>/dev/null))

ifeq ($(NATIVE_SCONS),)
SCONS_EXE=python2 ./scons-local/scons.py
get_scons: scons-local
    @echo "Couldn't find an installation of SCons, using a local copy"
else
SCONS_EXE=$(NATIVE_SCONS)
get_scons:
    @echo "Found SCons installation at $(SCONS_EXE)"
endif

↑ 在搜索路径中查找 scons 可执行文件(使用 which 命令):如果可用,则设置 get-scons 目标以简单地打印它可用.相反,如果它不可用,请创建 get-scons 目标,指示它依赖于之前定义的 scons-local 目标。

clean:
    $(SCONS_EXE) -c
    rm -rf scons-local
    rm -f scons-local-*.tar.gz

.PHONY: all clean get_scons

↑ 最后设置委托给scons的clean目标,之后删除本地安装。 .PHONY 规则告诉 make 以下规则不对应正在创建的文件。

此时,可以添加更多此类代理规则:

mytarget: get_scons
    @$(SCONS_EXE) mytarget

这将调用具有相应目标的 scons。

希望这是有用的,如果有什么不对的地方,请随时纠正我(我实际上不是 Makefile 专家,我正在尝试不通过使用 SCons 来成为专家 :P )