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