- ## _CheckDuplicateInFV() method\r
- #\r
- # Check whether there is duplicate modules/files exist in FV section.\r
- # The check base on the file GUID;\r
- #\r
- def _CheckDuplicateInFV(self, Fdf):\r
- for Fv in Fdf.Profile.FvDict:\r
- _GuidDict = {}\r
- for FfsFile in Fdf.Profile.FvDict[Fv].FfsList:\r
- if FfsFile.InfFileName and FfsFile.NameGuid is None:\r
- #\r
- # Get INF file GUID\r
- #\r
- InfFoundFlag = False\r
- for Pa in self.AutoGenObjectList:\r
- if InfFoundFlag:\r
- break\r
- for Module in Pa.ModuleAutoGenList:\r
- if path.normpath(Module.MetaFile.File) == path.normpath(FfsFile.InfFileName):\r
- InfFoundFlag = True\r
- if Module.Guid.upper() not in _GuidDict:\r
- _GuidDict[Module.Guid.upper()] = FfsFile\r
- break\r
- else:\r
- EdkLogger.error("build",\r
- FORMAT_INVALID,\r
- "Duplicate GUID found for these lines: Line %d: %s and Line %d: %s. GUID: %s" % (FfsFile.CurrentLineNum,\r
- FfsFile.CurrentLineContent,\r
- _GuidDict[Module.Guid.upper()].CurrentLineNum,\r
- _GuidDict[Module.Guid.upper()].CurrentLineContent,\r
- Module.Guid.upper()),\r
- ExtraData=self.FdfFile)\r
- #\r
- # Some INF files not have entity in DSC file.\r
- #\r
- if not InfFoundFlag:\r
- if FfsFile.InfFileName.find('$') == -1:\r
- InfPath = NormPath(FfsFile.InfFileName)\r
- if not os.path.exists(InfPath):\r
- EdkLogger.error('build', GENFDS_ERROR, "Non-existant Module %s !" % (FfsFile.InfFileName))\r
-\r
- PathClassObj = PathClass(FfsFile.InfFileName, self.WorkspaceDir)\r
- #\r
- # Here we just need to get FILE_GUID from INF file, use 'COMMON' as ARCH attribute. and use\r
- # BuildObject from one of AutoGenObjectList is enough.\r
- #\r
- InfObj = self.AutoGenObjectList[0].BuildDatabase.WorkspaceDb.BuildObject[PathClassObj, TAB_ARCH_COMMON, self.BuildTarget, self.ToolChain]\r
- if InfObj.Guid.upper() not in _GuidDict:\r
- _GuidDict[InfObj.Guid.upper()] = FfsFile\r
- else:\r
- EdkLogger.error("build",\r
- FORMAT_INVALID,\r
- "Duplicate GUID found for these lines: Line %d: %s and Line %d: %s. GUID: %s" % (FfsFile.CurrentLineNum,\r
- FfsFile.CurrentLineContent,\r
- _GuidDict[InfObj.Guid.upper()].CurrentLineNum,\r
- _GuidDict[InfObj.Guid.upper()].CurrentLineContent,\r
- InfObj.Guid.upper()),\r
- ExtraData=self.FdfFile)\r
- InfFoundFlag = False\r
-\r
- if FfsFile.NameGuid is not None:\r
- #\r
- # If the NameGuid reference a PCD name.\r
- # The style must match: PCD(xxxx.yyy)\r
- #\r
- if gPCDAsGuidPattern.match(FfsFile.NameGuid):\r
- #\r
- # Replace the PCD value.\r
- #\r
- _PcdName = FfsFile.NameGuid.lstrip("PCD(").rstrip(")")\r
- PcdFoundFlag = False\r
- for Pa in self.AutoGenObjectList:\r
- if not PcdFoundFlag:\r
- for PcdItem in Pa.AllPcdList:\r
- if (PcdItem.TokenSpaceGuidCName + "." + PcdItem.TokenCName) == _PcdName:\r
- #\r
- # First convert from CFormatGuid to GUID string\r
- #\r
- _PcdGuidString = GuidStructureStringToGuidString(PcdItem.DefaultValue)\r
-\r
- if not _PcdGuidString:\r
- #\r
- # Then try Byte array.\r
- #\r
- _PcdGuidString = GuidStructureByteArrayToGuidString(PcdItem.DefaultValue)\r
-\r
- if not _PcdGuidString:\r
- #\r
- # Not Byte array or CFormat GUID, raise error.\r
- #\r
- EdkLogger.error("build",\r
- FORMAT_INVALID,\r
- "The format of PCD value is incorrect. PCD: %s , Value: %s\n" % (_PcdName, PcdItem.DefaultValue),\r
- ExtraData=self.FdfFile)\r
-\r
- if _PcdGuidString.upper() not in _GuidDict:\r
- _GuidDict[_PcdGuidString.upper()] = FfsFile\r
- PcdFoundFlag = True\r
- break\r
- else:\r
- EdkLogger.error("build",\r
- FORMAT_INVALID,\r
- "Duplicate GUID found for these lines: Line %d: %s and Line %d: %s. GUID: %s" % (FfsFile.CurrentLineNum,\r
- FfsFile.CurrentLineContent,\r
- _GuidDict[_PcdGuidString.upper()].CurrentLineNum,\r
- _GuidDict[_PcdGuidString.upper()].CurrentLineContent,\r
- FfsFile.NameGuid.upper()),\r
- ExtraData=self.FdfFile)\r
-\r
- if FfsFile.NameGuid.upper() not in _GuidDict:\r
- _GuidDict[FfsFile.NameGuid.upper()] = FfsFile\r
- else:\r
- #\r
- # Two raw file GUID conflict.\r
- #\r
- EdkLogger.error("build",\r
- FORMAT_INVALID,\r
- "Duplicate GUID found for these lines: Line %d: %s and Line %d: %s. GUID: %s" % (FfsFile.CurrentLineNum,\r
- FfsFile.CurrentLineContent,\r
- _GuidDict[FfsFile.NameGuid.upper()].CurrentLineNum,\r
- _GuidDict[FfsFile.NameGuid.upper()].CurrentLineContent,\r
- FfsFile.NameGuid.upper()),\r
- ExtraData=self.FdfFile)\r
-\r
-\r