将scons构建过程封装在Makefile中



我在一个小C项目中写了一个scons构建链,但我担心用户不喜欢被告知"你应该先安装SCons。此外,它真的很酷!"(尤其是我的教授,因为他有点像老卫士)。

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

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

因为SCons也是用户空间包scons-local的一个插件(请参阅下载页面),所以可以获取并运行它。

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)

最新更新