buildframework/helium/tools/preparation/ido-prep.ant.xml
changeset 1 be27ed110b50
child 179 d8ac696cc51f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/tools/preparation/ido-prep.ant.xml	Wed Oct 28 14:39:48 2009 +0000
@@ -0,0 +1,547 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- 
+============================================================================ 
+Name        : ido-prep.ant.xml 
+Part of     : Helium 
+
+Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+All rights reserved.
+This component and the accompanying materials are made available
+under the terms of the License "Eclipse Public License v1.0"
+which accompanies this distribution, and is available
+at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+Initial Contributors:
+Nokia Corporation - initial contribution.
+
+Contributors:
+
+Description:
+
+============================================================================
+-->
+<project name="ido-prep" xmlns:hlm="http://www.nokia.com/helium">
+    <description>
+        IDO related targets.
+         * Build area preparation
+         * Codescanner integration
+         * Cenrep generation (old way)
+         * IBY export (old way)
+    </description>
+        
+    <property name="ado.mapping.file" location="${build.output.dir}/build/ado_mapping.ini"/>
+    <property name="ado.quality.mapping.file" location="${build.output.dir}/build/ado_quality_mapping.ini"/>
+    <property name="ido.romtree" location="${build.drive}${env.EPOCROOT}/epoc32/rom/include"  />
+    <property name="ido.cenrep.root" location="${build.drive}${env.EPOCROOT}/epoc32/tools/cenrep/ido/src"  />
+    <property name="ido.cenrep.target" value="${build.drive}${env.EPOCROOT}/epoc32/data/z/private/10202be9"  />
+    <property name="ido.codescanner.output.dir" location="${build.output.dir}/${build.id}_codescanner"/>
+    
+    <!-- Internal target that generates the '''ado.mapping.file'''.
+     It is a INI file that contains ADO location as a key and target location as value.
+    -->
+    <target name="ido-create-ado-mapping">        
+        <mkdir dir="${build.output.dir}/build"/>
+        <mkdir dir="${temp.build.dir}"/>
+        <tempfile property="prep.dynamic.sysdef.config" suffix=".txt" deleteonexit="false" destdir="${temp.build.dir}"/>
+        <hlm:referenceToFileMacro refid="system.definition.files" output="${prep.dynamic.sysdef.config}"/>
+        <trycatch>
+            <try>
+                <pathconvert pathsep="," property="ado.quality.dirs.path">
+                    <dirset refid="ado.quality.dirs"/>
+                </pathconvert>
+            </try>
+        </trycatch>
+        <script language="jython" setbeans="false">
+import os
+import ant
+import shutil
+import fileutils
+import ido
+
+input = open(project.getProperty(r"prep.dynamic.sysdef.config"), 'r')
+output = open(project.getProperty(r"ado.mapping.file"), 'w')
+outputquality = open(project.getProperty(r"ado.quality.mapping.file"), 'w')
+components = {}
+for sysdef in input.readlines():
+    sysdef = sysdef.strip()
+    if len(sysdef) > 0:
+        print "Checking %s" % sysdef
+        os.path.dirname(sysdef)
+        location = ido.get_sysdef_location(sysdef)
+        if location != None:
+            sysdef = os.path.dirname(sysdef).replace('\\','/').replace(':','\\:')
+            component = os.path.normpath(os.path.join(project.getProperty(r"build.drive"), os.environ['EPOCROOT'], location)).replace('\\','/').replace(':','\\:')
+            print "%s=%s\n" % (sysdef, component)
+            output.write("%s=%s\n" % (sysdef, component))
+            
+            if project.getProperty("ado.quality.dirs.path") == None:
+                outputquality.write("%s=%s\n" % (sysdef, component))
+            else:
+                for dir in project.getProperty("ado.quality.dirs.path").split(','):
+                    if os.path.normpath(dir) == os.path.normpath(os.path.join(project.getProperty(r"build.drive"), os.environ['EPOCROOT'], location)):
+                        outputquality.write("%s=%s\n" % (sysdef, component))
+outputquality.close()
+output.close()
+input.close()        
+        </script>
+    </target>
+    
+    
+    <!-- Target that uses the information from the system.definition.files to prepare the IDO build area.
+        It relies on the fact that layer_real_source_path entity is declared in each ADO configuration.
+        
+        By default it deletes the previous content. If you want to backup what was previoulsy used please
+        defined '''ido.keep.old''' property.         
+        -->
+    <target name="ido-prep-copy" depends="ido-create-ado-mapping">
+        <mkdir dir="${temp.build.dir}"/>
+        <tempfile property="prep.dynamic.config" suffix=".xml" deleteonexit="false" destdir="${temp.build.dir}"/>
+        
+        <!-- new implementation that only rely on Ant -->
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-ant-delete.xml.ftl"
+                     outputFile="${prep.dynamic.config}.clean.xml">
+            <data expandProperties="yes">
+                    inputfile: antProperty(ado.mapping.file)
+                    ant: antProperties()
+                        data: eval('
+                                java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+                                java.util.Properties props = new java.util.Properties();
+                                props.load(pin);
+                                return props;
+                                ', {filename:get(inputfile)})
+            </data>
+        </fmpp>
+        <ant antfile="${prep.dynamic.config}.clean.xml"/>
+        
+        <!-- new implementation that only rely on Ant -->
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-ant-copy.xml.ftl"
+            outputFile="${prep.dynamic.config}">
+            <data expandProperties="yes">
+                inputfile: antProperty(ado.mapping.file)
+                ant: antProperties()
+                    data: eval('
+                            java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+                            java.util.Properties props = new java.util.Properties();
+                            props.load(pin);
+                            return props;
+                            ', {filename:get(inputfile)})
+            </data>
+        </fmpp>
+        <ant antfile="${prep.dynamic.config}"/>
+    </target>
+    
+    
+    <!--
+    Run cleanup system definition configuration. The configuration name are
+    generated from the '''sysdef.configurations.list''' property, appending '_clean'
+    at the end of each configuration also reversing their build order.
+    if '''sysdef.clean.configurations.list''' is defined it overrides
+    the previous beharvious and is used to cleanup the environment.
+    -->
+    <target name ="ido-prep-clean">
+        <if>
+            <not>
+                <isset property="sysdef.clean.configurations.list"/>
+            </not>
+            <then>
+                <if>
+                    <isset property="sysdef.configurations.list"/>
+                    <then>
+                        <script language="jython" setbeans="false">
+rev_names = ""
+for sysdef in project.getProperty("sysdef.configurations.list").split(","):    
+    rev_names = sysdef + "_clean," + rev_names;
+project.setProperty("sysdef.clean.configurations.list", rev_names)
+                        </script>
+                    </then>
+                    <else>
+                        <fail message="You should either define sysdef.clean.configurations.list or sysdef.configurations.list."/>
+                    </else>
+                </if>
+            </then>
+        </if>
+        
+        <antcall target="compile-main">
+            <param name="sysdef.configurations.list" value="${sysdef.clean.configurations.list}"/>
+            <param name="compile.signal.input" value="compileCleanSignalInput"/>
+            <param name="compile.discard.result" value="true"/>
+            <param name="compile.cmd.clean" value="true"/>
+        </antcall>
+    </target>
+
+
+
+    <!--
+      Internal target that set an intermediate property to disable codescanner execution.
+    -->
+    <target name="ido-codescanner-skip">
+        <if>
+            <istrue value="${skip.codescanner}"/>
+            <then>
+                <property name="do.skip.codescanner" value="1"/>
+            </then>
+        </if>
+    </target>
+
+    <!--
+        This targets run the codescanner application on each discovered ADO.
+        The location of the output is defined byt '''ido.codescanner.output.dir''' property.
+        And the type is defined by '''ido.codescanner.output.type''' (default is HTML). 
+    -->
+    <target name="ido-codescanner" depends="ido-create-ado-mapping,ido-codescanner-skip" unless="do.skip.codescanner">
+        <!--hlm:iniKeys2Path ini="${ado.mapping.file}" pathid="ado.src.path"/-->
+        <property name="ido.codescanner.output.type" value="html"/>
+        <script language="jython" setbeans="false">
+""" internal.codescanner.drive """
+import os
+import fileutils
+import configuration
+import pathaddition.relative
+
+config = configuration.PropertiesConfiguration(stream=open(str(project.getProperty("ado.quality.mapping.file")), 'r'))
+prefix = pathaddition.relative.commonprefix(config.keys())
+if not os.path.exists(prefix):
+    raise Exception("Could not find common prefix for the following paths:\n" + "\n".join(config.keys()))
+self.log(str('Substing %s' % prefix))
+drive = fileutils.get_next_free_drive()
+fileutils.subst(drive, prefix)
+project.setProperty('internal.codescanner.drive', drive)
+
+# creating the structure form subst drive.
+path = project.createDataType("path")
+for location in config.keys():
+    self.log(str("From %s" % location))
+    location = drive + os.sep + pathaddition.relative.abs2rel(location, prefix)
+    self.log(str("To %s" % location))
+    pe = path.createPathElement()
+    pe.setPath(location)
+project.addReference('substed.ado.src.path', path)
+        </script>
+        <hlm:codescanner dest="${ido.codescanner.output.dir}"
+            format="${ido.codescanner.output.type}"
+            configuration="${ido.codescanner.config}">
+            <path refid="substed.ado.src.path"/>
+        </hlm:codescanner>
+        <hlm:unsubst drive="${internal.codescanner.drive}"/>
+    </target>
+
+        <!-- CMT Tool target. Complexity tool measures. Supported options for cmt tool macro is
+        1. input - files to be measured
+        2. output - output xml file (file size is huge 68MB for JAVA IDO, if this needs to be send, need to consider
+        3. config - input config . 
+        -->
+    <target name="ido-cmt" depends="ido-create-ado-mapping" if="enable.cmt">
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-cmt-ant.xml.ftl"
+                          outputFile="${temp.build.dir}/ido-cmt.ant.xml">
+            <data expandProperties="yes">
+                        inputfile: antProperty(ado.quality.mapping.file)
+                        ant: antProperties()
+                            data: eval('
+                                    java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+                                       java.util.Properties props = new java.util.Properties();
+                                    props.load(pin);
+                                    return props;
+                                    ', {filename:get(inputfile)})
+            </data>
+        </fmpp>
+        <ant antfile="${temp.build.dir}/ido-cmt.ant.xml"/>
+    </target>
+
+
+    <!-- Internal target that generates a temporary file that allow the 
+    either export of iby or either key*.xls. The generated Ant build file
+    contains two targets with copy insturctions and generic set of fileset rules.     
+    -->
+    <target name="ido-create-copy-file" depends="ido-create-ado-mapping">
+        <tempfile property="copyfile.dynamic.config" suffix=".ant.xml" deleteonexit="false" destdir="${temp.build.dir}"/>
+        <fmpp sourceFile="${helium.dir}/tools/common/templates/ido/ido-export.ant.xml.ftl"
+                      outputFile="${copyfile.dynamic.config}">
+            <data expandProperties="yes">
+                inputfile: antProperty(ado.mapping.file)
+                ant: antProperties()
+                data: eval('
+                            java.io.FileInputStream pin = new java.io.FileInputStream(filename);
+                               java.util.Properties props = new java.util.Properties();
+                            props.load(pin);
+                            return props;
+                            ', {filename:get(inputfile)})
+            </data>
+        </fmpp>
+    </target>
+
+    <!-- Do the export of the ibys from ADO work area level to epoc32 tree. -->    
+    <target name="ido-copy-iby" depends="ido-create-copy-file">
+        <ant antfile="${copyfile.dynamic.config}" target="ido-copy-iby"/>
+    </target>
+
+    <!-- Do the export of the Excel keys*.xls from ADO work area level to 
+    epoc32 tree.
+    -->
+    <target name="ido-copy-cenrep" depends="ido-create-copy-file">
+        <delete dir="${ido.cenrep.root}"/>
+        <mkdir dir="${ido.cenrep.root}"/>
+        <ant antfile="${copyfile.dynamic.config}" target="ido-copy-cenrep"/>
+    </target>
+
+    <!-- Generated cenrep from exported keys*.xls files. -->
+    <target name="ido-create-cenrep" depends="ido-copy-cenrep">
+        <delete dir="${ido.cenrep.root}/../data"/>
+        <mkdir dir="${ido.cenrep.root}/../data"/>
+        <exec executable="perl" dir="${ido.cenrep.root}" failonerror="true">
+            <arg value="${build.drive}/epoc32/tools/cenrep/generate_cenrep_inifile.pl"/>
+            <arg value="-r"/>
+            <arg value="${ido.cenrep.platform}"/>
+            <arg value="-d"/>
+            <arg value="${ido.cenrep.root}"/>
+            <arg value="-rd"/>
+            <arg value="${ido.cenrep.root}/../data"/>
+        </exec>
+        <!-- Copy generated files to target path -->
+        <copy todir="${ido.cenrep.target}" verbose="true" flatten="true" overwrite="true">
+            <fileset dir="${ido.cenrep.root}/../data">
+                <include name="*.txt"/>
+            </fileset>
+        </copy>    
+        
+    </target>
+
+    <!-- Gets the contents from GRACE / Dragonfly -->
+    <target name="ido-check-latest-release" depends="ido-check-latest-release-grace" unless="env.HLM_SUBCON">
+        <runtarget target="ido-check-latest-release-dragonfly"/>
+    </target>
+
+    <!-- Checks the contents from GRACE release. Mainly used by IDOs. But could be
+    extended to product builds.-->    
+    <target name="ido-check-latest-release-grace" unless="use.dragonfly">
+        <script language="jython" setbeans="false">
+import re
+import os
+import symrec
+import logging
+import traceback
+import ant
+            
+if not project.getProperty('s60.grace.server'):
+    raise Exception("Property 's60.grace.server' is not defined.")
+if not project.getProperty('s60.grace.service'):
+    raise Exception("Property 's60.grace.service' is not defined.")
+if not project.getProperty('s60.grace.product'):
+    raise Exception("Property 's60.grace.product' is not defined.")
+if not project.getProperty('s60.grace.release'):
+    raise Exception("Property 's60.grace.release' is not defined.")
+grace = project.getProperty('s60.grace.server')
+service = project.getProperty('s60.grace.service')
+product = project.getProperty('s60.grace.product')
+release = project.getProperty('s60.grace.release')
+revision = r'(_\d{3})?'
+if project.getProperty('s60.grace.revision') != None:
+    revision = project.getProperty('s60.grace.revision')
+
+# Get the cache filename.
+cachefilename = project.getProperty('s60.grace.cache')
+if cachefilename:
+    self.log(str("Using cache file: %s" % cachefilename))
+
+checkmd5 = False
+if project.getProperty('s60.grace.checkmd5') != None:
+    checkmd5 = str(project.getProperty('s60.grace.checkmd5')).lower()
+    checkmd5 = ((checkmd5 == "true") or (checkmd5 == "1") or (checkmd5 == "on"))
+            
+branch = os.path.join(grace, service, product)
+if not os.path.exists(branch):
+    raise Exception("Error occurred: Could not find directory %s" % branch)
+    
+result = []
+for rel in os.listdir(branch):
+    relpath = os.path.join(branch, rel)
+    self.log("Checking: %s" % str(relpath))
+    res = re.match(r"%s%s$" % (release, revision), rel, re.I)
+    if res != None:
+        self.log("Found: %s" % str(relpath))
+        result.append(relpath)
+result.sort(reverse=True)
+use_tickler = False
+tickler_validation = str(project.getProperty('s60.grace.usetickler')).lower()
+if tickler_validation != None:
+    use_tickler = ((tickler_validation == "true") or (tickler_validation == "1"))
+validresults = []
+for rel in result:
+    try:
+        metadata_filename = symrec.find_latest_metadata(str(rel))
+        if metadata_filename is not None and os.path.exists(metadata_filename):
+            self.log(str("Validating: %s" % metadata_filename))
+            if (use_tickler):
+                validator = symrec.ValidateTicklerReleaseMetadata(metadata_filename, cachefilename)
+            else:
+                validator = symrec.ValidateReleaseMetadataCached(metadata_filename, cachefilename)
+            if validator.is_valid(checkmd5):
+                self.log(str("%s is valid." % rel))
+                validresults.append(rel)
+                break
+            else:
+                self.log(str("%s is not a valid release." % rel))
+        elif metadata_filename is None:
+            self.log(str("Could not find the release metadata file under %s" % rel))
+    except Exception, e:
+        self.log(str("WARNING: %s: %s" % (rel , e)))
+        self.log(str("%s is not a valid release." % rel))
+        traceback.print_exc()
+
+result = validresults
+if len(result) == 0:
+    raise Exception("Error finding GRACE release.")
+print result[0]
+resultname = os.path.basename(result[0])
+vfile = os.path.join(project.getProperty('build.drive') + os.sep, 's60_version.txt')
+if (os.path.exists(vfile)):
+    self.log("Are we still up-to-date compare to %s" % str(vfile))
+    f = open(str(vfile), 'r')
+    version = f.readline()
+    self.log(str("'%s' == '%s'" % (version, resultname)))
+    project.setProperty('s60.getenv.path', str(result[0]))
+    project.setProperty('s60.getenv.release', str(resultname))
+    if version.strip() != resultname:
+        project.setProperty('s60.getenv.update', "1")
+    f.close()
+else:
+    self.log("Version file not found getting new environment...")
+    project.setProperty('s60.getenv.path', str(result[0]))
+    project.setProperty('s60.getenv.release', str(resultname))
+    project.setProperty('s60.getenv.update', "1")
+        </script>
+    </target>
+
+    <!-- Updates the build area from either GRACE / dragonfly server.-->
+    <target name="ido-update-build-area" depends="backup-subst-drives,ido-update-build-area-grace" unless="env.HLM_SUBCON">
+        <runtarget target="ido-update-build-area-dragonfly"/>
+    </target>
+
+    <!-- Creates the build area by getting the contents from GRACE release.-->    
+    <target name="ido-update-build-area-grace" if="s60.getenv.update" depends="ido-check-latest-release" unless="use.dragonfly">
+        <!-- We must update the build area so let's get rid of the old one. -->
+        <hlm:unsubst drive="${build.drive}" failonerror="false"/>
+        
+        <!-- Just get S60 for IDOs -->
+        <echo>Location of the new S60 release:${s60.getenv.path}</echo>
+        <tstamp>
+            <format property="getenv.tstamp" pattern="yyyyMMddHHmmss"/>
+        </tstamp>
+        <antcall target="init-drive">
+            <param name="prep.build.dir" location="${prep.root.dir}/${getenv.tstamp}_${s60.getenv.release}"/>            
+        </antcall>
+        <antcall target="preparation-getenv">
+            <param name="base_release.path" value="${s60.getenv.path}"/>
+        </antcall>
+        <antcall target="ido-prep-variant"/>
+
+        <if>
+            <not>
+                <hlm:hasSeverity severity="error" file="${build.cache.log.dir}/${build.id}_getenv.log.xml" />
+            </not>
+            <then>
+                <hlm:python>
+from path import path
+print "Writing version file...."
+vfile = path(r'${build.drive}'+"/").joinpath('s60_version.txt')
+f = open(str(vfile), 'w')
+f.write(path(r'${s60.getenv.path}').name)
+f.close()
+                </hlm:python>
+            </then>
+        </if>
+    </target>
+
+    <!-- Gets the Contents for particular variant, by unpacking the variant zip from the metadata file.-->
+    <target name="ido-prep-variant" if="ido.variant">
+        <script language="jython" setbeans="false">
+import re
+import os
+import symrec
+from com.nokia.ant.util import Helper
+rel_path = Helper.getProperty(project, 's60.getenv.path')
+metadata = symrec.find_latest_metadata(str(rel_path))
+self.log(str("Release metadata file: %s." % metadata))
+rel_metadata = symrec.ReleaseMetadata(metadata)
+variant_pkg = rel_metadata.getVariantPackage(project.getProperty('ido.variant'))
+project.setProperty('ido.variant.package', os.path.join(rel_path, variant_pkg))
+        </script>
+        <unzip src="${ido.variant.package}" dest="${build.drive}${env.EPOCROOT}"/>
+    </target>
+
+
+    <!-- This target will help CI tool to trigger a build by updating a 's60.getenv.trigger.location' file timestamp. -->
+    <target name="ido-latest-release-trigger" if="s60.getenv.update" depends="ido-check-latest-release">
+        <if>
+            <isset property="s60.getenv.trigger.location"/>
+            <then>
+                <echo>Touching the trigger.</echo>
+                <touch file="${s60.getenv.trigger.location}"/>
+            </then>
+            <else>
+                <echo>Property s60.getenv.trigger.location is not defined, trigger will not get updated.</echo>
+            </else>
+        </if>
+    </target>
+    
+    <!-- Convert keys of an ini file into a path structure.
+        e.g: <pre><hlm:iniKeys2Path ini="${ado.mapping.file}" pathid="ado.src.path"/></pre>
+
+    Usage example:
+      <pre>
+        <target name="test-iniKeys2Path" depends="ido-create-ado-mapping">
+            <hlm:iniKeys2Path ini="${ado.mapping.file}" pathid="ado.src.path"/>
+            <hlm:codescanner dest="${build.drive}/codescanner">
+                <path refid="ado.src.path"/>
+            </hlm:codescanner>
+        </target>
+        </pre>
+    -->
+    <scriptdef name="iniKeys2Path" language="beanshell" uri="http://www.nokia.com/helium">
+        <attribute name="ini"/>
+        <attribute name="pathid"/>
+        if (attributes.get("ini") == null)
+            throw new org.apache.tools.ant.BuildException("ini is not defined");
+        if (attributes.get("pathid") == null)
+            throw new org.apache.tools.ant.BuildException("pathid is not defined");
+        try {
+            java.io.FileInputStream pin = new java.io.FileInputStream(attributes.get("ini"));
+            java.util.Properties props = new java.util.Properties();
+            props.load(pin);
+            org.apache.tools.ant.types.Path path = project.createDataType("path");
+            for (java.util.Iterator i = props.stringPropertyNames().iterator(); i.hasNext() ; ) {
+                org.apache.tools.ant.types.Path.PathElement pe = (org.apache.tools.ant.types.Path.PathElement)path.createPathElement();
+                pe.setPath(i.next());
+            }
+            self.log("Creating reference: " + attributes.get("pathid"));
+            project.addReference(attributes.get("pathid"), path);
+        } catch (Exception e) {
+            throw new org.apache.tools.ant.BuildException(e);
+        }
+    </scriptdef>
+
+    <!-- Target to get the Substituted drives information-->
+    <target name="backup-subst-drives">
+        <exec dir="${cache.dir}" executable="subst.exe" osfamily="windows" output="${cache.dir}\hlmsubsteddrives.bat" failonerror="false"/>
+        <trycatch property="backup-subst-drives.exception">
+            <try>
+                <if>
+                    <available file="${cache.dir}/hlmsubsteddrives.bat" type="file"/>
+                    <then>
+                        <replaceregexp file="${cache.dir}\hlmsubsteddrives.bat" match="\\: => " replace=" " flags="g" byline="true"/>
+                        <replaceregexp file="${cache.dir}\hlmsubsteddrives.bat" match="\A" replace="subst.exe " byline="true"/>
+                        <replaceregexp file="${cache.dir}\hlmsubsteddrives.bat" match="UNC" replace="\\\\" byline="true"/>
+                    </then>
+                </if>
+            </try>
+            <catch>
+                <echo>${backup-subst-drives.exception}</echo>
+            </catch>
+        </trycatch>
+    </target>
+
+    <import file="ci.ant.xml"/>
+</project>
+
+
+
+