]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java
PCD tools update:
[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
8840ad58 21import java.util.UUID;\r
878ddf1f 22\r
23import org.tianocore.build.global.GlobalData;\r
24import org.tianocore.build.pcd.entity.MemoryDatabaseManager;\r
25import org.tianocore.build.pcd.entity.Token;\r
26import org.tianocore.build.pcd.entity.UsageInstance;\r
27import org.tianocore.build.pcd.exception.BuildActionException;\r
28import org.tianocore.build.pcd.exception.EntityException;\r
29\r
30/** This class is to manage how to generate the PCD information into Autogen.c and\r
31 Autogen.h.\r
32**/\r
33public class PCDAutoGenAction extends BuildAction {\r
34 ///\r
35 /// The reference of DBManager in GlobalData class.\r
36 ///\r
37 private MemoryDatabaseManager dbManager;\r
38 ///\r
39 /// The name of module which is analysised currently.\r
40 ///\r
41 private String moduleName;\r
42 ///\r
8840ad58 43 /// The Guid of module which is analyzed currently.\r
44 /// \r
45 private UUID moduleGuid;\r
46 ///\r
47 /// The name of package whose module is analysized currently.\r
48 /// \r
49 private String packageName;\r
50 ///\r
51 /// The Guid of package whose module is analyszed curretnly.\r
52 /// \r
53 private UUID packageGuid;\r
54 ///\r
55 /// The arch of current module\r
56 /// \r
57 private String arch;\r
58 ///\r
59 /// The version of current module\r
60 /// \r
61 private String version;\r
62 ///\r
878ddf1f 63 /// Wheter current module is PCD emulated driver. It is only for \r
64 /// emulated PCD driver and will be kept until PCD IMAGE tool ready.\r
65 ///\r
66 private boolean isEmulatedPCDDriver;\r
67 ///\r
8840ad58 68 /// Whether current autogen is for building library used by current module.\r
69 /// \r
70 private boolean isBuildUsedLibrary;\r
71 ///\r
878ddf1f 72 /// The generated string for header file.\r
73 ///\r
74 private String hAutoGenString;\r
75 ///\r
76 /// The generated string for C code file.\r
77 ///\r
78 private String cAutoGenString; \r
79\r
80 /**\r
81 Set parameter ModuleName\r
82 \r
83 @param moduleName the module name parameter.\r
84 **/\r
85 public void setModuleName(String moduleName) {\r
86 this.moduleName = moduleName;\r
87 }\r
88\r
8840ad58 89 public void setModuleGuid(UUID moduleGuid) {\r
90 this.moduleGuid = moduleGuid;\r
91 }\r
92\r
93 public void setPackageName(String packageName) {\r
94 this.packageName = packageName;\r
95 }\r
96\r
97 public void setPackageGuid(UUID packageGuid) {\r
98 this.packageGuid = packageGuid;\r
99 }\r
100\r
101 public void setArch(String arch) {\r
102 this.arch = arch;\r
103 }\r
104\r
105 public void setVersion(String version) {\r
106 this.version = version;\r
107 }\r
108\r
878ddf1f 109 /**\r
110 Set parameter isEmulatedPCDDriver\r
111 \r
112 @param isEmulatedPCDDriver whether this module is PeiEmulatedPCD driver\r
113 **/\r
114 public void setIsEmulatedPCDDriver(boolean isEmulatedPCDDriver) {\r
115 this.isEmulatedPCDDriver = isEmulatedPCDDriver;\r
116 }\r
117\r
8840ad58 118 public void setIsBuildUsedLibrary(boolean isBuildUsedLibrary) {\r
119 this.isBuildUsedLibrary = isBuildUsedLibrary;\r
120 }\r
121\r
878ddf1f 122 /**\r
123 Get the output of generated string for header file.\r
124 \r
125 @return the string of header file for PCD\r
126 **/\r
127 public String OutputH() {\r
128 return hAutoGenString;\r
129 }\r
130\r
131 /**\r
132 Get the output of generated string for C Code file.\r
133 \r
134 @return the string of C code file for PCD\r
135 **/\r
136 public String OutputC() {\r
137 return cAutoGenString;\r
138 }\r
139\r
140 /**\r
141 Construct function\r
142 \r
143 This function mainly initialize some member variable.\r
144 \r
145 @param moduleName Parameter of this action class.\r
146 @param isEmulatedPCDDriver Parameter of this action class.\r
147 **/\r
8840ad58 148 public PCDAutoGenAction(String moduleName, \r
149 UUID moduleGuid, \r
150 String packageName,\r
151 UUID packageGuid,\r
152 String arch,\r
153 String version,\r
154 boolean isEmulatedPCDDriver, \r
155 boolean isBuildUsedLibrary) {\r
156 dbManager = null;\r
157 hAutoGenString = "";\r
158 cAutoGenString = "";\r
159\r
878ddf1f 160 setIsEmulatedPCDDriver(isEmulatedPCDDriver);\r
161 setModuleName(moduleName);\r
8840ad58 162 setModuleGuid(moduleGuid);\r
163 setPackageName(packageName);\r
164 setPackageGuid(packageGuid);\r
165 setArch(arch);\r
166 setVersion(version);\r
167 setIsBuildUsedLibrary(isBuildUsedLibrary);\r
878ddf1f 168 }\r
169\r
170 /**\r
171 check the parameter for action class.\r
172 \r
173 @throws BuildActionException Bad parameter.\r
174 **/\r
175 void checkParameter() throws BuildActionException {\r
176 if(!isEmulatedPCDDriver &&(moduleName == null)) {\r
177 throw new BuildActionException("Wrong module name parameter for PCDAutoGenAction tool!");\r
178 }\r
179\r
180 if(!isEmulatedPCDDriver && moduleName.length() == 0) {\r
181 throw new BuildActionException("Wrong module name parameter for PCDAutoGenAction tool!");\r
182 }\r
878ddf1f 183 }\r
184\r
185 /**\r
186 Core execution function for this action class.\r
187 \r
188 All PCD information of this module comes from memory dabase. The collection\r
189 work should be done before this action execution.\r
190 Currently, we should generated all PCD information(maybe all dynamic) as array \r
191 in Pei emulated driver for simulating PCD runtime database. \r
192 \r
193 @throws BuildActionException Failed to execute this aciton class.\r
194 **/\r
195 void performAction() throws BuildActionException {\r
196 ActionMessage.debug(this, \r
197 "Starting PCDAutoGenAction to generate autogen.h and autogen.c!...");\r
845fdeba 198 //\r
199 // Check the PCD memory database manager is valid.\r
200 //\r
201 if(GlobalData.getPCDMemoryDBManager() == null) {\r
202 throw new BuildActionException("Memory database has not been initlizated!");\r
203 }\r
204\r
205 dbManager = GlobalData.getPCDMemoryDBManager();\r
206\r
207 if(dbManager.getDBSize() == 0) {\r
8840ad58 208 return;\r
845fdeba 209 }\r
210\r
211 ActionMessage.debug(this,\r
212 "PCD memory database contains " + dbManager.getDBSize() + " PCD tokens");\r
878ddf1f 213\r
878ddf1f 214\r
8840ad58 215\r
216 generateAutogenForModule();\r
878ddf1f 217 }\r
218\r
219 /**\r
220 Generate the autogen string for a common module.\r
221 \r
222 All PCD information of this module comes from memory dabase. The collection\r
223 work should be done before this action execution.\r
224 **/\r
225 private void generateAutogenForModule()\r
226 {\r
227 int index;\r
228 List<UsageInstance> usageInstanceArray;\r
229\r
8840ad58 230 if (!isBuildUsedLibrary) {\r
231 usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName,\r
232 moduleGuid,\r
233 packageName,\r
234 packageGuid,\r
235 arch,\r
236 version);\r
237 dbManager.UsageInstanceContext = usageInstanceArray;\r
238 dbManager.CurrentModuleName = moduleName; \r
239 } else {\r
240 usageInstanceArray = dbManager.UsageInstanceContext;\r
241 //\r
242 // For building MDE package, although all module are library, but PCD entries of \r
243 // these library should be used to autogen.\r
244 // \r
245 if (usageInstanceArray == null) {\r
246 usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName,\r
247 moduleGuid,\r
248 packageName,\r
249 packageGuid,\r
250 arch,\r
251 version);\r
252 }\r
253 }\r
878ddf1f 254\r
255 if(usageInstanceArray.size() != 0) {\r
256 //\r
257 // Add "#include 'PcdLib.h'" for Header file\r
258 //\r
259 hAutoGenString = "#include <MdePkg/Include/Library/PcdLib.h>\r\n";\r
260 }\r
261\r
262 for(index = 0; index < usageInstanceArray.size(); index ++) {\r
263 ActionMessage.debug(this,\r
264 "Module " + moduleName + "'s PCD [" + Integer.toHexString(index) + \r
265 "]: " + usageInstanceArray.get(index).parentToken.cName);\r
266 try {\r
8840ad58 267 usageInstanceArray.get(index).generateAutoGen(isBuildUsedLibrary);\r
878ddf1f 268 hAutoGenString += usageInstanceArray.get(index).getHAutogenStr() + "\r\n";\r
269 cAutoGenString += usageInstanceArray.get(index).getCAutogenStr() + "\r\n";\r
270 } catch(EntityException exp) {\r
271 throw new BuildActionException(exp.getMessage());\r
272 }\r
273 }\r
274\r
8840ad58 275 //\r
276 // Work around code, In furture following code should be modified that get \r
277 // these information from Uplevel Autogen tools.\r
278 // \r
32648c62 279 if (moduleName.equalsIgnoreCase("PcdPeim")) {\r
280 hAutoGenString += dbManager.PcdPeimHString;\r
281 cAutoGenString += dbManager.PcdPeimCString;\r
282 } else if (moduleName.equalsIgnoreCase("PcdDxe")) {\r
283 hAutoGenString += dbManager.PcdDxeHString;\r
284 cAutoGenString += dbManager.PcdDxeCString;\r
285 }\r
99d2c3c4 286\r
878ddf1f 287 ActionMessage.debug(this,\r
288 "Module " + moduleName + "'s PCD header file:\r\n" + hAutoGenString + "\r\n"\r
289 );\r
290 ActionMessage.debug(this,\r
291 "Module " + moduleName + "'s PCD C file:\r\n" + cAutoGenString + "\r\n"\r
292 );\r
293 }\r
294\r
98fc92fc 295 /**\r
296 Generate unreference token definition string for PCD emulated string. \r
297 \r
298 Maybe some PCD token definition in FPD but not used by any module or library, we \r
299 should also generate token definition in autoge.h/autogen.c, because maybe some\r
300 driver loaded in shell will use this PCD. \r
301\r
302 @param token The token who want be generated autogen string.\r
303 \r
304 **/\r
305 private void generateUnReferencePcdAutogenString(Token token) {\r
306 hAutoGenString += String.format("#define _PCD_TOKEN_%s 0x%016x\r\n", \r
307 token.cName, token.tokenNumber);\r
308 switch (token.pcdType) {\r
309 case FEATURE_FLAG:\r
310 hAutoGenString += String.format(\r
311 "#define _PCD_VALUE_%s %s\r\n", \r
312 token.cName, \r
313 token.datum.toString()\r
314 );\r
315 hAutoGenString += String.format(\r
316 "extern const BOOLEAN _gPcd_FixedAtBuild_%s;\r\n", \r
317 token.cName\r
318 );\r
319 cAutoGenString += String.format(\r
320 "GLOBAL_REMOVE_IF_UNREFERENCED const BOOLEAN _gPcd_FixedAtBuild_%s = _PCD_VALUE_%s;\r\n",\r
321 token.cName,\r
322 token.cName\r
323 );\r
324 hAutoGenString += String.format(\r
325 "#define _PCD_MODE_%s_%s _PCD_VALUE_%s\r\n",\r
326 Token.GetAutogenDefinedatumTypeString(token.datumType),\r
327 token.cName,\r
328 token.cName\r
329 );\r
330 break;\r
331 case FIXED_AT_BUILD:\r
332 hAutoGenString += String.format(\r
333 "#define _PCD_VALUE_%s %s\r\n", \r
334 token.cName, \r
335 token.datum.toString()\r
336 );\r
337 hAutoGenString += String.format(\r
338 "extern const %s _gPcd_FixedAtBuild_%s;\r\n",\r
339 Token.getAutogendatumTypeString(token.datumType),\r
340 token.cName\r
341 );\r
342 cAutoGenString += String.format(\r
343 "GLOBAL_REMOVE_IF_UNREFERENCED const %s _gPcd_FixedAtBuild_%s = _PCD_VALUE_%s;\r\n",\r
344 Token.getAutogendatumTypeString(token.datumType),\r
345 token.cName,\r
346 token.cName\r
347 );\r
348 hAutoGenString += String.format(\r
349 "#define _PCD_MODE_%s_%s _PCD_VALUE_%s\r\n",\r
350 Token.GetAutogenDefinedatumTypeString(token.datumType),\r
351 token.cName,\r
352 token.cName\r
353 );\r
354 break;\r
355 case PATCHABLE_IN_MODULE:\r
356 hAutoGenString += String.format(\r
357 "#define _PCD_VALUE_%s %s\r\n", \r
358 token.cName, \r
359 token.datum.toString()\r
360 );\r
361 hAutoGenString += String.format(\r
362 "extern %s _gPcd_BinaryPatch_%s;\r\n",\r
363 Token.getAutogendatumTypeString(token.datumType),\r
364 token.cName\r
365 );\r
366 cAutoGenString += String.format(\r
367 "GLOBAL_REMOVE_IF_UNREFERENCED %s _gPcd_BinaryPatch_%s = _PCD_VALUE_%s;\r\n",\r
368 Token.getAutogendatumTypeString(token.datumType),\r
369 token.cName,\r
370 token.cName\r
371 );\r
372 hAutoGenString += String.format(\r
373 "#define _PCD_MODE_%s_%s _gPcd_BinaryPatch_%s\r\n",\r
374 Token.GetAutogenDefinedatumTypeString(token.datumType),\r
375 token.cName,\r
376 token.cName\r
377 );\r
378 break;\r
379 case DYNAMIC:\r
380 hAutoGenString += String.format(\r
381 "#define _PCD_MODE_%s_%s LibPcdGet%s(_PCD_TOKEN_%s)\r\n",\r
382 Token.GetAutogenDefinedatumTypeString(token.datumType),\r
383 token.cName,\r
384 Token.getAutogenLibrarydatumTypeString(token.datumType),\r
385 token.cName\r
386 );\r
387 break;\r
388 case DYNAMIC_EX:\r
389 break;\r
390 default:\r
391 ActionMessage.warning(this, \r
392 "The PCD_TYPE setted by platform is unknown"\r
393 );\r
394 }\r
395\r
396 hAutoGenString += "\r\n";\r
397 cAutoGenString += "\r\n";\r
398 }\r
399 \r
878ddf1f 400 /**\r
401 Test case function\r
402\r
403 @param argv paramter from command line\r
404 **/\r
405 public static void main(String argv[]) {\r
99d2c3c4 406\r
8840ad58 407 String WorkSpace = "M:/ForPcd/edk2";\r
408 String logFilePath = WorkSpace + "/MdePkg/MdePkg.fpd";\r
878ddf1f 409\r
410 //\r
411 // At first, CollectPCDAction should be invoked to collect\r
412 // all PCD information from SPD, MSA, FPD.\r
413 //\r
414 CollectPCDAction collectionAction = new CollectPCDAction();\r
415 GlobalData.initInfo("Tools" + File.separator + "Conf" + File.separator + "FrameworkDatabase.db",\r
99d2c3c4 416 WorkSpace);\r
878ddf1f 417\r
878ddf1f 418 try {\r
99d2c3c4 419 collectionAction.perform(WorkSpace, \r
878ddf1f 420 logFilePath,\r
421 ActionMessage.MAX_MESSAGE_LEVEL);\r
422 } catch(Exception e) {\r
423 e.printStackTrace();\r
424 }\r
425\r
426 //\r
427 // Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c\r
428 //\r
8840ad58 429 PCDAutoGenAction autogenAction = new PCDAutoGenAction("BaseLib",\r
430 null,\r
431 null,\r
432 null,\r
433 null,\r
434 null,\r
435 false,\r
32648c62 436 false\r
878ddf1f 437 );\r
32648c62 438 autogenAction.execute();\r
99d2c3c4 439\r
32648c62 440 System.out.println(autogenAction.OutputH());\r
441 System.out.println("WQWQWQWQWQ");\r
442 System.out.println(autogenAction.OutputC());\r
99d2c3c4 443\r
444\r
98fc92fc 445 System.out.println (autogenAction.hAutoGenString);\r
446 System.out.println (autogenAction.cAutoGenString);\r
447\r
878ddf1f 448 }\r
449}\r