构建工具scons让一切变得简单

本文介绍了一个Python编写的自动化构建工具SCons,通过实例演示了如何使用SCons进行编译、链接等操作,包括生成可执行文件、动态链接库及静态链接库等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你曾经为繁琐的makefile语法纠结过吗?你有想要摆脱VS的束缚,自己构建工程却又苦于无从下手吗?你有为同一个工程要在不同操作系统或不同平台下构建编译环境而苦恼过吗? 本文有我的选择,你的答案。

最近小试了一把用scons来构建编译环境,感觉很不错,跟大家分享一下。
先说明下什么是scons,scons是一个Python写的自动化构建工具,就比如老牌的cmake,或者如果经常跟google一些开源项目打交道的话,那肯定知道新近开始流行的gyp(google内部用的构建工具),scons实现跟它们有类似的功能。而scons又有区别于其他构建工具的特点,不得不承认,这些特点让我喜欢上了这个工具。
先简单总结下吸引我的几点:
1. 自动依赖分析
2. 工具本身由python实现,跨平台
3. 基于MD5识别构建文件的改变,并且可以自定义和扩展
4. 构建文件逻辑用python来写,功能强大,扩展性超强,跨平台
5. 简单易用(半小时内可以学会如何构建中小规模编译环境)
6. 官方提供的文档详细易理解(如果看过google的gyp的文档,那叫一个坑爹)

好了,进入正题,就让我们来循序渐进的来领略下scons的魅力吧。
首先是安装环境,
第一步当然是要保证系统中安装了python,貌似2.6和2.7下scons都没有问题,其他的自己尝试下吧。
第二步,安装scons。windows环境的话直接去官网下载exe直接安装即可。linux Debian系统下则更方便,可以直接用如下命令来安装:sudo apt-get install scons
安装完成后,在命令行验证一下,输入scons -v, 如果没有提示scons命令不存在则说明安装成功。不幸的是,windows下还真提示不存在了,怎么办?其实在python安装路径C:\Python27\Scripts下(我的python安装在C:\Python27)有个scons.bat,以后运行这个命令就可以(/scons.bat -v),为了方便可以把该路径追加到环境变量PATH中。
ok,环境搞定。

接着,一起来细细品味下scons吧。
1. 假设有如下【helloScons.c】文件:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
        printf("Hello, SCons!\n");
        return 0;
} 
用scons怎么编译它呢?首先在helloScons.c相同路径下新建【SConstruct】文件,内容如下:
Program('helloScons.c')

命令行,进入该文件相同路径,运行‘scons’(windows下运行scons.bat)。可以看到如下运行结果:
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.
编译完成,得到helloScons可执行文件。
如果我们希望生成其他名字的可执行文件呢?很简单,把【SConstruct】改成如下内容就可:
Program('newName', 'helloScons.c')
 
2. 我们稍微改动下,比如相同路径下再新建个文件extScons.c, extScons.h:
extScons.h
int add(int x, int y);

extScons.c
int add(int x, int y)
{
     return x + y;
}

然后修改下【helloScons.c】:
#include <stdio.h> 
#include <stdlib.h>
#include “extScons.h”
int main(int argc, char* argv[]) 
{ 
        printf("Hello, SCons %d!\n", add(1, 2)); 
        return 0; 
} 

SConstruct】文件怎么改呢?
Program(['helloScons.c', 'extScons.c'])
那如果你整个工程中有上百个.c,难道都要在SConstruct中一个一个写出来吗?当然不需要,下面这样也能达到跟上面一样的功能:
Program(Glob('*.c'))

3. 假设我们再变化一下,在当前路径下创建ext文件夹,把extScons.h和extScons.c移到ext文件夹里,【SConstruct】怎么写:
Program(['helloScons.c', 'ext/extScons.c'])
类似如果希望设置为文件夹下所有文件,也可以写成:
Program([Glob('*.c'), Glob('ext/*.c')])

4. 那么如果要把extScons.c编译成动态链接库.so,怎么做?
【SConstruct】文件如下:
SharedLibrary('ext/extScons.c')
Program(['helloScons.c'], LIBS=['extScons'], LIBPATH='./ext')
解释一下,SharedLibrary()指定把ext/extScons.c编译成动态链接库,如果想编译为静态链接库则使用StaticLibrary()。Program方法中,LIBS指定的是主程序helloScons.c需要使用的动态链接库libextScons.so,LIBPATH则指定的是libextScons.so的路径。
运行scons后,可以看到ext文件夹下生成了libextScons.so,主文件夹下生成了可执行程序helloScons。

