scons浅入浅出

来源:互联网 发布:上海淘宝科技有限公司 编辑:程序博客网 时间:2024/06/06 04:29

--作者:燕十三(flyingcys)

-- blog:http://blog.csdn.net/flyingcys

--QQ:294102238

Scons是一个开放源码、以Python语言编码的自动化构建工具,可用来替代make编写复杂的makefile。并且scons是跨平台的,只要scons脚本写的好,可以在LinuxWindows下随意编译。

一、Scons安装

在使用scons之前,必须先安装Pythonubuntu下默认已安装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. Pythonos模块使用:

使用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 要用好,需要学习的东西还是很多的,只能一边用一边学了!

0 0