mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-01 12:53:27 +01:00
268 lines
11 KiB
Python
268 lines
11 KiB
Python
|
## @file
|
||
|
# This file is used to define a class object to describe a distribution package
|
||
|
#
|
||
|
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||
|
#
|
||
|
# SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
'''
|
||
|
DistributionPackageClass
|
||
|
'''
|
||
|
|
||
|
##
|
||
|
# Import Modules
|
||
|
#
|
||
|
import os.path
|
||
|
|
||
|
from Library.Misc import Sdict
|
||
|
from Library.Misc import GetNonMetaDataFiles
|
||
|
from PomAdapter.InfPomAlignment import InfPomAlignment
|
||
|
from PomAdapter.DecPomAlignment import DecPomAlignment
|
||
|
import Logger.Log as Logger
|
||
|
from Logger import StringTable as ST
|
||
|
from Logger.ToolError import OPTION_VALUE_INVALID
|
||
|
from Logger.ToolError import FatalError
|
||
|
from Logger.ToolError import EDK1_INF_ERROR
|
||
|
from Object.POM.CommonObject import IdentificationObject
|
||
|
from Object.POM.CommonObject import CommonHeaderObject
|
||
|
from Object.POM.CommonObject import MiscFileObject
|
||
|
from Common.MultipleWorkspace import MultipleWorkspace as mws
|
||
|
|
||
|
## DistributionPackageHeaderClass
|
||
|
#
|
||
|
# @param IdentificationObject: Identification Object
|
||
|
# @param CommonHeaderObject: Common Header Object
|
||
|
#
|
||
|
class DistributionPackageHeaderObject(IdentificationObject, \
|
||
|
CommonHeaderObject):
|
||
|
def __init__(self):
|
||
|
IdentificationObject.__init__(self)
|
||
|
CommonHeaderObject.__init__(self)
|
||
|
self.ReadOnly = ''
|
||
|
self.RePackage = ''
|
||
|
self.Vendor = ''
|
||
|
self.Date = ''
|
||
|
self.Signature = 'Md5Sum'
|
||
|
self.XmlSpecification = ''
|
||
|
|
||
|
def GetReadOnly(self):
|
||
|
return self.ReadOnly
|
||
|
|
||
|
def SetReadOnly(self, ReadOnly):
|
||
|
self.ReadOnly = ReadOnly
|
||
|
|
||
|
def GetRePackage(self):
|
||
|
return self.RePackage
|
||
|
|
||
|
def SetRePackage(self, RePackage):
|
||
|
self.RePackage = RePackage
|
||
|
|
||
|
def GetVendor(self):
|
||
|
return self.Vendor
|
||
|
|
||
|
def SetDate(self, Date):
|
||
|
self.Date = Date
|
||
|
|
||
|
def GetDate(self):
|
||
|
return self.Date
|
||
|
|
||
|
def SetSignature(self, Signature):
|
||
|
self.Signature = Signature
|
||
|
|
||
|
def GetSignature(self):
|
||
|
return self.Signature
|
||
|
|
||
|
def SetXmlSpecification(self, XmlSpecification):
|
||
|
self.XmlSpecification = XmlSpecification
|
||
|
|
||
|
def GetXmlSpecification(self):
|
||
|
return self.XmlSpecification
|
||
|
|
||
|
## DistributionPackageClass
|
||
|
#
|
||
|
# @param object: DistributionPackageClass
|
||
|
#
|
||
|
class DistributionPackageClass(object):
|
||
|
def __init__(self):
|
||
|
self.Header = DistributionPackageHeaderObject()
|
||
|
#
|
||
|
# {(Guid, Version, Path) : PackageObj}
|
||
|
#
|
||
|
self.PackageSurfaceArea = Sdict()
|
||
|
#
|
||
|
# {(Guid, Version, Name, Path) : ModuleObj}
|
||
|
#
|
||
|
self.ModuleSurfaceArea = Sdict()
|
||
|
self.Tools = MiscFileObject()
|
||
|
self.MiscellaneousFiles = MiscFileObject()
|
||
|
self.UserExtensions = []
|
||
|
self.FileList = []
|
||
|
|
||
|
## 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):
|
||
|
# Backup WorkspaceDir
|
||
|
Root = WorkspaceDir
|
||
|
|
||
|
#
|
||
|
# Get Packages
|
||
|
#
|
||
|
if PackageList:
|
||
|
for PackageFile in PackageList:
|
||
|
PackageFileFullPath = mws.join(Root, PackageFile)
|
||
|
WorkspaceDir = mws.getWs(Root, PackageFile)
|
||
|
DecObj = DecPomAlignment(PackageFileFullPath, WorkspaceDir, CheckMulDec=True)
|
||
|
PackageObj = DecObj
|
||
|
#
|
||
|
# Parser inf file one bye one
|
||
|
#
|
||
|
ModuleInfFileList = PackageObj.GetModuleFileList()
|
||
|
for File in ModuleInfFileList:
|
||
|
WsRelPath = os.path.join(PackageObj.GetPackagePath(), File)
|
||
|
WsRelPath = os.path.normpath(WsRelPath)
|
||
|
if ModuleList and WsRelPath in ModuleList:
|
||
|
Logger.Error("UPT",
|
||
|
OPTION_VALUE_INVALID,
|
||
|
ST.ERR_NOT_STANDALONE_MODULE_ERROR%\
|
||
|
(WsRelPath, PackageFile))
|
||
|
Filename = os.path.normpath\
|
||
|
(os.path.join(PackageObj.GetRelaPath(), File))
|
||
|
os.path.splitext(Filename)
|
||
|
#
|
||
|
# Call INF parser to generate Inf Object.
|
||
|
# Actually, this call is not directly call, but wrapped by
|
||
|
# Inf class in InfPomAlignment.
|
||
|
#
|
||
|
try:
|
||
|
ModuleObj = InfPomAlignment(Filename, WorkspaceDir, PackageObj.GetPackagePath())
|
||
|
|
||
|
#
|
||
|
# Add module to package
|
||
|
#
|
||
|
ModuleDict = PackageObj.GetModuleDict()
|
||
|
ModuleDict[(ModuleObj.GetGuid(), \
|
||
|
ModuleObj.GetVersion(), \
|
||
|
ModuleObj.GetName(), \
|
||
|
ModuleObj.GetCombinePath())] = ModuleObj
|
||
|
PackageObj.SetModuleDict(ModuleDict)
|
||
|
except FatalError as ErrCode:
|
||
|
if ErrCode.message == EDK1_INF_ERROR:
|
||
|
Logger.Warn("UPT",
|
||
|
ST.WRN_EDK1_INF_FOUND%Filename)
|
||
|
else:
|
||
|
raise
|
||
|
|
||
|
self.PackageSurfaceArea\
|
||
|
[(PackageObj.GetGuid(), PackageObj.GetVersion(), \
|
||
|
PackageObj.GetCombinePath())] = PackageObj
|
||
|
|
||
|
#
|
||
|
# Get Modules
|
||
|
#
|
||
|
if ModuleList:
|
||
|
for ModuleFile in ModuleList:
|
||
|
ModuleFileFullPath = mws.join(Root, ModuleFile)
|
||
|
WorkspaceDir = mws.getWs(Root, ModuleFile)
|
||
|
|
||
|
try:
|
||
|
ModuleObj = InfPomAlignment(ModuleFileFullPath, WorkspaceDir)
|
||
|
ModuleKey = (ModuleObj.GetGuid(),
|
||
|
ModuleObj.GetVersion(),
|
||
|
ModuleObj.GetName(),
|
||
|
ModuleObj.GetCombinePath())
|
||
|
self.ModuleSurfaceArea[ModuleKey] = ModuleObj
|
||
|
except FatalError as ErrCode:
|
||
|
if ErrCode.message == EDK1_INF_ERROR:
|
||
|
Logger.Error("UPT",
|
||
|
EDK1_INF_ERROR,
|
||
|
ST.WRN_EDK1_INF_FOUND%ModuleFileFullPath,
|
||
|
ExtraData=ST.ERR_NOT_SUPPORTED_SA_MODULE)
|
||
|
else:
|
||
|
raise
|
||
|
|
||
|
# Recover WorkspaceDir
|
||
|
WorkspaceDir = Root
|
||
|
|
||
|
## Get all files included for a distribution package, except tool/misc of
|
||
|
# distribution level
|
||
|
#
|
||
|
# @retval DistFileList A list of filepath for NonMetaDataFile, relative to workspace
|
||
|
# @retval MetaDataFileList A list of filepath for MetaDataFile, relative to workspace
|
||
|
#
|
||
|
def GetDistributionFileList(self):
|
||
|
MetaDataFileList = []
|
||
|
SkipModulesUniList = []
|
||
|
|
||
|
for Guid, Version, Path in self.PackageSurfaceArea:
|
||
|
Package = self.PackageSurfaceArea[Guid, Version, Path]
|
||
|
PackagePath = Package.GetPackagePath()
|
||
|
FullPath = Package.GetFullPath()
|
||
|
MetaDataFileList.append(Path)
|
||
|
IncludePathList = Package.GetIncludePathList()
|
||
|
for IncludePath in IncludePathList:
|
||
|
SearchPath = os.path.normpath(os.path.join(os.path.dirname(FullPath), IncludePath))
|
||
|
AddPath = os.path.normpath(os.path.join(PackagePath, IncludePath))
|
||
|
self.FileList += GetNonMetaDataFiles(SearchPath, ['CVS', '.svn'], False, AddPath)
|
||
|
#
|
||
|
# Add the miscellaneous files on DEC file
|
||
|
#
|
||
|
for MiscFileObj in Package.GetMiscFileList():
|
||
|
for FileObj in MiscFileObj.GetFileList():
|
||
|
MiscFileFullPath = os.path.normpath(os.path.join(PackagePath, FileObj.GetURI()))
|
||
|
if MiscFileFullPath not in self.FileList:
|
||
|
self.FileList.append(MiscFileFullPath)
|
||
|
|
||
|
Module = None
|
||
|
ModuleDict = Package.GetModuleDict()
|
||
|
for Guid, Version, Name, Path in ModuleDict:
|
||
|
Module = ModuleDict[Guid, Version, Name, Path]
|
||
|
ModulePath = Module.GetModulePath()
|
||
|
FullPath = Module.GetFullPath()
|
||
|
PkgRelPath = os.path.normpath(os.path.join(PackagePath, ModulePath))
|
||
|
MetaDataFileList.append(Path)
|
||
|
SkipList = ['CVS', '.svn']
|
||
|
NonMetaDataFileList = []
|
||
|
if Module.UniFileClassObject:
|
||
|
for UniFile in Module.UniFileClassObject.IncFileList:
|
||
|
OriPath = os.path.normpath(os.path.dirname(FullPath))
|
||
|
UniFilePath = os.path.normpath(os.path.join(PkgRelPath, UniFile.Path[len(OriPath) + 1:]))
|
||
|
if UniFilePath not in SkipModulesUniList:
|
||
|
SkipModulesUniList.append(UniFilePath)
|
||
|
for IncludeFile in Module.UniFileClassObject.IncludePathList:
|
||
|
if IncludeFile not in SkipModulesUniList:
|
||
|
SkipModulesUniList.append(IncludeFile)
|
||
|
NonMetaDataFileList = GetNonMetaDataFiles(os.path.dirname(FullPath), SkipList, False, PkgRelPath)
|
||
|
for NonMetaDataFile in NonMetaDataFileList:
|
||
|
if NonMetaDataFile not in self.FileList:
|
||
|
self.FileList.append(NonMetaDataFile)
|
||
|
for Guid, Version, Name, Path in self.ModuleSurfaceArea:
|
||
|
Module = self.ModuleSurfaceArea[Guid, Version, Name, Path]
|
||
|
ModulePath = Module.GetModulePath()
|
||
|
FullPath = Module.GetFullPath()
|
||
|
MetaDataFileList.append(Path)
|
||
|
SkipList = ['CVS', '.svn']
|
||
|
NonMetaDataFileList = []
|
||
|
if Module.UniFileClassObject:
|
||
|
for UniFile in Module.UniFileClassObject.IncFileList:
|
||
|
OriPath = os.path.normpath(os.path.dirname(FullPath))
|
||
|
UniFilePath = os.path.normpath(os.path.join(ModulePath, UniFile.Path[len(OriPath) + 1:]))
|
||
|
if UniFilePath not in SkipModulesUniList:
|
||
|
SkipModulesUniList.append(UniFilePath)
|
||
|
NonMetaDataFileList = GetNonMetaDataFiles(os.path.dirname(FullPath), SkipList, False, ModulePath)
|
||
|
for NonMetaDataFile in NonMetaDataFileList:
|
||
|
if NonMetaDataFile not in self.FileList:
|
||
|
self.FileList.append(NonMetaDataFile)
|
||
|
|
||
|
for SkipModuleUni in SkipModulesUniList:
|
||
|
if SkipModuleUni in self.FileList:
|
||
|
self.FileList.remove(SkipModuleUni)
|
||
|
|
||
|
return self.FileList, MetaDataFileList
|
||
|
|
||
|
|
||
|
|