3ffb37030b099eeb4cbb52784290a2f5616b81e0
[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.quiet(time.strftime("%H:%M:%S, %b.%d %Y ", time.localtime()) + "[00:00]" + "\n")\r
51         \r
52         #\r
53         # Parse the options and args\r
54         #\r
55         self.ParseOption()\r
56 \r
57         #\r
58         # Generate checkpoints list\r
59         #\r
60         EccGlobalData.gConfig = Configuration(self.ConfigFile)\r
61         \r
62         #\r
63         # Init Ecc database\r
64         #\r
65         EccGlobalData.gDb = Database.Database(Database.DATABASE_PATH)\r
66         EccGlobalData.gDb.InitDatabase()\r
67         \r
68         #\r
69         # Build ECC database\r
70         #\r
71         self.BuildDatabase()\r
72         \r
73         #\r
74         # Start to check\r
75         #\r
76         self.Check()\r
77         \r
78         #\r
79         # Show report\r
80         #\r
81         self.GenReport()\r
82         \r
83         #\r
84         # Close Database\r
85         #\r
86         EccGlobalData.gDb.Close()\r
87 \r
88     ## BuildDatabase\r
89     #\r
90     # Build the database for target\r
91     #\r
92     def BuildDatabase(self):\r
93         EdkLogger.quiet("Building database for source code ...")\r
94         #c.CollectSourceCodeDataIntoDB(EccGlobalData.gTarget)\r
95         EdkLogger.quiet("Building database for source code done!")\r
96         \r
97         self.BuildMetaDataFileDatabase()\r
98     \r
99     ## BuildMetaDataFileDatabase\r
100     #\r
101     # Build the database for meta data files\r
102     #\r
103     def BuildMetaDataFileDatabase(self):\r
104         EdkLogger.quiet("Building database for meta data files ...")\r
105         Op = open(EccGlobalData.gConfig.MetaDataFileCheckPathOfGenerateFileList, 'w+')\r
106         for Root, Dirs, Files in os.walk(EccGlobalData.gTarget):\r
107             if "CVS" in Dirs:\r
108                 Dirs.remove('CVS')\r
109             if ".svn" in Dirs:\r
110                 Dirs.remove('.svn')\r
111             if "EdkCompatibilityPkg" in Dirs:\r
112                 Dirs.remove('EdkCompatibilityPkg')\r
113             \r
114             for File in Files:\r
115                 if len(File) > 4 and File[-4:].upper() == ".DEC":\r
116                     Filename = os.path.normpath(os.path.join(Root, File))\r
117                     EdkLogger.quiet("Parsing %s" % Filename)\r
118                     Op.write("%s\r" % Filename)\r
119                     Dec(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
120                     continue\r
121                 if len(File) > 4 and File[-4:].upper() == ".DSC":\r
122                     Filename = os.path.normpath(os.path.join(Root, File))\r
123                     EdkLogger.quiet("Parsing %s" % Filename)\r
124                     Op.write("%s\r" % Filename)\r
125                     Dsc(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
126                     continue\r
127                 if len(File) > 4 and File[-4:].upper() == ".INF":\r
128                     Filename = os.path.normpath(os.path.join(Root, File))\r
129                     EdkLogger.quiet("Parsing %s" % Filename)\r
130                     Op.write("%s\r" % Filename)\r
131                     Inf(Filename, True, True, EccGlobalData.gWorkspace, EccGlobalData.gDb)\r
132                     continue\r
133                 if len(File) > 4 and File[-4:].upper() == ".FDF":\r
134                     Filename = os.path.normpath(os.path.join(Root, File))\r
135                     EdkLogger.quiet("Parsing %s" % Filename)\r
136                     Op.write("%s\r" % Filename)\r
137                     continue\r
138         Op.close()\r
139 \r
140         EdkLogger.quiet("Building database for meta data files done!")\r
141     \r
142     ##\r
143     #\r
144     # Check each checkpoint\r
145     #\r
146     def Check(self):\r
147         EdkLogger.quiet("Checking ...")\r
148         EccCheck = Check()\r
149         EccCheck.Check()\r
150         EdkLogger.quiet("Checking  done!")\r
151     \r
152     ##\r
153     #\r
154     # Generate the scan report\r
155     #\r
156     def GenReport(self):\r
157         EdkLogger.quiet("Generating report ...")\r
158         EccGlobalData.gDb.TblReport.ToCSV()\r
159         EdkLogger.quiet("Generating report done!")\r
160     \r
161     ## ParseOption\r
162     #\r
163     # Parse options\r
164     #\r
165     def ParseOption(self):\r
166         EdkLogger.quiet("Loading ECC configuration ... done")\r
167         (Options, Target) = self.EccOptionParser()\r
168         \r
169         #\r
170         # Check workspace envirnoment\r
171         #\r
172         if "WORKSPACE" not in os.environ:\r
173             EdkLogger.error("ECC", ATTRIBUTE_NOT_AVAILABLE, "Environment variable not found", \r
174                             ExtraData="WORKSPACE")\r
175         else:\r
176             EccGlobalData.gWorkspace = os.path.normpath(os.getenv("WORKSPACE"))\r
177             if not os.path.exists(EccGlobalData.gWorkspace):\r
178                 EdkLogger.error("ECC", FILE_NOT_FOUND, ExtraData="WORKSPACE = %s" % EccGlobalData.gWorkspace)\r
179             os.environ["WORKSPACE"] = EccGlobalData.gWorkspace\r
180         #\r
181         # Set log level\r
182         #\r
183         self.SetLogLevel(Options)\r
184         \r
185         #\r
186         # Set other options\r
187         #\r
188         if Options.ConfigFile != None:\r
189             self.ConfigFile = Options.ConfigFile\r
190         if Options.OutputFile != None:\r
191             self.OutputFile = Options.OutputFile\r
192         if Options.Target != None:\r
193             EccGlobalData.gTarget = os.path.normpath(Options.Target)\r
194         else:\r
195             EdkLogger.warn("Ecc", EdkLogger.ECC_ERROR, "The target source tree is not specified, use current WORKSPACE instead.!")\r
196             EccGlobalData.gTarget = os.path.normpath(os.getenv("WORKSPACE"))\r
197            \r
198     ## SetLogLevel\r
199     #\r
200     # Set current log level of the tool based on args\r
201     #\r
202     # @param Option:  The option list including log level setting \r
203     #\r
204     def SetLogLevel(self, Option):\r
205         if Option.verbose != None:\r
206             EdkLogger.SetLevel(EdkLogger.VERBOSE)\r
207         elif Option.quiet != None:\r
208             EdkLogger.SetLevel(EdkLogger.QUIET)\r
209         elif Option.debug != None:\r
210             EdkLogger.SetLevel(Option.debug + 1)\r
211         else:\r
212             EdkLogger.SetLevel(EdkLogger.INFO)    \r
213 \r
214     ## Parse command line options\r
215     #\r
216     # Using standard Python module optparse to parse command line option of this tool.\r
217     #\r
218     # @retval Opt   A optparse.Values object containing the parsed options\r
219     # @retval Args  Target of build command\r
220     #\r
221     def EccOptionParser(self):\r
222         Parser = OptionParser(description = self.Copyright, version = self.Version, prog = "Ecc.exe", usage = "%prog [options]")\r
223         Parser.add_option("-t", "--target sourcepath", action="store", type="string", dest='Target',\r
224             help="Check all files under the target workspace.")\r
225         Parser.add_option("-c", "--config filename", action="store", type="string", dest="ConfigFile",\r
226             help="Specify a configuration file. Defaultly use config.ini under ECC tool directory.")\r
227         Parser.add_option("-o", "--outfile filename", action="store", type="string", dest="OutputFile",\r
228             help="Specify the name of an output file, if and only if one filename was specified.")\r
229     \r
230         Parser.add_option("-l", "--log filename", action="store", dest="LogFile", help="""If specified, the tool should emit the changes that \r
231                                                                                           were made by the tool after printing the result message. \r
232                                                                                           If filename, the emit to the file, otherwise emit to \r
233                                                                                           standard output. If no modifications were made, then do not \r
234                                                                                           create a log file, or output a log message.""")\r
235         Parser.add_option("-q", "--quiet", action="store_true", type=None, help="Disable all messages except FATAL ERRORS.")\r
236         Parser.add_option("-v", "--verbose", action="store_true", type=None, help="Turn on verbose output with informational messages printed, "\\r
237                                                                                    "including library instances selected, final dependency expression, "\\r
238                                                                                    "and warning messages, etc.")\r
239         Parser.add_option("-d", "--debug", action="store", type="int", help="Enable debug messages at specified level.")\r
240     \r
241         (Opt, Args)=Parser.parse_args()\r
242         \r
243         return (Opt, Args)\r
244 \r
245 ##\r
246 #\r
247 # This acts like the main() function for the script, unless it is 'import'ed into another\r
248 # script.\r
249 #\r
250 if __name__ == '__main__':\r
251     Ecc = Ecc()\r
252 \r