在 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 )
我写了一个 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 )