summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYunhua Feng <yunhuax.feng@intel.com>2018-06-21 10:37:44 +0800
committerYonghong Zhu <yonghong.zhu@intel.com>2018-06-29 15:21:01 +0800
commitcd7bd491f3f9c43e4bb6c9516784ef3a09b6e337 (patch)
treea10c824896d4b5d4896a66152cf6999e65c1f45d
parent1e2bf55e0971187e006cfd224281b086810d6d8c (diff)
downloadedk2-cd7bd491f3f9c43e4bb6c9516784ef3a09b6e337.tar.gz
edk2-cd7bd491f3f9c43e4bb6c9516784ef3a09b6e337.tar.bz2
edk2-cd7bd491f3f9c43e4bb6c9516784ef3a09b6e337.zip
BaseTools: Fix parsing multiple nest !include issue
Fix the bug !include file in Components subsection meet syntax error. Case example: DSC components: !include Test1.txt Test1.txt: TestPkg/TestDriver.inf { <PcdsFixedAtBuild> PcdToken.PcdTest1 | "A" !include Test2.txt } Test2.txt: !include Test3.txt Test3.txt: PcdToken.PcdTest2 | "B" Cc: Liming Gao <liming.gao@intel.com> Cc: Yonghong Zhu <yonghong.zhu@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com> Reviewed-by: Jaben Carsey <jaben.carsey@intel.com>
-rw-r--r--BaseTools/Source/Python/Workspace/MetaFileParser.py28
1 files changed, 13 insertions, 15 deletions
diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py
index 8c860d594b..f089758fe6 100644
--- a/BaseTools/Source/Python/Workspace/MetaFileParser.py
+++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py
@@ -944,7 +944,14 @@ class DscParser(MetaFileParser):
self._SubsectionType = MODEL_META_DATA_SUBSECTION_HEADER
# directive line
elif Line[0] == '!':
- self._DirectiveParser()
+ TokenList = GetSplitValueList(Line, ' ', 1)
+ if TokenList[0] == TAB_INCLUDE:
+ for Arch, ModuleType, DefaultStore in self._Scope:
+ if self._SubsectionType != MODEL_UNKNOWN and Arch in OwnerId:
+ self._Owner[-1] = OwnerId[Arch]
+ self._DirectiveParser()
+ else:
+ self._DirectiveParser()
continue
if Line[0] == TAB_OPTION_START and not self._InSubsection:
EdkLogger.error("Parser", FILE_READ_FAILURE, "Missing the '{' before %s in Line %s" % (Line, Index+1), ExtraData=self.MetaFile)
@@ -965,7 +972,7 @@ class DscParser(MetaFileParser):
#
for Arch, ModuleType, DefaultStore in self._Scope:
Owner = self._Owner[-1]
- if self._SubsectionType != MODEL_UNKNOWN:
+ if self._SubsectionType != MODEL_UNKNOWN and Arch in OwnerId:
Owner = OwnerId[Arch]
self._LastItem = self._Store(
self._ItemType,
@@ -1190,6 +1197,7 @@ class DscParser(MetaFileParser):
if self._CurrentLine[-1] == '{':
self._ValueList[0] = self._CurrentLine[0:-1].strip()
self._InSubsection = True
+ self._SubsectionType = MODEL_UNKNOWN
else:
self._ValueList[0] = self._CurrentLine
@@ -1562,24 +1570,14 @@ class DscParser(MetaFileParser):
# set the parser status with current status
Parser._SectionName = self._SectionName
- if self._InSubsection:
- Parser._SectionType = self._SubsectionType
- else:
- Parser._SectionType = self._SectionType
+ Parser._SubsectionType = self._SubsectionType
+ Parser._InSubsection = self._InSubsection
+ Parser._SectionType = self._SectionType
Parser._Scope = self._Scope
Parser._Enabled = self._Enabled
# Parse the included file
Parser.Start()
- # update current status with sub-parser's status
- self._SectionName = Parser._SectionName
- if not self._InSubsection:
- self._SectionType = Parser._SectionType
- self._SubsectionType = Parser._SubsectionType
- self._InSubsection = Parser._InSubsection
-
- self._Scope = Parser._Scope
- self._Enabled = Parser._Enabled
# Insert all records in the table for the included file into dsc file table
Records = IncludedFileTable.GetAll()