]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Ecc/Ecc.py
Sync BaseTool trunk (version r2670) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / Python / Ecc / Ecc.py
index b1a0ab82723bfa945f4d45c7e10326db45fa44b4..b5d733e48e2e5917dd63f7295967d9c66726d689 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to be the main entrance of ECC tool\r
 #\r
-# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>\r
 # This program and the accompanying materials\r
 # are licensed and made available under the terms and conditions of the BSD License\r
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -59,6 +59,7 @@ class Ecc(object):
         self.ScanSourceCode = True\r
         self.ScanMetaData = True\r
         self.MetaFile = ''\r
+        self.OnlyScan = None\r
 \r
         # Parse the options and args\r
         self.ParseOption()\r
@@ -113,8 +114,9 @@ class Ecc(object):
         GlobalData.gAllFiles = DirCache(GlobalData.gWorkspace)\r
          \r
         # Build ECC database\r
-        self.BuildDatabase()\r
-\r
+#         self.BuildDatabase()\r
+        self.DetectOnlyScanDirs()\r
+        \r
         # Start to check\r
         self.Check()\r
 \r
@@ -133,11 +135,30 @@ class Ecc(object):
                 return\r
         self.ConfigFile = 'config.ini'\r
 \r
+\r
+    ## DetectOnlyScan\r
+    #\r
+    # Detect whether only scanned folders have been enabled\r
+    #\r
+    def DetectOnlyScanDirs(self):\r
+        if self.OnlyScan == True:\r
+            OnlyScanDirs = []\r
+            # Use regex here if multiple spaces or TAB exists in ScanOnlyDirList in config.ini file\r
+            for folder in re.finditer(r'\S+', EccGlobalData.gConfig.ScanOnlyDirList):\r
+                OnlyScanDirs.append(folder.group())\r
+            if len(OnlyScanDirs) != 0:\r
+                self.BuildDatabase(OnlyScanDirs)\r
+            else:\r
+                EdkLogger.error("ECC", BuildToolError.OPTION_VALUE_INVALID, ExtraData="Use -f option need to fill specific folders in config.ini file")\r
+        else:\r
+            self.BuildDatabase()\r
+            \r
+    \r
     ## BuildDatabase\r
     #\r
     # Build the database for target\r
     #\r
-    def BuildDatabase(self):\r
+    def BuildDatabase(self, SpeciDirs = None):\r
         # Clean report table\r
         EccGlobalData.gDb.TblReport.Drop()\r
         EccGlobalData.gDb.TblReport.Create()\r
@@ -146,10 +167,14 @@ class Ecc(object):
         if self.IsInit:            \r
             if self.ScanMetaData:\r
                 EdkLogger.quiet("Building database for Meta Data File ...")\r
-                self.BuildMetaDataFileDatabase()\r
+                self.BuildMetaDataFileDatabase(SpeciDirs)\r
             if self.ScanSourceCode:\r
                 EdkLogger.quiet("Building database for Meta Data File Done!")\r
-                c.CollectSourceCodeDataIntoDB(EccGlobalData.gTarget)\r
+                if SpeciDirs == None:\r
+                    c.CollectSourceCodeDataIntoDB(EccGlobalData.gTarget)\r
+                else:\r
+                    for specificDir in SpeciDirs:\r
+                        c.CollectSourceCodeDataIntoDB(os.path.join(EccGlobalData.gTarget, specificDir))\r
 \r
         EccGlobalData.gIdentifierTableList = GetTableList((MODEL_FILE_C, MODEL_FILE_H), 'Identifier', EccGlobalData.gDb)\r
         EccGlobalData.gCFileList = GetFileList(MODEL_FILE_C, EccGlobalData.gDb)\r
@@ -159,59 +184,67 @@ class Ecc(object):
     #\r
     # Build the database for meta data files\r
     #\r
-    def BuildMetaDataFileDatabase(self):\r
+    def BuildMetaDataFileDatabase(self, SpecificDirs = None):\r
+        ScanFolders = []\r
+        if SpecificDirs == None:\r
+            ScanFolders.append(EccGlobalData.gTarget)\r
+        else:\r
+            for specificDir in SpecificDirs:    \r
+                ScanFolders.append(os.path.join(EccGlobalData.gTarget, specificDir))\r
         EdkLogger.quiet("Building database for meta data files ...")\r
         Op = open(EccGlobalData.gConfig.MetaDataFileCheckPathOfGenerateFileList, 'w+')\r
         #SkipDirs = Read from config file\r
         SkipDirs = EccGlobalData.gConfig.SkipDirList\r
         SkipDirString = string.join(SkipDirs, '|')\r
