buildframework/helium/sf/python/pythoncore/lib/packageiad.py
author wbernard
Fri, 13 Aug 2010 14:59:05 +0300
changeset 628 7c4a911dc066
parent 587 85df38eb4012
permissions -rw-r--r--
helium_11.0.0-e00f171ca185
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     1
#============================================================================ 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     2
#Name        : packageiad.py 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     3
#Part of     : Helium 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     4
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     5
#Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     6
#All rights reserved.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     7
#This component and the accompanying materials are made available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     8
#under the terms of the License "Eclipse Public License v1.0"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     9
#which accompanies this distribution, and is available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    10
#at the URL "http://www.eclipse.org/legal/epl-v10.html".
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    11
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    12
#Initial Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    13
#Nokia Corporation - initial contribution.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    14
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    15
#Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    16
#
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    17
#Description:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    18
#===============================================================================
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    19
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    20
""" packageIAD.py module """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    21
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    22
import os
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    23
import sys
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    24
import xml.dom.minidom
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    25
import iadinfo
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    26
import zipfile
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    27
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    28
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    29
class IADPackager :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    30
    """ package IAD class "
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    31
    """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    32
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    33
    def __init__(self) :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    34
        """ class init method """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    35
        self.hasStub = False
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    36
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    37
    def getBldDirs(self, layer, bldDirs) :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    38
        """ get the list of build directories """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    39
        units = layer.getElementsByTagName ("unit")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    40
        for unit in units :
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    41
            dir_ = unit.getAttribute ("bldFile").rstrip ('\\/')
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    42
            i = dir_.rfind ("\\")
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    43
            if i == - 1 :
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    44
                i = dir_.rfind ("/")
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    45
            bldDirs.append (dir_[:i + 1])
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    46
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    47
    def getLayer(self, configuration, layers, bldDirs) :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    48
        """ get each layer info """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    49
        layerRef = configuration.getElementsByTagName ("layerRef")[0].getAttribute ("layerName")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    50
        for layer in layers :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    51
            if layer.getAttribute ("name") == layerRef :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    52
                self.getBldDirs (layer, bldDirs)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    53
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    54
    def createInfoFiles(self, sisInfo) :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    55
        """ create the INfo files depends.xml etc."""
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    56
        depends = xml.dom.minidom.parse ("depends.xml")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    57
        info = xml.dom.minidom.parseString (sisInfo)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    58
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    59
        infoFile = file ("sisinfo.xml", "w")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    60
        packageDeps = info.getElementsByTagName("package_dependency")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    61
        for packageDep in packageDeps :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    62
            pack = depends.createElement ("package")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    63
            depends.childNodes[1].appendChild (pack)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    64
            for child in packageDep.childNodes :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    65
                pack.appendChild (child)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    66
        infoFile.write (info.toxml ())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    67
        infoFile.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    68
        depFile = file ("depends.xml", "w")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    69
        depFile.write (depends.toxml ())
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    70
        depFile.close()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    71
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    72
    def createSis(self, packageDir, packageName, makesis) :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    73
        """ create the .sis file """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    74
        sisReader = iadinfo.IADHandler()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    75
        os.chdir (packageDir)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    76
        sisPackage = packageName + ".sis"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    77
        stubPackage = packageName + "_stub.sis"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    78
        print "Creating", sisPackage
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    79
        cmd = makesis + " package.pkg " + sisPackage
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    80
        os.system (cmd)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    81
        self.createInfoFiles (sisReader.getInfo(sisPackage))
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    82
        if os.path.exists(stubPackage) :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    83
            print "Creating stub SIS file", stubPackage
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    84
            self.hasStub = True
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    85
            cmd = makesis + " -s package.pkg " + stubPackage
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    86
            os.system (cmd)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    87
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    88
    def createPackage(self, topDir, packageName) :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    89
        """ create the Data Package """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    90
        print "Creating package", packageName
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    91
        os.chdir (topDir)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    92
        zipFile = packageName + ".zip"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    93
        sisFile = packageName + '/' + packageName + ".sis"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    94
        infoFile = packageName + "/sisinfo.xml"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    95
        depFile = packageName + "/depends.xml"
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    96
        zip_ = zipfile.ZipFile (zipFile, "w")
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    97
        zip_.write (sisFile, sisFile.encode ("utf-8"))
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    98
        zip_.write (infoFile, infoFile.encode ("utf-8"))
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
    99
        zip_.write (depFile, depFile.encode ("utf-8"))
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   100
        if self.hasStub :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   101
            stubFile = packageName + '/' + packageName + "_stub.sis"
628
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   102
            zip_.write (stubFile, stubFile.encode ("utf-8"))
7c4a911dc066 helium_11.0.0-e00f171ca185
wbernard
parents: 587
diff changeset
   103
        zip_.close()
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   104
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   105
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   106
    def processSisDir(self, sisDir, makesis) :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   107
        """ handle the directory used to create the .sis file """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   108
        for root, dirs, _ in os.walk (sisDir):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   109
            for name in dirs :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   110
                self.createSis (os.path.join (root, name), name, makesis)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   111
                self.createPackage (root, name)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   112
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   113
def main(sysdefFile, sysdefconfigs, bldDrive):
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   114
    """ main to called when imported """
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   115
    makesis = bldDrive + "\\epoc32\\tools\\makesis.exe"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   116
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   117
    sysdef = xml.dom.minidom.parse (sysdefFile)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   118
    configurations = sysdef.getElementsByTagName ("configuration")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   119
    layers = sysdef.getElementsByTagName ("layer")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   120
    bldDirs = []
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   121
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   122
    packager = IADPackager()
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   123
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   124
    for configuration in configurations :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   125
        if configuration.getAttribute ("name") == sysdefconfigs :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   126
            packager.getLayer (configuration, layers, bldDirs)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   127
     
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   128
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   129
    for bldDir in bldDirs :
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   130
        packager.processSisDir (bldDrive + bldDir + "sis\\", makesis)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   131
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   132
if __name__ == "__main__":
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   133
    main(sys.argv[1], sys.argv[2], sys.argv[3])