介绍一个新的构建工具:scons
make的不完美
想必在linux平台有过开发的程序员大多熟悉make,make已经赢得了太多的赞誉,尤其是相对于它强大功能下的简约规则,这种赞誉让太多的新手不敢对它有任何抱怨,只有苦苦适应,奇怪的语法,隐含规则,依赖关系,各种外部工具。当然这些还不算什么,在我看来,make带给程序员最大的不完美在于:
-
编写makefile的过程,并没有当我们在写这些makefile要控制的C++源文件时那么爽
-
后者让我们感觉是在主动的在编程实现我们的思想,而makefile编写过程却始终让我觉得这是在配置和使用一个规则严格堪比语言语法的软件
-
简单的说:编写makefile带给我们编程的痛苦,却没有让我们享受编程的快乐
好了,数落了一下make,scons该低调出场了。如果你从来没有听过或者使用过scons,可以这么理解:它是轻量级的另类make。
scons的气质
- scons脚本采用python语言编写
- 可以根据文件内容来决定依赖关系
- 对compile, link, lib,install等构件动作提供了非常直观的接口函数:只需调用这些函数,输入文件,产生构件结果
- environment,node概念,使脚本间变量传递,目标依赖变得更加清晰简单,但完全满足灵活的构建需求
几个简单示例
示例1:
一个平整目录结构的socket程序,编译目标: 主程序 hmc, 单元测试ut
文件结构 :
buffer.h
handler.cc
handler.h
heap.h
hmc.cc
hmc.h
main.cc
message.cc
message.h
record.h
stream.cc
stream.h
system.h
test.cc
timer.cc
timer.h
SConstruct构建脚本 :
srcs = Split('''
handler.cc
hmc.cc
message.cc
stream.cc
timer.cc
''')
test_srcs= Split('''
test.cc
timer.cc
''')
Program('hmc', srcs, CPPFLAGS='-g')
Program('ut', test_srcs, CPPFLAGS='-g')
scons过程
[fwf@centos5 hmc]$ scons
scons: Reading SConscript files ...
scons: warning: Two different environments were specified for target timer.o,
but they appear to have the same action: $CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES
File "/home/fwf/work/hmc/SConstruct", line 15, in ?
scons: done reading SConscript files.
scons: Building targets ...
g++ -o handler.o -c -g handler.cc
g++ -o hmc.o -c -g hmc.cc
g++ -o message.o -c -g message.cc
g++ -o stream.o -c -g stream.cc
g++ -o timer.o -c -g timer.cc
g++ -o hmc handler.o hmc.o message.o stream.o timer.o
g++ -o test.o -c -g test.cc
g++ -o ut test.o timer.o
scons: done building targets.
我的评价
我很负责的告诉大家 :scons的这些特点让它克服了makefile的复杂和不快,使编写scons脚本来构件项目的各个目标的过程就像编程一样“简单”
时间关系,就不展示例子了,有时间再补充。
想要了解?
http://www.scons.org/doc/HTML/scons-user/book1.html