-        p = re.compile(r'.*[\\/](?:%s)[\\/]?.*' % SkipDirString)\r
-        for Root, Dirs, Files in os.walk(EccGlobalData.gTarget):\r
-            if p.match(Root.upper()):\r
-                continue\r
-            for Dir in Dirs:\r
-                Dirname = os.path.join(Root, Dir)\r
-                if os.path.islink(Dirname):\r
-                    Dirname = os.path.realpath(Dirname)\r
-                    if os.path.isdir(Dirname):\r
-                        # symlinks to directories are treated as directories\r
-                        Dirs.remove(Dir)\r
-                        Dirs.append(Dirname)\r
-\r
-            for File in Files:\r
-                if len(File) > 4 and File[-4:].upper() == ".DEC":\r
-                    Filename = os.path.normpath(os.path.join(Root, File))\r
-                    EdkLogger.quiet("Parsing %s" % Filename)\r
-                    Op.write("%s\r" % Filename)\r
-                    #Dec(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
-                    self.MetaFile = DecParser(Filename, MODEL_FILE_DEC, EccGlobalData.gDb.TblDec)\r
-                    self.MetaFile.Start()\r
-                    continue\r
-                if len(File) > 4 and File[-4:].upper() == ".DSC":\r
-                    Filename = os.path.normpath(os.path.join(Root, File))\r
-                    EdkLogger.quiet("Parsing %s" % Filename)\r
-                    Op.write("%s\r" % Filename)\r
-                    #Dsc(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
-                    self.MetaFile = DscParser(PathClass(Filename, Root), MODEL_FILE_DSC, MetaFileStorage(EccGlobalData.gDb.TblDsc.Cur, Filename, MODEL_FILE_DSC, True))\r
-                    # alwasy do post-process, in case of macros change\r
-                    self.MetaFile.DoPostProcess()\r
-                    self.MetaFile.Start()\r
-                    self.MetaFile._PostProcess()\r
-                    continue\r
-                if len(File) > 4 and File[-4:].upper() == ".INF":\r
-                    Filename = os.path.normpath(os.path.join(Root, File))\r
-                    EdkLogger.quiet("Parsing %s" % Filename)\r
-                    Op.write("%s\r" % Filename)\r
-                    #Inf(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
-                    self.MetaFile = InfParser(Filename, MODEL_FILE_INF, EccGlobalData.gDb.TblInf)\r
-                    self.MetaFile.Start()\r
-                    continue\r
-                if len(File) > 4 and File[-4:].upper() == ".FDF":\r
-                    Filename = os.path.normpath(os.path.join(Root, File))\r
-                    EdkLogger.quiet("Parsing %s" % Filename)\r
-                    Op.write("%s\r" % Filename)\r
-                    Fdf(Filename, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
+#         p = re.compile(r'.*[\\/](?:%s)[\\/]?.*' % SkipDirString)\r
+        p = re.compile(r'.*[\\/](?:%s^\S)[\\/]?.*' % SkipDirString)\r
+        for scanFolder in ScanFolders:\r
+            for Root, Dirs, Files in os.walk(scanFolder):\r
+                if p.match(Root.upper()):\r
                     continue\r
+                for Dir in Dirs:\r
+                    Dirname = os.path.join(Root, Dir)\r
+                    if os.path.islink(Dirname):\r
+                        Dirname = os.path.realpath(Dirname)\r
+                        if os.path.isdir(Dirname):\r
+                            # symlinks to directories are treated as directories\r
+                            Dirs.remove(Dir)\r
+                            Dirs.append(Dirname)\r
+    \r
+                for File in Files:\r
+                    if len(File) > 4 and File[-4:].upper() == ".DEC":\r
+                        Filename = os.path.normpath(os.path.join(Root, File))\r
+                        EdkLogger.quiet("Parsing %s" % Filename)\r
+                        Op.write("%s\r" % Filename)\r
+                        #Dec(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
+                        self.MetaFile = DecParser(Filename, MODEL_FILE_DEC, EccGlobalData.gDb.TblDec)\r
+                        self.MetaFile.Start()\r
+                        continue\r
+                    if len(File) > 4 and File[-4:].upper() == ".DSC":\r
+                        Filename = os.path.normpath(os.path.join(Root, File))\r
+                        EdkLogger.quiet("Parsing %s" % Filename)\r
+                        Op.write("%s\r" % Filename)\r
+                        #Dsc(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
+                        self.MetaFile = DscParser(PathClass(Filename, Root), MODEL_FILE_DSC, MetaFileStorage(EccGlobalData.gDb.TblDsc.Cur, Filename, MODEL_FILE_DSC, True))\r
+                        # alwasy do post-process, in case of macros change\r
+                        self.MetaFile.DoPostProcess()\r
+                        self.MetaFile.Start()\r
+                        self.MetaFile._PostProcess()\r
+                        continue\r
+                    if len(File) > 4 and File[-4:].upper() == ".INF":\r
+                        Filename = os.path.normpath(os.path.join(Root, File))\r
+                        EdkLogger.quiet("Parsing %s" % Filename)\r
+                        Op.write("%s\r" % Filename)\r
+                        #Inf(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
+                        self.MetaFile = InfParser(Filename, MODEL_FILE_INF, EccGlobalData.gDb.TblInf)\r
+                        self.MetaFile.Start()\r
+                        continue\r
+                    if len(File) > 4 and File[-4:].upper() == ".FDF":\r
+                        Filename = os.path.normpath(os.path.join(Root, File))\r
+                        EdkLogger.quiet("Parsing %s" % Filename)\r
+                        Op.write("%s\r" % Filename)\r
+                        Fdf(Filename, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
+                        continue\r
         Op.close()\r
 \r
         # Commit to database\r
@@ -321,6 +354,8 @@ class Ecc(object):
             self.ScanSourceCode = False\r
         if Options.sourcecode != None:\r
             self.ScanMetaData = False\r
+        if Options.folders != None:\r
+            self.OnlyScan = True\r
 \r
     ## SetLogLevel\r
     #\r
@@ -371,6 +406,7 @@ class Ecc(object):
                                                                                    "and warning messages, etc.")\r
         Parser.add_option("-d", "--debug", action="store", type="int", help="Enable debug messages at specified level.")\r
         Parser.add_option("-w", "--workspace", action="store", type="string", dest='Workspace', help="Specify workspace.")\r
+        Parser.add_option("-f", "--folders", action="store_true", type=None, help="Only scanning specified folders which are recorded in config.ini file.")\r
 \r
         (Opt, Args)=Parser.parse_args()\r
 \r