Simplified code for reading ATS worker root. Plus clearer error message if it cannot be read.
<?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=""${sf.spec.sbs.filter.list}""/>
<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=""${sf.spec.sbs.filter.list}""/>
<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>