a1ca217fda9d3cf895a34d29b1b4ec01ede51a3e
[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             pass\r
56     \r
57     #\r
58     # Generate a list for all files defined in meta-data files\r
59     #\r
60     def MetaDataFileCheckGenerateFileList(self):\r
61         if EccGlobalData.gConfig.MetaDataFileCheckGenerateFileList == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
62             File = EccGlobalData.gConfig.MetaDataFileCheckPathOfGenerateFileList\r
63             pass\r
64     \r
65     #\r
66     # Check whether all Library Instances defined for a given module (or dependent library instance) match the module's type.  \r
67     # Each Library Instance must specify the Supported Module Types in its INF file, \r
68     # and any module specifying the library instance must be one of the supported types.\r
69     #\r
70     def MetaDataFileCheckLibraryInstance(self):\r
71         if EccGlobalData.gConfig.MetaDataFileCheckLibraryInstance == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
72             pass\r
73 \r
74     #\r
75     # Check whether a Library Instance has been defined for all dependent library classes\r
76     #\r
77     def MetaDataFileCheckLibraryInstanceDependent(self):\r
78         if EccGlobalData.gConfig.MetaDataFileCheckLibraryInstanceDependent == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
79             pass\r
80 \r
81     #\r
82     # Check whether the Library Instances specified by the LibraryClasses sections are listed in order of dependencies\r
83     #\r
84     def MetaDataFileCheckLibraryInstanceOrder(self):\r
85         if EccGlobalData.gConfig.MetaDataFileCheckLibraryInstanceOrder == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
86             pass\r
87 \r
88     #\r
89     # Check whether the unnecessary inclusion of library classes in the INF file\r
90     #\r
91     def MetaDataFileCheckLibraryNoUse(self):\r
92         if EccGlobalData.gConfig.MetaDataFileCheckLibraryNoUse == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
93             pass\r
94 \r
95     #\r
96     # 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
97     #\r
98     def MetaDataFileCheckBinaryInfInFdf(self):\r
99         if EccGlobalData.gConfig.MetaDataFileCheckBinaryInfInFdf == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
100             pass\r
101 \r
102     #\r
103     # Not to report error and warning related OS include file such as "windows.h" and "stdio.h"\r
104     # Check whether a PCD is set in a DSC file or the FDF file, but not in both.\r
105     #\r
106     def MetaDataFileCheckPcdDuplicate(self):\r
107         if EccGlobalData.gConfig.MetaDataFileCheckPcdDuplicate == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
108             pass\r
109 \r
110     #\r
111     # Check whether PCD settings in the FDF file can only be related to flash.\r
112     #\r
113     def MetaDataFileCheckPcdFlash(self):\r
114         if EccGlobalData.gConfig.MetaDataFileCheckPcdFlash == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
115             pass\r
116         \r
117     #\r
118     # Check whether PCDs used in INF files but not specified in DSC or FDF files\r
119     #\r
120     def MetaDataFileCheckPcdNoUse(self):\r
121         if EccGlobalData.gConfig.MetaDataFileCheckPcdNoUse == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
122             pass\r
123         \r
124     #\r
125     # Check whether having duplicate guids defined for Guid/Protocol/Ppi\r
126     #\r
127     def MetaDataFileCheckGuidDuplicate(self):\r
128         if EccGlobalData.gConfig.MetaDataFileCheckGuidDuplicate == '1' or EccGlobalData.gConfig.MetaDataFileCheckAll == '1':\r
129             EdkLogger.quiet("Checking duplicate guid/ppi/protocol ...")\r
130             #\r
131             # Check Guid\r
132             #\r
133             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_GUID, MODEL_EFI_GUID, EccGlobalData.gDb.TblDec)\r
134             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_GUID, MODEL_EFI_GUID, EccGlobalData.gDb.TblDsc)\r
135             self.CheckGuidProtocolPpiValue(ERROR_META_DATA_FILE_CHECK_DUPLICATE_GUID, MODEL_EFI_GUID)\r
136             #\r
137             # Check protocol\r
138             #\r
139             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PROTOCOL, MODEL_EFI_PROTOCOL, EccGlobalData.gDb.TblDec)\r
140             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PROTOCOL, MODEL_EFI_PROTOCOL, EccGlobalData.gDb.TblDsc)\r
141             self.CheckGuidProtocolPpiValue(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PROTOCOL, MODEL_EFI_GUID)\r
142             #\r
143             # Check ppi\r
144             #\r
145             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI, MODEL_EFI_PPI, EccGlobalData.gDb.TblDec)\r
146             self.CheckGuidProtocolPpi(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI, MODEL_EFI_PPI, EccGlobalData.gDb.TblDsc)\r
147             self.CheckGuidProtocolPpiValue(ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI, MODEL_EFI_GUID)\r
148 \r
149             EdkLogger.quiet("Checking duplicate guid/ppi/protocol done!")\r
150     \r
151     #\r
152     # Check whether these is duplicate Guid/Ppi/Protocol name\r
153     #\r
154     def CheckGuidProtocolPpi(self, ErrorID, Model, Table):\r
155         Name = ''\r
156         if Model == MODEL_EFI_GUID:\r
157             Name = 'guid'\r
158         if Model == MODEL_EFI_PROTOCOL:\r
159             Name = 'protocol'\r
160         if Model == MODEL_EFI_PPI:\r
161             Name = 'ppi'\r
162         SqlCommand = """\r
163                      select A.ID, A.Value1 from %s as A, %s as B \r
164                      where A.Model = %s and B.Model = %s \r
165                      and A.Value1 = B.Value1 and A.ID <> B.ID \r
166                      group by A.ID\r
167                      """ % (Table.Table, Table.Table, Model, Model)\r
168         RecordSet = Table.Exec(SqlCommand)\r
169         for Record in RecordSet:\r
170             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
171 \r
172     #\r
173     # Check whether these is duplicate Guid/Ppi/Protocol value\r
174     #\r
175     def CheckGuidProtocolPpiValue(self, ErrorID, Model):\r
176         Name = ''\r
177         Table = EccGlobalData.gDb.TblDec\r
178         if Model == MODEL_EFI_GUID:\r
179             Name = 'guid'\r
180         if Model == MODEL_EFI_PROTOCOL:\r
181             Name = 'protocol'\r
182         if Model == MODEL_EFI_PPI:\r
183             Name = 'ppi'\r
184         SqlCommand = """\r
185                      select A.ID, A.Value2 from %s as A, %s as B \r
186                      where A.Model = %s and B.Model = %s \r
187                      and A.Value2 = B.Value2 and A.ID <> B.ID \r
188                      group by A.ID\r
189                      """ % (Table.Table, Table.Table, Model, Model)\r
190         RecordSet = Table.Exec(SqlCommand)\r
191         for Record in RecordSet:\r
192             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
193 \r
194 \r
195 \r
196 ##\r
197 #\r
198 # This acts like the main() function for the script, unless it is 'import'ed into another\r
199 # script.\r
200 #\r
201 if __name__ == '__main__':\r
202     Check = Check()\r
203     Check.Check()