Update UPT to refer MultipleWorkspace class to convert the file path from WORKSPACE and PACKAGES_PATH. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Hesheng Chen <hesheng.chen@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18580 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			274 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
## @file
 | 
						|
# This file is used to define a class object to describe a distribution package
 | 
						|
#
 | 
						|
# Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
 | 
						|
#
 | 
						|
# 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.
 | 
						|
 | 
						|
'''
 | 
						|
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, 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, 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
 | 
						|
 | 
						|
        
 | 
						|
 |