## @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__': 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)