【发布时间】:2015-02-21 12:09:09
【问题描述】:
我写了一个 scons 构建链形式的一个小 C 项目,但恐怕用户不喜欢被告知“你应该先安装 SCons。此外,它真的很酷!” (尤其是我的教授,因为他有点像老派)。
有没有一种方法可以设置一个包装 scons 的 Makefile,而不需要将它安装在目标系统上?
【问题讨论】:
我写了一个 scons 构建链形式的一个小 C 项目,但恐怕用户不喜欢被告知“你应该先安装 SCons。此外,它真的很酷!” (尤其是我的教授,因为他有点像老派)。
有没有一种方法可以设置一个包装 scons 的 Makefile,而不需要将它安装在目标系统上?
【问题讨论】:
在前段时间寻找这样的解决方案后,我最终为此编写了一个 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)
【讨论】: