学习scons总结

linux下使用Scons构建自己的项目(来源:http://blog.csdn.net/shitangdejiaozi/article/details/51499591)
一、简介:SCons 是一个开放源代码、以 Python 语言编写的下一代的程序建造工具,替代Makefile的功能。
二、安装:sudo apt-get install scons
三、用法
1、SConstruct 文件是scons用来控制编译的文件,类似MakeFile,是一个Python脚本。编译顶层脚本文件名为 SConstruct,输入scons命令后,自动调用该脚本。
2、运行:scons 
scons  -c 就是清理你创建的文件,就是make clean 
scons  -Q 就是省略自带的一堆废话,只显示编译过程
3、支持的编译类型
Program: 编译成可执行程序
Object :只编译成目标文件,使用这种类型,编译结束后,只会产生目标文件,.o文件。
Library :编译成库文件,scons默认编译的库是指静态链接库
StaticLibrary :显式的编译成静态链接库,与上面的Library效果一样
SharedLibrary :编译成动态库
4、语法
Program('hello',['file.c','file2.c']), //生成可执行文件hello
Program('hello',Glob('*.c')),//使用Glob编译所有匹配的文件
Program('hello',Split("main.c file1.c file2.c")),//使用Split,以空白字符为分割符
Object(‘main’, ’hello.c’):编译hello.c为目标文件,文件名为main.o
scons的配置文件Sconscript,通过Sconscript()函数导入配置文件。

5、关键字
CCFLAGS 指定编译选项 
LINKFLAGS 指定链接选项 
CPPDEFINES指定预编译器 
LIBS 指定所需要链接的库文件 
LIBPATH 指定库文件(lib)的搜索路径 
CPPPATH 指定[.h,.c,.cpp]等文件的搜素路径
source:指定源文件名
target:指定目标文件名。如:
Program(source = Split(‘hello.c func1.c func2.c’), target = ‘main’)

Program('hello',['hellosons.c','file.c'],
LIBS = 'pthread',
LIBPATH = ['/usr/lib','/usr/local/lib'],
CCFLAGS = ['-g ','-Wall'],
CPPPATH = ['/usr/include','hello/src'])
6、使用Environments
(1)用户的环境变量,他们可以通过os.environ获取
(2)Construction Environment
env = Environment(CC = ‘arm-linux-gcc’) //创建,(name,value)集合
env.Program(‘hello.c’)
for item in env.Dictionary():
print '(%s:%s)' %(item,env[item]) //查看内容
env['cc'] //查看变量
env.subst('$CC') //查看变量,如果subset变量不存在时报告错误。
//修改环境变量
env.Clone //拷贝一个环境变量
env.Replace //替换一个已经存在的环境变量
env.SetDefault //为一个没有被定义的变量设置默认值
env.Append(CCFLAGS = '-g') //为一个已存在的环境变量增加一个值,感觉这个比较常用啊
env.Prepend(CCLFAGS = ‘-DFIRST’)//追加到开始位置:Prepend()
env.AppendUnique //为一个环境变量添加一个唯一的值
flags = {'CCFLAGS':'-option -O3 -O1'} env.MergeFlags(flags) //合并环境变量
7、控制目标文件的路径install
test = env.Program('test.cpp')
env.Install('bin',test) //放入到bin目录
//将目标放到其他目录下,并修改名字
test = env.Program('test.cpp')
env.InstallAs('bin/testapp',test)   //执行文件改为testapp

8、一份源码,要构建它的debug版本,又要构建release版本

//需要为不同的版本指定不同的obj名字,否则会冲突

opt = Environment(CCFLAGS ='-O2')

dbg = Environment(CCFLAGS = '-g')

o = opt.Object('foo-opt','foo.c')   //生成foo-opt.o

opt.Program(o)

d = dbg.Object('foo-dbg','foo.c')  //生成foo-dbg
.o
dbg.Program(d)

原文地址:https://www.cnblogs.com/xiaomayi-cyj/p/8391893.html