summaryrefslogtreecommitdiff
path: root/BaseTools/Source/Python/CommonDataClass/DistributionPackageClass.py
diff options
context:
space:
mode:
Diffstat (limited to 'BaseTools/Source/Python/CommonDataClass/DistributionPackageClass.py')
-rw-r--r--BaseTools/Source/Python/CommonDataClass/DistributionPackageClass.py159
1 files changed, 159 insertions, 0 deletions
diff --git a/BaseTools/Source/Python/CommonDataClass/DistributionPackageClass.py b/BaseTools/Source/Python/CommonDataClass/DistributionPackageClass.py
new file mode 100644
index 0000000000..cd8bd4cb7f
--- /dev/null
+++ b/BaseTools/Source/Python/CommonDataClass/DistributionPackageClass.py
@@ -0,0 +1,159 @@
+## @file
+# This file is used to define a class object to describe a distribution package
+#
+# Copyright (c) 2008, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+##
+# Import Modules
+#
+import os.path
+from CommonClass import *
+from Common.Misc import sdict
+from Common.Misc import GetFiles
+from Common.DecClassObjectLight import Dec
+from Common.InfClassObjectLight import Inf
+from Common.XmlParser import *
+
+## DistributionPackageHeaderClass
+#
+class DistributionPackageHeaderClass(IdentificationClass, CommonHeaderClass):
+ def __init__(self):
+ IdentificationClass.__init__(self)
+ CommonHeaderClass.__init__(self)
+ self.ReadOnly = 'False'
+ self.RePackage = 'True'
+ self.Vendor = ''
+ self.Date = ''
+ self.Signature = 'Md5Sum'
+ self.XmlSpecification = ''
+
+## DistributionPackageClass
+#
+#
+class DistributionPackageClass(object):
+ def __init__(self):
+ self.Header = DistributionPackageHeaderClass()
+ self.PackageSurfaceArea = sdict() # {(Guid, Version, Path) : PackageObj}
+ self.ModuleSurfaceArea = sdict() # {(Guid, Version, Path) : ModuleObj}
+ self.Tools = MiscFileClass()
+ self.MiscellaneousFiles = MiscFileClass()
+ self.UserExtensions = []
+
+ ## Get all included packages and modules for a distribution package
+ #
+ # @param WorkspaceDir: WorkspaceDir
+ # @param PackageList: A list of all packages
+ # @param ModuleList: A list of all modules
+ #
+ def GetDistributionPackage(self, WorkspaceDir, PackageList, ModuleList):
+ AllGuidVersionDict = {}
+ # Get Packages
+ if PackageList:
+ for PackageFile in PackageList:
+ PackageFileFullPath = os.path.normpath(os.path.join(WorkspaceDir, PackageFile))
+ DecObj = Dec(PackageFileFullPath, True, WorkspaceDir)
+ PackageObj = DecObj.Package
+ AllGuidVersionDict[PackageFileFullPath] = [PackageObj.PackageHeader.Guid, PackageObj.PackageHeader.Version]
+
+ # Parser inf file one bye one
+ for File in PackageObj.MiscFiles.Files:
+ Filename = os.path.normpath(os.path.join(PackageObj.PackageHeader.RelaPath, File.Filename))
+ (Name, ExtName) = os.path.splitext(Filename)
+ if ExtName.upper() == '.INF':
+ InfObj = Inf(Filename, True, WorkspaceDir, DecObj.Identification.PackagePath)
+ ModuleObj = InfObj.Module
+ AllGuidVersionDict[File] = [ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version]
+ # Find and update Guid/Version of LibraryClass
+ for Item in ModuleObj.LibraryClasses:
+ if Item.RecommendedInstance:
+ LibClassIns = os.path.normpath(os.path.join(WorkspaceDir, Item.RecommendedInstance))
+ Guid, Version = '', ''
+ if LibClassIns in AllGuidVersionDict:
+ Guid = AllGuidVersionDict[LibClassIns][0]
+ Version = AllGuidVersionDict[LibClassIns][1]
+ else:
+ Lib = Inf(LibClassIns, True, WorkspaceDir)
+ Guid = Lib.Module.ModuleHeader.Guid
+ Version = Lib.Module.ModuleHeader.Version
+ AllGuidVersionDict[LibClassIns] = [Guid, Version]
+ Item.RecommendedInstanceGuid = Guid
+ Item.RecommendedInstanceVersion = Version
+ # Find and update Guid/Version of
+ for Item in ModuleObj.PackageDependencies:
+ if Item.FilePath:
+ PackageFilePath = os.path.normpath(os.path.join(WorkspaceDir, Item.FilePath))
+ Guid, Version = '', ''
+ if PackageFilePath in AllGuidVersionDict:
+ Guid = AllGuidVersionDict[PackageFilePath][0]
+ Version = AllGuidVersionDict[PackageFilePath][1]
+ else:
+ PackageDependencies = Dec(PackageFilePath, True, WorkspaceDir)
+ Guid = PackageDependencies.Package.PackageHeader.Guid
+ Version = PackageDependencies.Package.PackageHeader.Version
+ AllGuidVersionDict[PackageFilePath] = [Guid, Version]
+ Item.PackageGuid = Guid
+ Item.PackageVersion = Version
+
+ # Add module to package
+ PackageObj.Modules[(ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version, ModuleObj.ModuleHeader.CombinePath)] = ModuleObj
+ self.PackageSurfaceArea[(PackageObj.PackageHeader.Guid, PackageObj.PackageHeader.Version, PackageObj.PackageHeader.CombinePath)] = PackageObj
+
+ # Get Modules
+ if ModuleList:
+ for ModuleFile in ModuleList:
+ ModuleFileFullPath = os.path.normpath(os.path.join(WorkspaceDir, ModuleFile))
+ InfObj = Inf(ModuleFileFullPath, True, WorkspaceDir)
+ ModuleObj = InfObj.Module
+ AllGuidVersionDict[ModuleFileFullPath] = [ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version]
+ # Find and update Guid/Version of LibraryClass
+ for Item in ModuleObj.LibraryClasses:
+ if Item.RecommendedInstance:
+ LibClassIns = os.path.normpath(os.path.join(WorkspaceDir, Item.RecommendedInstance))
+ Guid, Version = '', ''
+ if LibClassIns in AllGuidVersionDict:
+ Guid = AllGuidVersionDict[LibClassIns][0]
+ Version = AllGuidVersionDict[LibClassIns][1]
+ else:
+ Lib = Inf(LibClassIns, True, WorkspaceDir)
+ Guid = Lib.Module.ModuleHeader.Guid
+ Version = Lib.Module.ModuleHeader.Version
+ AllGuidVersionDict[LibClassIns] = [Guid, Version]
+ Item.RecommendedInstanceGuid = Guid
+ Item.RecommendedInstanceVersion = Version
+ # Find and update Guid/Version of
+ for Item in ModuleObj.PackageDependencies:
+ if Item.FilePath:
+ PackageFilePath = os.path.normpath(os.path.join(WorkspaceDir, Item.FilePath))
+ Guid, Version = '', ''
+ if PackageFilePath in AllGuidVersionDict:
+ Guid = AllGuidVersionDict[PackageFilePath][0]
+ Version = AllGuidVersionDict[PackageFilePath][1]
+ else:
+ PackageDependencies = Dec(PackageFilePath, True, WorkspaceDir)
+ Guid = PackageDependencies.Package.PackageHeader.Guid
+ Version = PackageDependencies.Package.PackageHeader.Version
+ AllGuidVersionDict[PackageFilePath] = [Guid, Version]
+ Item.PackageGuid = Guid
+ Item.PackageVersion = Version
+ self.ModuleSurfaceArea[(ModuleObj.ModuleHeader.Guid, ModuleObj.ModuleHeader.Version, ModuleObj.ModuleHeader.CombinePath)] = ModuleObj
+
+##
+#
+# This acts like the main() function for the script, unless it is 'import'ed into another
+# script.
+#
+if __name__ == '__main__':
+ pass
+ D = DistributionPackageClass()
+ D.GetDistributionPackage(os.getenv('WORKSPACE'), ['MdePkg/MdePkg.dec', 'TianoModulePkg/TianoModulePkg.dec'], ['MdeModulePkg/Application/HelloWorld/HelloWorld.inf'])
+ Xml = DistributionPackageXml()
+ print Xml.ToXml(D)
+ E = Xml.FromXml('C:\\2.xml')
+ #print Xml.ToXml(E)