Update Conditional statement(!if..) in DSC/FDF statement to require the mandatory...
authorqhuang8 <qhuang8@c2973edb-eda0-4c78-bc6a-9341b269661f>
Thu, 4 Mar 2010 02:45:19 +0000 (02:45 +0000)
committerqhuang8 <qhuang8@c2973edb-eda0-4c78-bc6a-9341b269661f>
Thu, 4 Mar 2010 02:45:19 +0000 (02:45 +0000)
This is a non-backward compatible change that might require the manual update of current DSC/FDF file. (The error message printed out by the tool will help user to solve the incompatible issue)

git-svn-id: https://edk2-buildtools.svn.sourceforge.net/svnroot/edk2-buildtools/trunk/BaseTools@1910 c2973edb-eda0-4c78-bc6a-9341b269661f

Source/Python/Common/FdfParserLite.py
Source/Python/GenFds/FdfParser.py
Source/Python/Workspace/MetaFileParser.py

index e9b69ff..eb7b0d7 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # parse FDF file\r
 #\r
-#  Copyright (c) 2007, Intel Corporation\r
+#  Copyright (c) 2007 - 2010, Intel Corporation\r
 #\r
 #  All rights reserved. This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
@@ -383,7 +383,22 @@ class FdfParser(object):
         while Offset <= EndPos[1]:\r
             self.Profile.FileLinesList[EndPos[0]][Offset] = Value\r
             Offset += 1\r
-            \r
+\r
+\r
+    def __GetMacroName(self):\r
+        if not self.__GetNextToken():\r
+            raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
+        MacroName = self.__Token\r
+        NotFlag = False\r
+        if MacroName.startswith('!'):\r
+            NotFlag = True\r
+            MacroName = MacroName[1:].strip()\r
+         \r
+        if not MacroName.startswith('$(') or not MacroName.endswith(')'):\r
+            raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},\r
+                          self.FileName, self.CurrentLineNumber)\r
+        MacroName = MacroName[2:-1]\r
+        return MacroName, NotFlag\r
     \r
     ## PreprocessFile() method\r
     #\r
@@ -554,14 +569,7 @@ class FdfParser(object):
                 IfList.append([IfStartPos, None, None])\r
                 CondLabel = self.__Token\r
                 \r
-                if not self.__GetNextToken():\r
-                    raise Warning("expected Macro name At Line ", self.FileName, self.CurrentLineNumber)\r
-                MacroName = self.__Token\r
-                NotFlag = False\r
-                if MacroName.startswith('!'):\r
-                    NotFlag = True\r
-                    MacroName = MacroName[1:]\r
-\r
+                MacroName, NotFlag = self.__GetMacroName() \r
                 NotDefineFlag = False\r
                 if CondLabel == '!ifndef':\r
                     NotDefineFlag = True\r
@@ -615,14 +623,7 @@ class FdfParser(object):
                     self.__WipeOffArea.append((IfList[-1][0], ElseStartPos))\r
                     IfList[-1] = [ElseStartPos, True, IfList[-1][2]]\r
                     if self.__Token == '!elseif':\r
-                        if not self.__GetNextToken():\r
-                            raise Warning("expected Macro name At Line ", self.FileName, self.CurrentLineNumber)\r
-                        MacroName = self.__Token\r
-                        NotFlag = False\r
-                        if MacroName.startswith('!'):\r
-                            NotFlag = True\r
-                            MacroName = MacroName[1:]\r
-\r
+                        MacroName, NotFlag = self.__GetMacroName() \r
                         if not self.__GetNextOp():\r
                             raise Warning("expected !endif At Line ", self.FileName, self.CurrentLineNumber)\r
                     \r
index 4ce2761..92d6ab6 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # parse FDF file\r
 #\r
-#  Copyright (c) 2007, Intel Corporation\r
+#  Copyright (c) 2007 - 2010, Intel Corporation\r
 #\r
 #  All rights reserved. This program and the accompanying materials\r
 #  are licensed and made available under the terms and conditions of the BSD License\r
@@ -415,6 +415,21 @@ class FdfParser:
             Offset += 1\r
 \r
 \r
