common/build.postbuild.xml
author MattD <mattd@symbian.org>
Fri, 16 Oct 2009 14:57:32 +0100
changeset 684 6d65abb8bba1
parent 677 dd6b7decdca2
child 685 b4b3727007b2
permissions -rw-r--r--
sf-run-evalid - minor change to make sure that evalid is run at the root of the build drive, which can stop the MD5s from being generated. (evalid requires dirs to be relative and not absolute)

<?xml version="1.0" encoding="UTF-8"?>
<project name="SF-POSTBUILD" xmlns:hlm="http://www.nokia.com/helium">
    <target name="sf-postbuild">
        <echo>[SF-POSTBUILD]</echo>
        <parallel>                
            <!-- TAG SOURCE CODE -->
            <if>
                <istrue value="${sf.spec.tagafterbuild.enable}" />
                <then>
                    <echo message="Apply tag to the source code used in this build"/>
                    <runtarget target="sf-tag-hg-code"/>
                </then>
            </if>
            
            <!-- Create MD5s -->
            <if>
                <istrue value="${sf.spec.md5.enable}"/>
                <then>
                    <echo message="INFO Creating MD5s"/>
                    <runtarget target="sf-run-evalid"/>
                </then>
            </if>
            
            <!-- Package up the binaries we built -->
            <if>
                <istrue value="${sf.spec.package.bin.enable}"/>
                <then>
                    <echo message="INFO Packaging Binaries"/>
                    <runtarget target="sf-package-binary"/>
                    <runtarget target="sf-package-tools"/>
    
                    <echo message="INFO Validate Zip files"/>
                    <runtarget target="sf-package-validate"/>
                </then>
            </if>
            
            <!-- run build analysis tools -->
            <runtarget target="sf-run-analysis"/>
        
            <if>
              <istrue value="${sf.spec.publish.enable}"/>
              <then>
                <!-- Generate reports to compare this build to a previous one -->
                <runtarget target="sf-compare-to-baseline"/>
              </then>
            </if>
        </parallel>
        
        <!-- Launch smoketest -->
        <if><istrue value="${sf.spec.test.sendpkg.enable}"/>
            <then>
                <runtarget target="sf-build-smoketestpkg"/>
                <runtarget target="sf-send-testpkg"/>
            </then>
        </if>

        <!-- Launch BC check -->
        <if><istrue value="${sf.spec.bccheck.enable}"/>
            <then>
                <runtarget target="sf-bc-check"/>
            </then>
        </if>

        <!-- Zip up all the logs -->
        <runtarget target="sf-zip-logs"/>

        <!-- Publish logs/reports -->
        <if>
            <istrue value="${sf.spec.publish.enable}" />
            <then>
                <echo message="Publish log files and reports to ${sf.spec.publish.rootdir}"/>
                <runtarget target="sf-publish"/>
            </then>
        </if>
    </target>

    <target name="sf-tag-hg-code">
        <property name="sf.tagafterbuild.tag" value="${sf.spec.job.name}_${sf.spec.job.codeline}.${sf.spec.job.number}"/>
        <fmpp sourceFile="${sf.common.config.dir}/templates/tag-hg-code.ant.xml.ftl"
              outputFile="${sf.common.config.dir}/generated/tag-hg-code.ant.xml">
            <data expandProperties="yes">
                ant: antProperties()
                data: csv(${sf.spec.sourcesync.sourcespecdir}/${sf.spec.sourcesync.sourcespecfile}, {separator:','})
            </data>
        </fmpp>
        <ant antfile="${sf.common.config.dir}/generated/tag-hg-code.ant.xml"/>
    </target>

    <target name="sf-run-evalid" >
        <delete dir="${build.drive}/output/md5"/>
        <mkdir  dir="${build.drive}/output/md5"/>

        <parallel>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/include output/md5/epoc32_include.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/s60 output/md5/epoc32_s60.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/localisation output/md5/epoc32_localisation.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -x \.sym$ -x ^armv5/udeb -x ^armv5/urel -x ^winscw/udeb -x ^winscw/urel -g epoc32/release output/md5/epoc32_release.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -x \.sym$ -g epoc32/release/armv5/udeb output/md5/epoc32_release_armv5_udeb.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -x \.sym$ -g epoc32/release/armv5/urel output/md5/epoc32_release_armv5_urel.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -x \.sym$ -g epoc32/release/winscw/udeb output/md5/epoc32_release_winscw_udeb.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -x \.sym$ -g epoc32/release/winscw/urel output/md5/epoc32_release_winscw_urel.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/cshlpcmp_template 	output/md5/epoc32_cshlpcmp_template.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/data output/md5/epoc32_data.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/engdoc output/md5/epoc32_engdoc.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/engineeringtools output/md5/epoc32_engineeringtools.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/gcc output/md5/epoc32_gcc.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/gcc_mingw output/md5/epoc32_gcc_mingw.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/ksa output/md5/epoc32_ksa.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/rom output/md5/epoc32_rom.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/rombuild output/md5/epoc32_rombuild.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/sbs_config output/md5/epoc32_sbs_config.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/sdk_special output/md5/epoc32_sdk_special.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/stdapis output/md5/epoc32_stdapis.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/stubs output/md5/epoc32_stubs.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/tools output/md5/epoc32_tools.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/wins output/md5/epoc32_wins.md5"/>
        </exec>
        <exec executable="cmd" dir="${build.drive}/">
            <arg value="/c"/>
            <arg value="evalid -g epoc32/winscw output/md5/epoc32_winscw.md5"/>
        </exec>
        </parallel>
        <!-- package MD5s directly into epoc32/relinfo location so that its usable out-of-the-box -->
    		<mkdir dir="${build.output.dir}/zips/release"/> <!-- Hack to prevent non-existing release dir -->
        <zip destfile="${build.output.dir}/zips/release/build_md5.zip">
            <zipfileset dir="${build.drive}/output/md5/" prefix="epoc32/relinfo"/>
        </zip>
        <!-- Generate release_metadata entries for the above zips -->
        <antcall target="sf-zip-content">
            <param name="zip.config.file" value="${sf.common.config.dir}/generated/zip.cfg.xml.ftl"/>
            <param name="zip.target.name" value="bin-just-metadata" />
        </antcall>
    </target>    
    
    <target name="sf-package-binary" depends="sf-package-postbuild-rnd">
        <!-- Warning: Reverting to using the He zipper will also revert to a single zip for the binaries:
             would need to update the template and possibly the script that populates it -->
        <!--antcall target="sf-zip-content">
            <param name="zip.config.file" value="${sf.common.config.dir}/generated/zip.cfg.xml.ftl"/>
            <param name="zip.target.name" value="bin" />
        </antcall-->
        <parallel>
            <exec executable="7za" dir="${build.drive}" output="${build.log.dir}/zip_${build.id}_binaries_epoc32.log">
                <arg value="a"/>
                <arg value="-tzip"/>
                <arg value="-x@${build.log.dir}/rnd_excludefile.txt"/>
                <arg value="-x!epoc32\tools"/>
                <arg value="-x!epoc32\build"/>
                <arg value="-x!epoc32\release\armv5"/>
                <arg value="-x!epoc32\release\winscw"/>
                <arg value="-xr!*.sym"/>
                <arg value="${build.drive}/output/zips/release/binaries_epoc.zip"/>
                <arg value="epoc32\"/>
            </exec>
            
            <exec executable="7za" dir="${build.drive}" output="${build.log.dir}/zip_${build.id}_binaries_winscw.log">
                <arg value="a"/>
                <arg value="-tzip"/>
                <arg value="-x@${build.log.dir}/rnd_excludefile.txt"/>
                <arg value="-xr!*.sym"/>
                <arg value="${build.drive}/output/zips/release/binaries_winscw.zip"/>
                <arg value="epoc32\release\winscw\"/>
            </exec>
            
            <exec executable="7za" dir="${build.drive}" output="${build.log.dir}/zip_${build.id}_binaries_armv5.log">
                <arg value="a"/>
                <arg value="-tzip"/>
                <arg value="-x@${build.log.dir}/rnd_excludefile.txt"/>
                <arg value="-xr!*.sym"/>
                <arg value="${build.drive}/output/zips/release/binaries_armv5.zip"/>
                <arg value="epoc32\release\armv5\"/>
            </exec>
        </parallel>
        <!-- Generate release_metadata entries for the above zips -->
        <antcall target="sf-zip-content">
            <param name="zip.config.file" value="${sf.common.config.dir}/generated/zip.cfg.xml.ftl"/>
            <param name="zip.target.name" value="bin-just-metadata" />
        </antcall>
    </target>

    <target name="sf-package-postbuild-rnd" >
        <antcall target="sf-zip-content">
            <param name="zip.config.file" value="${sf.common.config.dir}/generated/zip.cfg.xml.ftl"/>
            <param name="zip.target.name" value="rnd-postbuild" />
        </antcall>
    </target>

    <target name="sf-package-tools" >
        <exec executable="7za" dir="${build.drive}" output="${build.log.dir}/zip_${build.id}_tools_epoc32.log">
            <arg value="a"/>
            <arg value="-tzip"/>
            <arg value="-x@${build.log.dir}/rnd_excludefile.txt"/>
            <arg value="${build.drive}/output/zips/release/tools_epoc.zip"/> 
            <arg value="epoc32/tools"/>
        </exec>
        <antcall target="sf-zip-content">
            <param name="zip.config.file" value="${sf.common.config.dir}/generated/zip.cfg.xml.ftl"/>
            <param name="zip.target.name" value="tools" />
        </antcall>
    </target>
    
    <target name="sf-package-validate">
        <exec executable="7z" dir="${build.drive}/output/zips" failonerror="false" output="${build.drive}/output/zips/validate.log">
            <arg value="t"/>
            <arg value="*.zip"/>
        </exec>  
        <exec executable="7z" dir="${build.drive}/output/zips/release" failonerror="false" output="${build.drive}/output/zips/release/validate.log">
            <arg value="t"/>
            <arg value="*.zip"/>
        </exec>  
    </target>

    <!-- runs analysis of missing bins and source -->
    <target name="sf-run-analysis">
        <mkdir dir="${build.log.dir}/analysis"/>
        <parallel>
          <runtarget target="sf-run-analysis-ant"/>
          <runtarget target="sf-run-analysis-raptor"/>
          <runtarget target="sf-run-analysis-yarp"/>
          <runtarget target="sf-run-analysis-whatlog-summary"/>
          <runtarget target="sf-run-analysis-missing-files"/>
        </parallel>
        <if>
          <istrue value="${sf.spec.publish.enable}"/>
            <then>
            <runtarget target="sf-run-analysis-diamonds"/>
            </then>
        </if>
    </target>

    <target name="sf-run-analysis-ant">    
        <echo message="Running source analysis of ANT output"/>
        <exec executable="perl" dir="${build.log.dir}" failonerror="false" output="${build.log.dir}/analysis/${build.id}_scan_ant.log">
            <arg value="${sf.common.config.dir}/tools/analysis/scan_antlogs.pl"/>
            <arg value="*ant*"/>
        </exec>
    </target>

    <target name="sf-run-analysis-raptor">            
      <echo message="Preprocessing *_compile.log files"/>
      <delete file="${build.log.dir}/analysis/${build.id}_preprocess.log"/>
      <for param="logfile">
        <path>
          <fileset dir="${build.log.dir}">
            <include name="*_compile.log"/>
            <exclude name="*build_check_compile.log"/>
          </fileset>
        </path>
        <sequential>
          <propertyregex override="yes" property="preprocessedlogfile" input="@{logfile}" regexp=".*[\\/](.*)_compile\.log" replace="\1_compile_preprocessed.log"/>
          <echo message="Preprocessing @{logfile}..."/>
          <exec executable="perl" dir="${sf.common.config.dir}/tools/raptor" failonerror="false" input="@{logfile}" output="${build.log.dir}/analysis/${preprocessedlogfile}" errorProperty="@{logfile}" >
            <arg value="${sf.common.config.dir}/tools/raptor/preprocess_log.pl"/>
          </exec>
	  <echo file="${build.log.dir}/analysis/${build.id}_preprocess.log" append="true" message="${@{logfile}}${line.separator}"/>
        </sequential>
      </for>
      
      <echo message="Extracting whatlog information from *whatlog*_compile_preprocessed.log files"/>
      <for param="whatlogfile">
        <path>
          <fileset dir="${build.log.dir}/analysis">
            <include name="*whatlog*_compile_preprocessed.log"/>
          </fileset>
        </path>
        <sequential>
          <echo message="Extracting whatlog info from @{whatlogfile}..."/>
          <exec executable="perl" dir="${sf.common.config.dir}/tools/raptor" failonerror="false" output="${build.log.dir}/analysis/${build.id}_whatlog.log" append="true">
            <arg value="${sf.common.config.dir}/tools/raptor/parse.pl"/>
            <arg value="--releaseable"/>
            <arg value="--log=@{whatlogfile}"/>
            <arg value="--basedir=${build.log.dir}"/>
            <arg value="--append"/>
          </exec>
        </sequential>
      </for>
      
      <echo message="Extracting error information from *_compile_preprocessed.log files"/>
      <for param="raptorlogfile">
        <path>
          <fileset dir="${build.log.dir}/analysis">
            <include name="*_compile_preprocessed.log"/>
          </fileset>
        </path>
        <sequential>
          <echo message="Extracting error info from @{raptorlogfile}..."/>
          <propertyregex override="yes" property="raptorconfig" input="@{raptorlogfile}" regexp=".*[\\/].*__(.*)\.whatlog_(single|multiple)_thread.*" replace="\1" casesensitive="false" defaultValue="noconfig"/>
          <exec executable="perl" dir="${sf.common.config.dir}/tools/raptor" failonerror="false" output="${build.log.dir}/analysis/${build.id}_raptorparse.log" append="true">
            <arg value="${sf.common.config.dir}/tools/raptor/parse.pl"/>
            <arg value="--error"/>
            <arg value="--warning"/>
            <arg value="--unreciped"/>
            <arg value="--recipe"/>
            <arg value="--config=${raptorconfig}"/>
            <arg value="--log=@{raptorlogfile}"/>
            <arg value="--basedir=${build.log.dir}/raptorbits"/>
          </exec>
        </sequential>
      </for>
      
      <echo message="Summarizing Raptor data"/>
      <exec executable="perl" dir="${sf.common.config.dir}/tools/raptor" failonerror="false" output="${build.log.dir}/analysis/${build.id}_raptorparse.log" append="true">
        <arg value="${sf.common.config.dir}/tools/raptor/summarize.pl"/>
        <arg value="--raptorbitsdir=${build.log.dir}/raptorbits"/>
        <arg value="--outputdir=${build.log.dir}"/>
      </exec>
          
      <!-- Now iterate through the generated TSVs to sort them and remove duplicates -->
      <for param="tsv">
        <path>
          <fileset dir="${build.log.dir}">
            <include name="releaseables/**/*.tsv"/>
          </fileset>
        </path>
        <sequential>
          <exec executable="perl" input="@{tsv}" output="@{tsv}">
            <arg value="${sf.common.config.dir}/tools/sortUnique.pl"/>
          </exec>
        </sequential>
      </for>

      <!-- Cook the raptor analysis further to produce something in the right format for the BRAG system -->
      <exec executable="perl" output="${build.log.dir}/summary/Raptor_BRAG.xml" logError="yes">
        <arg value="${sf.common.config.dir}/tools/brag/raptorToBRAG.pl"/>
        <arg value="--raptorsummary"/>
        <arg value="${build.log.dir}/raptorbits/summary.csv"/>
      </exec>
      <!-- And copy the XSL so the output can be transformed by a browser -->
      <copy file="${sf.common.config.dir}/tools/brag/brag.xsl" toDir="${build.log.dir}/summary/"/>
    </target>

    <target name="sf-run-analysis-yarp">
      <echo message="Running yarp over *_compile.log files"/>
      <for param="logfile">
        <path>
          <fileset dir="${build.log.dir}">
            <include name="*_compile.log"/>
            <exclude name="*build_check_compile.log"/>
          </fileset>
        </path>
        <sequential>
          <propertyregex override="yes" property="yarpfile"  input="@{logfile}" regexp=".*[\\|\/](.*)_compile\.log" replace="\1_yarp.csv"/>
          <propertyregex override="yes" property="yarpfile_short"  input="${yarpfile}" regexp="[^_]*_[^_]*_[^_]*_(.+)_[^_]*_yarp\.csv" replace="YARP_\1"/>
          <echo message="Yarping @{logfile}..."/>
          <exec executable="perl" dir="${build.drive}" failonerror="false" output="${build.log.dir}/analysis/${yarpfile}.log" append="true">
            <arg value="${sf.common.config.dir}/tools/analysis/yarp.pl"/>
            <arg value="@{logfile}"/>
            <arg value="${build.log.dir}/analysis/${yarpfile}"/>
          </exec>
          <exec executable="cmd" output="${build.drive}/output/logs/analysis/tmp_yarp_files.csv" append="true">
            <arg value="/c"/>
            <arg value="echo"/>
            <arg value="${yarpfile_short},${sf.spec.publish.networkdrive}\${sf.spec.job.name}\builds\${sf.spec.job.codeline}\${build.id}\logs\analysis\${yarpfile},${build.drive}\output\logs\analysis\${yarpfile}"/>
          </exec>
        </sequential>
      </for>
      
      <!-- Cook the yarp analysis further to produce something in the right format for the BRAG system -->
      <mkdir dir="${build.log.dir}/summary/"/>
      <exec executable="perl" output="${build.log.dir}/summary/Yarp_BRAG.xml" logError="yes">
        <arg value="${sf.common.config.dir}/tools/brag/yarpToBRAG.pl"/>
        <arg value="${build.log.dir}/analysis/*_yarp.csv"/>
      </exec>
      
      <exec executable="perl" dir="${build.drive}" failonerror="false" outputproperty="sf.job.totalyarperrors">
        <arg value="${sf.common.config.dir}/tools/analysis/parse_yarp_files.pl"/>
        <arg value="${build.drive}/output/logs/analysis/tmp_yarp_files.csv"/>
      </exec>
      <echo message="Total yarp errors: ${sf.job.totalyarperrors}"/>
    </target>
    
    <target name="sf-run-analysis-whatlog-summary" >
        <sequential>
          <parallel>
            <runtarget target="sf-run-analysis-list"/>
            <runtarget target="sf-run-analysis-whatlog"/>
          </parallel>
          <runtarget target="sf-run-analysis-whatlog-merge" />
          <parallel>
            <runtarget target="sf-run-analysis-whatlog-package"/>
            <runtarget target="sf-run-analysis-whatlog-collisons"/>
          </parallel>
        </sequential>
    </target>
    
    <target name="sf-run-analysis-list">    
        <echo message="Running list analysis"/>
        <exec executable="perl" dir="${build.log.dir}/analysis" failonerror="false" output="${build.log.dir}/analysis/${build.id}_list_results.log">
            <arg value="${sf.common.config.dir}/tools/analysis/parselistdirs.pl"/>
            <arg value="..\"/>
        </exec>
    </target>

    <target name="sf-run-analysis-whatlog">    
        <echo message="Running whatlog analysis"/>
        <exec executable="perl" dir="${build.log.dir}/analysis" failonerror="false" output="${build.log.dir}/analysis/${build.id}_what_results.csv">
            <arg value="${sf.common.config.dir}/tools/analysis/parsewhatlog.pl"/>
            <arg value="..\"/>
        </exec>
    </target>

    <target name="sf-run-analysis-whatlog-merge" >        
        <echo message="Running summary analysis"/>
        <exec executable="perl" dir="${build.log.dir}/analysis" failonerror="false" output="${build.log.dir}/analysis/${build.id}_summary.log">
            <arg value="${sf.common.config.dir}/tools/analysis/merge_csv.pl"/>
            <arg value="${build.id}_what_results.csv"/>
            <arg value="${build.id}_list_results.log"/>
            <arg value="${build.drive}/output/zips/release/binaries_epoc_additional.zip"/>
        </exec>
    </target>
    
    <target name="sf-run-analysis-whatlog-package" >        
        <exec executable="perl" dir="${build.log.dir}/analysis" failonerror="false" output="${build.log.dir}/analysis/${build.id}_analysecomponents.log">
            <arg value="${sf.common.config.dir}/tools/analysis/analyse_components.pl"/>
            <arg value="${sf.spec.sourcesync.sourcespecdir}/${sf.spec.sourcesync.sourcespecfile}"/>
            <arg value="${build.id}_what_results.csv_results.csv"/>
            <arg value="${sf.project.location}/sysdefs/system_model_os.xml"/>
            <arg value="${sf.project.location}/sysdefs/system_model_s60.xml"/>
        </exec>
    </target>
    
    <target name="sf-run-analysis-whatlog-collisons" >        
        <echo message="Running collision analysis"/>
        <exec executable="perl" dir="${build.drive}" failonerror="false" output="${build.log.dir}/analysis/${build.id}_collisions.log">
            <arg value="${sf.common.config.dir}/tools/analysis/find_collisions.pl"/>
            <arg value="${build.log.dir}/analysis/${build.id}_what_results.csv"/>
        </exec>
    </target>

    <target name="sf-run-analysis-diamonds">      
      <fmpp sourceFile="${sf.common.config.dir}/diamonds/sf-run-analysis.xml.ftl" outputFile="${build.drive}/output/logs/sf-run-analysis.xml">
        <data expandProperties="yes">
          ant: antProperties()
          raptor_summary: csv(${build.log.dir}/raptorbits/summary.csv,{separator:',',headers:[category,subcategory,severity,config,component,phase,recipe,file,line]})
          files: csv(${build.drive}/output/logs/analysis/tmp_yarp_files.csv,{separator:',',headers:[name,path,localpath]})
        </data>
      </fmpp>
      <!-- Send the data to the server -->
	  <exec executable="python">
		    <arg value="${sf.common.config.dir}/tools/brag/send_xml_to_diamonds.py"/>
		    <arg value="-s"/>
		    <arg value="${diamonds.host}"/>
		    <arg value="-u"/>
		    <arg value="${diamonds.build.id}"/>
		    <arg value="-f"/>
		    <arg value="${build.log.dir}/sf-run-analysis.xml"/>
	  </exec>
    </target>    

    <target name="sf-brag-to-diamonds">
        <!-- Merge all our bits of XML together -->
        <exec executable="perl" output="${build.log.dir}/summary/_BRAG.xml">
            <arg value="${sf.common.config.dir}/tools/mergeXML.pl"/>
            <arg value="--xsl=brag.xsl"/>
            <arg value="--merge=buildStatus,phase(name),step(name),failures(level)"/>
            <arg value="${build.log.dir}/summary/*?_BRAG.xml"/>
        </exec>
        <!-- Run XSL transform to create file to send to diamonds -->
        <java jar="${sf.common.config.dir}/sysdefdowngrade/xalan-j_2_7_1/xalan.jar" fork="true">
            <arg value="-IN"/>
            <arg value="${build.log.dir}/summary/_BRAG.xml"/>
            <arg value="-XSL"/>
            <arg value="${sf.common.config.dir}/tools/brag/bragForDiamonds.xsl"/>
            <arg value="-OUT"/>
            <arg value="${temp.build.dir}/bragForDiamonds.xml"/>
        </java>
        <if>
            <istrue value="${sf.spec.publish.enable}"/>
            <then>
                <!-- Make sure that the summary directory is available to display the BRAG link -->
                <mkdir  dir="${publish.dir}/summary/"/>
                <copy todir="${publish.dir}/summary/" preservelastmodified="true" failonerror="false">
                   <fileset dir="${build.log.dir}/summary/"><include name="*.*"/></fileset>
                </copy>

                <!-- Try to obtain the diamonds ID for this build -->
                <if>
                    <not><isset property="diamonds.build.id"/></not>
                    <then>
                        <property file="${build.log.dir}/diamonds_build_id.properties"/> <!-- This will fail silently -->
                    </then>
                </if>
                <if>
                    <isset property="diamonds.build.id"/>
                    <then>
                        <!-- Send the data to the server -->
                        <exec executable="python">
                            <arg value="${sf.common.config.dir}/tools/brag/send_xml_to_diamonds.py"/>
                            <arg value="-s"/>
                            <arg value="${diamonds.host}"/>
                            <arg value="-u"/>
                            <arg value="${diamonds.build.id}"/>
                            <arg value="-f"/>
                            <arg value="${temp.build.dir}/bragForDiamonds.xml"/>
                        </exec>
                    </then>
                    <else>
                        <echo message="diamonds.build.id is not known - unable to push any build specific information to diamonds server"/>
                    </else>
                </if>
            </then>
        </if>
    </target>

    <target name="sf-check-utilities-dir">
        <available property="sf-utilities-available" file="${build.drive}/utilities" type="dir"/>
    </target>

    <target name="sf-compare-to-baseline" depends="sf-diamondize-bom,sf-check-utilities-dir" if="sf-utilities-available">
        <property name="sf.releasenotes.wiki.txt" value="${build.log.dir}/releaseNotes.wiki.txt"/>
        <delete file="${sf.releasenotes.wiki.txt}"/>
        <!-- FCL usage -->
        <exec executable="perl" dir="${build.drive}/utilities/releaseAutomation/" output="${build.log.dir}/fcls4releasenotes.log">
            <arg value="${build.drive}/utilities/releaseAutomation/fcls4releasenotes.pl"/>
            <arg value="--pdkname1=${sf.previous.pdk.tag}"/>
            <arg value="--pdkloc2=${build.log.dir}"/>
        </exec>
        <!-- Mercurial comparison -->
        <echo file="${sf.releasenotes.wiki.txt}" append="true">== Mercurial Comparison ==${line.separator}${line.separator}</echo>
        <if>
            <isset property="sf.previous.pdk.tag"/>
            <then>
                <echo file="${sf.releasenotes.wiki.txt}" append="true">The Mercurial changes from Nokia were delivered as a bulk update based on '''XXXXXXXXXXXXXXXXXXXXXX'''.${line.separator}${line.separator}List of the Mercurial changes (files added/removed/modified) between ${sf.previous.pdk.tag} and PDK '''XXXXX''' - [[Media:XXXX.txt]].${line.separator}${line.separator}A short study of the results concentrating on the added and removed files has identified these significant package changes:${line.separator}${line.separator}</echo>
                <if>
                    <istrue value="${sf.spec.sourcesync.archive}"/>
                    <then>
                        <echo file="${sf.releasenotes.wiki.txt}" append="true">'''Information cannot be derived as source was synced with archive option'''"${line.separator}${line.separator}</echo>
                    </then>
                    <else>
                        <exec executable="perl" dir="${build.drive}/" output="${sf.releasenotes.wiki.txt}" append="true">
                            <arg value="${build.drive}/utilities/releaseAutomation/mercurialComparison.pl"/>
                            <arg value="${build.log.dir}/BOM/build-info.xml"/>
                            <arg value="${sf.previous.pdk.tag}"/>
                            <arg value="${build.log.dir}/mercurialComparison.tsv"/>
                        </exec>
                    </else>
                </if>
            </then>
            <else>
                <echo file="${sf.releasenotes.wiki.txt}" append="true">'''Information cannot be provided as the tag for the previous PDK was not provided to the build'''"${line.separator}${line.separator}</echo>
            </else>
        </if>
        
        <!-- Code churn -->
        <!-- TODO? -->
        <fixcrlf file="${sf.releasenotes.wiki.txt}"/>
    </target>

    <!-- package all logs into zipfile for publishing -->
    <target name="sf-zip-logs" >
        <if>
            <istrue value="${sf.spec.logs.zip.enable}"/>
            <then>
                <mkdir dir="${build.output.dir}/zips/release"/> <!-- workaround for when there's no other releaseables, just the logs -->
                <zip destfile="${build.output.dir}/zips/release/build_logs.zip" basedir="${build.drive}"> 
                    <include name="output/logs/**"/>
                    <exclude name="output/logs/BOM/**"/>
                    <exclude name="output/logs/deliverables/**"/>
                    <exclude name="output/logs/releaseables/**"/>
                </zip>
                <!-- workaround for the time when when 'sf-run-analysis-raptor' has not been run -->
                <mkdir dir="${build.drive}/output/logs/releaseables"/> 
                <zip destfile="${build.output.dir}/zips/release/build_BOM.zip">
                    <zipfileset dir="${build.drive}/output/logs/BOM" prefix="build_info/logs/BOM"/>
                    <zipfileset dir="${build.drive}/output/logs/releaseables" prefix="build_info/logs/releaseables"/>
                </zip>
                <antcall target="sf-zip-content">
                    <param name="zip.config.file" value="${sf.common.config.dir}/generated/zip.cfg.xml.ftl"/>
                    <param name="zip.target.name" value="info-just-metadata" />
                </antcall>
            </then>
        </if>
     </target>
    
    <target name="sf-publish" depends="prep-publish">
        <copy todir="${publish.dir}" preservelastmodified="true" failonerror="false">
           <fileset dir="${build.output.dir}/zips/release/"><include name="build_*.zip"/></fileset>
        </copy>
    </target>

    <!-- TODO: Make this work for package builds once we have sysmodel story worked out -->
    <target name="sf-run-analysis-missing-files" if="sf.spec.splitbuild">
    <!-- splitbuild is only set for Platform builds -->
       <if><istrue value="${sf.spec.splitbuild}"/>
       <then>
            <if><istrue value="${sf.spec.os.skipbuild}" />
                <then><echo message="Skipping OS file check"/></then>
                <else><runtarget target="sf-check-missing-os-files"/></else>
            </if>

            <if><istrue value="${sf.spec.s60.skipbuild}" />
                <then><echo message="Skipping S60 file check"/></then>
                <else><runtarget target="sf-check-missing-s60-files"/></else>
            </if>
       </then>
       <else>
            <runtarget target="sf-check-missing-os-files"/>
       </else>
    </if>
    </target>
    
    <target name="sf-check-missing-os-files" depends="sf-compile-options">
        <hlm:argSet id="sbs.check.tools.var">
                <hlm:arg name="config" value="${sf.spec.sbs.tools.config}" />
                <hlm:arg name="run-check" value="true" />
        </hlm:argSet>
     
        <hlm:argSet id="sbs.check.main.var">
                <hlm:arg name="config" value="${sf.spec.sbs.config}" />
                <hlm:arg name="run-check" value="true" />
        </hlm:argSet>     
        <antcall target="compile-main" inheritAll="false" inheritRefs="true">
            <param name="build.system" value="${sf.spec.build.system}" />
            <param name="sysdef.configurations.list" value="${sf.spec.os.sysdef.clean.configurations.list}" />
            <param name="sf.spec.sysdef.version" value ="${sf.spec.os.sysdef.version}"/>
            <param name="build.id" value ="sbs_check"/>
            <reference refid="sbs.check.tools.var" torefid="sbs.var" />
            <reference refid="sbs.toolsbuild.options" torefid="sbs.make.options" />
            <reference refid="sf.spec.os.system.definition.files" torefid="system.definition.files" />
        </antcall> 
        <if><istrue value="${sf.os.compile.iterate}"/>
          <then>
            <for list="${sf.spec.sbs.config}" delimiter="," param="sf.spec.check.splitconfig">
              <sequential>
        				<echo message="INFO [Iterative check] @{sf.spec.check.splitconfig}"/>
                <hlm:argSet id="sbs.check.iterate.main.var">
                    <hlm:arg name="config" value="@{sf.spec.check.splitconfig}" />
                    <hlm:arg name="run-check" value="true" />
                </hlm:argSet>     
  
                <antcall target="compile-main" inheritAll="false" inheritRefs="true">
                    <param name="build.system" value="${sf.spec.build.system}" />
                    <param name="sysdef.configurations.list" value="${sf.spec.os.sysdef.clean.configurations.list}" />
                    <param name="sf.spec.sysdef.version" value ="${sf.spec.os.sysdef.version}"/>
                    <param name="build.id" value ="sbs_check"/>
                    <reference refid="sbs.check.iterate.main.var" torefid="sbs.var" />
                    <reference refid="sbs.fullbuild.options" torefid="sbs.make.options" />
                    <reference refid="sf.spec.os.system.definition.files" torefid="system.definition.files" />
                </antcall>
      				</sequential>
      			</for>	
      		</then>		
        <else>
        <antcall target="compile-main" inheritAll="false" inheritRefs="true">
            <param name="build.system" value="${sf.spec.build.system}" />
            <param name="sysdef.configurations.list" value="${sf.spec.os.sysdef.clean.configurations.list}" />
            <param name="sf.spec.sysdef.version" value ="${sf.spec.os.sysdef.version}"/>
            <param name="build.id" value ="sbs_check"/>
            <reference refid="sbs.check.main.var" torefid="sbs.var" />
            <reference refid="sbs.fullbuild.options" torefid="sbs.make.options" />
            <reference refid="sf.spec.os.system.definition.files" torefid="system.definition.files" />
        </antcall>
        </else>
        </if> 
    </target>

    <target name="sf-check-missing-s60-files" depends="sf-compile-options">
    
        <hlm:argSet id="sbs.check.tools.var">
                <hlm:arg name="config" value="${sf.spec.sbs.tools.config}" />
                <hlm:arg name="run-check" value="true" />
        </hlm:argSet>
     
        <hlm:argSet id="sbs.check.main.var">
                <hlm:arg name="config" value="${sf.spec.sbs.config}" />
                <hlm:arg name="run-check" value="true" />
        </hlm:argSet>     
        <antcall target="compile-main" inheritAll="false" inheritRefs="true">
            <param name="build.system" value="${sf.spec.build.system}" />
            <param name="sysdef.configurations.list" value="${sf.spec.s60.sysdef.clean.configurations.list}" />
            <param name="sf.spec.sysdef.version" value ="${sf.spec.s60.sysdef.version}"/>
            <param name="build.id" value ="sbs_check"/>
            <reference refid="sbs.check.tools.var" torefid="sbs.var" />
            <reference refid="sbs.toolsbuild.options" torefid="sbs.make.options" />
            <reference refid="sf.spec.s60.system.definition.files" torefid="system.definition.files" />
        </antcall> 
        <antcall target="compile-main" inheritAll="false" inheritRefs="true">
            <param name="build.system" value="${sf.spec.build.system}" />
            <param name="sysdef.configurations.list" value="${sf.spec.s60.sysdef.clean.configurations.list}" />
            <param name="sf.spec.sysdef.version" value ="${sf.spec.os.sysdef.version}"/>
            <param name="build.id" value ="sbs_check"/>
            <reference refid="sbs.check.main.var" torefid="sbs.var" />
            <reference refid="sbs.fullbuild.options" torefid="sbs.make.options" />
            <reference refid="sf.spec.s60.system.definition.files" torefid="system.definition.files" />
        </antcall>
        
    </target>
    
    <target name="sf-create-public-PDK" depends="sf-prebuild,sf-run-sfl-licence-munging" >
        <if>
            <istrue value="${sf.spec.md5.enable}"/>
            <then>
                <echo message="INFO Creating MD5s"/>
                <runtarget target="sf-run-evalid"/>
            </then>
        </if>
        
        <!-- Package up the binaries we built -->
        <if>
            <istrue value="${sf.spec.package.bin.enable}"/>
            <then>
                <echo message="INFO Packaging Binaries"/>
                <runtarget target="sf-package-binary"/>
                <runtarget target="sf-package-tools"/>

                <echo message="INFO Validate Zip files"/>
                <runtarget target="sf-package-validate"/>
            </then>
        </if>
        <runtarget target="sf-zip-logs"/>
        <runtarget target="sf-brag-to-diamonds"/>
        <if>
            <istrue value="${sf.spec.publish.enable}" />
            <then>
                <echo message="Publish log files and reports to ${sf.spec.publish.rootdir}"/>
                <runtarget target="sf-publish"/>
            </then>
        </if>
    </target>


    <target name="sf-run-sfl-licence-munging" depends="sf-check-utilities-dir" if="sf-utilities-available">    
        <echo message="Running SFL Licence Munging writing log to ${build.log.dir}"/>
        <exec executable="perl" dir="${build.drive}" failonerror="false" output="${build.log.dir}/postbuild_sfl-licence_munging_results.log">
          <arg value="${build.drive}/utilities/williamr/convert_to_eula.pl"/>
        </exec>
    </target>

</project>