查看文章
 
scons 学习笔记
2009-07-11 14:13

scons简介:
布衣在工作中碰到跨平台编译方面的需要,研究了下scons。

scons是一个Python写的自动化构建工具,从构建这个角度说,它跟GNU make是同一类的工具。

scons
与其它工具最显著的差别就是:scons配置文件是Python script.

它的思想是跟GNU make完全不同的。GNU make的核心是依赖关系,我要做的事情,就是告诉系统,一个目标依赖什么东西,并且,当被依赖的东西发生变化时,我要做什么。
例如:
all: main.c
$(CC) $(CFLAGS) $(LFLAGS) main.c -o BT_remote -lbluetooth -lBluetooth_remote -lm -lpthread
意思是:all依赖于main.c 如果main.c有了变化,作下面这些事。

Scons 命令集合:

Scons 编译命令

Scons –c 清除

文件目录参数:

Prrogram 参数 列表类型

1Program('program', ['prog.c', 'file1.c', 'file2.c'])

参数 是一个 python list 所以可以这么写:

Filelist = [‘a,.c’,’b.c’……..]

Program(‘program’,Filelist)

2、加载所有的内容 *.c 或者

Program(‘program’,Glob(‘*.c’))

3SCons还对output filesource file有关键字,可以用来指定
src_files = Split('main.c file1.c file2.c')
Program(target = 'program', source = src_files)
因为有关键字指定,多以可以换前后:
Program(source = src_files, target = 'program')

4Scons –q参数可以快速生成,过滤一些输出信息

编译动态库

Scons可以在用户和编译器之间传递信息,并控制编译器完成构建。同样的,编译目标文件,构建静态库、动态库可以由下面的一些builder来完成。

Library('foo', ['f1.c', 'f2.c', 'f3.c'])   #生成名为foo的静态库,在Windows上是foo.lib,在unix上为libfoo.a

StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) #生成名为foo的静态库,在Windows上是foo.lib,在unix上为libfoo.a

SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) #生成名为foo的动态库,在Windows上是foo.dll,在unix上为libfoo.so

Object('add.c') #生成名为add的目标文件,在Windows上是add.obj,在unix上为add.o

编译参数: busybuild VS8-DEBUG projects

范例如下:

Library(‘foo’,[‘test.c’,’a.c’])

Program(‘program.c’,LIBS=[‘foo’,’bar’],LIBPATH=’.’)

针对性的编译

采用 Scons编译的时候,Scons会自动识别已经编译过的文件。如果再次编译 回报:

‘.’ Is up-to-date. 可以采用 scons –c清除 然后重新编译

如果要针对性的编译 采用 scons –q hello 这样会重新编译 hello.c

Dependencies依赖的设置

1、 Using MD5 Signatures

Program(’hello.c’)

Decider(’MD5’)

2、 Usering TimeStamps to deside if a File Has Changed

Program(’hello.c’)

Decider(’timestamp-newer’)

3、 混合校验

Program(’hello.c’)

Decider(’MD5-timestamp’)

4、 两个官方不推荐的验证function

SourceSignatures(‘MD5’)

SourceSignatures(‘timestamp-newer’)

TargetSignatures(‘MD5’)

TargetSignatures(‘timestamp’)

Cache implicit Dependencies(缓存固有依赖)

Scons环境设置:

Environments: 字典类型


Scons
3种环境变量:
1. External Environment

外部环境,来之于 python os模块的信息


2. Construction Environment

构建环境,决定scons那部分被执行!

a、如果没有特别指定,可以 指定一个 默认的参数:

env.SetDefault(SPECIAL_FLAG = ’-extra-option’)

b、增加唯一的参数

env.AppendUnique(CCFLAGS=[’-g’])

c、增加 一个 开始(预知)参数

         env.Prepend(CCFLAGS = [’-DFIRST’])

         或者

         env.PrependUnique(CCFLAGS=[’-g’])

3. Execution Environment

执行环境

增加执行路径的管理:
path = [’/usr/local/bin’, ’/bin’, ’/usr/bin’]

env = Environment(ENV = {’PATH’ : path})

env = Environment(FOO = 'foo', BAR = 'bar')

dict = env.Dictionary()

print dict.keys()

for key in ['OBJSUFFIX', 'LIBSUFFIX', 'PROGSUFFIX']:

         print "key = %s, value = %s" % (key, dict[key])

        

d_env = DefaultEnvironment()

print d_env['CC']

path加入到环境中来

env = Environment(ENV = os.environ)

env.PrependENVPath(’PATH’, ’/usr/local/bin’)

env.AppendENVPath(’LIB’, ’/usr/local/lib’)

第八章 将操作合并到环境中来

env = Environment()

env.Append(CPPPATH = [’/include’, ’/usr/local/include’, ’/usr/include’])

flags = { ’CPPPATH’ : [’/usr/opt/include’, ’/usr/local/include’] }

env.MergeFlags(flags)

print env[’CPPPATH’]

Scons会智能的合并自己定义的操作,如果有重复的那么 scons自动采用在

前面声明的变量。

值得注意的是:在 分离编译 的时候,scons会将变量的值就行排序,然后返回一个新的字典 在进行 MergeFlage 操作

第九章: 分离编译参数设定

分离编译函数 PaseFlags

(注意:第九章看的不是很明白)

第十章: 查找安装过的类库

Parsdonfig函数

第十一章:对输出的控制

输出帮组信息:

Help(‘’’

       Type : ‘this is a complie tools about the’

       ‘’’)

if(env['PLATFORM'] == 'win32'):

       Help('\n' + ''' Tpye: scons windebug,to buid the windows debug version ''')


类别:java&python||添加到搜藏 |分享到i贴吧|浏览(1855)|评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu