资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,自动化编译工具,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 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 Install System,SuperCollider,VMware,Csound5,More about Scons,scons,最为人诟病的就是性能,比起,make,,,jam,来说,通常要慢一些,在,要求频繁迭代的场合很难满足要求,。,Scons,的设计原则:,1.,正确性,可能牺牲性能保证正确性。或者是为了保证正确性,而改变软件的,build,的方式,2.,性能,3.,方便:,尽可能的做了自动化的东西,比如跨系统,跨平台的自动检测,Scons,安装,安装,python,安装,Scons,下载地址:,http:/,www.scons.org,/,安装完之后,在命令行下检查是否可,执行,scons,命令,如果不可以的话,检查是,否已经将安装路径加到系统路径中,如何使用,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 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,file1.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 library,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,),根据文件内容,如果只是加了句注释,将不会被重新编译,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,LIBPATH,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,),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.,尾部增加环境变量值,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,ParseFlags,Function,ParseConfig,Function,通过输出监视编译过程,11.1.,Providing Build Help:theHelpFunction,11.2.,Controlling How,SCons,Prints Build Commands:the$*COMSTRVariables,11.3.,Providing Build Progress Output:theProgressFunction,11.4.,Printing Detailed Build Status:the,GetBuildFailures,Function,命令行参数控制编译过程*,1.Option,2.Variables,3.Targets,Installing Files in Other Directories,env,=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,Command(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,$SOURCE),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,and SConscript.,比较大的工程很少是把所有的源代码放在一起的,一般都是放在一个有层次结构的文件夹中,如果要编译这样有层次结构的代码,就要使用到,scons,中的层次结构编译脚本函数,SConsript,;,就像我们看到的,这样的层次编译系统中的顶部调用的是,sconstruct,。,这个位于顶部的,sconstruct,脚本可以调用其他子目录下的,sconsript,脚本来完成其他文件的编译;,而这些分支中的,sconscript,又可以循环的调用其他的,sconscript,脚本,Path name;,相对路径,绝对路径,SCONS,Sconstruct,SConscript,SConscript,SConscript,SConscript,make,MAKE,Make,Multi-platform config
展开阅读全文