Added file type check in dsc file
authorjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 16 May 2008 08:39:04 +0000 (08:39 +0000)
committerjwang36 <jwang36@7335b38e-4728-0410-8992-fb3ffe349368>
Fri, 16 May 2008 08:39:04 +0000 (08:39 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1234 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/Common/Misc.py
Source/Python/Workspace/WorkspaceDatabase.py

index 4957c8a..c0ba373 100755 (executable)
@@ -250,14 +250,18 @@ def DataRestore(File):
     return Data\r
 \r
 ## Check if gvien file exists or not\r
-# \r
+#\r
 #   @param      File    File name or path to be checked\r
 #   @param      Dir     The directory the file is relative to\r
-# \r
+#\r
 #   @retval     True    if file exists\r
 #   @retval     False   if file doesn't exists\r
-# \r
-def ValidFile(File, Dir='.'):\r
+#\r
+def ValidFile(File, Ext=None, Dir='.'):\r
+    if Ext != None:\r
+        Dummy, FileExt = os.path.splitext(File)\r
+        if FileExt.lower() != Ext.lower():\r
+            return False\r
     Wd = os.getcwd()\r
     os.chdir(Dir)\r
     if not os.path.exists(File):\r
@@ -267,13 +271,13 @@ def ValidFile(File, Dir='.'):
     return True\r
 \r
 ## Get GUID value from given packages\r
-# \r
+#\r
 #   @param      CName           The CName of the GUID\r
 #   @param      PackageList     List of packages looking-up in\r
-# \r
+#\r
 #   @retval     GuidValue   if the CName is found in any given package\r
 #   @retval     None        if the CName is not found in all given packages\r
-# \r
+#\r
 def GuidValue(CName, PackageList):\r
     for P in PackageList:\r
         if CName in P.Guids:\r
@@ -466,11 +470,11 @@ class sdict(IterableUserDict):
     ## "in" test support\r
     def __contains__(self, key):\r
         return key in self._key_list\r
-    \r
+\r
     ## indexof support\r
     def index(self, key):\r
         return self._key_list.index(key)\r
-    \r
+\r
     ## insert support\r
     def insert(self, key, newkey, newvalue, order):\r
         index = self._key_list.index(key)\r
@@ -487,7 +491,7 @@ class sdict(IterableUserDict):
             if key not in self._key_list:\r
                 self._key_list.append(key)\r
             IterableUserDict.__setitem__(self, key, sdict[key])\r
-        \r
+\r
     def has_key(self, key):\r
         return key in self._key_list\r
 \r
@@ -565,7 +569,7 @@ class rdict(dict):
     ## []= operator\r
     def __setitem__(self, key, value):\r
         if key not in self:\r
-            EdkLogger.error("RestrictedDict", ATTRIBUTE_SET_FAILURE, "Key [%s] is not allowed" % key, \r
+            EdkLogger.error("RestrictedDict", ATTRIBUTE_SET_FAILURE, "Key [%s] is not allowed" % key,\r
                             ExtraData=", ".join(dict.keys(self)))\r
         dict.__setitem__(self, key, value)\r
 \r
@@ -604,7 +608,7 @@ class tdict:
         self._Level_ = _Level_\r
         self.data = {}\r
         self._Single_ = _Single_\r
-    \r
+\r
     # =[] operator\r
     def __getitem__(self, key):\r
         KeyType = type(key)\r
@@ -699,7 +703,7 @@ class tdict:
 \r
         if FirstKey in self._ValidWildcardList:\r
             FirstKey = self._Wildcard\r
-        \r
+\r
         if FirstKey not in self.data and self._Level_ > 0:\r
             self.data[FirstKey] = tdict(self._Single_, self._Level_ - 1)\r
 \r
@@ -721,7 +725,7 @@ class tdict:
                 self.data[Key].SetSingleMode()\r
 \r
 ## Boolean chain list\r
-# \r
+#\r
 class Blist(UserList):\r
     def __init__(self, initlist=None):\r
         UserList.__init__(self, initlist)\r
@@ -746,7 +750,7 @@ def ParseConsoleLog(Filename):
         if Line.find('.efi') > -1:\r
             Line = Line[Line.rfind(' ') : Line.rfind('.efi')].strip()\r
             Opw.write('%s\n' % Line)\r
-    \r
+\r
     Opr.close()\r
     Opw.close()\r
 \r
@@ -764,7 +768,7 @@ if __name__ == '__main__':
 #    d['IA32', 'DXE_CORE', 'C'] = 3\r
 #\r
 #    print d['IA32', 'DXE_CORE', 'C']\r
-    \r
+\r
 #    s = sdict()\r
 #    s[1] = 1\r
 #    s[3] = 3\r
index 99dca27..8c62c13 100644 (file)
@@ -133,14 +133,14 @@ class DscBuildData(PlatformBuildClassObject):
         return self._Arch\r
 \r
     ## Set architecture\r
-    #   \r
+    #\r
     #   Changing the default ARCH to another may affect all other information\r
     # because all information in a platform may be ARCH-related. That's\r
-    # why we need to clear all internal used members, in order to cause all \r
+    # why we need to clear all internal used members, in order to cause all\r
     # information to be re-retrieved.\r
-    # \r
+    #\r
     #   @param  Value   The value of ARCH\r
-    # \r
+    #\r
     def _SetArch(self, Value):\r
         if self._Arch == Value:\r
             return\r
@@ -150,7 +150,7 @@ class DscBuildData(PlatformBuildClassObject):
     ## Retrieve all information in [Defines] section\r
     #\r
     #   (Retriving all [Defines] information in one-shot is just to save time.)\r
-    # \r
+    #\r
     def _GetHeaderInfo(self):\r
         RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch]\r
         for Record in RecordList:\r
@@ -323,9 +323,9 @@ class DscBuildData(PlatformBuildClassObject):
             ModuleId = Record[5]\r
             LineNo = Record[6]\r
             # check the file existence\r
-            if not ValidFile(ModuleFile):\r
-                EdkLogger.error('build', FILE_NOT_FOUND, File=self.DescFilePath, \r
-                                ExtraData=ModuleFile, Line=LineNo)\r
+            if not ValidFile(ModuleFile, '.inf'):\r
+                EdkLogger.error('build', FORMAT_INVALID, "Invalid or non-existent module",\r
+                                File=self.DescFilePath, ExtraData=ModuleFile, Line=LineNo)\r
             if ModuleFile in self._Modules:\r
                 continue\r
             Module = ModuleBuildClassObject()\r
@@ -337,7 +337,7 @@ class DscBuildData(PlatformBuildClassObject):
                 LibraryClass = Record[0]\r
                 LibraryPath = NormPath(Record[1], self._Macros)\r
                 LineNo = Record[-1]\r
-                if not ValidFile(LibraryPath):\r
+                if not ValidFile(LibraryPath, '.inf'):\r
                     EdkLogger.error('build', FILE_NOT_FOUND, ExtraData=LibraryPath,\r
                                     File=self.DescFilePath, Line=LineNo)\r
                 if LibraryClass == '' or LibraryClass == 'NULL':\r
@@ -395,10 +395,10 @@ class DscBuildData(PlatformBuildClassObject):
     def _GetLibraryClasses(self):\r
         if self._LibraryClasses == None:\r
             self._LibraryInstances = []\r
-            # \r
-            # tdict is a special dict kind of type, used for selecting correct \r
+            #\r
+            # tdict is a special dict kind of type, used for selecting correct\r
             # library instance for given library class and module type\r
-            # \r
+            #\r
             LibraryClassDict = tdict(True, 3)\r
             # track all library class names\r
             LibraryClassSet = set()\r
@@ -406,14 +406,14 @@ class DscBuildData(PlatformBuildClassObject):
             for LibraryClass, LibraryInstance, Dummy, Arch, ModuleType, Dummy, LineNo in RecordList:\r
                 LibraryClassSet.add(LibraryClass)\r
                 LibraryInstance = NormPath(LibraryInstance, self._Macros)\r
-                if not ValidFile(LibraryInstance):\r
-                    EdkLogger.error('build', FILE_NOT_FOUND, File=self.DescFilePath, \r
+                if not ValidFile(LibraryInstance, '.inf'):\r
+                    EdkLogger.error('build', FILE_NOT_FOUND, File=self.DescFilePath,\r
                                     ExtraData=LibraryInstance, Line=LineNo)\r
                 LibraryClassDict[Arch, ModuleType, LibraryClass] = LibraryInstance\r
                 if LibraryInstance not in self._LibraryInstances:\r
                     self._LibraryInstances.append(LibraryInstance)\r
 \r
-            # resolve the specific library instance for each class and each module type \r
+            # resolve the specific library instance for each class and each module type\r
             self._LibraryClasses = tdict(True)\r
             for LibraryClass in LibraryClassSet:\r
                 # try all possible module types\r
@@ -428,16 +428,16 @@ class DscBuildData(PlatformBuildClassObject):
             for Record in RecordList:\r
                 File = NormPath(Record[0], self._Macros)\r
                 LineNo = Record[-1]\r
-                if not ValidFile(File):\r
+                if not ValidFile(File, '.inf'):\r
                     EdkLogger.error('build', FILE_NOT_FOUND, ExtraData=File,\r
                                     File=self.DescFilePath, Line=LineNo)\r
                 if File not in self._LibraryInstances:\r
                     self._LibraryInstances.append(File)\r
-                # \r
+                #\r
                 # we need the module name as the library class name, so we have\r
                 # to parse it here. (self._Bdb[] will trigger a file parse if it\r
                 # hasn't been parsed)\r
-                # \r
+                #\r
                 Library = self._Bdb[File, self._Arch]\r
                 self._LibraryClasses[Library.BaseName, ':dummy:'] = Library\r
         return self._LibraryClasses\r
@@ -469,15 +469,15 @@ class DscBuildData(PlatformBuildClassObject):
     ## Retrieve non-dynamic PCD settings\r
     #\r
     #   @param  Type    PCD type\r
-    # \r
+    #\r
     #   @retval a dict object contains settings of given PCD type\r
-    # \r
+    #\r
     def _GetPcd(self, Type):\r
         Pcds = {}\r
-        # \r
-        # tdict is a special dict kind of type, used for selecting correct \r
+        #\r
+        # tdict is a special dict kind of type, used for selecting correct\r
         # PCD settings for certain ARCH\r
-        # \r
+        #\r
         PcdDict = tdict(True, 3)\r
         PcdSet = set()\r
         # Find out all possible PCD candidates for self._Arch\r
@@ -510,15 +510,15 @@ class DscBuildData(PlatformBuildClassObject):
     ## Retrieve dynamic PCD settings\r
     #\r
     #   @param  Type    PCD type\r
-    # \r
+    #\r
     #   @retval a dict object contains settings of given PCD type\r
-    # \r
+    #\r
     def _GetDynamicPcd(self, Type):\r
         Pcds = {}\r
-        # \r
-        # tdict is a special dict kind of type, used for selecting correct \r
+        #\r
+        # tdict is a special dict kind of type, used for selecting correct\r
         # PCD settings for certain ARCH and SKU\r
-        # \r
+        #\r
         PcdDict = tdict(True, 4)\r
         PcdSet = set()\r
         # Find out all possible PCD candidates for self._Arch\r
@@ -553,15 +553,15 @@ class DscBuildData(PlatformBuildClassObject):
     ## Retrieve dynamic HII PCD settings\r
     #\r
     #   @param  Type    PCD type\r
-    # \r
+    #\r
     #   @retval a dict object contains settings of given PCD type\r
-    # \r
+    #\r
     def _GetDynamicHiiPcd(self, Type):\r
         Pcds = {}\r
-        # \r
-        # tdict is a special dict kind of type, used for selecting correct \r
+        #\r
+        # tdict is a special dict kind of type, used for selecting correct\r
         # PCD settings for certain ARCH and SKU\r
-        # \r
+        #\r
         PcdDict = tdict(True, 4)\r
         PcdSet = set()\r
         RecordList = self._RawData[Type, self._Arch]\r
@@ -595,15 +595,15 @@ class DscBuildData(PlatformBuildClassObject):
     ## Retrieve dynamic VPD PCD settings\r
     #\r
     #   @param  Type    PCD type\r
-    # \r
+    #\r
     #   @retval a dict object contains settings of given PCD type\r
-    # \r
+    #\r
     def _GetDynamicVpdPcd(self, Type):\r
         Pcds = {}\r
-        # \r
-        # tdict is a special dict kind of type, used for selecting correct \r
+        #\r
+        # tdict is a special dict kind of type, used for selecting correct\r
         # PCD settings for certain ARCH and SKU\r
-        # \r
+        #\r
         PcdDict = tdict(True, 4)\r
         PcdSet = set()\r
         # Find out all possible PCD candidates for self._Arch\r
@@ -637,11 +637,11 @@ class DscBuildData(PlatformBuildClassObject):
 \r
     ## Add external modules\r
     #\r
-    #   The external modules are mostly those listed in FDF file, which don't \r
+    #   The external modules are mostly those listed in FDF file, which don't\r
     # need "build".\r
-    # \r
+    #\r
     #   @param  FilePath    The path of module description file\r
-    # \r
+    #\r
     def AddModule(self, FilePath):\r
         FilePath = NormPath(FilePath)\r
         if FilePath not in self.Modules:\r
@@ -653,11 +653,11 @@ class DscBuildData(PlatformBuildClassObject):
     #\r
     #   The external PCDs are mostly those listed in FDF file to specify address\r
     # or offset information.\r
-    # \r
+    #\r
     #   @param  Name    Name of the PCD\r
     #   @param  Guid    Token space guid of the PCD\r
     #   @param  Value   Value of the PCD\r
-    # \r
+    #\r
     def AddPcd(self, Name, Guid, Value):\r
         if (Name, Guid) not in self.Pcds:\r
             self.Pcds[Name, Guid] = PcdClassObject(\r
@@ -778,14 +778,14 @@ class DecBuildData(PackageBuildClassObject):
         return self._Arch\r
 \r
     ## Set architecture\r
-    #   \r
+    #\r
     #   Changing the default ARCH to another may affect all other information\r
     # because all information in a platform may be ARCH-related. That's\r
-    # why we need to clear all internal used members, in order to cause all \r
+    # why we need to clear all internal used members, in order to cause all\r
     # information to be re-retrieved.\r
-    # \r
+    #\r
     #   @param  Value   The value of ARCH\r
-    # \r
+    #\r
     def _SetArch(self, Value):\r
         if self._Arch == Value:\r
             return\r
@@ -795,7 +795,7 @@ class DecBuildData(PackageBuildClassObject):
     ## Retrieve all information in [Defines] section\r
     #\r
     #   (Retriving all [Defines] information in one-shot is just to save time.)\r
-    # \r
+    #\r
     def _GetHeaderInfo(self):\r
         RecordList = self._RawData[MODEL_META_DATA_HEADER]\r
         for Record in RecordList:\r
@@ -834,10 +834,10 @@ class DecBuildData(PackageBuildClassObject):
     ## Retrieve protocol definitions (name/value pairs)\r
     def _GetProtocol(self):\r
         if self._Protocols == None:\r
-            # \r
-            # tdict is a special kind of dict, used for selecting correct \r
+            #\r
+            # tdict is a special kind of dict, used for selecting correct\r
             # protocol defition for given ARCH\r
-            # \r
+            #\r
             ProtocolDict = tdict(True)\r
             NameList = []\r
             # find out all protocol definitions for specific and 'common' arch\r
@@ -849,20 +849,20 @@ class DecBuildData(PackageBuildClassObject):
             # use sdict to keep the order\r
             self._Protocols = sdict()\r
             for Name in NameList:\r
-                # \r
+                #\r
                 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
                 # will automatically turn to 'common' ARCH for trying\r
-                # \r
+                #\r
                 self._Protocols[Name] = ProtocolDict[self._Arch, Name]\r
         return self._Protocols\r
 \r
     ## Retrieve PPI definitions (name/value pairs)\r
     def _GetPpi(self):\r
         if self._Ppis == None:\r
-            # \r
-            # tdict is a special kind of dict, used for selecting correct \r
+            #\r
+            # tdict is a special kind of dict, used for selecting correct\r
             # PPI defition for given ARCH\r
-            # \r
+            #\r
             PpiDict = tdict(True)\r
             NameList = []\r
             # find out all PPI definitions for specific arch and 'common' arch\r
@@ -874,20 +874,20 @@ class DecBuildData(PackageBuildClassObject):
             # use sdict to keep the order\r
             self._Ppis = sdict()\r
             for Name in NameList:\r
-                # \r
+                #\r
                 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
                 # will automatically turn to 'common' ARCH for trying\r
-                # \r
+                #\r
                 self._Ppis[Name] = PpiDict[self._Arch, Name]\r
         return self._Ppis\r
 \r
     ## Retrieve GUID definitions (name/value pairs)\r
     def _GetGuid(self):\r
         if self._Guids == None:\r
-            # \r
-            # tdict is a special kind of dict, used for selecting correct \r
+            #\r
+            # tdict is a special kind of dict, used for selecting correct\r
             # GUID defition for given ARCH\r
-            # \r
+            #\r
             GuidDict = tdict(True)\r
             NameList = []\r
             # find out all protocol definitions for specific and 'common' arch\r
@@ -899,10 +899,10 @@ class DecBuildData(PackageBuildClassObject):
             # use sdict to keep the order\r
             self._Guids = sdict()\r
             for Name in NameList:\r
-                # \r
+                #\r
                 # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
                 # will automatically turn to 'common' ARCH for trying\r
-                # \r
+                #\r
                 self._Guids[Name] = GuidDict[self._Arch, Name]\r
         return self._Guids\r
 \r
@@ -915,7 +915,7 @@ class DecBuildData(PackageBuildClassObject):
                 File = NormPath(Record[0], self._Macros)\r
                 LineNo = Record[-1]\r
                 # validate the path\r
-                if not ValidFile(File, self._PackageDir):\r
+                if not ValidFile(File, Dir=self._PackageDir):\r
                     EdkLogger.error('build', FILE_NOT_FOUND, ExtraData=File,\r
                                     File=self.DescFilePath, Line=LineNo)\r
                 # avoid duplicate include path\r
@@ -926,16 +926,16 @@ class DecBuildData(PackageBuildClassObject):
     ## Retrieve library class declarations (not used in build at present)\r
     def _GetLibraryClass(self):\r
         if self._LibraryClasses == None:\r
-            # \r
-            # tdict is a special kind of dict, used for selecting correct \r
+            #\r
+            # tdict is a special kind of dict, used for selecting correct\r
             # library class declaration for given ARCH\r
-            # \r
+            #\r
             LibraryClassDict = tdict(True)\r
             LibraryClassSet = set()\r
             RecordList = self._RawData[MODEL_EFI_LIBRARY_CLASS, self._Arch]\r
             for LibraryClass, File, Dummy, Arch, ID, LineNo in RecordList:\r
                 File = NormPath(File, self._Macros)\r
-                if not ValidFile(File, self._PackageDir):\r
+                if not ValidFile(File, Dir=self._PackageDir):\r
                     EdkLogger.error('build', FILE_NOT_FOUND, ExtraData=File,\r
                                     File=self.DescFilePath, Line=LineNo)\r
                 LibraryClassSet.add(LibraryClass)\r
@@ -959,10 +959,10 @@ class DecBuildData(PackageBuildClassObject):
     ## Retrieve PCD declarations for given type\r
     def _GetPcd(self, Type):\r
         Pcds = {}\r
-        # \r
-        # tdict is a special kind of dict, used for selecting correct \r
+        #\r
+        # tdict is a special kind of dict, used for selecting correct\r
         # PCD declaration for given ARCH\r
-        # \r
+        #\r
         PcdDict = tdict(True, 3)\r
         # for summarizing PCD\r
         PcdSet = set()\r
@@ -974,10 +974,10 @@ class DecBuildData(PackageBuildClassObject):
 \r
         for PcdCName, TokenSpaceGuid in PcdSet:\r
             ValueList = ['', '', '']\r
-            # \r
+            #\r
             # limit the ARCH to self._Arch, if no self._Arch found, tdict\r
             # will automatically turn to 'common' ARCH and try again\r
-            # \r
+            #\r
             Setting = PcdDict[self._Arch, PcdCName, TokenSpaceGuid]\r
             if Setting == None:\r
                 continue\r
@@ -1079,7 +1079,7 @@ class InfBuildData(ModuleBuildClassObject):
         "LIB"       :   "SLINK",\r
         "LINK"      :   "DLINK",\r
     }\r
-    \r
+\r
 \r
     ## Constructor of DscBuildData\r
     #\r
@@ -1153,14 +1153,14 @@ class InfBuildData(ModuleBuildClassObject):
         return self._Arch\r
 \r
     ## Set architecture\r
-    #   \r
+    #\r
     #   Changing the default ARCH to another may affect all other information\r
     # because all information in a platform may be ARCH-related. That's\r
-    # why we need to clear all internal used members, in order to cause all \r
+    # why we need to clear all internal used members, in order to cause all\r
     # information to be re-retrieved.\r
-    # \r
+    #\r
     #   @param  Value   The value of ARCH\r
-    # \r
+    #\r
     def _SetArch(self, Value):\r
         if self._Arch == Value:\r
             return\r
@@ -1172,11 +1172,11 @@ class InfBuildData(ModuleBuildClassObject):
         return self._Platform\r
 \r
     ## Change the name of platform employing this module\r
-    # \r
+    #\r
     #   Changing the default name of platform to another may affect some information\r
     # because they may be PLATFORM-related. That's why we need to clear all internal\r
     # used members, in order to cause all information to be re-retrieved.\r
-    # \r
+    #\r
     def _SetPlatform(self, Value):\r
         if self._Platform == Value:\r
             return\r
@@ -1186,7 +1186,7 @@ class InfBuildData(ModuleBuildClassObject):
     ## Retrieve all information in [Defines] section\r
     #\r
     #   (Retriving all [Defines] information in one-shot is just to save time.)\r
-    # \r
+    #\r
     def _GetHeaderInfo(self):\r
         RecordList = self._RawData[MODEL_META_DATA_HEADER, self._Arch, self._Platform]\r
         for Record in RecordList:\r
@@ -1245,13 +1245,13 @@ class InfBuildData(ModuleBuildClassObject):
                 else:\r
                     if TokenList[0] not in ['MSFT', 'GCC']:\r
                         EdkLogger.error("build", FORMAT_NOT_SUPPORTED,\r
-                                        "No supported family [%s]" % TokenList[0], \r
+                                        "No supported family [%s]" % TokenList[0],\r
                                         File=self.DescFilePath, Line=Record[-1])\r
                     self._CustomMakefile[TokenList[0]] = TokenList[1]\r
 \r
-        # \r
+        #\r
         # Retrieve information in sections specific to R8.x modules\r
-        # \r
+        #\r
         if self._AutoGenVersion < 0x00010005:   # _AutoGenVersion may be None, which is less than anything\r
             if self._ComponentType in self._MODULE_TYPE_:\r
                 self._ModuleType = self._MODULE_TYPE_[self._ComponentType]\r
@@ -1266,7 +1266,7 @@ class InfBuildData(ModuleBuildClassObject):
                     self._ModuleEntryPointList.append(Value)\r
                 elif Name == "DPX_SOURCE":\r
                     File = NormPath(Value, self._Macros)\r
-                    if not ValidFile(File, self._ModuleDir):\r
+                    if not ValidFile(File, Dir=self._ModuleDir):\r
                         EdkLogger.error('build', FILE_NOT_FOUND, ExtraData=File,\r
                                         File=self.DescFilePath, Line=LineNo)\r
                     if self.Sources == None:\r
@@ -1275,7 +1275,7 @@ class InfBuildData(ModuleBuildClassObject):
                 else:\r
                     ToolList = self._NMAKE_FLAG_PATTERN_.findall(Name)\r
                     if len(ToolList) == 0 or len(ToolList) != 1:\r
-                        EdkLogger.warn("build", "Don't know how to do with macro [%s]" % Name, \r
+                        EdkLogger.warn("build", "Don't know how to do with macro [%s]" % Name,\r
                                        File=self.DescFilePath, Line=LineNo)\r
                     else:\r
                         if self._BuildOptions == None:\r
@@ -1431,7 +1431,7 @@ class InfBuildData(ModuleBuildClassObject):
             if self._DestructorList == None:\r
                 self._DestructorList = []\r
         return self._DestructorList\r
-                        \r
+\r
     ## Retrieve binary files\r
     def _GetBinaryFiles(self):\r
         if self._Binaries == None:\r
@@ -1441,7 +1441,7 @@ class InfBuildData(ModuleBuildClassObject):
                 FileType = Record[0]\r
                 File = NormPath(Record[1], self._Macros)\r
                 LineNo = Record[-1]\r
-                if not ValidFile(File, self._ModuleDir):\r
+                if not ValidFile(File, Dir=self._ModuleDir):\r
                     EdkLogger.error('build', FILE_NOT_FOUND, ExtraData=File,\r
                                     File=self.DescFilePath, Line=LineNo)\r
                 Target = Record[2]\r
@@ -1457,7 +1457,7 @@ class InfBuildData(ModuleBuildClassObject):
             for Record in RecordList:\r
                 File = NormPath(Record[0], self._Macros)\r
                 LineNo = Record[-1]\r
-                if not ValidFile(File, self._ModuleDir):\r
+                if not ValidFile(File, Dir=self._ModuleDir):\r
                     EdkLogger.error('build', FILE_NOT_FOUND, ExtraData=File,\r
                                     File=self.DescFilePath, Line=LineNo)\r
                 ToolChainFamily = Record[1]\r
@@ -1550,7 +1550,7 @@ class InfBuildData(ModuleBuildClassObject):
                 File = NormPath(Record[0], self._Macros)\r
                 LineNo = Record[-1]\r
                 #if File[0] == '.':\r
-                #    if not ValidFile(File, self._ModuleDir):\r
+                #    if not ValidFile(File, Dir=self._ModuleDir):\r
                 #        EdkLogger.error('build', FILE_NOT_FOUND, ExtraData=File,\r
                 #                        File=self.DescFilePath, Line=LineNo)\r
                 #else:\r
@@ -1570,7 +1570,7 @@ class InfBuildData(ModuleBuildClassObject):
             for Record in RecordList:\r
                 File = NormPath(Record[0], self._Macros)\r
                 LineNo = Record[-1]\r
-                if not ValidFile(File):\r
+                if not ValidFile(File, '.dec'):\r
                     EdkLogger.error('build', FILE_NOT_FOUND, ExtraData=File,\r
                                     File=self.DescFilePath, Line=LineNo)\r
                 # parse this package now. we need it to get protocol/ppi/guid value\r
@@ -1601,7 +1601,7 @@ class InfBuildData(ModuleBuildClassObject):
                 if (ToolChainFamily, ToolChain) not in self._BuildOptions:\r
                     self._BuildOptions[ToolChainFamily, ToolChain] = Option\r
                 else:\r
-                    # concatenate the option string if they're for the same tool \r
+                    # concatenate the option string if they're for the same tool\r
                     OptionString = self._BuildOptions[ToolChainFamily, ToolChain]\r
                     self._BuildOptions[ToolChainFamily, ToolChain] = OptionString + " " + Option\r
         return self._BuildOptions\r
@@ -1667,13 +1667,13 @@ class InfBuildData(ModuleBuildClassObject):
 \r
             # get necessary info from package declaring this PCD\r
             for Package in self.Packages:\r
-                # \r
+                #\r
                 # 'dynamic' in INF means its type is determined by platform;\r
-                # if platform doesn't give its type, use 'lowest' one in the \r
+                # if platform doesn't give its type, use 'lowest' one in the\r
                 # following order, if any\r
-                # \r
+                #\r
                 #   "FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"\r
-                # \r
+                #\r
                 PcdType = self._PCD_TYPE_STRING_[Type]\r
                 if Type in [MODEL_PCD_DYNAMIC, MODEL_PCD_DYNAMIC_EX]:\r
                     for T in ["FixedAtBuild", "PatchableInModule", "FeatureFlag", "Dynamic", "DynamicEx"]:\r
@@ -1692,7 +1692,7 @@ class InfBuildData(ModuleBuildClassObject):
                     break\r
             else:\r
                 EdkLogger.error(\r
-                            'build', \r
+                            'build',\r
                             PARSER_ERROR,\r
                             "PCD [%s.%s] in [%s] is not found in dependent packages:" % (TokenSpaceGuid, PcdCName, self.DescFilePath),\r
                             File =self.DescFilePath, Line=LineNo,\r
@@ -1739,7 +1739,7 @@ class InfBuildData(ModuleBuildClassObject):
 #   This class defined the build databse for all modules, packages and platform.\r
 # It will call corresponding parser for the given file if it cannot find it in\r
 # the database.\r
-# \r
+#\r
 # @param DbPath             Path of database file\r
 # @param GlobalMacros       Global macros used for replacement during file parsing\r
 # @prarm RenewDb=False      Create new database file if it's already there\r
@@ -1764,10 +1764,10 @@ class WorkspaceDatabase(object):
     # default database file path\r
     _DB_PATH_ = "Conf/.cache/build.db"\r
 \r
-    # \r
+    #\r
     # internal class used for call corresponding file parser and caching the result\r
     # to avoid unnecessary re-parsing\r
-    # \r
+    #\r
     class BuildObjectFactory(object):\r
         _FILE_TYPE_ = {\r
             ".INF"  : MODEL_FILE_INF,\r
@@ -1825,8 +1825,8 @@ class WorkspaceDatabase(object):
             # get table for current file\r
             MetaFile = self.WorkspaceDb[FilePath, FileType]\r
             BuildObject = self._GENERATOR_[FileType](\r
-                                    FilePath, \r
-                                    MetaFile, \r
+                                    FilePath,\r
+                                    MetaFile,\r
                                     self,\r
                                     Arch,\r
                                     Platform,\r
@@ -1845,7 +1845,7 @@ class WorkspaceDatabase(object):
             pass\r
 \r
     ## Constructor of WorkspaceDatabase\r
-    # \r
+    #\r
     # @param DbPath             Path of database file\r
     # @param GlobalMacros       Global macros used for replacement during file parsing\r
     # @prarm RenewDb=False      Create new database file if it's already there\r
@@ -1883,17 +1883,17 @@ class WorkspaceDatabase(object):
         # conversion object for build or file format conversion purpose\r
         self.BuildObject = WorkspaceDatabase.BuildObjectFactory(self)\r
         self.TransformObject = WorkspaceDatabase.TransformObjectFactory(self)\r
-    \r
+\r
     ## Initialize build database\r
     def InitDatabase(self):\r
         EdkLogger.verbose("\nInitialize build database started ...")\r
-        \r
+\r
         #\r
         # Create new tables\r
         #\r
         self.TblDataModel.Create(False)\r
         self.TblFile.Create(False)\r
-        \r
+\r
         #\r
         # Initialize table DataModel\r
         #\r
@@ -1906,10 +1906,10 @@ class WorkspaceDatabase(object):
     #\r
     def QueryTable(self, Table):\r
         Table.Query()\r
-    \r
+\r
     ## Close entire database\r
     #\r
-    # Commit all first \r
+    # Commit all first\r
     # Close the connection and cursor\r
     #\r
     def Close(self):\r
@@ -1945,9 +1945,9 @@ class WorkspaceDatabase(object):
         return "_%s_%s" % (FileType, FileId)\r
 \r
     ## Return a temp table containing all content of the given file\r
-    # \r
+    #\r
     #   @param  FileInfo    The tuple containing path and type of a file\r
-    # \r
+    #\r
     def __getitem__(self, FileInfo):\r
         FilePath, FileType = FileInfo\r
         if FileType not in self._FILE_TABLE_:\r