Update Guid.xref to contain information from FILE statements in FDF
file.

Fixes: https://bugzilla.tianocore.org/show_bug.cgi?id=778
Cc: Liming Gao <liming....@intel.com>
Cc: Dmitry Antipov <dma...@microsoft.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yonghong Zhu <yonghong....@intel.com>
---
 BaseTools/Source/Python/GenFds/GenFds.py | 88 +++++++++++++++++++++++++++++++-
 1 file changed, 86 insertions(+), 2 deletions(-)

diff --git a/BaseTools/Source/Python/GenFds/GenFds.py 
b/BaseTools/Source/Python/GenFds/GenFds.py
index 277da35..c19dc40 100644
--- a/BaseTools/Source/Python/GenFds/GenFds.py
+++ b/BaseTools/Source/Python/GenFds/GenFds.py
@@ -40,10 +40,13 @@ from Common.Misc import ClearDuplicatedInf
 from Common.Misc import GuidStructureStringToGuidString
 from Common.Misc import CheckPcdDatum
 from Common.Misc import BuildOptionPcdValueFormat
 from Common.BuildVersion import gBUILD_VERSION
 from Common.MultipleWorkspace import MultipleWorkspace as mws
+import FfsFileStatement
+import glob
+from struct import unpack
 
 ## Version and Copyright
 versionNumber = "1.0" + ' ' + gBUILD_VERSION
 __version__ = "%prog Version " + versionNumber
 __copyright__ = "Copyright (c) 2007 - 2017, Intel Corporation  All rights 
reserved."
@@ -325,11 +328,11 @@ def main():
 
         """Call GenFds"""
         GenFds.GenFd('', FdfParserObj, BuildWorkSpace, ArchList)
 
         """Generate GUID cross reference file"""
-        GenFds.GenerateGuidXRefFile(BuildWorkSpace, ArchList)
+        GenFds.GenerateGuidXRefFile(BuildWorkSpace, ArchList, FdfParserObj)
 
         """Display FV space info."""
         GenFds.DisplayFvSpaceInfo(FdfParserObj)
 
     except FdfParser.Warning, X:
