]> git.proxmox.com Git - mirror_edk2.git/blame - Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java
Convert env var name to all caps.
[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
878ddf1f 295 /**\r
296 Test case function\r
297\r
298 @param argv paramter from command line\r
299 **/\r
300 public static void main(String argv[]) {\r
99d2c3c4 301\r
8840ad58 302 String WorkSpace = "M:/ForPcd/edk2";\r
303 String logFilePath = WorkSpace + "/MdePkg/MdePkg.fpd";\r
878ddf1f 304\r
305 //\r
306 // At first, CollectPCDAction should be invoked to collect\r
307 // all PCD information from SPD, MSA, FPD.\r
308 //\r
309 CollectPCDAction collectionAction = new CollectPCDAction();\r
310 GlobalData.initInfo("Tools" + File.separator + "Conf" + File.separator + "FrameworkDatabase.db",\r
99d2c3c4 311 WorkSpace);\r
878ddf1f 312\r
878ddf1f 313 try {\r
99d2c3c4 314 collectionAction.perform(WorkSpace, \r
878ddf1f 315 logFilePath,\r
316 ActionMessage.MAX_MESSAGE_LEVEL);\r
317 } catch(Exception e) {\r
318 e.printStackTrace();\r
319 }\r
320\r
321 //\r
322 // Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c\r
323 //\r
8840ad58 324 PCDAutoGenAction autogenAction = new PCDAutoGenAction("BaseLib",\r
325 null,\r
326 null,\r
327 null,\r
328 null,\r
329 null,\r
330 false,\r
32648c62 331 false\r
878ddf1f 332 );\r
32648c62 333 autogenAction.execute();\r
99d2c3c4 334\r
32648c62 335 System.out.println(autogenAction.OutputH());\r
336 System.out.println("WQWQWQWQWQ");\r
337 System.out.println(autogenAction.OutputC());\r
99d2c3c4 338\r
339\r
98fc92fc 340 System.out.println (autogenAction.hAutoGenString);\r
341 System.out.println (autogenAction.cAutoGenString);\r
342\r
878ddf1f 343 }\r
344}\r