Reviewed-by: Liming Gao <[email protected]> > -----Original Message----- > From: Zhu, Yonghong > Sent: Saturday, November 19, 2016 5:21 PM > To: [email protected] > Cc: Gao, Liming <[email protected]> > Subject: [Patch] BaseTools: report error for same Guid's Private definition > conflict > > 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 <[email protected]> > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Yonghong Zhu <[email protected]> > --- > .../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
_______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

