mirror of https://github.com/acidanthera/audk.git
160 lines
8.5 KiB
Python
160 lines
8.5 KiB
Python
|
## @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)
|