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