From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 50F4781E6C for ; Sat, 19 Nov 2016 01:21:19 -0800 (PST) Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga103.fm.intel.com with ESMTP; 19 Nov 2016 01:21:24 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,662,1473145200"; d="scan'208";a="33118238" Received: from shwdeopenpsi168.ccr.corp.intel.com ([10.239.158.144]) by orsmga005.jf.intel.com with ESMTP; 19 Nov 2016 01:21:23 -0800 From: Yonghong Zhu To: edk2-devel@lists.01.org Cc: Liming Gao Date: Sat, 19 Nov 2016 17:21:21 +0800 Message-Id: <1479547281-18232-1-git-send-email-yonghong.zhu@intel.com> X-Mailer: git-send-email 2.6.1.windows.1 Subject: [Patch] BaseTools: report error for same Guid's Private definition conflict X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 19 Nov 2016 09:21:19 -0000 Add error check for the same Guid/Protocol/PPIs/Includes defined as both Private and non-Private attribute. Fixes: https://bugzilla.tianocore.org/show_bug.cgi?id=209 Cc: Liming Gao Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Yonghong Zhu --- .../Source/Python/Workspace/WorkspaceDatabase.py | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py index ceaa4b8..b413a98 100644 --- a/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py +++ b/BaseTools/Source/Python/Workspace/WorkspaceDatabase.py @@ -1408,17 +1408,25 @@ class DecBuildData(PackageBuildClassObject): # ProtocolDict = tdict(True) PrivateProtocolDict = tdict(True) NameList = [] PrivateNameList = [] + PublicNameList = [] # find out all protocol definitions for specific and 'common' arch RecordList = self._RawData[MODEL_EFI_PROTOCOL, self._Arch] for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList: if PrivateFlag == 'PRIVATE': if Name not in PrivateNameList: PrivateNameList.append(Name) PrivateProtocolDict[Arch, Name] = Guid + if Name in PublicNameList: + EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo) + else: + if Name not in PublicNameList: + PublicNameList.append(Name) + if Name in PrivateNameList: + EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo) if Name not in NameList: NameList.append(Name) ProtocolDict[Arch, Name] = Guid # use sdict to keep the order self._Protocols = sdict() @@ -1442,17 +1450,25 @@ class DecBuildData(PackageBuildClassObject): # PpiDict = tdict(True) PrivatePpiDict = tdict(True) NameList = [] PrivateNameList = [] + PublicNameList = [] # find out all PPI definitions for specific arch and 'common' arch RecordList = self._RawData[MODEL_EFI_PPI, self._Arch] for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList: if PrivateFlag == 'PRIVATE': if Name not in PrivateNameList: PrivateNameList.append(Name) PrivatePpiDict[Arch, Name] = Guid + if Name in PublicNameList: + EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo) + else: + if Name not in PublicNameList: + PublicNameList.append(Name) + if Name in PrivateNameList: + EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo) if Name not in NameList: NameList.append(Name) PpiDict[Arch, Name] = Guid # use sdict to keep the order self._Ppis = sdict() @@ -1476,17 +1492,25 @@ class DecBuildData(PackageBuildClassObject): # GuidDict = tdict(True) PrivateGuidDict = tdict(True) NameList = [] PrivateNameList = [] + PublicNameList = [] # find out all protocol definitions for specific and 'common' arch RecordList = self._RawData[MODEL_EFI_GUID, self._Arch] for Name, Guid, Dummy, Arch, PrivateFlag, ID, LineNo in RecordList: if PrivateFlag == 'PRIVATE': if Name not in PrivateNameList: PrivateNameList.append(Name) PrivateGuidDict[Arch, Name] = Guid + if Name in PublicNameList: + EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo) + else: + if Name not in PublicNameList: + PublicNameList.append(Name) + if Name in PrivateNameList: + EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % Name, File=self.MetaFile, Line=LineNo) if Name not in NameList: NameList.append(Name) GuidDict[Arch, Name] = Guid # use sdict to keep the order self._Guids = sdict() @@ -1504,10 +1528,11 @@ class DecBuildData(PackageBuildClassObject): ## Retrieve public include paths declared in this package def _GetInclude(self): if self._Includes == None: self._Includes = [] self._PrivateIncludes = [] + PublicInclues = [] RecordList = self._RawData[MODEL_EFI_INCLUDE, self._Arch] Macros = self._Macros Macros["EDK_SOURCE"] = GlobalData.gEcpSource for Record in RecordList: File = PathClass(NormPath(Record[0], Macros), self._PackageDir, Arch=self._Arch) @@ -1521,10 +1546,18 @@ class DecBuildData(PackageBuildClassObject): if File not in self._Includes: self._Includes.append(File) if Record[4] == 'PRIVATE': if File not in self._PrivateIncludes: self._PrivateIncludes.append(File) + if File in PublicInclues: + EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % File, File=self.MetaFile, Line=LineNo) + else: + if File not in PublicInclues: + PublicInclues.append(File) + if File in self._PrivateIncludes: + EdkLogger.error('build', OPTION_CONFLICT, "Can't determine %s's attribute, it is both defined as Private and non-Private attribute in DEC file." % File, File=self.MetaFile, Line=LineNo) + return self._Includes ## Retrieve library class declarations (not used in build at present) def _GetLibraryClass(self): if self._LibraryClasses == None: -- 2.6.1.windows.1