From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.120; helo=mga04.intel.com; envelope-from=yonghong.zhu@intel.com; receiver=edk2-devel@lists.01.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 9772F2097E27B for ; Sun, 24 Jun 2018 17:48:34 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 Jun 2018 17:48:34 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,268,1526367600"; d="scan'208";a="235252116" Received: from shwdeopenpsi168.ccr.corp.intel.com ([10.239.158.129]) by orsmga005.jf.intel.com with ESMTP; 24 Jun 2018 17:48:33 -0700 From: Yonghong Zhu To: edk2-devel@lists.01.org Cc: Yunhua Feng , Liming Gao Date: Mon, 25 Jun 2018 08:48:17 +0800 Message-Id: <1529887697-24584-1-git-send-email-yonghong.zhu@intel.com> X-Mailer: git-send-email 2.6.1.windows.1 Subject: [Patch] BaseTools: Fix two drivers include the same file issue X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 25 Jun 2018 00:48:34 -0000 From: Yunhua Feng Two drivers include the same PCD file, the PCD value in the first driver is correct, but it in the second driver is incorrect. DSC: [Components] Testpkg/Testdriver1.inf { !include Test.txt } Testpkg/Testdriver2.inf { !include Test.txt } Cc: Liming Gao Cc: Yonghong Zhu Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Yunhua Feng --- BaseTools/Source/Python/Workspace/MetaDataTable.py | 27 +++++++++++++++++----- .../Source/Python/Workspace/MetaFileParser.py | 4 ++-- BaseTools/Source/Python/Workspace/MetaFileTable.py | 14 ++++++----- 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/BaseTools/Source/Python/Workspace/MetaDataTable.py b/BaseTools/Source/Python/Workspace/MetaDataTable.py index e37a10c..bd751ea 100644 --- a/BaseTools/Source/Python/Workspace/MetaDataTable.py +++ b/BaseTools/Source/Python/Workspace/MetaDataTable.py @@ -166,11 +166,12 @@ class TableFile(Table): Name VARCHAR NOT NULL, ExtName VARCHAR, Path VARCHAR, FullPath VARCHAR NOT NULL, Model INTEGER DEFAULT 0, - TimeStamp SINGLE NOT NULL + TimeStamp SINGLE NOT NULL, + FromItem REAL NOT NULL ''' def __init__(self, Cursor): Table.__init__(self, Cursor, 'File') ## Insert table @@ -182,20 +183,21 @@ class TableFile(Table): # @param Path: Path of a File # @param FullPath: FullPath of a File # @param Model: Model of a File # @param TimeStamp: TimeStamp of a File # - def Insert(self, Name, ExtName, Path, FullPath, Model, TimeStamp): + def Insert(self, Name, ExtName, Path, FullPath, Model, TimeStamp, FromItem=0): (Name, ExtName, Path, FullPath) = ConvertToSqlString((Name, ExtName, Path, FullPath)) return Table.Insert( self, Name, ExtName, Path, FullPath, Model, - TimeStamp + TimeStamp, + FromItem ) ## InsertFile # # Insert one file to table @@ -203,11 +205,21 @@ class TableFile(Table): # @param FileFullPath: The full path of the file # @param Model: The model of the file # # @retval FileID: The ID after record is inserted # - def InsertFile(self, File, Model): + def InsertFile(self, File, Model, FromItem=''): + if FromItem: + return self.Insert( + File.Name, + File.Ext, + File.Dir, + File.Path, + Model, + File.TimeStamp, + FromItem + ) return self.Insert( File.Name, File.Ext, File.Dir, File.Path, @@ -219,12 +231,15 @@ class TableFile(Table): # # @param FilePath Path of file # # @retval ID ID value of given file in the table # - def GetFileId(self, File): - QueryScript = "select ID from %s where FullPath = '%s'" % (self.Table, str(File)) + def GetFileId(self, File, FromItem=None): + if FromItem: + QueryScript = "select ID from %s where FullPath = '%s' and FromItem = %s" % (self.Table, str(File), str(FromItem)) + else: + QueryScript = "select ID from %s where FullPath = '%s'" % (self.Table, str(File)) RecordList = self.Exec(QueryScript) if len(RecordList) == 0: return None return RecordList[0][0] diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py index f03b264..f3eb0c1 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -883,11 +883,11 @@ class DscParser(MetaFileParser): # @param Owner Owner ID (for sub-section parsing) # @param From ID from which the data comes (for !INCLUDE directive) # def __init__(self, FilePath, FileType, Arch, Table, Owner= -1, From= -1): # prevent re-initialization - if hasattr(self, "_Table"): + if hasattr(self, "_Table") and self._Table is Table: return MetaFileParser.__init__(self, FilePath, FileType, Arch, Table, Owner, From) self._Version = 0x00010005 # Only EDK2 dsc file is supported # to store conditional directive evaluation result self._DirectiveStack = [] @@ -1550,16 +1550,16 @@ class DscParser(MetaFileParser): EdkLogger.error('parser', ErrorCode, File=self._FileWithError, Line=self._LineIndex + 1, ExtraData=ErrorInfo1 + "\n" + ErrorInfo2) self._FileWithError = IncludedFile1 - IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile1, MODEL_FILE_DSC, False) FromItem = self._Content[self._ContentIndex - 1][0] if self._InSubsection: Owner = self._Content[self._ContentIndex - 1][8] else: Owner = self._Content[self._ContentIndex - 1][0] + IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile1, MODEL_FILE_DSC, False, FromItem=FromItem) Parser = DscParser(IncludedFile1, self._FileType, self._Arch, IncludedFileTable, Owner=Owner, From=FromItem) self.IncludedFiles.add (IncludedFile1) diff --git a/BaseTools/Source/Python/Workspace/MetaFileTable.py b/BaseTools/Source/Python/Workspace/MetaFileTable.py index 3c8dae0..93a2b97 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileTable.py +++ b/BaseTools/Source/Python/Workspace/MetaFileTable.py @@ -29,19 +29,19 @@ class MetaFileTable(Table): # TRICK: use file ID as the part before '.' _ID_STEP_ = 0.00000001 _ID_MAX_ = 0.99999999 ## Constructor - def __init__(self, Cursor, MetaFile, FileType, Temporary): + def __init__(self, Cursor, MetaFile, FileType, Temporary, FromItem=None): self.MetaFile = MetaFile self._FileIndexTable = TableFile(Cursor) self._FileIndexTable.Create(False) - FileId = self._FileIndexTable.GetFileId(MetaFile) + FileId = self._FileIndexTable.GetFileId(MetaFile, FromItem) if not FileId: - FileId = self._FileIndexTable.InsertFile(MetaFile, FileType) + FileId = self._FileIndexTable.InsertFile(MetaFile, FileType, FromItem) if Temporary: TableName = "_%s_%s_%s" % (FileType, FileId, uuid.uuid4().hex) else: TableName = "_%s_%s" % (FileType, FileId) @@ -283,12 +283,12 @@ class PlatformTable(MetaFileTable): ''' # used as table end flag, in case the changes to database is not committed to db file _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====','====', -1, -1, -1, -1, -1, -1, -1" ## Constructor - def __init__(self, Cursor, MetaFile, Temporary): - MetaFileTable.__init__(self, Cursor, MetaFile, MODEL_FILE_DSC, Temporary) + def __init__(self, Cursor, MetaFile, Temporary, FromItem=0): + MetaFileTable.__init__(self, Cursor, MetaFile, MODEL_FILE_DSC, Temporary, FromItem) ## Insert table # # Insert a record into table Dsc # @@ -377,11 +377,11 @@ class MetaFileStorage(object): ".dec" : MODEL_FILE_DEC, ".dsc" : MODEL_FILE_DSC, } ## Constructor - def __new__(Class, Cursor, MetaFile, FileType=None, Temporary=False): + def __new__(Class, Cursor, MetaFile, FileType=None, Temporary=False, FromItem=None): # no type given, try to find one if not FileType: if MetaFile.Type in self._FILE_TYPE_: FileType = Class._FILE_TYPE_[MetaFile.Type] else: @@ -390,9 +390,11 @@ class MetaFileStorage(object): # don't pass the type around if it's well known if FileType == MODEL_FILE_OTHERS: Args = (Cursor, MetaFile, FileType, Temporary) else: Args = (Cursor, MetaFile, Temporary) + if FromItem: + Args = Args + (FromItem,) # create the storage object and return it to caller return Class._FILE_TABLE_[FileType](*Args) -- 2.6.1.windows.1