scons简介.ppt.ppt_第1页
scons简介.ppt.ppt_第2页
scons简介.ppt.ppt_第3页
scons简介.ppt.ppt_第4页
scons简介.ppt.ppt_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、自动化编译工具Scons简介,Alex Huang 2008.9.25,What is Scons?,Next-generation software construction tool. Or make tool ,一个用来建软件的软件,或者使用来保持软件更新(一旦发生源文件变化的情况); Scons最大的不同就是他的配置文件就是一个脚本执行文件,python。而其他的大部分自动编译工具都是写了自己的一个语法规则来实现的。,More about Scons,跨平台。 支持POSIX systems,windows NT, Mac OS X 。 支持从中心代码仓库build 除了传统的time

2、 stamp,还支持MD5 signatures来作为build依据 完全可靠。scons把正确性作为高优先级的设计目标 配置文件是python脚本:) 这一点太爽了,对把python作为native language的人来说。基本上 scons的users guide可以一目十行。,More about Scons,编译过Linux下的Doom3,(雷神之锤) 在Google的浏览器chrome中出现 还有一些其他的开源项目 Aqsis Ardour Battlefield 1942 Blender Delta3D id Software Nullsoft Scriptable Instal

3、l System SuperCollider VMware Csound5,More about Scons,scons最为人诟病的就是性能,比起make,jam来说,通常要慢一些,在要求频繁迭代的场合很难满足要求 。,Scons的设计原则:,1.正确性 可能牺牲性能保证正确性。或者是为了保证正确性,而改变软件的build的方式 2.性能 3.方便: 尽可能的做了自动化的东西,比如跨系统,跨平台的自动检测,Scons安装,安装python 安装Scons 下载地址:/ 安装完之后,在命令行下检查是否可 执行scons命令,如果不可以的话,检查是 否已经将安

