Enhance ECC tools:
authorqhuang8 <qhuang8@c2973edb-eda0-4c78-bc6a-9341b269661f>
Tue, 2 Feb 2010 10:05:50 +0000 (10:05 +0000)
committerqhuang8 <qhuang8@c2973edb-eda0-4c78-bc6a-9341b269661f>
Tue, 2 Feb 2010 10:05:50 +0000 (10:05 +0000)
1. Add same Include File Name checkpoint
2. Add -w option support to specify workspace environment
3. Add -e option support to specify an exception file list
4. Print out the error file, line number, error info in the command output in the standard format to be captured by some editor when ECC tool is run as the plug in.

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

Source/Python/Ecc/Check.py
Source/Python/Ecc/Ecc.py
Source/Python/Table/TableReport.py

index c8bc54d..79659f7 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to define checkpoints used by ECC tool\r
 #\r
-# Copyright (c) 2008, Intel Corporation\r
+# Copyright (c) 2008 - 2010, Intel Corporation\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
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -298,7 +298,8 @@ class Check(object):
             for Key in RecordDict:\r
                 if len(RecordDict[Key]) > 1:\r
                     for Item in RecordDict[Key]:\r
-                        EccGlobalData.gDb.TblReport.Insert(ERROR_INCLUDE_FILE_CHECK_NAME, OtherMsg = "The file name for '%s' is duplicate" % (Item[1]), BelongsToTable = 'File', BelongsToItem = Item[0])\r
+                        if not EccGlobalData.gException.IsException(ERROR_INCLUDE_FILE_CHECK_NAME, Item[1]):\r
+                            EccGlobalData.gDb.TblReport.Insert(ERROR_INCLUDE_FILE_CHECK_NAME, OtherMsg = "The file name for [%s] is duplicate" % (Item[1]), BelongsToTable = 'File', BelongsToItem = Item[0])\r
 \r
     # Check whether all include file contents is guarded by a #ifndef statement.\r
     def IncludeFileCheckIfndef(self):\r
@@ -738,17 +739,17 @@ class Check(object):
                     self.NamingConventionCheckDefineStatement(FileTable)\r
                     self.NamingConventionCheckTypedefStatement(FileTable)\r
                     self.NamingConventionCheckIfndefStatement(FileTable)\r
-                    self.NamingConventionCheckVariableName(FileTable)           \r
+                    self.NamingConventionCheckVariableName(FileTable)\r
                     self.NamingConventionCheckSingleCharacterVariable(FileTable)\r
 \r
         self.NamingConventionCheckPathName()\r
         self.NamingConventionCheckFunctionName()\r
-        \r
+\r
     # Check whether only capital letters are used for #define declarations\r
     def NamingConventionCheckDefineStatement(self, FileTable):\r
         if EccGlobalData.gConfig.NamingConventionCheckDefineStatement == '1' or EccGlobalData.gConfig.NamingConventionCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':\r
             EdkLogger.quiet("Checking naming covention of #define statement ...")\r
-            \r
+\r
             SqlCommand = """select ID, Value from %s where Model = %s""" %(FileTable, MODEL_IDENTIFIER_MACRO_DEFINE)\r
             RecordSet = EccGlobalData.gDb.TblFile.Exec(SqlCommand)\r
             for Record in RecordSet:\r
@@ -763,7 +764,7 @@ class Check(object):
     def NamingConventionCheckTypedefStatement(self, FileTable):\r
         if EccGlobalData.gConfig.NamingConventionCheckTypedefStatement == '1' or EccGlobalData.gConfig.NamingConventionCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':\r
             EdkLogger.quiet("Checking naming covention of #typedef statement ...")\r
-            \r
+\r
             SqlCommand = """select ID, Name from %s where Model = %s""" %(FileTable, MODEL_IDENTIFIER_TYPEDEF)\r
             RecordSet = EccGlobalData.gDb.TblFile.Exec(SqlCommand)\r
             for Record in RecordSet:\r
@@ -783,7 +784,7 @@ class Check(object):
     def NamingConventionCheckIfndefStatement(self, FileTable):\r
         if EccGlobalData.gConfig.NamingConventionCheckTypedefStatement == '1' or EccGlobalData.gConfig.NamingConventionCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':\r
             EdkLogger.quiet("Checking naming covention of #ifndef statement ...")\r
-            \r
+\r
             SqlCommand = """select ID, Value from %s where Model = %s""" %(FileTable, MODEL_IDENTIFIER_MACRO_IFNDEF)\r
             RecordSet = EccGlobalData.gDb.TblFile.Exec(SqlCommand)\r
             for Record in RecordSet:\r
