在软件项目开发过程当中,make 工具一般被用来建造程序。make 工具经过一个被称为 Makefile 的配置文件能够自动的检测文件之间的依赖关系,这对于建造复杂的项目很是有帮助,然而,编写 Makefile 自己却不是一件容易的事情。SCons 是一个用 Python 语言编写的相似于 make 工具的程序。与 make 工具相比较,SCons 的配置文件更加简单清晰明了,除此以外,它还有许多的优势。本文将简单介绍如何在软件开发项目中使用 SCons,经过本文,读者能够学习到如何使用 SCons 来建造本身的程序项目。python
make 这个工具自上个世纪 70 年代 Stuart Feldman 在贝尔实验室开发出以来,就一直是类 UNIX 程序员的最爱之一。经过检查文件的修改时间,make 工具能够知道编译目标文件所要依赖的其余文件。在复杂的项目中,若是只有少数几个文件修改过,make 工具知道仅仅须要对哪些文件从新编译就能够确保目标程序被正确的编译连接。这样作的好处就是在编译中,不只能够节省大量的重复输入,还能够确保程序能够被 正确的连接,缩短编译的时间。虽然如此,可是为 make 工具编写建造规则却不是一件容易的事。它复杂的配置规则,即便是有经验的开发者也望而生畏。make 工具的许多替代品便所以而诞生,SCons 就是是其中之一。SCons 是一个用 Python 语言编写的相似于 make 工具的程序。与 make 工具相比较,SCons 的配置文件更加简单清晰明了,除此以外,它还有许多的优势。linux
回页首程序员
SCons 是一个开放源代码、以 Python 语言编写的下一代的程序建造工具。它最初的名字是 ScCons, 基于由 perl 语言编写的 Cons 软件开发而成,它在 2000 年 8 月得到了由 Software Carpentry 举办的 SC 建造比赛的大奖。如今 ScCons 已经被更名为 SCons,目的是为了表示再也不与 Software Carpentry 有联系,固然,还有一个目的,就是为了更方便的输入。编程
做为下一代的软件建造工具,SCons 的设计目标就是让开发人员更容易、更可靠和更快速的建造软件。与传统的 make 工具比较,SCons 具备如下优势:编程语言
回页首函数
SCons 支持多种操做系统平台,并为各个系统制做了易于安装的文件,所以在各个系统平台上的安装方法不尽相同,在 SCons 的官方网站上能够查每一个平台的具体安装方法。 若是 SCons 没有为你的系统制做相应的安装包,你也能够下载 SCons 的源代码,直接进行安装。 首先,从 SCons 的网站上下载最新的 SCons 源代码包(目前 SCons 的最新版本是 2.0.1)。 其次,解压下载的源代码。视下载的源代码包的格式不一样而有不一样的方法,在 Windows 平台上,但是使用 winzip 或者其余相似的工具解压。在 Linux 平台上,对于 tar 包,使用 tar 命令进行解压,如:工具
$ tar -zxf scons-2.0.1.tar.gz
而后切换进入解压后的目录进行安装,如学习
$ cd scons-2.0.1 $ sudo python setup.py install
命令执行若是没有错误,那么 scons 就被安装到系统上了。对于 Linux 来讲,scons 会默认安装到 /usr/loca/bin 目录下,而在 Windows 平台上,则会被安装到 C:\Python25\Scripts 下。网站
回页首ui
在 SCons 安装完成后,咱们就可使用 SCons 来建造咱们的程序或者项目了。像不少编程书籍那样,在这里咱们也经过一个简单的 helloscons 例子来讲明如何使用 SCons。例子 helloscons 包含两个文件 :
$ ls helloscons helloscons.c SConstruct
其中 helloscons.c 是程序的源文件,SConstruct 是 scons 的配置文件,相似使用 make 工具时的 Makefile 文件,所以,为了编译你的项目,须要手工建立一个 SConstruct 文件(注意:文件名是大小写敏感的)。不过,在编译的时候不须要指定它。 要编译这个例子,切换到 helloscons 的目录下,运行 scons 命令,以下:
$ cd helloscons/ $ scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... gcc -o helloscons.o -c helloscons.c gcc -o helloscons helloscons.o scons: done building targets.
来查看一下运行 scons 命令后获得的结果 :
$ ls helloscons helloscons.c helloscons.o SConstruct
建造结束后,获得了二进制文件 helloscons 以及编译的过程当中产生的一些以 .o 结尾的目标文件。试运行 helloscons 一下 , 会获得 :
$ ./helloscons Hello, SCons!
如今让咱们回过头来解析一下 helloscons 这个例子 . helloscons.c 是这个例子里的惟一一个源代码文件,它所作的事就是在控制台上输出一行简单的"Hello,SCons", 它的源代码以下:
#include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { printf("Hello, SCons!\n"); return 0; }
做为项目建造规则的配置文件 SConstruct 的内容以下 :
Program('helloscons.c')
你可能很惊讶 SConstruct 的内容只有一行,然而事实确实如此,它比传统的 Makefile 简单不少。SConstruct 以 Python 脚本的语法编写,你能够像编写 Python 脚本同样来编写它。其中的 Program 是编译的类型,说明你准备想要建造一个可执行的二进制程序,它由 helloscons.c 文件来生成。在这里,没有指定生成的可执行程序的名字。不过不用担忧,SCons 会把源代码文件名字的后缀去掉,用来做为可执行文件的名字。在这里,咱们甚至不须要像 Makefile 那样指定清理的动做,就能够执行清理任务。在 SCons 中,执行清理任务由参数 -c 指定,以下 :
$ scons -c scons: Reading SConscript files ... scons: done reading SConscript files. scons: Cleaning targets ... Removed helloscons.o Removed helloscons scons: done cleaning targets. $ ls helloscons.c SConstruct
若是你不想直接编译可执行的二进制文件,那也没有关系。SCons 支持多种编译类型,你能够根据本身的须要,任意选用其中的一种。SCons 支持的编译类型有:
这个简单的 SConstruct 的配置文件从一个侧面说明了使用 SCons 来建造程序是多么的简单。 在实际的项目开发中,程序的建造规则远比 helloscons 这个例子复杂。不过,这些都不是问题,你能够像扩展你本身的 Python 脚本文件那样去扩展 SConstruct. 若是你不想使用 SConstruct 为你设置的默承认执行文件的名字,而是选择你本身喜欢的名字,如 myscons,能够把 SConstruct 的内容修改成 :
Program('myscons, 'helloscons.c')
其中 myscons 就是你想要的可执行文件的名字,你能够把它换成任意你喜欢的名字, 不过有点注意的是,这个名字必须放在第一位。 而后在 helloscons 目录下运行 scons 命令,就会获得 myscons 这个可执行文件,如 下:
$ scons -Q gcc -o helloscons.o -c helloscons.c gcc -o myscons helloscons.o
其中的 -Q 参数是减小编译时的由 scons 产生的冗余信息。 若是你的项目由多个源文件组成,并且你想指定一些编译的宏定义,以及显式的指定使用某些库,这些对于 SCons 来讲,都是很是简单的事情。咱们的另一个例子 helloscons2 很好的说明这种状况。 helloscons2 由 3 个源文件组成 , 它们是 helloscon2.c, file1.c, file2.c,另外指定了编译的选项,同时还指定了使用哪些具体的库。让咱们来看一下 helloscons2 的 SConstruct 文件 :
Program('helloscons2', ['helloscons2.c', 'file1.c', 'file2.c'], LIBS = 'm', LIBPATH = ['/usr/lib', '/usr/local/lib'], CCFLAGS = '-DHELLOSCONS')
正如你想像的那样,这样一个配置文件并不复杂 . 该 SConstruct 文件指出,它将生成一个名叫 helloscons2 的可执行程序,该可执行程序由 helloscons2.c, file1.c 和 file2.c 组成。注意,多个源文件须要放在一个 Python 列表中。若是你的源程序代码文件不少,有十几个甚至上百个,那不要一个个的将他们都列出来,你可使用 glob('*.c') 来代替源代码列表。以下 :
Program('helloscons2', Glob('*.c')
配置文件中 LIBS,LIBAPTH 和 CCFLAGS 是 SCons 内置的关键字,它们的做用以下:
运行 scons 命令的时候,能够看到这些变量如何被使用的,让咱们执行一下 scons 命令 :
$ scons -Q gcc -o file1.o -c -DHELLOSCONS file1.c gcc -o file2.o -c -DHELLOSCONS file2.c gcc -o helloscons2.o -c -DHELLOSCONS helloscons2.c gcc -o helloscons2 helloscons2.o file1.o file2.o -L/usr/lib -L/usr/local/lib -lm
scons 命令的输出显示了可执行程序 helloscons2 如何由多个源文件而生成,以及在 SConstruct 中定义的 LIBS,LIBPATH 和 CCFLAGS 如何被使用。 可见,即便对于复杂的项目,SCons 的编译配置文件也很简单。除此以外,SCons 也提供了不少功能以适应不一样的须要,若是读者想更深刻的了解如何使用 SCons,能够参考 SCons 的帮助手册。
本文简单介绍了 SCons 的特色,如何安装 SCons,以及经过例子来讲明如何在项目中使用 SCons。 做为下一代的软件建造工具,SCons 使用 Python 语言做为配置文件,不但功能强大,并且简单易用,对于跨平台的项目,很是适合。 若是你厌烦了 make 工具的那种复杂的编写规则,尝试一下新鲜的 SCons 吧。