5. 如果要把编译和链接两个步骤分开呢?没问题,scons提供了Object方法来编译生成.o(windows下为.obj)文件。
【SConstruct】文件如下:
import os
Object('ext/extScons.c')
Library('ext/extScons.o')
Object('helloScons.c')
Program(['helloScons.o'], LIBS=['extScons'], LIBPATH='./ext')
Object方法用来编译生成.o文件,Library和Program则用来链接.o生成静态链接库和可执行文件。
还可以再改善下如上构建代码:
import os
ext = Object('ext/extScons.c')
Library(ext)
main = Object('helloScons.c')
Program(main, LIBS=['extScons'], LIBPATH='./ext')
Object会返回编译产生的.o文件列表,可以直接把这个返回值传给Library和Program方法。在需要编译许多代码文件时,这点还是很有用的。

6. 如果需要在不同操作系统下编译链接不同的代码文件呢?scons可以很简单就实现。
我们再创建一个文件【helloSconsForWin.c】,作为windows环境下使用的主程序:
#include <stdio.h>
#include <stdlib.h>
#include "ext/extScons.h"
int main(int argc, char* argv[])
{
        printf("Hello, SCons in Windows %d!\n", add(1, 2));
        return 0;
}

同时,假设我们又希望在Linux下以动态链接的形式,而在windows下以静态链接的形式使用extScons【SConstruct】文件如下:
import os
if os.name == "posix":
     SharedLibrary('ext/extScons.c')
     Program(['helloScons.c'], LIBS=['extScons'], LIBPATH='./ext')
elif os.name == "nt":
     StaticLibrary('ext/extScons.c')
     Program(['helloSconsForWin.c'], LIBS=['extScons'], LIBPATH='./ext')
纯粹的python语法,使用了os模块,如果你熟悉python的话,编译和链接的逻辑你可以随心所欲的写。其实这一点是最吸引我的,因为我算是个python的fan,呵呵。

本文其实只是一些关于scons的最基本的说明,在这里我也只是抛砖引玉,scons还有很多很好的特性,大家可以参考官方的文档,如果有什么新体会新发现,也别忘了留言分享下吧。
前言 make 这个工具自上个世纪 70 年代 Stuart Feldman 在贝尔实验室开发出以来,就一直是类 UNIX 程序员的最爱之一。通过检查文件的修改时间,make 工具可以知道编译目标文件所要依赖的其他文件。在复杂的项目中,如果只有少数几个文件修改过,make 工具知道仅仅需要对哪些文件重新编译就可以确保目标程序被正确的编译链接。这样做的好处就是在编译中,不仅可以节省大量的重复输入,还可以确保程序可以被正确的链接,缩短编译的时间。虽然如此,但是为 make 工具编写建造规则却不是一件容易的事。它复杂的配置规则,即使是有经验的开发者也望而生畏。make 工具的许多替代品便因此而诞生,SCons 就是是其中之一。SCons 是一个用 Python 语言编写的类似于 make 工具的程序。与 make 工具相比较,SCons 的配置文件更加简单清晰明了,除此之外,它还有许多的优点。 -------------------------------------------------------------------------------- 回页首 SCons 简介 SCons 是一个开放源代码、以 Python 语言编写的下一代的程序建造工具。它最初的名字是 ScCons, 基于由 perl 语言编写的 Cons 软件开发而成,它在 2000 年 8 月获得了由 Software Carpentry 举办的 SC 建造比赛的大奖。现在 ScCons 已经被改名为 SCons,目的是为了表示不再与 Software Carpentry 有联系,当然,还有一个目的,就是为了更方便的输入。 作为下一代的软件建造工具SCons 的设计目标就是让开发人员更容易、更可靠和更快速的建造软件。与传统的 make 工具比较,SCons 具有以下优点: 使用 Python 脚本做为配置文件 对于 C,C++ 和 Fortran, 内建支持可靠自动依赖分析 . 不用像 make 工具那样需要执行"make depends"和"make clean"就可以获得所有的依赖关系。 内建支持 C, C++, D, Java, Fortran, Yacc, Lex, Qt,SWIG 以及 Tex/Latex。用户还可以根据自己的需要进行扩展以获得对需要编程语言的支持。 支持 make -j 风格的并行建造。相比 make -j, SCons 可以同时运行 N 个工作,而不用担心代码的层次结构。 使用 Autoconf 风格查找头文件,函数库,函数和类型定义。 良好的夸平台性。SCons 可以运行在 Linux, AIX, BSD, HP/UX, IRIX, Solaris, Windows, Mac OS X 和 OS/2 上。 -------------------------------------------------------------------------------- 回页首 安装 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 下。 -------------------------------------------------------------------------------- 回页首 使用 SConsSCons 安装完成后,我们就可以使用 SCons 来建造我们的程序或者项目了。像很多编程书籍那样,在这里我们也通过一个简单的 helloscons 例子来说明如何使用
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值