@@ -818,7 +819,7 @@ class Check(object):
         if EccGlobalData.gConfig.NamingConventionCheckVariableName == '1' or EccGlobalData.gConfig.NamingConventionCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':\r
             EdkLogger.quiet("Checking naming covention of variable name ...")\r
             Pattern = re.compile(r'^[A-Zgm]+\S*[a-z]\S*$')\r
-            \r
+\r
             SqlCommand = """select ID, Name from %s where Model = %s""" %(FileTable, MODEL_IDENTIFIER_VARIABLE)\r
             RecordSet = EccGlobalData.gDb.TblFile.Exec(SqlCommand)\r
             for Record in RecordSet:\r
@@ -846,7 +847,7 @@ class Check(object):
     def NamingConventionCheckSingleCharacterVariable(self, FileTable):\r
         if EccGlobalData.gConfig.NamingConventionCheckSingleCharacterVariable == '1' or EccGlobalData.gConfig.NamingConventionCheckAll == '1' or EccGlobalData.gConfig.CheckAll == '1':\r
             EdkLogger.quiet("Checking naming covention of single character variable name ...")\r
-            \r
+\r
             SqlCommand = """select ID, Name from %s where Model = %s""" %(FileTable, MODEL_IDENTIFIER_VARIABLE)\r
             RecordSet = EccGlobalData.gDb.TblFile.Exec(SqlCommand)\r
             for Record in RecordSet:\r
index ea9d0b3..df9934a 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, Intel Corporation\r
+# Copyright (c) 2009 - 2010, Intel Corporation\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
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -225,6 +225,9 @@ class Ecc(object):
         EdkLogger.quiet("Loading ECC configuration ... done")\r
         (Options, Target) = self.EccOptionParser()\r
 \r
+        if Options.Workspace:\r
+            os.environ["WORKSPACE"] = Options.Workspace\r
+            \r
         # Check workspace envirnoment\r
         if "WORKSPACE" not in os.environ:\r
             EdkLogger.error("ECC", BuildToolError.ATTRIBUTE_NOT_AVAILABLE, "Environment variable not found",\r
@@ -244,6 +247,8 @@ class Ecc(object):
             self.OutputFile = Options.OutputFile\r
         if Options.ReportFile != None:\r
             self.ReportFile = Options.ReportFile\r
+        if Options.ExceptionFile != None:\r
+            self.ExceptionFile = Options.ExceptionFile\r
         if Options.Target != None:\r
             if not os.path.isdir(Options.Target):\r
                 EdkLogger.error("ECC", BuildToolError.OPTION_VALUE_INVALID, ExtraData="Target [%s] does NOT exist" % Options.Target)\r
@@ -294,6 +299,8 @@ class Ecc(object):
             help="Specify the name of an output file, if and only if one filename was specified.")\r
         Parser.add_option("-r", "--reportfile filename", action="store", type="string", dest="ReportFile",\r
             help="Specify the name of an report file, if and only if one filename was specified.")\r
+        Parser.add_option("-e", "--exceptionfile filename", action="store", type="string", dest="ExceptionFile",\r
+            help="Specify the name of an exception file, if and only if one filename was specified.")\r
         Parser.add_option("-m", "--metadata", action="store_true", type=None, help="Only scan meta-data files information if this option is specified.")\r
         Parser.add_option("-s", "--sourcecode", action="store_true", type=None, help="Only scan source code files information if this option is specified.")\r
         Parser.add_option("-k", "--keepdatabase", action="store_true", type=None, help="The existing Ecc database will not be cleaned except report information if this option is specified.")\r
@@ -307,6 +314,7 @@ class Ecc(object):
                                                                                    "including library instances selected, final dependency expression, "\\r
                                                                                    "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
 \r
         (Opt, Args)=Parser.parse_args()\r
 \r
index 042c1b7..777a479 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to create/update/query/erase table for ECC reports\r
 #\r
-# Copyright (c) 2008, Intel Corporation\r
+# Copyright (c) 2008 - 2010, Intel Corporation\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
 # which accompanies this distribution.  The full text of the license may be found at\r
@@ -114,7 +114,8 @@ class TableReport(Table):
                 NewRecord = self.Exec(SqlCommand)\r
                 if NewRecord != []:\r
                     File.write("""%s,%s,"%s",%s,%s,"%s"\n""" % (Index, ErrorID, EccToolError.gEccErrorMessage[ErrorID], NewRecord[0][1], NewRecord[0][0], OtherMsg))\r
-            \r
+                    EdkLogger.quiet("%s(%s): [%s]%s %s" % (NewRecord[0][1], NewRecord[0][0], ErrorID, EccToolError.gEccErrorMessage[ErrorID], OtherMsg))\r
+                    \r
             File.close()\r
         except IOError:\r
             NewFilename = 'Report_' + time.strftime("%Y%m%d_%H%M%S.csv", time.localtime())\r