sf-platform/compile.ant.xml
author Simon Howkins <simonh@symbian.org>
Tue, 19 Oct 2010 11:11:40 +0100
changeset 1309 2ea5b5b66973
parent 1300 fe97a9594f6c
permissions -rw-r--r--
Adjusted release tagging, so that it clones from the package source, not dst, and hence it's much less likely that the tagging operation will create multiple heads on the TAGS branch.

<?xml version="1.0" encoding="UTF-8"?>
<project name="SF-COMPILE" xmlns:hlm="http://www.nokia.com/helium">

 <math result="sf.spec.sbs.numberofjobs" operand1="${env.NUMBER_OF_PROCESSORS}" operation="*" operand2="2" datatype="int"/>
 
  <!-- compile specified sysdef file. called from sf-compile target in sf-platform/build.xml -->
  <target name="sf-os-compile">
    
    <antcall target="sf-do-compile" inheritAll="false" inheritRefs="true">
        <param name="sysdef.configurations.list" value="${sf.spec.os.sysdef.clean.configurations.list}" />
        <reference refid="sf.spec.os.system.definition.files" torefid="system.definition.files" />
    </antcall>

      <!-- Export model to BOM, as generate-layers target is no longer called from compile-main target -->
      <!-- Name of file in BOM should always be system_model.xml, so that it can be predictably re-used again -->
      <copy file="${build.drive}/output/build/canonical_system_definition_${sf.spec.os.sysdef.clean.configurations.list}.xml" tofile="${build.log.dir}/BOM/system_model.xml" failonerror="false"/>

    <if><available file="${sf.spec.systemdefinition.location}/tools_model.xml"/>
      <then>
            <!-- perform reallyclean to remove any exported artefacts that are going to be rebuilt -->
            <antcall target="sf-do-reallyclean" inheritAll="false" inheritRefs="true">
              <param name="sysdef.configurations.list" value="bldmelast" />
              <reference refid="sf.spec.tools.system.definition.files" torefid="system.definition.files" />
            </antcall>

            <antcall target="sf-do-compile" inheritAll="false" inheritRefs="true">
              <param name="sysdef.configurations.list" value="bldmelast" />
              <reference refid="sf.spec.tools.system.definition.files" torefid="system.definition.files" />
            </antcall>

            <!-- Export model to BOM, as generate-layers target is no longer called from compile-main target -->
            <!-- Name of file in BOM should always be tools_model.xml, so that it can be predictably re-used again -->
            <copy file="${build.drive}/output/build/canonical_system_definition_bldmelast.xml" tofile="${build.log.dir}/BOM/tools_model.xml" failonerror="false"/>
      </then>
    </if>

  </target>

  
  <!-- compile sbs.tools.config and sbs.config. tools built only if its not being unpacked first.
       note: must be called from sf-os/s60-compile targets, as sys model input needed -->
  <target name="sf-do-compile" depends="create-canonical-sysdef-file">
    <echo message="INFO Using Helium 7+ for sf-do-compile"/>

    <!-- explicitly run qmake once, as iterative build will repeat the step. if qmake is not unpacked already, then this step is skipped  -->
    <antcall target="run-qmake" inheritAll="false" inheritRefs="true">
      <param name="qmake.enabled" value="true"/>
      <param name="sysdef.configuration" value="${sysdef.configurations.list}"/>
    </antcall>

    <!-- perform initial exports -->
    <antcall target="sf-do-full-export" inheritAll="false" inheritRefs="true">
        <param name="sf.export.stage.name" value="full_export"/>
        <param name="sysdef.configuration" value="${sysdef.configurations.list}"/>
    </antcall>	  

    <!-- explicitly run qmake second time to allow -configure options to be applied -->
    <antcall target="run-qmake" inheritAll="false" inheritRefs="true">
      <param name="qmake.enabled" value="true"/>
      <param name="sysdef.configuration" value="${sysdef.configurations.list}"/>
    </antcall>
	
    <if> <!-- If tools baseline unpack has not been specified, or its not a "fast" build then try to build them -->
      <or>
        <isfalse value="${sf.spec.toolsbaseline.enable}"/>
        <isfalse value="${sf.os.compile.fast}"/>
      </or>
      <then>
        <echo message="INFO Building tools, unpack is not specified"/>        
        
        <!-- sf.spec.sbs.tools.config param used. do-target-build will decide to build sequentially/together -->
        <antcall target="sf-do-target-compile" inheritAll="false" inheritRefs="true">
            <param name="i.sf.spec.sbs.config" value="${sf.spec.sbs.tools.config}" />   
            <param name="sysdef.configuration" value="${sysdef.configurations.list}"/>        
        </antcall>
      </then>
      <else>
        <echo message="INFO Skipping tools build, tools were unpacked from ${sf.spec.toolsbaseline.location}"/>
      </else>
      </if>
      	  	  
      <!-- sf.spec.sbs.config param used. do-target-build will decide to build sequentially/together -->
      <antcall target="sf-do-target-compile" inheritAll="false" inheritRefs="true">
          <param name="i.sf.spec.sbs.config" value="${sf.spec.sbs.config}" />
          <param name="sysdef.configuration" value="${sysdef.configurations.list}"/>
      </antcall>
  

  </target>

  <!-- perform export only first to assist when parallel makefile parsing -->
  <target name="sf-do-full-export">
  
    <!-- turn comma separated list into sbs friendly -c list, and _ separated list for friendly log names -->
    <propertyregex property="i.sf.spec.sbs.config.expanded"         override="true" input="${sf.spec.sbs.config}" regexp="(,)" replace=" -c " defaultValue="${sf.spec.sbs.config}" global="true"  casesensitive="false"/>
    <propertyregex property="i.sf.spec.sbs.tools.config.expanded"   override="true" input="${sf.spec.sbs.tools.config}" regexp="(,)" replace=" -c " defaultValue="${sf.spec.sbs.tools.config}" global="true"  casesensitive="false"/>

    <hlm:sbsinput id="sf.export">
        <sbsOptions>
            <arg line="-c ${i.sf.spec.sbs.config.expanded} -c ${i.sf.spec.sbs.tools.config.expanded}"/>
            <arg line="-k" />
            <arg line="-j ${sf.spec.sbs.numberofjobs}"/>
            <arg line="-t ${sf.spec.sbs.retry.limit}"/>
            <arg name="--logfile" value="${build.drive}/output/logs/${build.id}_${sysdef.configuration}_compile_${sf.export.stage.name}.log" />
            <arg name="--makefile" value="${compile.log.dir}/${build.id}_${sysdef.configuration}_compile_${sf.export.stage.name}_Makefile" />
            <arg line="--export-only"/>
        </sbsOptions>
    </hlm:sbsinput>
    
    <!-- call helium's compile-main target using the sbsInput args defined above -->
    <echo message="INFO Full export for all targets"/>
    <antcall target="compile-main" inheritAll="false" inheritRefs="true">
        <param name="build.system" value="${sf.spec.build.system}" />
        <param name="sysdef.configuration" value="${sysdef.configurations.list}"/>
        <param name="sbs.inputs.list" value="sf.export"/>
    </antcall> 
  </target>

  <!-- perform reallyclean -->
  <target name="sf-do-reallyclean">
  
    <!-- turn comma separated list into sbs friendly -c list, and _ separated list for friendly log names -->
    <propertyregex property="i.sf.spec.sbs.config.expanded"         override="true" input="${sf.spec.sbs.config}" regexp="(,)" replace=" -c " defaultValue="${sf.spec.sbs.config}" global="true"  casesensitive="false"/>
    <propertyregex property="i.sf.spec.sbs.tools.config.expanded"   override="true" input="${sf.spec.sbs.tools.config}" regexp="(,)" replace=" -c " defaultValue="${sf.spec.sbs.tools.config}" global="true"  casesensitive="false"/>

    <hlm:sbsinput id="sf.reallyclean">
        <sbsOptions>
            <arg line="-c ${i.sf.spec.sbs.config.expanded} -c ${i.sf.spec.sbs.tools.config.expanded}"/>
            <arg line="-k" />
            <arg line="-j ${sf.spec.sbs.numberofjobs}"/>
            <arg line="-t ${sf.spec.sbs.retry.limit}"/>
            <arg name="--logfile" value="${build.drive}/output/logs/${build.id}_${sysdef.configurations.list}_reallyclean.log" />
            <arg name="--makefile" value="${compile.log.dir}/${build.id}_${sysdef.configurations.list}_reallyclean_Makefile" />
            <arg line="REALLYCLEAN"/>
        </sbsOptions>
    </hlm:sbsinput>
    
    <!-- call helium's compile-main target using the sbsInput args defined above -->
    <echo message="INFO REALLCLEAN for all targets"/>
    <antcall target="compile-main" inheritAll="false" inheritRefs="true">
        <param name="build.system" value="${sf.spec.build.system}" />
        <param name="sysdef.configuration" value="${sysdef.configurations.list}"/>
        <param name="sbs.inputs.list" value="sf.reallyclean"/>
    </antcall> 
  </target>

  <!-- compile sbs.config list of targets either sequentially or together -->
  <target name="sf-do-target-compile">
  
    <if>
      <istrue value="${sf.os.compile.iterate}"/>
      <then>
        <for list="${i.sf.spec.sbs.config}" delimiter="," param="item.sbs.splitconfig">
        <sequential>
        
            <!-- define sbs args, log name etc -->
            <hlm:sbsinput id="sf.build">
                <sbsOptions>
                    <arg line="-c @{item.sbs.splitconfig}"/>
                    <arg line="-k" />
                    <arg line="-j ${sf.spec.sbs.numberofjobs}"/>
                    <arg line="-t ${sf.spec.sbs.retry.limit}"/>
                    <arg line="${sf.spec.sbs.options}"/>
                    <arg name="--filters" value="&quot;${sf.spec.sbs.filter.list}&quot;"/>
                    <arg name="--logfile" value="${build.drive}/output/logs/${build.id}_@{item.sbs.splitconfig}_${sysdef.configuration}_compile.log" />
                    <arg name="--makefile" value="${compile.log.dir}/${build.id}_@{item.sbs.splitconfig}_${sysdef.configuration}_Makefile" />
                    <arg line="--noexport"/>
                </sbsOptions>
            </hlm:sbsinput>

            <!-- call helium's compile-main target using the sbsInput args defined above -->
            <echo message="INFO Iterative compile building target: @{item.sbs.splitconfig}"/>
            <antcall target="compile-main" inheritAll="false" inheritRefs="true">
              <param name="build.system" value="${sf.spec.build.system}" />
              <param name="sysdef.configuration" value="${sysdef.configurations.list}"/>
              <param name="sbs.inputs.list" value="sf.build"/>
            </antcall> 
                        
        </sequential>
        </for>
      </then>
      <else>
           <!-- turn comma separated list into sbs friendly -c list, and _ separated list for friendly log names -->
           <propertyregex property="i.sf.spec.sbs.config.expanded"         override="true" input="${i.sf.spec.sbs.config}" regexp="(,)" replace=" -c " defaultValue="${i.sf.spec.sbs.config}" global="true"  casesensitive="false"/>
           <propertyregex property="i.sf.spec.sbs.config.expanded.logname" override="true" input="${i.sf.spec.sbs.config}" regexp="(,)" replace="_"    defaultValue="${i.sf.spec.sbs.config}" global="true"  casesensitive="false"/>
           <echo message="INFO Target : ${i.sf.spec.sbs.config.expanded}"/>
           <echo message="INFO Logname: ${i.sf.spec.sbs.config.expanded.logname} + Config: ${sysdef.configuration}"/>
           
           <!-- TODO: Make this use above compile-main call? -->

           <!-- define sbs args, log name etc -->
           <hlm:sbsinput id="sf.build">
                <sbsOptions>
                    <arg line="-c ${i.sf.spec.sbs.config.expanded}"/>
                    <arg line="-k" />
                    <arg line="-j ${sf.spec.sbs.numberofjobs}"/>
                    <arg line="-t ${sf.spec.sbs.retry.limit}"/>
                    <arg line="${sf.spec.sbs.options}"/>
                    <arg name="--filters" value="&quot;${sf.spec.sbs.filter.list}&quot;"/>
                    <arg name="--logfile" value="${build.drive}/output/logs/${build.id}_${i.sf.spec.sbs.config.expanded.logname}_${sysdef.configuration}_compile.log" />
                    <arg name="--makefile" value="${compile.log.dir}/${build.id}_${i.sf.spec.sbs.config.expanded.logname}_${sysdef.configuration}_Makefile" />
                    <arg line="--noexport"/>
                </sbsOptions>
           </hlm:sbsinput>
            
            <!-- call helium's compile-main target using the sbsInput args defined above -->
            <echo message="INFO Building target(s): ${i.sf.spec.sbs.config.expanded}"/>
            <antcall target="compile-main" inheritAll="false" inheritRefs="true">
              <param name="build.system" value="${sf.spec.build.system}" />
              <param name="sysdef.configuration" value="${sysdef.configurations.list}"/>
              <param name="sbs.inputs.list" value="sf.build"/>
            </antcall> 
           
      </else>
    </if>
  </target>
  
</project>