+    def __GetMacroName(self):\r
+        if not self.__GetNextToken():\r
+            raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
+        MacroName = self.__Token\r
+        NotFlag = False\r
+        if MacroName.startswith('!'):\r
+            NotFlag = True\r
+            MacroName = MacroName[1:].strip()\r
+         \r
+        if not MacroName.startswith('$(') or not MacroName.endswith(')'):\r
+            raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},\r
+                          self.FileName, self.CurrentLineNumber)\r
+        MacroName = MacroName[2:-1]\r
+        return MacroName, NotFlag\r
+    \r
     ## PreprocessFile() method\r
     #\r
     #   Preprocess file contents, replace comments with spaces.\r
@@ -545,6 +560,7 @@ class FdfParser:
 \r
         self.Rewind()\r
 \r
+    \r
     ## PreprocessIncludeFile() method\r
     #\r
     #   Preprocess file contents, replace !include statements with file contents.\r
@@ -583,15 +599,8 @@ class FdfParser:
                 IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
                 IfList.append([IfStartPos, None, None])\r
                 CondLabel = self.__Token\r
-\r
-                if not self.__GetNextToken():\r
-                    raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
-                MacroName = self.__Token\r
-                NotFlag = False\r
-                if MacroName.startswith('!'):\r
-                    NotFlag = True\r
-                    MacroName = MacroName[1:]\r
-\r
+                \r
+                MacroName, NotFlag = self.__GetMacroName() \r
                 NotDefineFlag = False\r
                 if CondLabel == '!ifndef':\r
                     NotDefineFlag = True\r
@@ -645,14 +654,7 @@ class FdfParser:
                     self.__WipeOffArea.append((IfList[-1][0], ElseStartPos))\r
                     IfList[-1] = [ElseStartPos, True, IfList[-1][2]]\r
                     if self.__Token == '!elseif':\r
-                        if not self.__GetNextToken():\r
-                            raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
-                        MacroName = self.__Token\r
-                        NotFlag = False\r
-                        if MacroName.startswith('!'):\r
-                            NotFlag = True\r
-                            MacroName = MacroName[1:]\r
-\r
+                        MacroName, NotFlag = self.__GetMacroName() \r
                         if not self.__GetNextOp():\r
                             raise Warning("expected !endif", self.FileName, self.CurrentLineNumber)\r
 \r
index 7ae9593..4c7ea03 100644 (file)
@@ -799,13 +799,24 @@ class DscParser(MetaFileParser):
             else:
                 self._Enabled = len(self._Eval)
 
-    ## Evaludate the value of expression in "if/ifdef/ifndef" directives
+    ## Evaluate the Token for its value; for now only macros are supported.
+    def _EvaluateToken(self, TokenName, Expression):
+        if TokenName.startswith("$(") and TokenName.endswith(")"):
+            Name = TokenName[2:-1]
+            return self._Macros.get(Name)
+        else:
+            EdkLogger.error('Parser', FORMAT_INVALID, "Unknown operand '%(Token)s', "
+                            "please use '$(%(Token)s)' if '%(Token)s' is a macro" % {"Token" : TokenName},
+                            File=self.MetaFile, Line=self._LineIndex+1, ExtraData=Expression)
+    
+    ## Evaluate the value of expression in "if/ifdef/ifndef" directives
     def _Evaluate(self, Expression):
         TokenList = Expression.split()
         TokenNumber = len(TokenList)
         # one operand, guess it's just a macro name
         if TokenNumber == 1:
-            return TokenList[0] in self._Macros
+            TokenValue =  self._EvaluateToken(TokenList[0], Expression)
+            return TokenValue != None
         # two operands, suppose it's "!xxx" format
         elif TokenNumber == 2:
             Op = TokenList[0]
@@ -819,8 +830,8 @@ class DscParser(MetaFileParser):
             return self._OP_[Op](Value)
         # three operands
         elif TokenNumber == 3:
-            Name = TokenList[0]
-            if Name not in self._Macros:
+            TokenValue = self._EvaluateToken(TokenList[0], Expression)
+            if TokenValue == None:
                 return False
             Value = TokenList[2]
             if Value[0] in ["'", '"'] and Value[-1] in ["'", '"']:
@@ -829,7 +840,7 @@ class DscParser(MetaFileParser):
             if Op not in self._OP_:
                 EdkLogger.error('Parser', FORMAT_INVALID, "Unsupported operator [%s]" % Op, File=self.MetaFile,
                                 Line=self._LineIndex+1, ExtraData=Expression)
-            return self._OP_[Op](self._Macros[Name], Value)
+            return self._OP_[Op](TokenValue, Value)
         else:
             EdkLogger.error('Parser', FORMAT_INVALID, File=self.MetaFile, Line=self._LineIndex+1,
                             ExtraData=Expression)