4、装路径加到系统路径中,如何使用Scons Hello.c,1. 写一个源代码文件 hello.c int main() Printf(“hello world”); 2. 编写一个Scons脚本(实际上也就是一个python脚本),名字叫做Sconstruct. Program(hello.c) 3. 命令行下执行scons,Sconstruct脚本,Sconstruct其实就是一个python执行脚本,(所以支持所有的python语法,比如可以用#来注释脚本),相当于make中的makefile; 但是也不是普通的python脚本,执行的时候,是不一定能够按照你写的顺序执行的;,Build

5、command in sconstruct(1),1.Program(hello.c) 编译hello.c可执行文件,根据系统自动生成(hello.exe on Windows; hello on POSIX) Program(new_hello,hello.c) 指定Output文件名(new_hello.exe on Windows; new_hello on POSIX) Program(main.c, file1.c, file2.c) 编译多个文件,Output文件名以第一个文件命名 (main.exe;main) Program(program, Split(main.c file

6、1.c file2.c),Build command in sconstruct(2),Object(hello.c) 编译hello.c目标文件,根据系统自动生成(hello.obj on Windows; hello.o on POSIX),Build command in sconstruct(3),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 l

7、ibrary,Build command in sconstruct(4),4.Program(prog.c, LIBS=foo, bar, LIBPATH=.) 连接库,不需加后缀或是前缀,Build command in sconstruct(5),5.判断源文件是否修改 SourceSignatures(MD5) 根据内容是否改变,默认方式 SourceSignatures(timestamp) 根据修改时间 6.判断目标文件是否改变 TargetSignatures(build) 根据编译结果 TargetSignatures(content) 根据文件内容,如果只是加了句注释,将不会

8、被重新编译 7.Ignore(hello, hello.h) 忽略某个依赖关系 8.Depends(hello, other_file) 明确依赖关系,如何使用scons,Executive command in shell 1. scons -c clean 2. scons -Q 只显示编译信息,去除多余的打印信息 3. scons -Q -implicit-cache hello 保存依赖关系 -implicit-deps-changed 强制更新依赖关系 -implicit-deps-unchanged 强制使用原先的依赖关系,即使已经改变 Key words: LIBS LIBPAT

9、H CCFLAGS CPPPATH :Program(hello.c, CPPPATH = include, /home/project/inc),Scons与环境变量,外部环境 os 构造环境 os,编译器etc 执行环境 os,Lib,Scons与环境变量(1),1.创建环境变量 env = Environment() env.Program(foo.c) 根据不同系统创建不同的编译环境变量 也可以改变: env = Environment(CC = gcc,CCFLAGS = -O2),Scons与环境变量(2),2.复制环境变量 env = Environment(CC = gcc)

10、opt = env.Copy(CCFLAGS = -O2) dbg = env.Copy(CCFLAGS = -g),Scons与环境变量(3),3.获取环境变量 env = Environment() print CC is:, envCC 4.扩展环境变量 env = Environment() print CC is:, env.subst($CC),Scons与环境变量(4),5.替换环境变量 env = Environment(CCFLAGS = -DDEFINE1) env.Replace(CCFLAGS = -DDEFINE2) env.Program(foo.c) 6.尾部增加

11、环境变量值 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),其他和环境变量有关的函数,MergeFlags Function ParseFlagsFunction ParseConfigFunction,通过输出监视编译过程,11.1.Providing Build

12、 Help: theHelpFunction 11.2.Controlling HowSConsPrints Build Commands: the$*COMSTRVariables 11.3.Providing Build Progress Output: theProgressFunction 11.4.Printing Detailed Build Status: theGetBuildFailuresFunction,命令行参数控制编译过程*,1.Option 2. Variables 3. Targets,Installing Files in Other Directories,e

13、nv = Environment() hello = env.Program(hello.c) env.Install(/usr/bin, hello) env = Environment() hello = env.Program(hello.c) goodbye = env.Program(goodbye.c) env.Install(/usr/bin, hello) env.Install(/usr/bin, goodbye) env.Alias(install, /usr/bin),Platform-Independent File System Manipulation,Comman

14、d(file.out, file.in, Copy($TARGET, $SOURCE) Command(file.out, file.in, Delete(tempfile), Copy(tempfile, $SOURCE), modify tempfile, Copy($TARGET, tempfile), ) Command(file.out, file.in, Copy(tempfile, $SOURCE), modify tempfile, Move($TARGET, tempfile), ) Command(file.out, file.in, Copy($TARGET, $SOUR

15、CE), Touch($TARGET), ) Command(file.out, file.in, Delete(tempdir), Mkdir(tempdir), Copy(tempdir/$SOURCE.file, $SOURCE), process tempdir, Move($TARGET, tempdir/output_file), Delete(tempdir), ) Command(file.out, file.in, Copy($TARGET, $SOURCE), Chmod($TARGET, 0755), ),Hierarchical Builds *,Sconstruct,

16、 and SConscript. 比较大的工程很少是把所有的源代码放在一起的,一般都是放在一个有层次结构的文件夹中,如果要编译这样有层次结构的代码,就要使用到scons中的层次结构编译脚本函数SConsript; 就像我们看到的,这样的层次编译系统中的顶部调用的是sconstruct。 这个位于顶部的sconstruct脚本可以调用其他子目录下的sconsript脚本来完成其他文件的编译; 而这些分支中的sconscript又可以循环的调用其他的sconscript脚本 Path name; 相对路径,绝对路径,Multi-platform configuration,24.1.Configu

17、re Contexts 24.2.Checking for the Existence of Header Files 24.3.Checking for the Availability of a Function 24.4.Checking for the Availability of a Library 24.5.Checking for the Availability of atypedef 24.6.Adding Your Own Custom Checks 24.7.Not Configuring When Cleaning Targets,Compare with autoconf/autoMake/Make,etc,1. 变量名的问题 make的名字作用域是共用一个的,而scons是存在大量不同的Enviroment对象的 2. 如何确定一个文件是否改变 MD5,时间戳 3. 检查依赖性 递归方式,完整运行buildsystem 4. 编程语言 混杂的(m4,make,shell), python 5. 跨平台,Compare with autoconf/autoMake/Make,etc,6. 复杂度 7. 对代码生成,信息传播的支持,缺陷,scons最为人诟病的就是性能,比起make,jam来说,通常要慢一些,在要求频繁迭代的场合很难

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论