+ ## _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 == None:\r
+ #\r
+ # Get INF file GUID\r
+ #\r
+ InfFoundFlag = False \r
+ for Pa in self.AutoGenObjectList:\r
+ for Module in Pa.ModuleAutoGenList:\r
+ if path.normpath(Module.MetaFile.File) == path.normpath(FfsFile.InfFileName):\r
+ InfFoundFlag = True\r
+ if not Module.Guid.upper() in _GuidDict.keys():\r
+ _GuidDict[Module.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[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, 'COMMON', self.BuildTarget, self.ToolChain]\r
+ if not InfObj.Guid.upper() in _GuidDict.keys():\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 != None:\r
+ _CheckPCDAsGuidPattern = re.compile("^PCD\(.+\..+\)$")\r
+ \r
+ #\r
+ # If the NameGuid reference a PCD name. \r
+ # The style must match: PCD(xxxx.yyy)\r
+ #\r
+ if _CheckPCDAsGuidPattern.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 not _PcdGuidString.upper() in _GuidDict.keys(): \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 not FfsFile.NameGuid.upper() in _GuidDict.keys():\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