]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Common/Expression.py
Sync BaseTools Trunk (version r2518) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / Python / Common / Expression.py
index 8b112d50b39b0627b6e09b271902de2c0ed5a007..a4853b78a4f5f62dc3be6863610b5ed575ad9985 100644 (file)
@@ -36,6 +36,7 @@ ERR_STRING_CMP          = 'Unicode string and general string cannot be compared:
 ERR_ARRAY_TOKEN         = 'Bad C array or C format GUID token: [%s].'\r
 ERR_ARRAY_ELE           = 'This must be HEX value for NList or Array: [%s].'\r
 ERR_EMPTY_EXPR          = 'Empty expression is not allowed.'\r
+ERR_IN_OPERAND          = 'Macro after IN operator can only be: $(FAMILY), $(ARCH), $(TOOL_CHAIN_TAG) and $(TARGET).'\r
 \r
 ## SplitString\r
 #  Split string to list according double quote\r
@@ -88,22 +89,29 @@ def ReplaceExprMacro(String, Macros, ExceptionList = None):
                 # If an undefined macro name appears in the constant-expression of\r
                 # !if or !elif, it is replaced by the integer constant 0.\r
                 RetStr += '0'\r
-            elif not InQuote and ExceptionList and Macro in ExceptionList:\r
+            elif not InQuote:\r
+                Tklst = RetStr.split()\r
+                if Tklst and Tklst[-1] in ['IN', 'in'] and ExceptionList and Macro not in ExceptionList:\r
+                    raise BadExpression(ERR_IN_OPERAND)\r
                 # Make sure the macro in exception list is encapsulated by double quote\r
                 # For example: DEFINE ARCH = IA32 X64\r
                 # $(ARCH) is replaced with "IA32 X64"\r
-                RetStr += '"' + Macros[Macro] + '"'\r
-            else:\r
-                if Macros[Macro].strip() != "":\r
+                if ExceptionList and Macro in ExceptionList:\r
+                    RetStr += '"' + Macros[Macro] + '"'\r
+                elif Macros[Macro].strip():\r
                     RetStr += Macros[Macro]\r
                 else:\r
                     RetStr += '""'\r
+            else:\r
+                RetStr += Macros[Macro]\r
             RetStr += String[MacroEndPos+1:]\r
             String = RetStr\r
             MacroStartPos = String.find('$(')\r
         StrList[i] = RetStr\r
     return ''.join(StrList)\r
 \r
+SupportedInMacroList = ['TARGET', 'TOOL_CHAIN_TAG', 'ARCH', 'FAMILY']\r
+\r
 class ValueExpression(object):\r
     # Logical operator mapping\r
     LogicalOperators = {\r
@@ -213,7 +221,7 @@ class ValueExpression(object):
 \r
         self._Expr = ReplaceExprMacro(Expression.strip(),\r
                                   SymbolTable,\r
-                                  ['TARGET', 'TOOL_CHAIN_TAG', 'ARCH'])\r
+                                  SupportedInMacroList)\r
 \r
         if not self._Expr.strip():\r
             raise BadExpression(ERR_EMPTY_EXPR)\r
@@ -457,7 +465,9 @@ class ValueExpression(object):
         # PCD token\r
         if self.PcdPattern.match(self._Token):\r
             if self._Token not in self._Symb:\r
-                raise BadExpression(ERR_PCD_RESOLVE % self._Token)\r
+                Ex = BadExpression(ERR_PCD_RESOLVE % self._Token)\r
+                Ex.Pcd = self._Token\r
+                raise Ex\r
             self._Token = ValueExpression(self._Symb[self._Token], self._Symb)(True)\r
             if type(self._Token) != type(''):\r
                 self._LiteralToken = hex(self._Token)\r