1 构建基础知识
1.1 Ant构建脚本
自动化构建的核心是表达构件间依赖关系和构建步骤的脚本,Make工具使用makefile,而Ant使用了基于XML格式的缺省文件名为Build.Xml的配置文件。
1.1.1 Ant项目配置文件
Ant配置文件描述了一个构建项目(project),它由一些属性定义(property)和一个目标树(target tree)组成;目标代表了一个期望的构建结果(例如生成一个链接好的可执行文件),并表述了其依赖的其它目标,常见的构建目标有初始化(Init)、编译(Compile)、单元测试(Test)、安装(Install)、清除(Clean)等;每个目标包含了实现它而将要执行的任务(task),Ant支持的任务种类非常丰富,例如源码编译、文件拷贝、执行命令行操作等。Ant还提供一种非常重要的任务就是执行其它的项目配置文件,使得多个构建项目的批处理成为可能。
1.1.2 Ant配置文件示例
下面是一个Ant项目的配置文件示例:
<?xml version="1.0"?> <project name="Improve-Install" default="InstallAll" basedir="."> <description > Build file for all Improve library project </description>
<!-- task and type extension --> <taskdef resource="cpptasks.tasks"/> <typedef resource="cpptasks.types"/>
<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>
<!-- Properties --> <property environment="sys_env"/> <property name="proj.root" location="../."/> <target name="-Init"> <condition property="cc" value="${mswin32-compiler}"> <os family="windows"/> </condition> <condition property="cc" value="gcc"> <os family="unix"/> </condition> <echo message="${ant.project.name}: Init Complete"/> </target>
<target name="Clean" depends="-Init" description="Clean the temporal building space"> <!-- Delete all files in temporal build space --> <delete includeEmptyDirs="true" > <fileset dir="${tgt.bin}" includes="objs/*, objs_d/*" defaultexcludes="false"/> </delete> <delete includeEmptyDirs="true" > <fileset dir="${tgt.lib}" includes="objs/*, objs_d" defaultexcludes="false"/> </delete> <echo message="${ant.project.name}: Clean buildspace Complete"/> </target>
<target name="AutoBuild" depends="-Init, -Prep" description="AutoBuild all source to get bin out"> <mkdir dir="${tgt.lib}/objs_d"/> <mkdir dir="${tgt.lib}/objs"/> <if> <equals arg1="${cc}" arg2="msvc"/> <then> <cc name="${cc}" objdir="${tgt.lib}/objs_d" outfile="${tgt.lib}/improve_debug" outtype="static" exceptions="true" multithreaded="true" runtime="dynamic" debug="true"> <compiler extends="${cc}-compiler"> <includepath path="${tgt.interface}"/> <includepath path="${getenv.BOOST_ROOT}/include"/> <includepath path="${getenv.CPPUNIT_ROOT}/include"/> <defineset > <define name="WIN32"/> <define name="_WINDOWS"/> </defineset> <compilerarg value="/W3"/> <compilerarg value="/GR"/> <compilerarg value="/O2"/> </compiler> <linker extends="${cc}-linker"> <linkerarg value="/machine:I386"/> <!--fileset dir="${getenv.LIBS_ROOT}/lib" includes="3d_party.*"/--> </linker> <fileset dir="${tgt.src}"> <include name="**/*.cpp"/> <include name="**/*.c"/> <exclude name="exception_ex.*"/> </fileset> </cc>
<echo message="${ant.project.name}: AutoBuild Complete"/> </target>
<target name="Test" depends="-Init, TestBuild" description="Perform acception testing"> <exec executable="test_main_debug.exe" dir="${tgt.bin}" failοnerrοr="true" vmlauncher="false" os="Windows 2000"> <env key="Path" path="${getenv.Path};${getenv.CPPUNIT_ROOT}/lib;${getenv.BOOST_ROOT}/lib"/> </exec> <echo message="test_main.exe Debug Version Testing Pass "/> <exec executable="test_main.exe" dir="${tgt.bin}" failοnerrοr="true" vmlauncher="false" os="Windows 2000"> <env key="Path" path="${getenv.Path};${getenv.CPPUNIT_ROOT}/lib;${getenv.BOOST_ROOT}/lib"/> </exec> <echo message="test_main.exe Release Version Testing Pass "/> <echo message="${ant.project.name}: Testing Complete"/> </target>
<target name="InstallAll" depends="CleanAll, AutoBuild, Install, Test" description="Make a clean (re)install and test"> <echo message="${ant.project.name}: Install/Reinstall Complete"/> </target>
</project> |
在此Ant配置文件中定义了项目将引用的一些property,例如环境变量、项目的根目录路径、指定的编译器等;项目的缺省构建目标为InstallAll,它通过依赖定义,使得初始化(Init)、清除(CleanAll)、编译(AutoBuild)、安装(Install)、测试(Test)等目标依次执行;AutoBuild目标执行的cc任务,将对源码进行编译,并通过includepath设置了编译头文件的查找路径,通过linker段指定了需链接的库3d_party.lib。
本项目中各Ant配置文件的具体配置和使用,请参见Ant用户手册等参考资料,和阅读Ant配置文件本身内容。
1.1.3 Ant执行示例
Ant在命令行下执行的示例: