summaryrefslogtreecommitdiff
path: root/BaseTools/Source/Python/Ecc/Configuration.py
blob: 310cb5716bfa5875e5ec756dfeb6eb546f7990fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
## @file
# This file is used to define class Configuration
#
# Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution.  The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#

##
# Import Modules
#
import os
import Common.EdkLogger as EdkLogger
from Common.DataType import *
from Common.String import *

## Configuration
#
# This class is used to define all items in configuration file
#
# @param Filename:  The name of configuration file, the default is config.ini
#
class Configuration(object):
    def __init__(self, Filename):
        self.Filename = Filename
        
        self.Version = 0.1

        ## Identify to if check all items
        # 1 - Check all items and ignore all other detailed items
        # 0 - Not check all items, the tool will go through all other detailed items to decide to check or not
        #
        self.CheckAll = 0

        ## Identify to if automatically correct mistakes
        # 1 - Automatically correct
        # 0 - Not automatically correct
        # Only the following check points can be automatically corrected, others not listed below are not supported even it is 1
        #
        # GeneralCheckTab
        # GeneralCheckIndentation
        # GeneralCheckLine
        # GeneralCheckCarriageReturn
        # SpaceCheckAll
        #
        self.AutoCorrect = 0
        
        # List customized Modifer here, split with ','
        # Defaultly use the definition in class DataType
        self.ModifierList = MODIFIER_LIST
        
        ## General Checking
        self.GeneralCheckAll = 0
        
        # Check whether NO Tab is used, replaced with spaces
        self.GeneralCheckNoTab = 1
        # The width of Tab
        self.GeneralCheckTabWidth = 2
        # Check whether the indentation is followed coding style
        self.GeneralCheckIndentation = 1
        # The width of indentation
        self.GeneralCheckIndentationWidth = 2
        # Check whether no line is exceeding defined widty
        self.GeneralCheckLine = 1
        # The width of a line
        self.GeneralCheckLineWidth = 120
        # Check whether no use of _asm in the source file
        self.GeneralCheckNo_Asm = 1
        # Check whether no use of "#progma" in source file except "#pragma pack(#)".
        self.GeneralCheckNoProgma = 1
        # Check whether there is a carriage return at the end of the file
        self.GeneralCheckCarriageReturn = 1
        # Check whether the file exists
        self.GeneralCheckFileExistence = 1
        
        ## Space Checking
        self.SpaceCheckAll = 1
        
        ## Predicate Expression Checking
        self.PredicateExpressionCheckAll = 0
        
        # Check whether Boolean values, variable type BOOLEAN not use explicit comparisons to TRUE or FALSE
        self.PredicateExpressionCheckBooleanValue = 1
        # Check whether Non-Boolean comparisons use a compare operator (==, !=, >, < >=, <=). 
        self.PredicateExpressionCheckNonBooleanOperator = 1
        # Check whether a comparison of any pointer to zero must be done via the NULL type
        self.PredicateExpressionCheckComparisonNullType = 1
        
        ## Headers Checking
        self.HeaderCheckAll = 0
        
        # Check whether File header exists
        self.HeaderCheckFile = 1
        # Check whether Function header exists
        self.HeaderCheckFunction = 1
        
        ## C Function Layout Checking
        self.CFunctionLayoutCheckAll = 0
        
        # Check whether return type exists and in the first line
        self.CFunctionLayoutCheckReturnType = 1
        # Check whether any optional functional modifiers exist and next to the return type
        self.CFunctionLayoutCheckOptionalFunctionalModifier = 1
        # Check whether the next line contains the function name, left justified, followed by the beginning of the parameter list
        # Check whether the closing parenthesis is on its own line and also indented two spaces
        self.CFunctionLayoutCheckFunctionName = 1
        # Check whether the function prototypes in include files have the same form as function definitions
        self.CFunctionLayoutCheckFunctionPrototype = 1
        # Check whether the body of a function is contained by open and close braces that must be in the first column
        self.CFunctionLayoutCheckFunctionBody = 1
        # Check whether the data declarations is the first code in a module.
        self.CFunctionLayoutCheckDataDeclaration = 1
        # Check whether no initialization of a variable as part of its declaration
        self.CFunctionLayoutCheckNoInitOfVariable = 1
        # Check whether no use of STATIC for functions
        self.CFunctionLayoutCheckNoStatic = 1
        
        ## Include Files Checking
        self.IncludeFileCheckAll = 0
        
        #Check whether having include files with same name
        self.IncludeFileCheckSameName = 1
        # Check whether all include file contents is guarded by a #ifndef statement.
        # the #ifndef must be the first line of code following the file header comment
        # the #endif must appear on the last line in the file
        self.IncludeFileCheckIfndefStatement = 1
        # Check whether include files contain only public or only private data
        # Check whether include files NOT contain code or define data variables
        self.IncludeFileCheckData = 1
        
        ## Declarations and Data Types Checking
        self.DeclarationDataTypeCheckAll = 0
        
        # Check whether no use of int, unsigned, char, void, static, long in any .c, .h or .asl files.
        self.DeclarationDataTypeCheckNoUseCType = 1
        # Check whether the modifiers IN, OUT, OPTIONAL, and UNALIGNED are used only to qualify arguments to a function and should not appear in a data type declaration
        self.DeclarationDataTypeCheckInOutModifier = 1
        # Check whether the EFIAPI modifier should be used at the entry of drivers, events, and member functions of protocols
        self.DeclarationDataTypeCheckEFIAPIModifier = 1
        # Check whether Enumerated Type has a 'typedef' and the name is capital
        self.DeclarationDataTypeCheckEnumeratedType = 1
        # Check whether Structure Type has a 'typedef' and the name is capital
        self.DeclarationDataTypeCheckStructureDeclaration = 1
        # Check whether having same Structure
        self.DeclarationDataTypeCheckSameStructure = 1
        # Check whether Union Type has a 'typedef' and the name is capital
        self.DeclarationDataTypeCheckUnionType = 1
        
        ## Naming Conventions Checking
        self.NamingConventionCheckAll = 0
        
        # Check whether only capital letters are used for #define declarations
        self.NamingConventionCheckDefineStatement = 1
        # Check whether only capital letters are used for typedef declarations
        self.NamingConventionCheckTypedefStatement = 1
        # Check whether the #ifndef at the start of an include file uses both prefix and postfix underscore characters, '_'.
        self.NamingConventionCheckIfndefStatement = 1
        # Rule for path name, variable name and function name
        # 1. First character should be upper case
        # 2. Existing lower case in a word
        # 3. No space existence
        # Check whether the path name followed the rule
        self.NamingConventionCheckPathName = 1
        # Check whether the variable name followed the rule
        self.NamingConventionCheckVariableName = 1
        # Check whether the function name followed the rule
        self.NamingConventionCheckFunctionName = 1
        # Check whether NO use short variable name with single character
        self.NamingConventionCheckSingleCharacterVariable = 1
        
        ## Doxygen Checking
        self.DoxygenCheckAll = 0
        
        # Check whether the file headers are followed Doxygen special documentation blocks in section 2.3.5
        self.DoxygenCheckFileHeader = 1
        # Check whether the function headers are followed Doxygen special documentation blocks in section 2.3.5
        self.DoxygenCheckFunctionHeader = 1
        # Check whether the first line of text in a comment block is a brief description of the element being documented. 
        # The brief description must end with a period.
        self.DoxygenCheckCommentDescription = 1
        # Check whether comment lines with '///< ... text ...' format, if it is used, it should be after the code section.
        self.DoxygenCheckCommentFormat = 1
        # Check whether only Doxygen commands allowed to mark the code are @bug and @todo.
        self.DoxygenCheckCommand = 1
        
        ## Meta-Data File Processing Checking
        self.MetaDataFileCheckAll = 0
        
        # Check whether each file defined in meta-data exists
        self.MetaDataFileCheckPathName = 1
        # Generate a list for all files defined in meta-data files
        self.MetaDataFileCheckGenerateFileList = 1
        # The path of log file
        self.MetaDataFileCheckPathOfGenerateFileList = 'File.log'
        # Check whether all Library Instances defined for a given module (or dependent library instance) match the module's type.  
        # Each Library Instance must specify the Supported Module Types in its INF file, 
        # and any module specifying the library instance must be one of the supported types.
        self.MetaDataFileCheckLibraryInstance = 1
        # Check whether a Library Instance has been defined for all dependent library classes
        self.MetaDataFileCheckLibraryInstanceDependent = 1
        # Check whether the Library Instances specified by the LibraryClasses sections are listed in order of dependencies
        self.MetaDataFileCheckLibraryInstanceOrder = 1
        # Check whether the unnecessary inclusion of library classes in the INF file
        self.MetaDataFileCheckLibraryNoUse = 1
        # Check whether an INF file is specified in the FDF file, but not in the DSC file, then the INF file must be for a Binary module only
        self.MetaDataFileCheckBinaryInfInFdf = 1
        # Not to report error and warning related OS include file such as "windows.h" and "stdio.h"
        # Check whether a PCD is set in a DSC file or the FDF file, but not in both.
        self.MetaDataFileCheckPcdDuplicate = 1
        # Check whether PCD settings in the FDF file can only be related to flash.
        self.MetaDataFileCheckPcdFlash = 1
        # Check whether PCDs used in INF files but not specified in DSC or FDF files
        self.MetaDataFileCheckPcdNoUse = 1
        # Check whether having duplicate guids defined for Guid/Protocol/Ppi
        self.MetaDataFileCheckGuidDuplicate = 1
        # Check whether all files under module directory are described in INF files
        self.MetaDataFileCheckModuleFileNoUse = 1
        # Check whether the PCD is correctly used in C function via its type
        self.MetaDataFileCheckPcdType = 1
        # Check whether there are FILE_GUID duplication among different INF files
        self.MetaDataFileCheckModuleFileGuidDuplication = 1

        #
        # The check points in this section are reserved
        #
        # GotoStatementCheckAll = 0
        #
        self.SpellingCheckAll = 0

        # The directory listed here will not be parsed, split with ','
        self.SkipDirList = []

        self.ParseConfig()
        
    def ParseConfig(self):
        Filepath = os.path.normpath(self.Filename)
        if not os.path.isfile(Filepath):
            ErrorMsg = "Can't find configuration file '%s'" % Filepath
            EdkLogger.error("Ecc", EdkLogger.ECC_ERROR, ErrorMsg, File = Filepath)
        
        LineNo = 0
        for Line in open(Filepath, 'r'):
            LineNo = LineNo + 1
            Line = CleanString(Line)
            if Line != '':
                List = GetSplitValueList(Line, TAB_EQUAL_SPLIT)
                if List[0] not in self.__dict__:
                    ErrorMsg = "Invalid configuration option '%s' was found" % List[0]
                    EdkLogger.error("Ecc", EdkLogger.ECC_ERROR, ErrorMsg, File = Filepath, Line = LineNo)
                if List[0] == 'ModifierList':
                    List[1] = GetSplitValueList(List[1], TAB_COMMA_SPLIT)
                if List[0] == 'MetaDataFileCheckPathOfGenerateFileList' and List[1] == "":
                    continue
                if List[0] == 'SkipDirList':
                    List[1] = GetSplitValueList(List[1], TAB_COMMA_SPLIT)
                self.__dict__[List[0]] = List[1]
    
    def ShowMe(self):
        print self.Filename
        for Key in self.__dict__.keys():
            print Key, '=', self.__dict__[Key]