@@ -722,25 +725,106 @@ class GenFds :
         ModuleDict = BuildDb.BuildObject[DscFile, 'COMMON', 
GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag].Modules
         for Key in ModuleDict:
             ModuleObj = BuildDb.BuildObject[Key, 'COMMON', 
GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
             print ModuleObj.BaseName + ' ' + ModuleObj.ModuleType
 
-    def GenerateGuidXRefFile(BuildDb, ArchList):
+    def GenerateGuidXRefFile(BuildDb, ArchList, FdfParserObj):
         GuidXRefFileName = os.path.join(GenFdsGlobalVariable.FvDir, 
"Guid.xref")
         GuidXRefFile = StringIO.StringIO('')
         GuidDict = {}
+        ModuleList = []
+        FileGuidList = []
         for Arch in ArchList:
             PlatformDataBase = 
BuildDb.BuildObject[GenFdsGlobalVariable.ActivePlatform, Arch, 
GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
             for ModuleFile in PlatformDataBase.Modules:
                 Module = BuildDb.BuildObject[ModuleFile, Arch, 
GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
+                if Module in ModuleList:
+                    continue
+                else:
+                    ModuleList.append(Module)
                 GuidXRefFile.write("%s %s\n" % (Module.Guid, Module.BaseName))
                 for key, item in Module.Protocols.items():
                     GuidDict[key] = item
                 for key, item in Module.Guids.items():
                     GuidDict[key] = item
                 for key, item in Module.Ppis.items():
                     GuidDict[key] = item
+            for FvName in FdfParserObj.Profile.FvDict:
+                for FfsObj in FdfParserObj.Profile.FvDict[FvName].FfsList:
+                    if not isinstance(FfsObj, FfsFileStatement.FileStatement):
+                        InfPath = 
PathClass(NormPath(mws.join(GenFdsGlobalVariable.WorkSpaceDir, 
FfsObj.InfFileName)))
+                        FdfModule = BuildDb.BuildObject[InfPath, Arch, 
GenFdsGlobalVariable.TargetName, GenFdsGlobalVariable.ToolChainTag]
+                        if FdfModule in ModuleList:
+                            continue
+                        else:
+                            ModuleList.append(FdfModule)
+                        GuidXRefFile.write("%s %s\n" % (FdfModule.Guid, 
FdfModule.BaseName))
+                        for key, item in FdfModule.Protocols.items():
+                            GuidDict[key] = item
+                        for key, item in FdfModule.Guids.items():
+                            GuidDict[key] = item
+                        for key, item in FdfModule.Ppis.items():
+                            GuidDict[key] = item
+                    else:
+                        FileStatementGuid = FfsObj.NameGuid
+                        if FileStatementGuid in FileGuidList:
+                            continue
+                        else:
+                            FileGuidList.append(FileStatementGuid)
+                        Name = []
+                        FfsPath = os.path.join(GenFdsGlobalVariable.FvDir, 
'Ffs')
+                        FfsPath = glob.glob(os.path.join(FfsPath, 
FileStatementGuid) + '*')
+                        if not FfsPath:
+                            continue
+                        if not os.path.exists(FfsPath[0]):
+                            continue
+                        MatchDict = {}
+                        ReFileEnds = 
re.compile('\S+(.ui)$|\S+(fv.sec.txt)$|\S+(.pe32.txt)$|\S+(.te.txt)$|\S+(.pic.txt)$|\S+(.raw.txt)$|\S+(.ffs.txt)$')
+                        FileList = os.listdir(FfsPath[0])
+                        for File in FileList:
+                            Match = ReFileEnds.search(File)
+                            if Match:
+                                for Index in range(1, 8):
+                                    if Match.group(Index) and 
Match.group(Index) in MatchDict:
+                                        
MatchDict[Match.group(Index)].append(File)
+                                    elif Match.group(Index):
+                                        MatchDict[Match.group(Index)] = [File]
+                        if not MatchDict:
+                            continue
+                        if '.ui' in MatchDict:
+                            for File in MatchDict['.ui']:
+                                with open(os.path.join(FfsPath[0], File), 
'rb') as F:
+                                    F.read()
+                                    length = F.tell()
+                                    F.seek(4)
+                                    TmpStr = unpack('%dh' % ((length - 4) / 
2), F.read())
+                                    Name = ''.join([chr(c) for c in 
TmpStr[:-1]])
+                        else:
+                            FileList = []
+                            if 'fv.sec.txt' in MatchDict:
+                                FileList = MatchDict['fv.sec.txt']
+                            elif '.pe32.txt' in MatchDict:
+                                FileList = MatchDict['.pe32.txt']
+                            elif '.te.txt' in MatchDict:
+                                FileList = MatchDict['.te.txt']
+                            elif '.pic.txt' in MatchDict:
+                                FileList = MatchDict['.pic.txt']
+                            elif '.raw.txt' in MatchDict:
+                                FileList = MatchDict['.raw.txt']
+                            elif '.ffs.txt' in MatchDict:
+                                FileList = MatchDict['.ffs.txt']
+                            else:
+                                pass
+                            for File in FileList:
+                                with open(os.path.join(FfsPath[0], File), 'r') 
as F:
+                                    Name.append((F.read().split()[-1]))
+                        if not Name:
+                            continue
+
+                        Name = ' '.join(Name) if type(Name) == type([]) else 
Name
+                        GuidXRefFile.write("%s %s\n" %(FileStatementGuid, 
Name))
+
        # Append GUIDs, Protocols, and PPIs to the Xref file
         GuidXRefFile.write("\n")
         for key, item in GuidDict.items():
             GuidXRefFile.write("%s %s\n" % 
(GuidStructureStringToGuidString(item).upper(), key))
 
-- 
2.6.1.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to