将一个scons构建过程包装在Makefile中

时间:2015-02-21 12:09:10

标签: makefile scons

我已经在一个小C项目中编写了scons构建链,但我担心用户不会被告知"您应该先安装SCons。此外,它真的很酷!" (特别是我的教授,因为他是来自老卫士的那种)。

有没有办法可以设置一个包含scons的Makefile,而不是要求它安装在目标系统上?

1 个答案:

答案 0 :(得分:2)

在不久前寻找这样的解决方案之后,我最终为此目的编写了一个Makefile。

因为SCons也是一个插入用户空间包scons-local(参见download page),所以可以获取并运行它。这是我的Makefile的解剖和评论版本,我也将其上传为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)