--作者:燕十三(flyingcys)
-- blog:http://blog.csdn.net/flyingcys
--QQ:294102238
Scons是一个开放源码、以Python语言编码的自动化构建工具,可用来替代make编写复杂的makefile。并且scons是跨平台的,只要scons脚本写的好,可以在Linux和Windows下随意编译。
一、Scons安装
在使用scons之前,必须先安装Python,ubuntu下默认已安装python。如为Windows系统可至https://www.python.org/downloads/release/python-2713/下载安装python2.7。
如使用的是Ubuntu系统,可直接通过sudo apt-get install scons命令安装已编译好的scons。也可以通过源码编译安装,至官网http://scons.org/pages/download.html下载源码,当前最新版本为scons 2.5.1,可下载的zip格式的“scons-2.5.1.zip”。
解压后进入源文件目录,在命令行输入sudo python setup.py install进行编译,安装scons脚本至python目录/usr/local/bin,同事会安装scons编译引擎到python使用的库目录/usr/loacl/lib/scons。
Scons详细安装使用说明可在官网http://www.scons.org/doc/HTML/scons-user.html下查看,中文翻译版说明可在http://www.linuxidc.com/Linux/2013-02/79467.htm,看完就基本上就可以上手了。
二、Scons入门
1. scons 编译脚本:
a) 编译顶层脚本文件名为SConstruct,输入scons命令后,自动调用该脚本
b) scons的配置文件Sconscript,通过Sconscript()函数导入配置文件。
2. scons -c:清除目标文件,对应make clean
3. scons -Q:只显示编译信息,去处多余的打印信息
4. 常用scons方法:
a) Program():生成可执行文件。如:
Program(‘hello.c’):编译hello.c为可执行文件,文件名为第一个文件名
Program(‘main’,‘hello.c’):编译hello.c为可执行文件,文件名mian
b) Object():生成目标文件。如:
Object(‘main’, ’hello.c’):编译hello.c为目标文件,文件名为main.o
c) 生成库文件
i. Library():生成库,默认为静态库。
ii. StaticLibrary():生成静态库
iii. ShareLibrary():生成动态库
d) 编译多个文件
i. Program([‘hello.c’, ‘func1.c’, ‘func2.c’])
ii. Split(‘hello.c func1.c func2’)
iii. Glob(‘*.c’)
5. 常用scons关键字:
i. source:指定源文件名
ii. target:指定目标文件名。如:
Program(source = Split(‘hello.c func1.c func2.c’), target = ‘main’)
iii. LIBS:指定库文件,不需要添加lib和后面的.a,直接输入名字。等同makefile里面的-l。如:
LIBS=[‘m’,‘pthread’]
iv. LIBPATH:指定库文件路径,等同于makefile里面的-L。如:
LIBPATH = [‘/usr/lib’,‘/usr/local/bin’]
v. CPPPATH:指定程序编译过程中需要查找的头文件路径。
vi. CCFLAGS: 指定编译选项。如:
Program(‘main’,‘hello.c’, CCFLAGS = [‘-g’,‘-O2’],CPPPATH = [‘./include’,‘../include’])
vii. LINKFLAGS: 指定链接选项
viii. CPPDEFINES:指定预编译选项
三、Scons进阶
scons脚本是用Python语言写的,所以熟悉Python很重要,但是没关系,可以一点点熟悉。个人感觉对于scons来说,环境变量(Environment)是异常重要的,只有会用Environment,才能写出真正可以实际使用的scons脚本。
1. 构造环境变量:
个人理解就是由自己创建的环境变量,这个环境变量可以用来控制整个目标文件编译过程。
本人第一个用到构造环境变量的就是交叉编译器的设置,由于scons默认用的是gcc来编译系统,而嵌入式开发要使用指定的交叉编译器来编译目标文件,所以可通过构造环境变量来修改编译器。
a) 创建
env = Environment(CC = ‘arm-linux-gcc’)
b) 使用:用arm-linux-gcc编译执行文件
env.Program(‘hello.c’)
c) 从构造环境变量获取值:
print “CC is:”, env[‘CC’]
d) 拷贝:我们想使用gcc编译2个不同版本的debug/realse版本的程序,就可以通过拷贝创建2个环境变量
debug = env.Clone(CCFLAGS = ‘-g’)
Realse = env.Clone(CCFLAGS = ‘-O2’)
debug.Program(‘debug’,‘hello.c’)
debug.Program(‘realse’,‘hello.c’)
e) 追加到末尾:Append()
env.Append(CCFLAGS = ‘-DLAST’)
f) 追加到开始位置:Prepend()
env.Prepend(CCLFAGS = ‘-DFIRST’)
2. Python的os模块使用:
使用os模块,需要在每个脚本文件添加import os
a) os.name:获取当前正在使用的平台,linux显示为‘posix’,windows返回的是‘nt’
b) os.getcwd():获取当前工作目录
c) os.getenv():读取环境变量
d) os.putenv():设置环境变量
e) os.listdir():返回指定目录下的所有文件和目录
f) os.remove():删除一个文件
g) os.system():运行shell命令
scons 要用好,需要学习的东西还是很多的,只能一边用一边学了!