]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java
Use strcasecmp in gcc builds.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / pcd / action / PCDAutoGenAction.java
CommitLineData
878ddf1f 1/** @file\r
2 PCDAutoGenAction class.\r
3\r
4 This class is to manage how to generate the PCD information into Autogen.c and\r
5 Autogen.h.\r
6 \r
7Copyright (c) 2006, Intel Corporation\r
8All rights reserved. This program and the accompanying materials\r
9are licensed and made available under the terms and conditions of the BSD License\r
10which accompanies this distribution. The full text of the license may be found at\r
11http://opensource.org/licenses/bsd-license.php\r
12 \r
13THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
14WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
15\r
16**/\r
17package org.tianocore.build.pcd.action;\r
18\r
19import java.io.File;\r
20import java.util.List;\r
21\r
22import org.tianocore.build.global.GlobalData;\r
23import org.tianocore.build.pcd.entity.MemoryDatabaseManager;\r
24import org.tianocore.build.pcd.entity.Token;\r
25import org.tianocore.build.pcd.entity.UsageInstance;\r
26import org.tianocore.build.pcd.exception.BuildActionException;\r
27import org.tianocore.build.pcd.exception.EntityException;\r
28\r
29/** This class is to manage how to generate the PCD information into Autogen.c and\r
30 Autogen.h.\r
31**/\r
32public class PCDAutoGenAction extends BuildAction {\r
33 ///\r
34 /// The reference of DBManager in GlobalData class.\r
35 ///\r
36 private MemoryDatabaseManager dbManager;\r
37 ///\r
38 /// The name of module which is analysised currently.\r
39 ///\r
40 private String moduleName;\r
41 ///\r
42 /// Wheter current module is PCD emulated driver. It is only for \r
43 /// emulated PCD driver and will be kept until PCD IMAGE tool ready.\r
44 ///\r
45 private boolean isEmulatedPCDDriver;\r
46 ///\r
47 /// The generated string for header file.\r
48 ///\r
49 private String hAutoGenString;\r
50 ///\r
51 /// The generated string for C code file.\r
52 ///\r
53 private String cAutoGenString; \r
54\r
55 /**\r
56 Set parameter ModuleName\r
57 \r
58 @param moduleName the module name parameter.\r
59 **/\r
60 public void setModuleName(String moduleName) {\r
61 this.moduleName = moduleName;\r
62 }\r
63\r
64 /**\r
65 Set parameter isEmulatedPCDDriver\r
66 \r
67 @param isEmulatedPCDDriver whether this module is PeiEmulatedPCD driver\r
68 **/\r
69 public void setIsEmulatedPCDDriver(boolean isEmulatedPCDDriver) {\r
70 this.isEmulatedPCDDriver = isEmulatedPCDDriver;\r
71 }\r
72\r
73 /**\r
74 Get the output of generated string for header file.\r
75 \r
76 @return the string of header file for PCD\r
77 **/\r
78 public String OutputH() {\r
79 return hAutoGenString;\r
80 }\r
81\r
82 /**\r
83 Get the output of generated string for C Code file.\r
84 \r
85 @return the string of C code file for PCD\r
86 **/\r
87 public String OutputC() {\r
88 return cAutoGenString;\r
89 }\r
90\r
91 /**\r
92 Construct function\r
93 \r
94 This function mainly initialize some member variable.\r
95 \r
96 @param moduleName Parameter of this action class.\r
97 @param isEmulatedPCDDriver Parameter of this action class.\r
98 **/\r
99 public PCDAutoGenAction(String moduleName, boolean isEmulatedPCDDriver) {\r
100 dbManager = null;\r
101 setIsEmulatedPCDDriver(isEmulatedPCDDriver);\r
102 setModuleName(moduleName);\r
103 }\r
104\r
105 /**\r
106 check the parameter for action class.\r
107 \r
108 @throws BuildActionException Bad parameter.\r
109 **/\r
110 void checkParameter() throws BuildActionException {\r
111 if(!isEmulatedPCDDriver &&(moduleName == null)) {\r
112 throw new BuildActionException("Wrong module name parameter for PCDAutoGenAction tool!");\r
113 }\r
114\r
115 if(!isEmulatedPCDDriver && moduleName.length() == 0) {\r
116 throw new BuildActionException("Wrong module name parameter for PCDAutoGenAction tool!");\r
117 }\r
118\r
119 //\r
120 // Check the PCD memory database manager is valid.\r
121 //\r
122 if(GlobalData.getPCDMemoryDBManager() == null) {\r
123 throw new BuildActionException("Memory database has not been initlizated!");\r
124 }\r
125\r
126 dbManager = GlobalData.getPCDMemoryDBManager();\r
127\r
128 if(dbManager.getDBSize() == 0) {\r
129 throw new BuildActionException("Memory database does not contain any record!");\r
130 }\r
131\r
132 ActionMessage.debug(this,\r
133 "PCD memory database contains " + dbManager.getDBSize() + " PCD tokens");\r
134 }\r
135\r
136 /**\r
137 Core execution function for this action class.\r
138 \r
139 All PCD information of this module comes from memory dabase. The collection\r
140 work should be done before this action execution.\r
141 Currently, we should generated all PCD information(maybe all dynamic) as array \r
142 in Pei emulated driver for simulating PCD runtime database. \r
143 \r
144 @throws BuildActionException Failed to execute this aciton class.\r
145 **/\r
146 void performAction() throws BuildActionException {\r
147 ActionMessage.debug(this, \r
148 "Starting PCDAutoGenAction to generate autogen.h and autogen.c!...");\r
149\r
150 hAutoGenString = "";\r
151 cAutoGenString = "";\r
152\r
153 if(isEmulatedPCDDriver) {\r
154 generateAutogenForPCDEmulatedDriver();\r
155 } else {\r
156 generateAutogenForModule();\r
157 }\r
158 }\r
159\r
160 /**\r
161 Generate the autogen string for a common module.\r
162 \r
163 All PCD information of this module comes from memory dabase. The collection\r
164 work should be done before this action execution.\r
165 **/\r
166 private void generateAutogenForModule()\r
167 {\r
168 int index;\r
169 List<UsageInstance> usageInstanceArray;\r
170\r
171 usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName);\r
172\r
173 if(usageInstanceArray.size() != 0) {\r
174 //\r
175 // Add "#include 'PcdLib.h'" for Header file\r
176 //\r
177 hAutoGenString = "#include <MdePkg/Include/Library/PcdLib.h>\r\n";\r
178 }\r
179\r
180 for(index = 0; index < usageInstanceArray.size(); index ++) {\r
181 ActionMessage.debug(this,\r
182 "Module " + moduleName + "'s PCD [" + Integer.toHexString(index) + \r
183 "]: " + usageInstanceArray.get(index).parentToken.cName);\r
184 try {\r
185 usageInstanceArray.get(index).generateAutoGen();\r
186 hAutoGenString += usageInstanceArray.get(index).getHAutogenStr() + "\r\n";\r
187 cAutoGenString += usageInstanceArray.get(index).getCAutogenStr() + "\r\n";\r
188 } catch(EntityException exp) {\r
189 throw new BuildActionException(exp.getMessage());\r
190 }\r
191 }\r
192\r
193 ActionMessage.debug(this,\r
194 "Module " + moduleName + "'s PCD header file:\r\n" + hAutoGenString + "\r\n"\r
195 );\r
196 ActionMessage.debug(this,\r
197 "Module " + moduleName + "'s PCD C file:\r\n" + cAutoGenString + "\r\n"\r
198 );\r
199 }\r
200\r
201 /**\r
202 Generate all PCD autogen string and the emulated PCD IMAGE array for emulated driver.\r
203 \r
204 Currently, we should generated all PCD information(maybe all dynamic) as array \r
205 in Pei emulated driver for simulating PCD runtime database. \r
206 \r
207 **/\r
208 private void generateAutogenForPCDEmulatedDriver() {\r
209 int index;\r
210 Token[] tokenArray;\r
211 UsageInstance usageInstance;\r
212\r
213 //\r
214 // Add "#include 'PcdLib.h'" for Header file\r
215 //\r
216 hAutoGenString = "#include <MdePkg/Include/Library/PcdLib.h>\r\n";\r
217\r
218 tokenArray = dbManager.getRecordArray();\r
219 for(index = 0; index < tokenArray.length; index ++) {\r
220 //\r
221 // Get one consumer instance and generate autogen for this token.\r
222 //\r
223 if(tokenArray[index].consumers != null ) {\r
224 if(tokenArray[index].consumers.size() == 0) {\r
225 continue;\r
226 }\r
227\r
228 usageInstance = tokenArray[index].consumers.get(0);\r
229 try {\r
230 usageInstance.generateAutoGen();\r
231 } catch(EntityException exp) {\r
232 throw new BuildActionException(exp.getMessage());\r
233 }\r
234\r
235 hAutoGenString += usageInstance.getHAutogenStr();\r
236 cAutoGenString += usageInstance.getCAutogenStr();\r
237\r
238 hAutoGenString += "\r\n";\r
239 cAutoGenString += "\r\n";\r
240 }\r
241 }\r
242\r
243 generatePCDEmulatedArray(tokenArray);\r
244\r
245 ActionMessage.debug(this,\r
246 "PCD emulated driver's header: \r\n" + hAutoGenString + "\r\n"\r
247 );\r
248 ActionMessage.debug(this,\r
249 "PCD emulated driver's C code: \r\n" + cAutoGenString + "\r\n"\r
250 );\r
251\r
252 }\r
253\r
254 /**\r
255 Generate PCDEmulated array in PCDEmulated driver for emulated runtime database.\r
256 \r
257 @param tokenArray All PCD token in memory database.\r
258 \r
259 @throws BuildActionException Unknown PCD_TYPE\r
260 **/\r
261 private void generatePCDEmulatedArray(Token[] tokenArray)\r
262 throws BuildActionException {\r
263 int index;\r
264 Token token;\r
265 String[] guidStrArray;\r
266 String value;\r
267\r
268 //\r
269 // The value of String type of PCD entry maybe use byte array but not string direcly\r
270 // such as {0x1, 0x2, 0x3}, and define PCD1_STRING_Value as L"string define here"\r
271 // For this case, we should generate a string array to C output and use the address\r
272 // of generated string array.\r
273 //\r
274 for(index = 0; index < tokenArray.length; index ++) {\r
275 token = tokenArray[index];\r
276\r
277 if((token.producers.size() == 0) &&(token.consumers.size() == 0)) {\r
278 //\r
279 // If no one use this PCD token, it will not generated in emulated array.\r
280 //\r
281 continue;\r
282 }\r
283 value = token.datum.toString();\r
284 if(token.datumType == Token.DATUM_TYPE.POINTER) {\r
285 if(!((value.charAt(0) == 'L' && value.charAt(1) == '"') ||(value.charAt(0) == '"'))) {\r
286 cAutoGenString += String.format("UINT8 _mPcdArray%08x[] = %s;\r\n", \r
287 index, \r
288 value\r
289 );\r
290 }\r
291 }\r
292 }\r
293\r
294 //\r
295 // Output emulated PCD entry array\r
296 //\r
297 cAutoGenString += "\r\nEMULATED_PCD_ENTRY gEmulatedPcdEntry[] = {\r\n";\r
298\r
299 for(index = 0; index < tokenArray.length; index ++) {\r
300 token = tokenArray[index];\r
301\r
302 if((token.producers.size() == 0) &&(token.consumers.size() == 0)) {\r
303 //\r
304 // If no one use this PCD token, it will not generated in emulated array.\r
305 //\r
306 continue;\r
307 }\r
308\r
309 if(index != 0) {\r
310 cAutoGenString += ",\r\n";\r
311 }\r
312\r
313 //\r
314 // Print Start "{" for a Token item in array\r
315 //\r
316 cAutoGenString += " {\r\n";\r
317\r
318 //\r
319 // Print Token Name\r
320 //\r
321 cAutoGenString += String.format(" _PCD_TOKEN_%s,\r\n", token.cName);\r
322\r
323 //\r
324 // Print Hii information\r
325 //\r
326 if(token.hiiEnabled) {\r
327 cAutoGenString += String.format(" TRUE,\r\n");\r
328 } else {\r
329 cAutoGenString += String.format(" FALSE,\r\n");\r
330 }\r
331\r
332 //\r
333 // Print sku information\r
334 //\r
335 if(token.skuEnabled) {\r
336 cAutoGenString += String.format(" TRUE,\r\n");\r
337 } else {\r
338 cAutoGenString += String.format(" FALSE,\r\n");\r
339 }\r
340\r
341 //\r
342 // Print maxSkuCount\r
343 //\r
344 cAutoGenString += String.format(" %d,\r\n", token.maxSkuCount);\r
345\r
346 cAutoGenString += String.format(" %d,\r\n", token.skuId);\r
347\r
348 if(token.variableGuid == null) {\r
349 cAutoGenString += " { 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },\r\n";\r
350 } else {\r
351 guidStrArray =(token.variableGuid.toString()).split("-");\r
352\r
353 cAutoGenString += String.format(" { 0x%s, 0x%s, 0x%s, { 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s } },\r\n",\r
354 guidStrArray[0],\r
355 guidStrArray[1],\r
356 guidStrArray[2],\r
357 (guidStrArray[3].substring(0, 2)),\r
358 (guidStrArray[3].substring(2, 4)),\r
359 (guidStrArray[4].substring(0, 2)),\r
360 (guidStrArray[4].substring(2, 4)),\r
361 (guidStrArray[4].substring(4, 6)),\r
362 (guidStrArray[4].substring(6, 8)),\r
363 (guidStrArray[4].substring(8, 10)),\r
364 (guidStrArray[4].substring(10, 12))\r
365 );\r
366\r
367 }\r
368\r
369 value = token.datum.toString();\r
370 if(token.datumType == Token.DATUM_TYPE.POINTER) {\r
371 if((value.charAt(0) == 'L' && value.charAt(1) == '"') || value.charAt(0) == '"') {\r
372 cAutoGenString += String.format(" sizeof(_PCD_VALUE_%s),\r\n", token.cName);\r
373 cAutoGenString += String.format(" 0, %s, %s,\r\n", token.variableName, value);\r
374 } else {\r
375 cAutoGenString += String.format(" sizeof(_mPcdArray%08x),\r\n", index);\r
376 cAutoGenString += String.format(" 0, &_mPcdArray%08x, %s,\r\n", index, token.variableName);\r
377 }\r
378 } else {\r
379 switch(token.datumType) {\r
380 case UINT8:\r
381 cAutoGenString += " 1,\r\n";\r
382 break;\r
383 case UINT16:\r
384 cAutoGenString += " 2,\r\n";\r
385 break;\r
386 case UINT32:\r
387 cAutoGenString += " 4,\r\n";\r
388 break;\r
389 case UINT64:\r
390 cAutoGenString += " 8,\r\n";\r
391 break;\r
392 case BOOLEAN:\r
393 cAutoGenString += " 1,\r\n";\r
394 break;\r
395 default:\r
396 throw new BuildActionException("Unknown datum size");\r
397 }\r
398 cAutoGenString += String.format(" %s, %s, NULL,\r\n", value, token.variableName);\r
399 }\r
400\r
401 //\r
402 // Print end "}" for a token item in array\r
403 //\r
404 cAutoGenString += " }";\r
405 }\r
406\r
407 cAutoGenString += "\r\n};\r\n";\r
408 cAutoGenString += "\r\n";\r
409 cAutoGenString += "UINTN\r\n";\r
410 cAutoGenString += "GetPcdDataBaseSize(\r\n";\r
411 cAutoGenString += " VOID\r\n";\r
412 cAutoGenString += " )\r\n";\r
413 cAutoGenString += "{\r\n";\r
414 cAutoGenString += " return sizeof(gEmulatedPcdEntry);\r\n";\r
415 cAutoGenString += "}\r\n";\r
416 }\r
417\r
418 /**\r
419 Test case function\r
420\r
421 @param argv paramter from command line\r
422 **/\r
423 public static void main(String argv[]) {\r
424 String logFilePath = "G:/mdk/EdkNt32Pkg/build/Nt32.fpd";\r
425\r
426 //\r
427 // At first, CollectPCDAction should be invoked to collect\r
428 // all PCD information from SPD, MSA, FPD.\r
429 //\r
430 CollectPCDAction collectionAction = new CollectPCDAction();\r
431 GlobalData.initInfo("Tools" + File.separator + "Conf" + File.separator + "FrameworkDatabase.db",\r
432 "G:/mdk");\r
433\r
434 GlobalData.getPCDMemoryDBManager().setLogFileName(logFilePath + ".PCDMemroyDatabaseLog.txt");\r
435\r
436 try {\r
437 collectionAction.perform("G:/mdk", \r
438 logFilePath,\r
439 ActionMessage.MAX_MESSAGE_LEVEL);\r
440 } catch(Exception e) {\r
441 e.printStackTrace();\r
442 }\r
443\r
444 //\r
445 // Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c\r
446 //\r
447 PCDAutoGenAction autogenAction = new PCDAutoGenAction("HelloWorld",\r
448 true\r
449 );\r
450 autogenAction.execute();\r
451 }\r
452}\r