scons简易手册

在编译大程序时免不了要写个makefile来管理,但是makefile的规则对于大多数人来说都还太复杂了。于是我找到了autotools工具,尽管方便了一些,但是还是不够傻瓜。目前scons是我用过最傻瓜的。基本教程这里就不在累赘了,网上多的事,这里只是写常用变量和函数的汇总。

详细英文文档地址:

http://www.scons.org/doc/production/HTML/scons-man.html

下面是以为译者对英文文档的前几章翻译

http://blog.youkuaiyun.com/andyelvis/article/details/7074195

 

sconstruct是执行Scons的脚本文件,Python脚本。

c:>scons 执行sconstruct中脚本

Build command in sconstruct:

1.编译为可执行程序

Program('hello.c') 编译hello.c可执行文件,根据系统自动生成(hello.exe on Windows; hello on POSIX)

Program('new_hello','hello.c') 指定Output文件名(new_hello.exe onWindows; new_hello on POSIX)

Program(['main.c', 'file1.c', 'file2.c']) 编译多个文件,Output文件名以第一个文件命名(main.exe;main)
Program('program', Split('main.c file1.c file2.c'))

Program('hello',Glob("*.c"))

2.编译为二进制对象

Object('hello.c') 编译hello.c目标文件,根据系统自动生成(hello.obj on Windows; hello.o on POSIX)

3.编译为库文件

.Library('foo', ['f1.c', 'f2.c', 'f3.c']) 编译library

SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) 编译 static library

StaticLibrary('foo', ['f1.c', 'f2.c', 'f3.c']) 编译 shared library
4.使用多参数的例子

Program('prog.c', LIBS=['foo', 'bar'], LIBPATH='.') 连接库,不需加后缀或是前缀

5.判断源文件是否修改

SourceSignatures('MD5') 根据内容是否改变,默认方式

SourceSignatures('timestamp') 根据修改时间,类似makefile

6.判断目标文件是否改变

TargetSignatures('build') 根据编译结果
TargetSignatures('content') 根据文件内容,如果只是加了句注释,将不会被重新编译

7.文件依赖

Ignore(hello, 'hello.h') 忽略某个依赖关系

Depends(hello, 'other_file') 明确依赖关系

8.Scons可以常用的参数

1. scons -c   clean

2. scons -Q 只显示编译信息,去除多余的打印信息

3. scons -Q --implicit-cache hello 保存依赖关系

--implicit-deps-changed 强制更新依赖关系

--implicit-deps-unchanged 强制使用原先的依赖关系,即使已经改变

9.常用关键字(变量):

LIBS          //要连接的库文件

LIBPATH      //库文件路径

CCFLAGS     //编译标志

CPPPATH     //头文件

Program('hello.c', CPPPATH = ['include', '/home/project/inc'])

 

下面是使用环境来制作编译
1.创建环境变量

env = Environment()

env.Program('foo.c') 根据不同系统创建不同的编译环境变量

也可以改变:

env = Environment(CC = 'gcc',CCFLAGS = '-O2')

2.复制环境变量

env = Environment(CC = 'gcc')

opt = env.Copy(CCFLAGS = '-O2')
dbg = env.Copy(CCFLAGS = '-g')

3.获取环境变量

env = Environment()

print "CC is:", env['CC']

4.扩展环境变量

env = Environment()
print "CC is:", env.subst('$CC')

5.替换环境变量

env = Environment(CCFLAGS = '-DDEFINE1')
env.Replace(CCFLAGS = '-DDEFINE2')
env.Program('foo.c')

6.尾部增加环境变量值

env = Environment(CCFLAGS = '-DMY_VALUE')
env.Append(CCFLAGS = ' -DLAST')
env.Program('foo.c')

7.头部添加环境变量值

env = Environment(CCFLAGS = '-DMY_VALUE')
env.Prepend(CCFLAGS = '-DFIRST ')
env.Program('foo.c')

使用

1.看编译命令未展开

Input:

env = Environment(CCFLAGS = '-DFOO')
print "CCCOM is:", env['CCCOM']

Output:

CCCOM is: $CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS$_CPPINCFLAGS -c -o $TARGET $SOURCES

2.看编译命令已展开

Input:

env = Environment(CCFLAGS = '-DFOO')
print "CCCOM is:", env.subst('$CCCOM')

Output:

CCCOM is: gcc -DFOO -c -o

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值