]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools: introduce !error statement
authorYunhua Feng <yunhuax.feng@intel.com>
Sun, 17 Jun 2018 09:22:21 +0000 (17:22 +0800)
committerYonghong Zhu <yonghong.zhu@intel.com>
Fri, 22 Jun 2018 05:38:40 +0000 (13:38 +0800)
The DSC and FDF file can use `!error` statement. The argument of this
statement is an error message, it causes build tool to stop at the
location where the statement is encountered and error message following
the `!error` statement is output as a message.

Fixes: https://bugzilla.tianocore.org/show_bug.cgi?id=701
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: Yonghong Zhu <yonghong.zhu@intel.com>
BaseTools/Source/Python/Common/BuildToolError.py
BaseTools/Source/Python/Common/DataType.py
BaseTools/Source/Python/GenFds/FdfParser.py
BaseTools/Source/Python/Workspace/MetaFileParser.py

index 27779c5d98eaf2ba74bbdd9dd5cb62c1d0a1bba5..fc2503ea80242675db00b23bdd8b0e3b040e53fb 100644 (file)
@@ -89,6 +89,7 @@ PCD_VARIABLE_INFO_ERROR = 0xF016
 PCD_VARIABLE_ATTRIBUTES_CONFLICT_ERROR = 0xF013\r
 PCD_STRUCTURE_PCD_INVALID_FIELD_ERROR = 0xF014\r
 PCD_STRUCTURE_PCD_ERROR = 0xF015\r
+ERROR_STATEMENT = 0xFFFD\r
 ABORT_ERROR = 0xFFFE\r
 UNKNOWN_ERROR = 0xFFFF\r
 \r
@@ -151,6 +152,7 @@ gErrorMessage = {
     IO_TIMEOUT              :   "Timeout",\r
     IO_UNKNOWN_ERROR        :   "Unknown error in IO operation",\r
 \r
+    ERROR_STATEMENT         :   "!error statement",\r
     UNKNOWN_ERROR           :   "Unknown error",\r
 }\r
 \r
index a72c7e6f067fefba793927994a5fc1c586b411f7..154245ca317d266a96a5efe4aecde589a0d1973c 100644 (file)
@@ -471,7 +471,7 @@ TAB_ELSE = '!else'
 TAB_IF_DEF = '!ifdef'\r
 TAB_IF_N_DEF = '!ifndef'\r
 TAB_IF_EXIST = '!if exist'\r
-TAB_ERROR = '!ERROR'\r
+TAB_ERROR = '!error'\r
 \r
 #\r
 # Unknown section\r
index 78cb049c61871e4cdd5cb59e2329fa132e776112..ceedcf8a28b94e01e750042cdfacd685bb3b5589 100644 (file)
@@ -1361,6 +1361,7 @@ class FdfParser:
 \r
         try:\r
             self.Preprocess()\r
+            self.__GetError()\r
             #\r
             # Keep processing sections of the FDF until no new sections or a syntax error is found\r
             #\r
@@ -1441,6 +1442,17 @@ class FdfParser:
 \r
         return False\r
 \r
+    ##__GetError() method\r
+    def __GetError(self):\r
+        #save the Current information\r
+        CurrentLine = self.CurrentLineNumber\r
+        CurrentOffset = self.CurrentOffsetWithinLine\r
+        while self.__GetNextToken():\r
+            if self.__Token == TAB_ERROR:\r
+                EdkLogger.error('FdfParser', ERROR_STATEMENT, self.__CurrentLine().replace(TAB_ERROR, '', 1), File=self.FileName, Line=self.CurrentLineNumber)\r
+        self.CurrentLineNumber = CurrentLine\r
+        self.CurrentOffsetWithinLine = CurrentOffset\r
+\r
     ## __GetFd() method\r
     #\r
     #   Get FD section contents and store its data into FD dictionary of self.Profile\r
index 71da731e3283e5a44e36d9ad07ee1643b954283a..88c7bb374ccc2159fcacdaac70a45ac43f996fac 100644 (file)
@@ -838,6 +838,7 @@ class DscParser(MetaFileParser):
         TAB_ELSE.upper()                            :   MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSE,\r
         TAB_END_IF.upper()                          :   MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF,\r
         TAB_USER_EXTENSIONS.upper()                 :   MODEL_META_DATA_USER_EXTENSION,\r
+        TAB_ERROR.upper()                           :   MODEL_META_DATA_CONDITIONAL_STATEMENT_ERROR,\r
     }\r
 \r
     # Valid names in define section\r
@@ -1028,6 +1029,8 @@ class DscParser(MetaFileParser):
         Scope = [[TAB_COMMON, TAB_COMMON, TAB_COMMON]]\r
         if ItemType == MODEL_META_DATA_INCLUDE:\r
             Scope = self._Scope\r
+        elif ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ERROR:\r
+            Scope = self._Scope\r
         if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF:\r
             # Remove all directives between !if and !endif, including themselves\r
             while self._DirectiveStack:\r
@@ -1041,7 +1044,7 @@ class DscParser(MetaFileParser):
                 EdkLogger.error("Parser", FORMAT_INVALID, "Redundant '!endif'",\r
                                 File=self.MetaFile, Line=self._LineIndex + 1,\r
                                 ExtraData=self._CurrentLine)\r
-        elif ItemType != MODEL_META_DATA_INCLUDE:\r
+        elif ItemType not in {MODEL_META_DATA_INCLUDE, MODEL_META_DATA_CONDITIONAL_STATEMENT_ERROR}:\r
             # Break if there's a !else is followed by a !elseif\r
             if ItemType == MODEL_META_DATA_CONDITIONAL_STATEMENT_ELSEIF and \\r
                self._DirectiveStack and \\r
@@ -1287,6 +1290,7 @@ class DscParser(MetaFileParser):
             MODEL_META_DATA_BUILD_OPTION                    :   self.__ProcessBuildOption,\r
             MODEL_UNKNOWN                                   :   self._Skip,\r
             MODEL_META_DATA_USER_EXTENSION                  :   self._SkipUserExtension,\r
+            MODEL_META_DATA_CONDITIONAL_STATEMENT_ERROR     :   self._ProcessError,\r
         }\r
 \r
         self._Table = MetaFileStorage(self._RawTable.Cur, self.MetaFile, MODEL_FILE_DSC, True)\r
@@ -1390,6 +1394,10 @@ class DscParser(MetaFileParser):
         GlobalData.gPlatformDefines.update(self._FileLocalMacros)\r
         self._PostProcessed = True\r
         self._Content = None\r
+    def _ProcessError(self):\r
+        if not self._Enabled:\r
+            return\r
+        EdkLogger.error('Parser', ERROR_STATEMENT, self._ValueList[1], File=self.MetaFile, Line=self._LineIndex + 1)\r
 \r
     def __ProcessSectionHeader(self):\r
         self._SectionName = self._ValueList[0]\r