2 PCDAutoGenAction class.
4 This class is to manage how to generate the PCD information into Autogen.c and
7 Copyright (c) 2006, Intel Corporation
8 All rights reserved. This program and the accompanying materials
9 are licensed and made available under the terms and conditions of the BSD License
10 which accompanies this distribution. The full text of the license may be found at
11 http://opensource.org/licenses/bsd-license.php
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 package org
.tianocore
.build
.pcd
.action
;
20 import java
.util
.ArrayList
;
21 import java
.util
.List
;
24 import java
.util
.UUID
;
25 import java
.util
.regex
.Matcher
;
26 import java
.util
.regex
.Pattern
;
28 import org
.apache
.xmlbeans
.XmlObject
;
29 import org
.tianocore
.build
.global
.GlobalData
;
30 import org
.tianocore
.build
.global
.SurfaceAreaQuery
;
31 import org
.tianocore
.build
.pcd
.entity
.MemoryDatabaseManager
;
32 import org
.tianocore
.build
.pcd
.entity
.Token
;
33 import org
.tianocore
.build
.pcd
.entity
.UsageInstance
;
34 import org
.tianocore
.build
.pcd
.exception
.BuildActionException
;
35 import org
.tianocore
.build
.pcd
.exception
.EntityException
;
37 /** This class is to manage how to generate the PCD information into Autogen.c and
40 public class PCDAutoGenAction
extends BuildAction
{
42 /// The reference of DBManager in GlobalData class.
44 private MemoryDatabaseManager dbManager
;
46 /// The name of module which is analysised currently.
48 private String moduleName
;
50 /// The Guid of module which is analyzed currently.
52 private UUID moduleGuid
;
54 /// The name of package whose module is analysized currently.
56 private String packageName
;
58 /// The Guid of package whose module is analyszed curretnly.
60 private UUID packageGuid
;
62 /// The arch of current module
66 /// The version of current module
68 private String version
;
70 /// Whether current autogen is for building library used by current module.
72 private boolean isBuildUsedLibrary
;
74 /// The generated string for header file.
76 private String hAutoGenString
;
78 /// The generated string for C code file.
80 private String cAutoGenString
;
82 /// The name array of <PcdCoded> in a module.
84 private String
[] pcdNameArray
;
86 Set parameter ModuleName
88 @param moduleName the module name parameter.
90 public void setModuleName(String moduleName
) {
91 this.moduleName
= moduleName
;
95 set the moduleGuid parameter.
99 public void setModuleGuid(UUID moduleGuid
) {
100 this.moduleGuid
= moduleGuid
;
104 set packageName parameter.
108 public void setPackageName(String packageName
) {
109 this.packageName
= packageName
;
113 set packageGuid parameter.
117 public void setPackageGuid(UUID packageGuid
) {
118 this.packageGuid
= packageGuid
;
126 public void setArch(String arch
) {
131 set version parameter
135 public void setVersion(String version
) {
136 this.version
= version
;
140 set isBuildUsedLibrary parameter.
142 @param isBuildUsedLibrary
144 public void setIsBuildUsedLibrary(boolean isBuildUsedLibrary
) {
145 this.isBuildUsedLibrary
= isBuildUsedLibrary
;
148 set pcdNameArray parameter.
152 public void setPcdNameArray(String
[] pcdNameArray
) {
153 this.pcdNameArray
= pcdNameArray
;
157 Get the output of generated string for header file.
159 @return the string of header file for PCD
161 public String
OutputH() {
162 return hAutoGenString
;
166 Get the output of generated string for C Code file.
168 @return the string of C code file for PCD
170 public String
OutputC() {
171 return cAutoGenString
;
177 This function mainly initialize some member variable.
179 @param moduleName Parameter of this action class.
180 @param isEmulatedPCDDriver Parameter of this action class.
182 public PCDAutoGenAction(String moduleName
,
188 boolean isBuildUsedLibrary
,
189 String
[] pcdNameArray
) {
194 setModuleName(moduleName
);
195 setModuleGuid(moduleGuid
);
196 setPackageName(packageName
);
197 setPackageGuid(packageGuid
);
198 setPcdNameArray(pcdNameArray
);
201 setIsBuildUsedLibrary(isBuildUsedLibrary
);
205 check the parameter for action class.
207 @throws BuildActionException Bad parameter.
209 void checkParameter() throws BuildActionException
{
214 Core execution function for this action class.
216 All PCD information of this module comes from memory dabase. The collection
217 work should be done before this action execution.
218 Currently, we should generated all PCD information(maybe all dynamic) as array
219 in Pei emulated driver for simulating PCD runtime database.
221 @throws BuildActionException Failed to execute this aciton class.
223 void performAction() throws BuildActionException
{
224 ActionMessage
.debug(this,
225 "Starting PCDAutoGenAction to generate autogen.h and autogen.c!...");
227 // Check the PCD memory database manager is valid.
229 if(GlobalData
.getPCDMemoryDBManager() == null) {
230 throw new BuildActionException("Memory database has not been initlizated!");
233 dbManager
= GlobalData
.getPCDMemoryDBManager();
235 if(dbManager
.getDBSize() == 0) {
239 ActionMessage
.debug(this,
240 "PCD memory database contains " + dbManager
.getDBSize() + " PCD tokens");
244 generateAutogenForModule();
248 Generate the autogen string for a common module.
250 All PCD information of this module comes from memory dabase. The collection
251 work should be done before this action execution.
253 private void generateAutogenForModule()
256 List
<UsageInstance
> usageInstanceArray
, usageContext
;
257 String
[] guidStringArray
= null;
258 String guidStringCName
= null;
259 String guidString
= null;
260 UsageInstance usageInstance
= null;
262 if (!isBuildUsedLibrary
) {
263 usageInstanceArray
= dbManager
.getUsageInstanceArrayByModuleName(moduleName
,
269 dbManager
.UsageInstanceContext
= usageInstanceArray
;
270 dbManager
.CurrentModuleName
= moduleName
;
272 usageContext
= dbManager
.UsageInstanceContext
;
274 // For building MDE package, although all module are library, but PCD entries of
275 // these library should be used to autogen.
277 if (usageContext
== null) {
278 usageInstanceArray
= dbManager
.getUsageInstanceArrayByModuleName(moduleName
,
285 usageInstanceArray
= new ArrayList
<UsageInstance
>();
287 // Remove PCD entries which are not belong to this library.
289 for (index
= 0; index
< usageContext
.size(); index
++) {
290 if ((pcdNameArray
== null) || (pcdNameArray
.length
== 0)){
294 for (index2
= 0; index2
< pcdNameArray
.length
; index2
++) {
295 if (pcdNameArray
[index2
].equalsIgnoreCase(usageContext
.get(index
).parentToken
.cName
)) {
296 usageInstanceArray
.add(usageContext
.get(index
));
304 if(usageInstanceArray
.size() != 0) {
306 // Add "#include 'PcdLib.h'" for Header file
308 hAutoGenString
= "#include <MdePkg/Include/Library/PcdLib.h>\r\n";
312 // Generate all PCD entry for a module.
314 for(index
= 0; index
< usageInstanceArray
.size(); index
++) {
315 ActionMessage
.debug(this,
316 "Module " + moduleName
+ "'s PCD [" + Integer
.toHexString(index
) +
317 "]: " + usageInstanceArray
.get(index
).parentToken
.cName
);
319 usageInstance
= usageInstanceArray
.get(index
);
321 // Before generate any PCD information into autogen.h/autogen.c for a module,
322 // generate TokenSpaceGuid array variable firstly. For every dynamicEx type
323 // PCD in this module the token, they are all reference to TokenSpaceGuid
326 if (usageInstanceArray
.get(index
).modulePcdType
== Token
.PCD_TYPE
.DYNAMIC_EX
) {
327 guidStringArray
= usageInstance
.parentToken
.tokenSpaceName
.toString().split("-");
328 guidStringCName
= "_gPcd_TokenSpaceGuid_" +
329 usageInstance
.parentToken
.tokenSpaceName
.toString().replaceAll("-", "_");
330 guidString
= String
.format("{ 0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}",
334 (guidStringArray
[3].substring(0, 2)),
335 (guidStringArray
[3].substring(2, 4)),
336 (guidStringArray
[4].substring(0, 2)),
337 (guidStringArray
[4].substring(2, 4)),
338 (guidStringArray
[4].substring(4, 6)),
339 (guidStringArray
[4].substring(6, 8)),
340 (guidStringArray
[4].substring(8, 10)),
341 (guidStringArray
[4].substring(10, 12)));
342 if (!isBuildUsedLibrary
) {
343 Pattern pattern
= Pattern
.compile("(" + guidStringCName
+ ")+?");
344 Matcher matcher
= pattern
.matcher(cAutoGenString
+ " ");
346 // Find whether this guid array variable has been generated into autogen.c
347 // For different DyanmicEx pcd token who use same token space guid, the token space
348 // guid array should be only generated once.
350 if (!matcher
.find()) {
351 cAutoGenString
+= String
.format("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID %s = %s;\r\n",
358 usageInstance
.generateAutoGen(isBuildUsedLibrary
);
360 // For every PCD entry for this module(usage instance), autogen string would
363 hAutoGenString
+= usageInstance
.getHAutogenStr() + "\r\n";
364 cAutoGenString
+= usageInstance
.getCAutogenStr();
366 } catch(EntityException exp
) {
367 throw new BuildActionException("[PCD Autogen Error]: " + exp
.getMessage());
372 // Work around code, In furture following code should be modified that get
373 // these information from Uplevel Autogen tools.
375 if (moduleName
.equalsIgnoreCase("PcdPeim")) {
376 hAutoGenString
+= dbManager
.PcdPeimHString
;
377 cAutoGenString
+= dbManager
.PcdPeimCString
;
378 } else if (moduleName
.equalsIgnoreCase("PcdDxe")) {
379 hAutoGenString
+= dbManager
.PcdDxeHString
;
380 cAutoGenString
+= dbManager
.PcdDxeCString
;
383 ActionMessage
.debug(this,
384 "Module " + moduleName
+ "'s PCD header file:\r\n" + hAutoGenString
+ "\r\n"
386 ActionMessage
.debug(this,
387 "Module " + moduleName
+ "'s PCD C file:\r\n" + cAutoGenString
+ "\r\n"
394 @param argv paramter from command line
396 public static void main(String argv
[]) {
398 String WorkSpace
= "M:/tianocore/edk2";
399 String logFilePath
= WorkSpace
+ "/EdkNt32Pkg/Nt32.fpd";
400 String
[] nameArray
= null;
403 // At first, CollectPCDAction should be invoked to collect
404 // all PCD information from SPD, MSA, FPD.
406 CollectPCDAction collectionAction
= new CollectPCDAction();
407 GlobalData
.initInfo("Tools" + File
.separator
+ "Conf" + File
.separator
+ "FrameworkDatabase.db",
411 collectionAction
.perform(WorkSpace
,
413 ActionMessage
.MAX_MESSAGE_LEVEL
);
414 } catch(Exception e
) {
419 // Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c
421 PCDAutoGenAction autogenAction
= new PCDAutoGenAction("MonoStatusCode",
429 autogenAction
.execute();
431 System
.out
.println(autogenAction
.OutputH());
432 System
.out
.println("WQWQWQWQWQ");
433 System
.out
.println(autogenAction
.OutputC());