]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/FdfParser.py
Sync BaseTools Branch (version r2321) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
index 5cdbe8888964ef2e42922917c8fbbd9bae0e6e98..c4b3f273f07a3ae34384894e1f86adb9dd835e2c 100644 (file)
@@ -2298,10 +2298,15 @@ class FdfParser:
         if not self.__IsKeyword( "FILE"):\r
             return False\r
 \r
-        FfsFileObj = FfsFileStatement.FileStatement()\r
-\r
         if not self.__GetNextWord():\r
             raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
+\r
+        if ForCapsule and self.__Token == 'DATA':\r
+            self.__UndoToken()\r
+            self.__UndoToken()\r
+            return False\r
+        \r
+        FfsFileObj = FfsFileStatement.FileStatement()\r
         FfsFileObj.FvFileType = self.__Token\r
 \r
         if not self.__IsToken( "="):\r
@@ -2917,7 +2922,9 @@ class FdfParser:
             IsInf = self.__GetInfStatement(Obj, True)\r
             IsFile = self.__GetFileStatement(Obj, True)\r
             IsFv = self.__GetFvStatement(Obj)\r
-            if not IsInf and not IsFile and not IsFv:\r
+            IsFd = self.__GetFdStatement(Obj)\r
+            IsAnyFile = self.__GetAnyFileStatement(Obj)\r
+            if not (IsInf or IsFile or IsFv or IsFd or IsAnyFile):\r
                 break\r
 \r
     ## __GetFvStatement() method\r
@@ -2945,6 +2952,65 @@ class FdfParser:
         CapsuleObj.CapsuleDataList.append(CapsuleFv)\r
         return True\r
 \r
+    ## __GetFdStatement() method\r
+    #\r
+    #   Get FD for capsule\r
+    #\r
+    #   @param  self        The object pointer\r
+    #   @param  CapsuleObj  for whom FD is got\r
+    #   @retval True        Successfully find a FD statement\r
+    #   @retval False       Not able to find a FD statement\r
+    #\r
+    def __GetFdStatement(self, CapsuleObj):\r
+\r
+        if not self.__IsKeyword("FD"):\r
+            return False\r
+\r
+        if not self.__IsToken("="):\r
+            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+\r
+        if not self.__GetNextToken():\r
+            raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
+\r
+        CapsuleFd = CapsuleData.CapsuleFd()\r
+        CapsuleFd.FdName = self.__Token\r
+        CapsuleObj.CapsuleDataList.append(CapsuleFd)\r
+        return True\r
+\r
+    ## __GetAnyFileStatement() method\r
+    #\r
+    #   Get AnyFile for capsule\r
+    #\r
+    #   @param  self        The object pointer\r
+    #   @param  CapsuleObj  for whom AnyFile is got\r
+    #   @retval True        Successfully find a Anyfile statement\r
+    #   @retval False       Not able to find a AnyFile statement\r
+    #\r
+    def __GetAnyFileStatement(self, CapsuleObj):\r
+\r
+        if not self.__IsKeyword("FILE"):\r
+            return False\r
+\r
+        if not self.__IsKeyword("DATA"):\r
+            self.__UndoToken()\r
+            return False\r
+\r
+        if not self.__IsToken("="):\r
+            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+\r
+        if not self.__GetNextToken():\r
+            raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
+        \r
+        AnyFileName = self.__Token\r
+        AnyFileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AnyFileName)\r
+        if not os.path.exists(AnyFileName):\r
+            raise Warning("File %s not exists"%AnyFileName, self.FileName, self.CurrentLineNumber)\r
+\r
+        CapsuleAnyFile = CapsuleData.CapsuleAnyFile()\r
+        CapsuleAnyFile.FileName = AnyFileName\r
+        CapsuleObj.CapsuleDataList.append(CapsuleAnyFile)\r
+        return True\r
+\r
     ## __GetRule() method\r
     #\r
     #   Get Rule section contents and store its data into rule list of self.Profile\r
@@ -3930,16 +3996,18 @@ class FdfParser:
     def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
 \r
         for CapsuleDataObj in CapObj.CapsuleDataList :\r
-            if CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
+            if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
                 RefFvList.append (CapsuleDataObj.FvName.upper())\r
+            elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName != None and CapsuleDataObj.FdName.upper() not in RefFdList:\r
+                RefFdList.append (CapsuleDataObj.FdName.upper())            \r
             elif CapsuleDataObj.Ffs != None:\r
-              if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
-                  if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
-                      RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
-                  elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
-                      RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
-                  else:\r
-                      self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
+                if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
+                    if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
+                        RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
+                    elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
+                        RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
+                    else:\r
+                        self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
 \r
     ## __GetFvInFd() method\r
     #\r
@@ -4139,12 +4207,19 @@ class FdfParser:
         return False\r
 \r
 if __name__ == "__main__":\r
-    parser = FdfParser("..\LakeportX64Pkg.fdf")\r
+    import sys\r
+    try:\r
+        test_file = sys.argv[1]\r
+    except IndexError, v:\r
+        print "Usage: %s filename" % sys.argv[0]\r
+        sys.exit(1)\r
+\r
+    parser = FdfParser(test_file)\r
     try:\r
         parser.ParseFile()\r
         parser.CycleReferenceCheck()\r
     except Warning, X:\r
-            print str(X)\r
+        print str(X)\r
     else:\r
         print "Success!"\r
 \r