我已经在一个小C项目中编写了scons
构建链,但我担心用户不会被告知"您应该先安装SCons。此外,它真的很酷!" (特别是我的教授,因为他是来自老卫士的那种)。
有没有办法可以设置一个包含scons的Makefile,而不是要求它安装在目标系统上?
答案 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)