sf-platform/compile.ant.xml
author Simon Howkins <simonh@symbian.org>
Wed, 27 Oct 2010 16:22:14 +0100
changeset 1316 0b4a09013baf
parent 1300 fe97a9594f6c
permissions -rw-r--r--
Added copyright messages

<?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>