1. Add a switch to enable/disable error raise for EdkLogger
[people/mcb30/basetools.git] / Source / Python / Ecc / Check.py
1 ## @file\r
2 # This file is used to define checkpoints used by 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 from CommonDataClass.DataClass import *\r
15 from EccToolError import *\r
16 import EccGlobalData\r
17 \r
18 ## Check\r
19 #\r
20 # This class is to define checkpoints used by ECC tool\r
21 #\r
22 # @param object:          Inherited from object class\r
23 #\r
24 class Check(object):\r
25     def __init__(self):\r
26         pass\r
27      \r
28     #\r
29     # Check all required checkpoints\r
30     #   \r
31     def Check(self):\r
32         self.MetaDataFileCheck()\r
33     \r
34     #\r
35     # Meta-Data File Processing Checking\r
36     #\r
37     def MetaDataFileCheck(self):\r
38         self.MetaDataFileCheckPathName()\r
39         self.MetaDataFileCheckGenerateFileList()\r
40         self.MetaDataFileCheckLibraryInstance()\r
41         self.MetaDataFileCheckLibraryInstanceDependent()\r
42         self.MetaDataFileCheckLibraryInstanceOrder()\r
43         self.MetaDataFileCheckLibraryNoUse()\r
44         self.MetaDataFileCheckBinaryInfInFdf()\r
45         self.MetaDataFileCheckPcdDuplicate()\r
46         self.MetaDataFileCheckPcdFlash()\r
47         self.MetaDataFileCheckPcdNoUse()\r
48         self.MetaDataFileCheckGuidDuplicate()\r
49 \r
50     #\r
51     # Check whether each file defined in meta-data exists\r
52     #\r
53     def MetaDataFileCheckPathName(self):\r
54         if EccGlobalData.gConfig.MetaDataFileCheckPathName == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
55             # This item is covered when parsing INF/DEC/DSC files\r
56             pass\r
57     \r
58     #\r
59     # Generate a list for all files defined in meta-data files\r
60     #\r
61     def MetaDataFileCheckGenerateFileList(self):\r
62         if EccGlobalData.gConfig.MetaDataFileCheckGenerateFileList == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
63             # This item is covered when parsing INF/DEC/DSC files\r
64             pass\r
65     \r
66     #\r
67     # Check whether all Library Instances defined for a given module (or dependent library instance) match the module's type.  \r
68     # Each Library Instance must specify the Supported Module Types in its INF file, \r
69     # and any module specifying the library instance must be one of the supported types.\r
70     #\r
71     def MetaDataFileCheckLibraryInstance(self):\r
72         if EccGlobalData.gConfig.MetaDataFileCheckLibraryInstance == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
73             pass\r
74 \r
75     #\r
76     # Check whether a Library Instance has been defined for all dependent library classes\r
77     #\r
78     def MetaDataFileCheckLibraryInstanceDependent(self):\r
79         if EccGlobalData.gConfig.MetaDataFileCheckLibraryInstanceDependent == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
80             pass\r
81 \r
82     #\r
83     # Check whether the Library Instances specified by the LibraryClasses sections are listed in order of dependencies\r
84     #\r
85     def MetaDataFileCheckLibraryInstanceOrder(self):\r
86         if EccGlobalData.gConfig.MetaDataFileCheckLibraryInstanceOrder == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
87             pass\r
88 \r
89     #\r
90     # Check whether the unnecessary inclusion of library classes in the INF file\r
91     #\r
92     def MetaDataFileCheckLibraryNoUse(self):\r
93         if EccGlobalData.gConfig.MetaDataFileCheckLibraryNoUse == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
94             pass\r
95 \r
96     #\r
97     # 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\r
98     #\r
99     def MetaDataFileCheckBinaryInfInFdf(self):\r
100         if EccGlobalData.gConfig.MetaDataFileCheckBinaryInfInFdf == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
101             pass\r
102 \r
103     #\r
104     # Not to report error and warning related OS include file such as "windows.h" and "stdio.h"\r
105     # Check whether a PCD is set in a DSC file or the FDF file, but not in both.\r
106     #\r
107     def MetaDataFileCheckPcdDuplicate(self):\r
108         if EccGlobalData.gConfig.MetaDataFileCheckPcdDuplicate == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
109             pass\r
110 \r
111     #\r
112     # Check whether PCD settings in the FDF file can only be related to flash.\r
113     #\r
114     def MetaDataFileCheckPcdFlash(self):\r
115         if EccGlobalData.gConfig.MetaDataFileCheckPcdFlash == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
116             pass\r
117         \r
118     #\r
119     # Check whether PCDs used in INF files but not specified in DSC or FDF files\r
120     #\r
121     def MetaDataFileCheckPcdNoUse(self):\r
122         if EccGlobalData.gConfig.MetaDataFileCheckPcdNoUse == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
123             pass\r
124         \r
125     #\r
126     # Check whether having duplicate guids defined for Guid/Protocol/Ppi\r
127     #\r
128     def MetaDataFileCheckGuidDuplicate(self):\r
129         if EccGlobalData.gConfig.MetaDataFileCheckGuidDuplicate == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
130             EdkLogger.quiet("Checking duplicate guid/ppi/protocol ...")\r
131             #\r
132             # Check Guid\r
133             #\r
134             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_GUID, MODEL_EFI_GUID, EccGlobalData.gDb.TblDec)\r
135             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_GUID, MODEL_EFI_GUID, EccGlobalData.gDb.TblDsc)\r
136             self.CheckGuidProtocolPpiValue(ERROR_META_DATA_FILE_CHECK_DUPLICATE_GUID, MODEL_EFI_GUID)\r
137             #\r
138             # Check protocol\r
139             #\r
140             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PROTOCOL, MODEL_EFI_PROTOCOL, EccGlobalData.gDb.TblDec)\r
141             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PROTOCOL, MODEL_EFI_PROTOCOL, EccGlobalData.gDb.TblDsc)\r
142             self.CheckGuidProtocolPpiValue(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PROTOCOL, MODEL_EFI_GUID)\r
143             #\r
144             # Check ppi\r
145             #\r
146             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI, MODEL_EFI_PPI, EccGlobalData.gDb.TblDec)\r
147             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI, MODEL_EFI_PPI, EccGlobalData.gDb.TblDsc)\r
148             self.CheckGuidProtocolPpiValue(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI, MODEL_EFI_GUID)\r
149 \r
150             EdkLogger.quiet("Checking duplicate guid/ppi/protocol done!")\r
151     \r
152     #\r
153     # Check whether these is duplicate Guid/Ppi/Protocol name\r
154     #\r
155     def CheckGuidProtocolPpi(self, ErrorID, Model, Table):\r
156         Name = ''\r
157         if Model == MODEL_EFI_GUID:\r
158             Name = 'guid'\r
159         if Model == MODEL_EFI_PROTOCOL:\r
160             Name = 'protocol'\r
161         if Model == MODEL_EFI_PPI:\r
162             Name = 'ppi'\r
163         SqlCommand = """\r
164                      select A.ID, A.Value1 from %s as A, %s as B \r
165                      where A.Model = %s and B.Model = %s \r
166                      and A.Value1 = B.Value1 and A.ID <> B.ID \r
167                      group by A.ID\r
168                      """ % (Table.Table, Table.Table, Model, Model)\r
169         RecordSet = Table.Exec(SqlCommand)\r
170         for Record in RecordSet:\r
171             EccGlobalData.gDb.TblReport.Insert(ErrorID, OtherMsg = "The %s name '%s' is defined more than one time" % (Name, Record[1]), BelongsToTable = Table.Table, BelongsToItem = Record[0])\r
172 \r
173     #\r
174     # Check whether these is duplicate Guid/Ppi/Protocol value\r
175     #\r
176     def CheckGuidProtocolPpiValue(self, ErrorID, Model):\r
177         Name = ''\r
178         Table = EccGlobalData.gDb.TblDec\r
179         if Model == MODEL_EFI_GUID:\r
180             Name = 'guid'\r
181         if Model == MODEL_EFI_PROTOCOL:\r
182             Name = 'protocol'\r
183         if Model == MODEL_EFI_PPI:\r
184             Name = 'ppi'\r
185         SqlCommand = """\r
186                      select A.ID, A.Value2 from %s as A, %s as B \r
187                      where A.Model = %s and B.Model = %s \r
188                      and A.Value2 = B.Value2 and A.ID <> B.ID \r
189                      group by A.ID\r
190                      """ % (Table.Table, Table.Table, Model, Model)\r
191         RecordSet = Table.Exec(SqlCommand)\r
192         for Record in RecordSet:\r
193             EccGlobalData.gDb.TblReport.Insert(ErrorID, OtherMsg = "The %s value '%s' is defined more than one time" % (Name, Record[1]), BelongsToTable = Table.Table, BelongsToItem = Record[0])\r
194 \r
195 \r
196 \r
197 ##\r
198 #\r
199 # This acts like the main() function for the script, unless it is 'import'ed into another\r
200 # script.\r
201 #\r
202 if __name__ == '__main__':\r
203     Check = Check()\r
204     Check.Check()