1. Add a switch to enable/disable error raise for EdkLogger
[people/mcb30/basetools.git] / Source / Python / Ecc / Ecc.py
1 ## @file\r
2 # This file is used to be the main entrance of ECC tool\r
3 #\r
4 # Copyright (c) 2008, Intel Corporation\r
5 # All rights reserved. This program and the accompanying materials\r
6 # are licensed and made available under the terms and conditions of the BSD License\r
7 # which accompanies this distribution.  The full text of the license may be found at\r
8 # http://opensource.org/licenses/bsd-license.php\r
9 #\r
10 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 #\r
13 \r
14 ##\r
15 # Import Modules\r
16 #\r
17 import os, time, glob\r
18 from optparse import OptionParser\r
19 import Common.EdkLogger as EdkLogger\r
20 import Database\r
21 from Configuration import Configuration\r
22 from Check import Check\r
23 import EccGlobalData\r
24 from Common.InfClassObject import Inf\r
25 from Common.DecClassObject import Dec\r
26 from Common.DscClassObject import Dsc\r
27 from Common.String import NormPath\r
28 #import c\r
29 \r
30 ## Ecc\r
31 #\r
32 # This class is used to define Ecc main entrance\r
33 #\r
34 # @param object:          Inherited from object class\r
35 #\r
36 class Ecc(object):\r
37     def __init__(self):\r
38         # Version and Copyright\r
39         self.VersionNumber = "0.01"\r
40         self.Version = "%prog Version " + self.VersionNumber\r
41         self.Copyright = "Copyright (c) 2008, Intel Corporation  All rights reserved."\r
42         \r
43         self.ConfigFile = 'config.ini'\r
44         self.OutputFile = 'output.txt'\r
45         \r
46         #\r
47         # Initialize log system\r
48         #\r
49         EdkLogger.Initialize()\r
50         EdkLogger.IsRaiseError = False\r
51         EdkLogger.quiet(time.strftime("%H:%M:%S, %b.%d %Y ", time.localtime()) + "[00:00]" + "\n")\r
52         \r
53         #\r
54         # Parse the options and args\r
55         #\r
56         self.ParseOption()\r
57 \r
58         #\r
59         # Generate checkpoints list\r
60         #\r
61         EccGlobalData.gConfig = Configuration(self.ConfigFile)\r
62         \r
63         #\r
64         # Init Ecc database\r
65         #\r
66         EccGlobalData.gDb = Database.Database(Database.DATABASE_PATH)\r
67         EccGlobalData.gDb.InitDatabase()\r
68         \r
69         #\r
70         # Build ECC database\r
71         #\r
72         self.BuildDatabase()\r
73         \r
74         #\r
75         # Start to check\r
76         #\r
77         self.Check()\r
78         \r
79         #\r
80         # Show report\r
81         #\r
82         self.GenReport()\r
83         \r
84         #\r
85         # Close Database\r
86         #\r
87         EccGlobalData.gDb.Close()\r
88 \r
89     ## BuildDatabase\r
90     #\r
91     # Build the database for target\r
92     #\r
93     def BuildDatabase(self):\r
94         EdkLogger.quiet("Building database for source code ...")\r
95         #c.CollectSourceCodeDataIntoDB(EccGlobalData.gTarget)\r
96         EdkLogger.quiet("Building database for source code done!")\r
97         \r
98         self.BuildMetaDataFileDatabase()\r
99     \r
100     ## BuildMetaDataFileDatabase\r
101     #\r
102     # Build the database for meta data files\r
103     #\r
104     def BuildMetaDataFileDatabase(self):\r
105         EdkLogger.quiet("Building database for meta data files ...")\r
106         Op = open(EccGlobalData.gConfig.MetaDataFileCheckPathOfGenerateFileList, 'w+')\r
107         for Root, Dirs, Files in os.walk(EccGlobalData.gTarget):\r
108             if "CVS" in Dirs:\r
109                 Dirs.remove('CVS')\r
110             if ".svn" in Dirs:\r
111                 Dirs.remove('.svn')\r
112             if "EdkCompatibilityPkg" in Dirs:\r
113                 Dirs.remove('EdkCompatibilityPkg')\r
114             \r
115             for File in Files:\r
116                 if len(File) > 4 and File[-4:].upper() == ".DEC":\r
117                     Filename = os.path.normpath(os.path.join(Root, File))\r
118                     EdkLogger.quiet("Parsing %s" % Filename)\r
119                     Op.write("%s\r" % Filename)\r
120                     Dec(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
121                     continue\r
122                 if len(File) > 4 and File[-4:].upper() == ".DSC":\r
123                     Filename = os.path.normpath(os.path.join(Root, File))\r
124                     EdkLogger.quiet("Parsing %s" % Filename)\r
125                     Op.write("%s\r" % Filename)\r
126                     Dsc(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
127                     continue\r
128                 if len(File) > 4 and File[-4:].upper() == ".INF":\r
129                     Filename = os.path.normpath(os.path.join(Root, File))\r
130                     EdkLogger.quiet("Parsing %s" % Filename)\r
131                     Op.write("%s\r" % Filename)\r
132                     Inf(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
133                     continue\r
134                 if len(File) > 4 and File[-4:].upper() == ".FDF":\r
135                     Filename = os.path.normpath(os.path.join(Root, File))\r
136                     EdkLogger.quiet("Parsing %s" % Filename)\r
137                     Op.write("%s\r" % Filename)\r
138                     continue\r
139         Op.close()\r
140 \r
141         EdkLogger.quiet("Building database for meta data files done!")\r
142     \r
143     ##\r
144     #\r
145     # Check each checkpoint\r
146     #\r
147     def Check(self):\r
148         EdkLogger.quiet("Checking ...")\r
149         EccCheck = Check()\r
150         EccCheck.Check()\r
151         EdkLogger.quiet("Checking  done!")\r
152     \r
153     ##\r
154     #\r
155     # Generate the scan report\r
156     #\r
157     def GenReport(self):\r
158         EdkLogger.quiet("Generating report ...")\r
159         EccGlobalData.gDb.TblReport.ToCSV()\r
160         EdkLogger.quiet("Generating report done!")\r
161     \r
162     ## ParseOption\r
163     #\r
164     # Parse options\r
165     #\r
166     def ParseOption(self):\r
167         EdkLogger.quiet("Loading ECC configuration ... done")\r
168         (Options, Target) = self.EccOptionParser()\r
169         \r
170         #\r
171         # Check workspace envirnoment\r
172         #\r
173         if "WORKSPACE" not in os.environ:\r
174             EdkLogger.error("ECC", ATTRIBUTE_NOT_AVAILABLE, "Environment variable not found", \r
175                             ExtraData="WORKSPACE")\r
176         else:\r
177             EccGlobalData.gWorkspace = os.path.normpath(os.getenv("WORKSPACE"))\r
178             if not os.path.exists(EccGlobalData.gWorkspace):\r
179                 EdkLogger.error("ECC", FILE_NOT_FOUND, ExtraData="WORKSPACE = %s" % EccGlobalData.gWorkspace)\r
180             os.environ["WORKSPACE"] = EccGlobalData.gWorkspace\r
181         #\r
182         # Set log level\r
183         #\r
184         self.SetLogLevel(Options)\r
185         \r
186         #\r
187         # Set other options\r
188         #\r
189         if Options.ConfigFile != None:\r
190             self.ConfigFile = Options.ConfigFile\r
191         if Options.OutputFile != None:\r
192             self.OutputFile = Options.OutputFile\r
193         if Options.Target != None:\r
194             EccGlobalData.gTarget = os.path.normpath(Options.Target)\r
195         else:\r
196             EdkLogger.warn("Ecc", EdkLogger.ECC_ERROR, "The target source tree is not specified, use current WORKSPACE instead.!")\r
197             EccGlobalData.gTarget = os.path.normpath(os.getenv("WORKSPACE"))\r
198            \r
199     ## SetLogLevel\r
200     #\r
201     # Set current log level of the tool based on args\r
202     #\r
203     # @param Option:  The option list including log level setting \r
204     #\r
205     def SetLogLevel(self, Option):\r
206         if Option.verbose != None:\r
207             EdkLogger.SetLevel(EdkLogger.VERBOSE)\r
208         elif Option.quiet != None:\r
209             EdkLogger.SetLevel(EdkLogger.QUIET)\r
210         elif Option.debug != None:\r
211             EdkLogger.SetLevel(Option.debug + 1)\r
212         else:\r
213             EdkLogger.SetLevel(EdkLogger.INFO)    \r
214 \r
215     ## Parse command line options\r
216     #\r
217     # Using standard Python module optparse to parse command line option of this tool.\r
218     #\r
219     # @retval Opt   A optparse.Values object containing the parsed options\r
220     # @retval Args  Target of build command\r
221     #\r
222     def EccOptionParser(self):\r
223         Parser = OptionParser(description = self.Copyright, version = self.Version, prog = "Ecc.exe", usage = "%prog [options]")\r
224         Parser.add_option("-t", "--target sourcepath", action="store", type="string", dest='Target',\r
225             help="Check all files under the target workspace.")\r
226         Parser.add_option("-c", "--config filename", action="store", type="string", dest="ConfigFile",\r
227             help="Specify a configuration file. Defaultly use config.ini under ECC tool directory.")\r
228         Parser.add_option("-o", "--outfile filename", action="store", type="string", dest="OutputFile",\r
229             help="Specify the name of an output file, if and only if one filename was specified.")\r
230     \r
231         Parser.add_option("-l", "--log filename", action="store", dest="LogFile", help="""If specified, the tool should emit the changes that \r
232                                                                                           were made by the tool after printing the result message. \r
233                                                                                           If filename, the emit to the file, otherwise emit to \r
234                                                                                           standard output. If no modifications were made, then do not \r
235                                                                                           create a log file, or output a log message.""")\r
236         Parser.add_option("-q", "--quiet", action="store_true", type=None, help="Disable all messages except FATAL ERRORS.")\r
237         Parser.add_option("-v", "--verbose", action="store_true", type=None, help="Turn on verbose output with informational messages printed, "\\r
238                                                                                    "including library instances selected, final dependency expression, "\\r
239                                                                                    "and warning messages, etc.")\r
240         Parser.add_option("-d", "--debug", action="store", type="int", help="Enable debug messages at specified level.")\r
241     \r
242         (Opt, Args)=Parser.parse_args()\r
243         \r
244         return (Opt, Args)\r
245 \r
246 ##\r
247 #\r
248 # This acts like the main() function for the script, unless it is 'import'ed into another\r
249 # script.\r
250 #\r
251 if __name__ == '__main__':\r
252     Ecc = Ecc()\r
253 \r