使用 SCons

在 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", 它的源代码如下:

清单 1. helloscons.c

#include
#include
int main(int argc, char* argv[])
{
printf("Hello, SCons!\n");
return 0;
}

作为项目建造规则的配置文件 SConstruct 的内容如下 :

清单 2. 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 支持的编译类型有:

●Program: 编译成可执行程序(在 Windows 平台上即是 exe 文件),这是最常用的一种编译类型。

●Object: 只编译成目标文件。使用这种类型,编译结束后,只会产生目标文件。在 POSIX 系统中,目标文件以 .o 结尾,在 Windows 平台上以 .OBJ 结尾。

●Library: 编译成库文件。SCons 默认编译的库是指静态链接库。

●StaticLibrary: 显示的编译成静态链接库,与上面的 Library 效果一样。

●SharedLibrary: 在 POSIX 系统上编译动态链接库,在 Windows 平台上编译 DLL。

这个简单的 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 内置的关键字,它们的作用如下:

●LIBS: 显示的指明要在链接过程中使用的库,如果有多个库,应该把它们放在一个列表里面。这个例子里,我们使用一个称为 m 的库。

●LIBPATH: 链接库的搜索路径,多个搜索路径放在一个列表中。这个例子里,库的搜索路径是 /usr/lib 和 /usr/local/lib。

●CCFLAGS: 编译选项,可以指定需要的任意编译选项,如果有多个选项,应该放在一个列表中。这个例子里,编译选项是通过 -D 这个 gcc 的选项定义了一个宏 HELLOSCONS。

运行 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 吧。

原文:http://www.ibm.com/developerworks/cn/linux/l-cn-scons/index.html?ca=drs-


相关内容