]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - Tools/Java/Source/GenBuild/org/tianocore/build/global/GlobalData.java
Support MSA build options. Now the build options from four places: 1. tools_def.txt
[mirror_edk2.git] / Tools / Java / Source / GenBuild / org / tianocore / build / global / GlobalData.java
... / ...
CommitLineData
1/** @file\r
2 GlobalData class.\r
3\r
4 GlobalData provide initializing, instoring, querying and update global data.\r
5 It is a bridge to intercommunicate between multiple component, such as AutoGen,\r
6 PCD and so on.\r
7\r
8Copyright (c) 2006, Intel Corporation\r
9All rights reserved. This program and the accompanying materials\r
10are licensed and made available under the terms and conditions of the BSD License\r
11which accompanies this distribution. The full text of the license may be found at\r
12http://opensource.org/licenses/bsd-license.php\r
13\r
14THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
15WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
16**/\r
17package org.tianocore.build.global;\r
18\r
19import java.io.File;\r
20import java.io.IOException;\r
21import java.util.HashMap;\r
22import java.util.HashSet;\r
23import java.util.Iterator;\r
24import java.util.List;\r
25import java.util.Map;\r
26import java.util.Set;\r
27\r
28import org.apache.xmlbeans.XmlException;\r
29import org.apache.xmlbeans.XmlObject;\r
30\r
31import org.tianocore.common.definitions.ToolDefinitions;\r
32import org.tianocore.common.exception.EdkException;\r
33import org.tianocore.common.logger.EdkLog;\r
34import org.tianocore.pcd.entity.MemoryDatabaseManager;\r
35import org.tianocore.DbPathAndFilename;\r
36import org.tianocore.FrameworkDatabaseDocument;\r
37import org.tianocore.ModuleSurfaceAreaDocument;\r
38import org.tianocore.ModuleSurfaceAreaDocument.ModuleSurfaceArea;\r
39import org.tianocore.build.id.FpdModuleIdentification;\r
40import org.tianocore.build.id.ModuleIdentification;\r
41import org.tianocore.build.id.PackageIdentification;\r
42import org.tianocore.build.id.PlatformIdentification;\r
43import org.tianocore.build.toolchain.ToolChainConfig;\r
44import org.tianocore.build.toolchain.ToolChainElement;\r
45import org.tianocore.build.toolchain.ToolChainInfo;\r
46import org.tianocore.build.toolchain.ToolChainKey;\r
47import org.tianocore.build.toolchain.ToolChainMap;\r
48\r
49/**\r
50 GlobalData provide initializing, instoring, querying and update global data.\r
51 It is a bridge to intercommunicate between multiple component, such as AutoGen,\r
52 PCD and so on.\r
53\r
54 <p>Note that all global information are initialized incrementally. All data will\r
55 parse and record only of necessary during build time. </p>\r
56\r
57 @since GenBuild 1.0\r
58**/\r
59public class GlobalData {\r
60 ///\r
61 /// Record current WORKSPACE Directory\r
62 ///\r
63 private static String workspaceDir = "";\r
64\r
65 ///\r
66 /// Be used to ensure Global data will be initialized only once.\r
67 ///\r
68 private static boolean globalFlag = false;\r
69\r
70 ///\r
71 /// Framework Database information: package list and platform list\r
72 ///\r
73 private static Set<PackageIdentification> packageList = new HashSet<PackageIdentification>();\r
74\r
75 private static Set<PlatformIdentification> platformList = new HashSet<PlatformIdentification>();\r
76\r
77 ///\r
78 /// Every detail SPD informations: Module list, Library class definition,\r
79 /// Package header file, GUID/PPI/Protocol definitions\r
80 ///\r
81 private static final Map<PackageIdentification, Spd> spdTable = new HashMap<PackageIdentification, Spd>();\r
82\r
83 ///\r
84 /// Build informations are divided into three parts:\r
85 /// 1. From MSA 2. From FPD 3. From FPD' ModuleSA\r
86 ///\r
87 private static Map<ModuleIdentification, Map<String, XmlObject>> nativeMsa = new HashMap<ModuleIdentification, Map<String, XmlObject>>();\r
88\r
89 private static Map<FpdModuleIdentification, Map<String, XmlObject>> fpdModuleSA= new HashMap<FpdModuleIdentification, Map<String, XmlObject>>();\r
90\r
91 private static Map<String, XmlObject> fpdBuildOptionsMap = new HashMap<String, XmlObject>();\r
92 \r
93 private static XmlObject fpdBuildOptions;\r
94\r
95 private static XmlObject fpdDynamicPcds;\r
96\r
97 ///\r
98 /// Parsed modules list\r
99 ///\r
100 private static Map<FpdModuleIdentification, Map<String, XmlObject>> parsedModules = new HashMap<FpdModuleIdentification, Map<String, XmlObject>>();\r
101\r
102 ///\r
103 /// built modules list with ARCH, TARGET, TOOLCHAIN\r
104 ///\r
105 private static Set<FpdModuleIdentification> builtModules = new HashSet<FpdModuleIdentification>();\r
106\r
107 ///\r
108 /// PCD memory database stored all PCD information which collected from FPD,MSA and SPD.\r
109 ///\r
110 private static final MemoryDatabaseManager pcdDbManager = new MemoryDatabaseManager();\r
111\r
112 ///\r
113 /// build target + tool chain family/tag name + arch + command types + command options\r
114 ///\r
115 ///\r
116 /// Tool Chain Data\r
117 /// toolsDef - build tool program information\r
118 /// fpdBuildOption - all modules's build options for tool tag or tool chain families\r
119 /// moduleSaBuildOption - build options for a specific module\r
120 ///\r
121 private static ToolChainConfig toolsDef;\r
122\r
123 private static ToolChainInfo toolChainInfo;\r
124 private static ToolChainInfo toolChainEnvInfo;\r
125 private static ToolChainInfo toolChainPlatformInfo;\r
126\r
127 private static ToolChainMap platformToolChainOption;\r
128 private static ToolChainMap platformToolChainFamilyOption;\r
129\r
130 private static Map<FpdModuleIdentification, ToolChainMap> moduleToolChainOption = new HashMap<FpdModuleIdentification, ToolChainMap>();\r
131 private static Map<FpdModuleIdentification, ToolChainMap> moduleToolChainFamilyOption = new HashMap<FpdModuleIdentification, ToolChainMap>();\r
132\r
133 private static Map<ModuleIdentification, ToolChainMap> msaBuildOption = new HashMap<ModuleIdentification, ToolChainMap>();\r
134 private static Map<ModuleIdentification, ToolChainMap> msaFamilyBuildOption = new HashMap<ModuleIdentification, ToolChainMap>();\r
135\r
136// private static Pattern flagPattern = Pattern.compile("[^\\\\]?(\".*?[^\\\\]\")[ \t,]+");\r
137 /**\r
138 Parse framework database (DB) and all SPD files listed in DB to initialize\r
139 the environment for next build. This method will only be executed only once\r
140 in the whole build process.\r
141\r
142 @param workspaceDatabaseFile the file name of framework database\r
143 @param workspaceDir current workspace directory path\r
144 @throws BuildException\r
145 Framework Dababase or SPD or MSA file is not valid\r
146 **/\r
147 public synchronized static void initInfo(String workspaceDatabaseFile, String workspaceDir, String toolsDefFilename ) throws EdkException {\r
148 //\r
149 // ensure this method will be revoked only once\r
150 //\r
151 if (globalFlag) {\r
152 return;\r
153 }\r
154 globalFlag = true;\r
155\r
156 //\r
157 // Backup workspace directory. It will be used by other method\r
158 //\r
159 GlobalData.workspaceDir = workspaceDir.replaceAll("(\\\\)", "/");\r
160\r
161 //\r
162 // Parse tools definition file\r
163 //\r
164 //\r
165 // If ToolChain has been set up before, do nothing.\r
166 // CONF dir + tools definition file name\r
167 //\r
168 File toolsDefFile = new File(workspaceDir + File.separatorChar + toolsDefFilename);\r
169 EdkLog.log("Init", EdkLog.EDK_ALWAYS, "Using tool definition file [" + toolsDefFile.getPath() + "].");\r
170 toolsDef = new ToolChainConfig(toolsDefFile);\r
171\r
172 //\r
173 // Parse Framework Database\r
174 //\r
175 File dbFile = new File(workspaceDir + File.separatorChar + workspaceDatabaseFile);\r
176 try {\r
177 FrameworkDatabaseDocument db = (FrameworkDatabaseDocument) XmlObject.Factory.parse(dbFile);\r
178 //\r
179 // validate FrameworkDatabaseFile\r
180 //\r
181 if (!db.validate()) {\r
182 throw new EdkException("Framework Database file [" + dbFile.getPath() + "] format is invalid!");\r
183 }\r
184 //\r
185 // Get package list\r
186 //\r
187 if (db.getFrameworkDatabase().getPackageList() != null ) {\r
188 List<DbPathAndFilename> packages = db.getFrameworkDatabase().getPackageList().getFilenameList();\r
189 Iterator<DbPathAndFilename> iter = packages.iterator();\r
190 while (iter.hasNext()) {\r
191 String fileName = iter.next().getStringValue().trim();\r
192 Spd spd = new Spd(new File(workspaceDir + File.separatorChar + fileName));\r
193 packageList.add(spd.getPackageId());\r
194 //\r
195 // Report warning if existing two packages with same GUID and Version\r
196 //\r
197 if (spdTable.containsKey(spd.getPackageId())) {\r
198 //\r
199 // BUGBUG\r
200 //\r
201 EdkLog.log("Init", EdkLog.EDK_WARNING, "Warning: Existing two packages with same GUID and Version. They are ... " + spd.getPackageId().getSpdFile().getPath());\r
202 }\r
203 spdTable.put(spd.getPackageId(), spd);\r
204 }\r
205 }\r
206\r
207 //\r
208 // Get platform list\r
209 //\r
210 if (db.getFrameworkDatabase().getPlatformList() != null) {\r
211 List<DbPathAndFilename> platforms = db.getFrameworkDatabase().getPlatformList().getFilenameList();\r
212 Iterator<DbPathAndFilename> iter = platforms.iterator();\r
213 while (iter.hasNext()) {\r
214 String fileName = iter.next().getStringValue().trim();\r
215 File fpdFile = new File(workspaceDir + File.separatorChar + fileName);\r
216 if ( !fpdFile.exists() ) {\r
217 throw new EdkException("Platform file [" + fpdFile.getPath() + "] not exists. ");\r
218 }\r
219 XmlObject fpdDoc = XmlObject.Factory.parse(fpdFile);\r
220 //\r
221 // Verify FPD file, if is invalid, throw Exception\r
222 //\r
223 if (!fpdDoc.validate()) {\r
224 throw new EdkException("Framework Platform Surface Area file [" + fpdFile.getPath() + "] format is invalid!");\r
225 }\r
226 //\r
227 // We can change Map to XmlObject\r
228 //\r
229 Map<String, XmlObject> fpdDocMap = new HashMap<String, XmlObject>();\r
230 fpdDocMap.put("PlatformSurfaceArea", fpdDoc);\r
231 SurfaceAreaQuery saq = new SurfaceAreaQuery(fpdDocMap);\r
232 PlatformIdentification platformId = saq.getFpdHeader();\r
233 platformId.setFpdFile(fpdFile);\r
234 //\r
235 // Report warning if existing two platfrom with same GUID and Version\r
236 //\r
237 if (platformList.contains(platformId)) {\r
238 //\r
239 // BUGBUG\r
240 //\r
241 EdkLog.log("Init", EdkLog.EDK_WARNING, "Warning: Existing two platforms with same GUID and Version. They are ... " + fpdFile.getPath());\r
242 }\r
243 platformList.add(platformId);\r
244 }\r
245 }\r
246 } catch(IOException ex) {\r
247 EdkException edkException = new EdkException("Parse WORKSPACE Database file [" + dbFile.getPath() + "] Error.\n" + ex.getMessage());\r
248 edkException.setStackTrace(ex.getStackTrace());\r
249 throw edkException;\r
250 } catch(XmlException ex) {\r
251 EdkException edkException = new EdkException("Parse WORKSPACE Database file [" + dbFile.getPath() + "] Error.\n" + ex.getMessage());\r
252 edkException.setStackTrace(ex.getStackTrace());\r
253 throw edkException;\r
254 }\r
255 }\r
256\r
257 /**\r
258 Get the current WORKSPACE Directory.\r
259\r
260 @return current workspace directory\r
261 **/\r
262 public synchronized static String getWorkspacePath() {\r
263 return workspaceDir;\r
264 }\r
265\r
266\r
267 /**\r
268 Get the MSA file name with absolute path\r
269 */\r
270 public synchronized static File getMsaFile(ModuleIdentification moduleId) throws EdkException {\r
271 File msaFile = null;\r
272 //\r
273 // TBD. Do only when package is null.\r
274 //\r
275 Iterator iter = packageList.iterator();\r
276 while (iter.hasNext()) {\r
277 PackageIdentification packageId = (PackageIdentification)iter.next();\r
278 Spd spd = spdTable.get(packageId);\r
279 msaFile = spd.getModuleFile(moduleId);\r
280 if (msaFile != null ) {\r
281 break ;\r
282 }\r
283 }\r
284 if (msaFile == null){\r
285 throw new EdkException("Can't find Module [" + moduleId.getName() + "] in any SPD package!");\r
286 } else {\r
287 return msaFile;\r
288 }\r
289 }\r
290\r
291 public synchronized static PackageIdentification getPackageForModule(ModuleIdentification moduleId) throws EdkException {\r
292 //\r
293 // If package already defined in module\r
294 //\r
295 if (moduleId.getPackage() != null) {\r
296 return moduleId.getPackage();\r
297 }\r
298\r
299 PackageIdentification packageId = null;\r
300 Iterator iter = packageList.iterator();\r
301 while (iter.hasNext()) {\r
302 packageId = (PackageIdentification)iter.next();\r
303 moduleId.setPackage(packageId);\r
304 Spd spd = spdTable.get(packageId);\r
305 File tempMsaFile = null;\r
306 if ((tempMsaFile = spd.getModuleFile(moduleId)) != null ) {\r
307 if (tempMsaFile.getParent().equalsIgnoreCase(moduleId.getMsaFile().getParent())) {\r
308 break ;\r
309 }\r
310 tempMsaFile = null;\r
311 }\r
312 }\r
313 if (packageId == null){\r
314 throw new EdkException("Can't find Module [" + moduleId.getName() + "] in any SPD package!");\r
315 } else {\r
316 return packageId;\r
317 }\r
318 }\r
319\r
320 /**\r
321 Difference between build and parse: ToolChain and Target\r
322 **/\r
323 public synchronized static boolean isModuleBuilt(FpdModuleIdentification moduleId) {\r
324 return builtModules.contains(moduleId);\r
325 }\r
326\r
327 public synchronized static void registerBuiltModule(FpdModuleIdentification fpdModuleId) {\r
328 builtModules.add(fpdModuleId);\r
329 }\r
330\r
331\r
332 public synchronized static void registerFpdModuleSA(FpdModuleIdentification fpdModuleId, Map<String, XmlObject> doc) throws EdkException{\r
333 Map<String, XmlObject> result = new HashMap<String, XmlObject>();\r
334 Set keySet = doc.keySet();\r
335 Iterator iter = keySet.iterator();\r
336 while (iter.hasNext()){\r
337 String key = (String)iter.next();\r
338 XmlObject item = cloneXmlObject(doc.get(key), true);\r
339 result.put(key, item);\r
340 }\r
341 fpdModuleSA.put(fpdModuleId, result);\r
342 }\r
343\r
344 public synchronized static boolean hasFpdModuleSA(FpdModuleIdentification fpdModuleId) {\r
345 return fpdModuleSA.containsKey(fpdModuleId);\r
346 }\r
347\r
348 /**\r
349 Query module surface area information.\r
350\r
351 <p>Note that surface area parsing is incremental. That means the method will\r
352 only parse the MSA files if necessary. </p>\r
353 \r
354 @param fpdModuleId Module ID with arch\r
355 @return ModuleSA info and MSA info for fpdModuleId\r
356 @throws BuildException Can't find MSA\r
357 **/\r
358 public synchronized static Map<String, XmlObject> getDoc(FpdModuleIdentification fpdModuleId) throws EdkException{\r
359 if (parsedModules.containsKey(fpdModuleId)) {\r
360 return parsedModules.get(fpdModuleId);\r
361 }\r
362 Map<String, XmlObject> doc = new HashMap<String, XmlObject>();\r
363 ModuleIdentification moduleId = fpdModuleId.getModule();\r
364 //\r
365 // First part: get the MSA files info\r
366 //\r
367 doc.putAll(getNativeMsa(moduleId));\r
368\r
369 //\r
370 // Second part: put build options\r
371 //\r
372 doc.put("BuildOptions", fpdBuildOptions);\r
373\r
374 //\r
375 // Third part: get Module info from FPD, such as Library instances, PCDs\r
376 //\r
377 if (fpdModuleSA.containsKey(fpdModuleId)){\r
378 //\r
379 // merge module info in FPD to final Doc\r
380 // For Library Module, do nothing here\r
381 //\r
382 doc.putAll(fpdModuleSA.get(fpdModuleId));\r
383 }\r
384 parsedModules.put(fpdModuleId, doc);\r
385 return doc;\r
386 }\r
387\r
388 public synchronized static Map<String, XmlObject> getDoc(ModuleIdentification moduleId, String arch) throws EdkException{\r
389 FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, arch);\r
390 return getDoc(fpdModuleId);\r
391 }\r
392 \r
393 /**\r
394 Query the native MSA information with module base name.\r
395\r
396 <p>Note that MSA parsing is incremental. That means the method will\r
397 only to parse the MSA files when never parsed before. </p>\r
398\r
399 @param moduleName the base name of the module\r
400 @return the native MSA information\r
401 @throws BuildException\r
402 MSA file is not valid\r
403 **/\r
404 public synchronized static Map<String, XmlObject> getNativeMsa(ModuleIdentification moduleId) throws EdkException {\r
405 if (nativeMsa.containsKey(moduleId)) {\r
406 return nativeMsa.get(moduleId);\r
407 }\r
408 File msaFile = getMsaFile(moduleId);\r
409 Map<String, XmlObject> msaMap = getNativeMsa(msaFile);\r
410 nativeMsa.put(moduleId, msaMap);\r
411 return msaMap;\r
412 }\r
413\r
414 public synchronized static Map<String, XmlObject> getNativeMsa(File msaFile) throws EdkException {\r
415 if (!msaFile.exists()) {\r
416 throw new EdkException("Module Surface Area file [" + msaFile.getPath() + "] can't be found!");\r
417 }\r
418 try {\r
419 ModuleSurfaceAreaDocument doc = (ModuleSurfaceAreaDocument)XmlObject.Factory.parse(msaFile);\r
420 //\r
421 // Validate File if they accord with XML Schema\r
422 //\r
423 if ( !doc.validate()){\r
424 throw new EdkException("Module Surface Area file [" + msaFile.getPath() + "] format is invalid!");\r
425 }\r
426 //\r
427 // parse MSA file\r
428 //\r
429 ModuleSurfaceArea msa= doc.getModuleSurfaceArea();\r
430 Map<String, XmlObject> msaMap = new HashMap<String, XmlObject>();\r
431 msaMap.put("MsaHeader", cloneXmlObject(msa.getMsaHeader(), true));\r
432 msaMap.put("ModuleDefinitions", cloneXmlObject(msa.getModuleDefinitions(), true));\r
433 msaMap.put("LibraryClassDefinitions", cloneXmlObject(msa.getLibraryClassDefinitions(), true));\r
434 msaMap.put("SourceFiles", cloneXmlObject(msa.getSourceFiles(), true));\r
435 msaMap.put("PackageDependencies", cloneXmlObject(msa.getPackageDependencies(), true));\r
436 msaMap.put("Protocols", cloneXmlObject(msa.getProtocols(), true));\r
437 msaMap.put("PPIs", cloneXmlObject(msa.getPPIs(), true));\r
438 msaMap.put("Guids", cloneXmlObject(msa.getGuids(), true));\r
439 msaMap.put("Externs", cloneXmlObject(msa.getExterns(), true));\r
440 msaMap.put("PcdCoded", cloneXmlObject(msa.getPcdCoded(), true));\r
441 msaMap.put("ModuleBuildOptions", cloneXmlObject(msa.getModuleBuildOptions(), true));\r
442 return msaMap;\r
443 } catch(IOException ex) {\r
444 EdkException edkException = new EdkException("Parsing MSA file [" + msaFile.getPath() + "] error. \n" + ex.getMessage());\r
445 edkException.setStackTrace(ex.getStackTrace());\r
446 throw edkException;\r
447 } catch(XmlException ex) {\r
448 EdkException edkException = new EdkException("Parsing MSA file [" + msaFile.getPath() + "] error. \n" + ex.getMessage());\r
449 edkException.setStackTrace(ex.getStackTrace());\r
450 throw edkException;\r
451 }\r
452 }\r
453\r
454 public static Map<String, XmlObject> getFpdBuildOptionsMap() {\r
455 return fpdBuildOptionsMap;\r
456 }\r
457\r
458 public static void setFpdBuildOptions(XmlObject fpdBuildOptions) throws EdkException {\r
459 GlobalData.fpdBuildOptions = cloneXmlObject(fpdBuildOptions, true);\r
460 fpdBuildOptionsMap.put("BuildOptions", GlobalData.fpdBuildOptions);\r
461 }\r
462\r
463 public static XmlObject getFpdDynamicPcds() {\r
464 return fpdDynamicPcds;\r
465 }\r
466\r
467 public static void setFpdDynamicPcds(XmlObject fpdDynamicPcds) {\r
468 GlobalData.fpdDynamicPcds = fpdDynamicPcds;\r
469 }\r
470\r
471 public static Set<ModuleIdentification> getModules(PackageIdentification packageId){\r
472 Spd spd = spdTable.get(packageId);\r
473 if (spd == null ) {\r
474 Set<ModuleIdentification> dummy = new HashSet<ModuleIdentification>();\r
475 return dummy;\r
476 } else {\r
477 return spd.getModules();\r
478 }\r
479 }\r
480\r
481 /**\r
482 * The header file path is relative to workspace dir\r
483 */\r
484 public static String[] getLibraryClassHeaderFiles(\r
485 PackageIdentification[] packages, String name) throws EdkException{\r
486 if (packages == null) {\r
487 // throw Exception or not????\r
488 return new String[0];\r
489 }\r
490 String[] result = null;\r
491 for (int i = 0; i < packages.length; i++) {\r
492 Spd spd = spdTable.get(packages[i]);\r
493 //\r
494 // If find one package defined the library class\r
495 //\r
496 if ((result = spd.getLibClassIncluder(name)) != null) {\r
497 return result;\r
498 }\r
499 }\r
500 //\r
501 // If can't find library class declaration in every package\r
502 //\r
503 throw new EdkException("Can not find library class [" + name\r
504 + "] declaration in any SPD package!");\r
505 }\r
506\r
507 /**\r
508 * The header file path is relative to workspace dir\r
509 */\r
510 public static String getPackageHeaderFiles(PackageIdentification packages,\r
511 String moduleType) {\r
512 if (packages == null) {\r
513 return new String("");\r
514 }\r
515 Spd spd = spdTable.get(packages);\r
516 //\r
517 // If can't find package header file, skip it\r
518 //\r
519 String temp = null;\r
520 if (spd != null) {\r
521 if ((temp = spd.getPackageIncluder(moduleType)) != null) {\r
522 return temp;\r
523 } else {\r
524 temp = "";\r
525 return temp;\r
526 }\r
527 } else {\r
528 return null;\r
529 }\r
530 }\r
531\r
532 /**\r
533 * return two values: {cName, GuidValue}\r
534 */\r
535 public static String[] getGuid(List<PackageIdentification> packages, String name) {\r
536 if (packages == null) {\r
537 // throw Exception or not????\r
538 return new String[0];\r
539 }\r
540 String[] result = null;\r
541 Iterator item = packages.iterator();\r
542 while (item.hasNext()){\r
543 Spd spd = spdTable.get(item.next());\r
544 //\r
545 // If find one package defined the GUID\r
546 //\r
547 if ((result = spd.getGuid(name)) != null) {\r
548 return result;\r
549 }\r
550 }\r
551\r
552 return null;\r
553 }\r
554\r
555 /**\r
556 * return two values: {cName, GuidValue}\r
557 */\r
558 public static String[] getPpiGuid(List<PackageIdentification> packages,\r
559 String name) {\r
560 if (packages == null) {\r
561 return new String[0];\r
562 }\r
563 String[] result = null;\r
564 Iterator item = packages.iterator();\r
565 while (item.hasNext()){\r
566 Spd spd = spdTable.get(item.next());\r
567 //\r
568 // If find one package defined the Ppi GUID\r
569 //\r
570 if ((result = spd.getPpi(name)) != null) {\r
571 return result;\r
572 }\r
573 }\r
574 return null;\r
575 }\r
576\r
577 /**\r
578 * return two values: {cName, GuidValue}\r
579 */\r
580 public static String[] getProtocolGuid(List<PackageIdentification> packages,\r
581 String name) {\r
582 if (packages == null) {\r
583 return new String[0];\r
584 }\r
585 String[] result = null;\r
586 Iterator item = packages.iterator();\r
587 while (item.hasNext()){\r
588 Spd spd = spdTable.get(item.next());\r
589 //\r
590 // If find one package defined the protocol GUID\r
591 //\r
592 if ((result = spd.getProtocol(name))!= null){\r
593 return result;\r
594 }\r
595 }\r
596 return null;\r
597\r
598 }\r
599\r
600 public synchronized static PlatformIdentification getPlatformByName(String name) throws EdkException {\r
601 Iterator iter = platformList.iterator();\r
602 while(iter.hasNext()){\r
603 PlatformIdentification platformId = (PlatformIdentification)iter.next();\r
604 if (platformId.getName().equalsIgnoreCase(name)) {\r
605 return platformId;\r
606 }\r
607 }\r
608 throw new EdkException("Can't find platform [" + name + "] in the current WORKSPACE database!");\r
609 }\r
610\r
611 public synchronized static PlatformIdentification getPlatform(String filename) throws EdkException {\r
612 File file = new File(workspaceDir + File.separatorChar + filename);\r
613 Iterator iter = platformList.iterator();\r
614 while(iter.hasNext()){\r
615 PlatformIdentification platformId = (PlatformIdentification)iter.next();\r
616 if (platformId.getFpdFile().getPath().equalsIgnoreCase(file.getPath())) {\r
617 return platformId;\r
618 }\r
619 }\r
620 throw new EdkException("Can't find platform file [" + filename + "] in the current WORKSPACE database!");\r
621 }\r
622\r
623 public synchronized static PackageIdentification refreshPackageIdentification(PackageIdentification packageId) throws EdkException {\r
624 Iterator iter = packageList.iterator();\r
625 while(iter.hasNext()){\r
626 PackageIdentification packageItem = (PackageIdentification)iter.next();\r
627 if (packageItem.equals(packageId)) {\r
628 packageId.setName(packageItem.getName());\r
629 packageId.setSpdFile(packageItem.getSpdFile());\r
630 return packageId;\r
631 }\r
632 }\r
633 throw new EdkException("Can't find package GUID value " + packageId.toGuidString() + " in the current workspace!");\r
634 }\r
635\r
636 public synchronized static ModuleIdentification refreshModuleIdentification(ModuleIdentification moduleId) throws EdkException {\r
637 PackageIdentification packageId = getPackageForModule(moduleId);\r
638 moduleId.setPackage(packageId);\r
639 Spd spd = spdTable.get(packageId);\r
640 if (spd == null) {\r
641 throw new EdkException("Can't find package GUID value " + packageId.toGuidString() + " in the current workspace!");\r
642 }\r
643 Set<ModuleIdentification> modules = spd.getModules();\r
644 Iterator<ModuleIdentification> iter = modules.iterator();\r
645 while (iter.hasNext()) {\r
646 ModuleIdentification item = iter.next();\r
647 if (item.equals(moduleId)) {\r
648 moduleId.setName(item.getName());\r
649 moduleId.setModuleType(item.getModuleType());\r
650 moduleId.setMsaFile(item.getMsaFile());\r
651 return moduleId;\r
652 }\r
653 }\r
654 throw new EdkException("Can't find module GUID value " + moduleId.toGuidString() + " in " + packageId + " under the current workspace!");\r
655 }\r
656\r
657 public synchronized static Set<PackageIdentification> getPackageList(){\r
658 return packageList;\r
659 }\r
660\r
661 /**\r
662 BUGBUG: It is a walk around method. If do not clone, can't query info with\r
663 XPath correctly. \r
664 \r
665 @param object XmlObject\r
666 @param deep flag for deep clone\r
667 @return XmlObject after clone\r
668 @throws BuildException parse original XmlObject error. \r
669 **/\r
670 private static XmlObject cloneXmlObject(XmlObject object, boolean deep) throws EdkException {\r
671 if ( object == null) {\r
672 return null;\r
673 }\r
674 XmlObject result = null;\r
675 try {\r
676 result = XmlObject.Factory.parse(object.getDomNode()\r
677 .cloneNode(deep));\r
678 } catch (XmlException ex) {\r
679 EdkException edkException = new EdkException(ex.getMessage());\r
680 edkException.setStackTrace(ex.getStackTrace());\r
681 throw edkException;\r
682 }\r
683 return result;\r
684 }\r
685\r
686 ///\r
687 /// Tool Chain Related, try to refine and put some logic process to ToolChainFactory\r
688 ///\r
689 public synchronized static ToolChainInfo getToolChainInfo() {\r
690 if (toolChainInfo == null) {\r
691 toolChainInfo = toolsDef.getConfigInfo().intersection(toolChainEnvInfo);\r
692 if (toolChainPlatformInfo != null) {\r
693 toolChainInfo = toolChainInfo.intersection(toolChainPlatformInfo);\r
694 }\r
695 toolChainInfo.addCommands(toolsDef.getConfigInfo().getCommands());\r
696 toolChainInfo.normalize();\r
697 EdkLog.log("Init", EdkLog.EDK_ALWAYS, "Current build tool chain information summary: ");\r
698 EdkLog.log("Init", EdkLog.EDK_ALWAYS, toolChainInfo + "");\r
699 }\r
700 return toolChainInfo;\r
701 }\r
702\r
703 public static void setPlatformToolChainFamilyOption(ToolChainMap map) {\r
704 platformToolChainFamilyOption = map;\r
705 }\r
706\r
707 public static void setPlatformToolChainOption(ToolChainMap map) {\r
708 platformToolChainOption = map;\r
709 }\r
710\r
711 public static void addModuleToolChainOption(FpdModuleIdentification fpdModuleId,\r
712 ToolChainMap toolChainOption) {\r
713 moduleToolChainOption.put(fpdModuleId, toolChainOption);\r
714 }\r
715\r
716 public static void addModuleToolChainFamilyOption(FpdModuleIdentification fpdModuleId,\r
717 ToolChainMap toolChainOption) {\r
718 moduleToolChainFamilyOption.put(fpdModuleId, toolChainOption);\r
719 }\r
720 \r
721 public static void addMsaBuildOption(ModuleIdentification moduleId,\r
722 ToolChainMap toolChainOption) {\r
723 msaBuildOption.put(moduleId, toolChainOption);\r
724 }\r
725 \r
726 public static void addMsaFamilyBuildOption(ModuleIdentification moduleId,\r
727 ToolChainMap toolChainOption) {\r
728 msaFamilyBuildOption.put(moduleId, toolChainOption);\r
729 }\r
730 \r
731 public static boolean isCommandSet(String target, String toolchain, String arch) {\r
732 String[] commands = getToolChainInfo().getCommands();\r
733\r
734 for (int i = 0; i < commands.length; ++i) {\r
735 String cmdName = toolsDef.getConfig().get(new String[] {target, toolchain, arch, commands[i], ToolDefinitions.TOOLS_DEF_ATTRIBUTE_NAME});\r
736 if (cmdName != null && cmdName.length() != 0) {\r
737 return true;\r
738 }\r
739 }\r
740\r
741 return false;\r
742 }\r
743\r
744 /**\r
745 Except FLAGS, all attribute are from TOOLS_DEF file. \r
746 \r
747 For FLAGS, information from four places, they are: \r
748 <pre>\r
749 1. tools_def.txt\r
750 2. MSA &lt;BuildOptions&gt;/&lt;Options&gt;\r
751 3. FPD &lt;BuildOptions&gt;/&lt;Options&gt;\r
752 4. FPD &lt;FrameworkModules&gt;/&lt;ModuleSaBuildOptions&gt;/&lt;Options&gt;\r
753 </pre>\r
754 \r
755 @param commandDescription Key: TARGET, TAGNAME, ARCH, COMMANDTYPE, ATTRIBUTE\r
756 @param fpdModuleId Module Identification with Arch\r
757 @return The corresponding String\r
758 @throws EdkException If build option definition error\r
759 **/\r
760 public synchronized static String getCommandSetting(String[] commandDescription, FpdModuleIdentification fpdModuleId) throws EdkException {\r
761 ToolChainKey toolChainKey = new ToolChainKey(commandDescription);\r
762 ToolChainMap toolChainConfig = toolsDef.getConfig();\r
763 String setting = null;\r
764\r
765 //\r
766 // Default in tools_def.txt\r
767 // \r
768 setting = toolChainConfig.get(toolChainKey);\r
769 if (setting == null) {\r
770 setting = "";\r
771 }\r
772 if (!commandDescription[ToolChainElement.ATTRIBUTE.value].equals(ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FLAGS)) {\r
773 return setting;\r
774 }\r
775\r
776 //\r
777 // Tool's option can be in .fpd and/or .msa file\r
778 //\r
779 String optionString;\r
780 ToolChainMap option = null;\r
781 ToolChainKey toolChainFamilyKey = new ToolChainKey(commandDescription);\r
782\r
783 toolChainFamilyKey.setKey(ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FAMILY, ToolChainElement.ATTRIBUTE.value);\r
784 String family = toolChainConfig.get(toolChainFamilyKey);\r
785 toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value);\r
786 toolChainFamilyKey.setKey(ToolDefinitions.TOOLS_DEF_ATTRIBUTE_FLAGS, ToolChainElement.ATTRIBUTE.value);\r
787\r
788 //\r
789 // MSA's tool chain family option\r
790 //\r
791 option = msaFamilyBuildOption.get(fpdModuleId.getModule());\r
792 if (option != null && (optionString = option.get(toolChainFamilyKey)) != null) {\r
793 setting += (" " + optionString);\r
794 }\r
795 \r
796 //\r
797 // MSA's tool chain option\r
798 //\r
799 option = msaBuildOption.get(fpdModuleId.getModule());\r
800 if (option != null && (optionString = option.get(toolChainKey)) != null) {\r
801 setting += (" " + optionString);\r
802 }\r
803 \r
804 //\r
805 // Platform's tool chain family option\r
806 //\r
807 optionString = platformToolChainFamilyOption.get(toolChainFamilyKey);\r
808 if (optionString != null) {\r
809 setting += (" " + optionString);\r
810 }\r
811\r
812 //\r
813 // Platform's tool chain tag option\r
814 //\r
815 optionString = platformToolChainOption.get(toolChainKey);\r
816 if (optionString != null) {\r
817 setting += (" " + optionString);\r
818 }\r
819\r
820 //\r
821 // Module's tool chain family option\r
822 //\r
823 option = moduleToolChainFamilyOption.get(fpdModuleId);\r
824 if (option != null && (optionString = option.get(toolChainFamilyKey)) != null) {\r
825 setting += (" " + optionString);\r
826 }\r
827\r
828 //\r
829 // Module's tool chain tag option\r
830 //\r
831 option = moduleToolChainOption.get(fpdModuleId);\r
832 if (option != null && (optionString = option.get(toolChainKey)) != null) {\r
833 setting += (" " + optionString);\r
834 }\r
835\r
836 return setting;\r
837 }\r
838\r
839 public static void setToolChainEnvInfo(ToolChainInfo envInfo) {\r
840 toolChainEnvInfo = envInfo;\r
841 }\r
842 public static void setToolChainPlatformInfo(ToolChainInfo platformInfo) {\r
843 toolChainPlatformInfo = platformInfo;\r
844 }\r
845\r
846 //\r
847 // for PCD\r
848 //\r
849 public synchronized static MemoryDatabaseManager getPCDMemoryDBManager() {\r
850 return pcdDbManager;\r
851 }\r
852\r
853 //\r
854 // For PCD get tokenSpaceGUid\r
855 //\r
856 public synchronized static String getGuidInfoFromCname(String cName){\r
857 String cNameGuid = null;\r
858 String guid = null;\r
859 Set set = spdTable.keySet();\r
860 Iterator iter = set.iterator();\r
861\r
862 if (iter == null) {\r
863 return null;\r
864 }\r
865\r
866 while (iter.hasNext()){\r
867 Spd spd = (Spd) spdTable.get(iter.next());\r
868 guid = spd.getGuidFromCname(cName);\r
869 if (guid != null){\r
870 cNameGuid = guid;\r
871 break;\r
872 }\r
873 }\r
874 return cNameGuid;\r
875 }\r
876\r
877 //\r
878 // For PCD\r
879 //\r
880 public synchronized static Map<FpdModuleIdentification, XmlObject>\r
881 getFpdModuleSaXmlObject(String xmlObjectName) {\r
882 Set<FpdModuleIdentification> fpdModuleSASet = fpdModuleSA.keySet();\r
883 Iterator item = fpdModuleSASet.iterator();\r
884\r
885\r
886 Map<FpdModuleIdentification, XmlObject> SAPcdBuildDef = new HashMap<FpdModuleIdentification, XmlObject>();\r
887 Map<String, XmlObject> SANode = new HashMap<String, XmlObject>();\r
888 FpdModuleIdentification moduleId;\r
889 while (item.hasNext()) {\r
890\r
891 moduleId = (FpdModuleIdentification) item.next();\r
892 SANode = fpdModuleSA.get(moduleId);\r
893 try{\r
894 if (SANode.get(xmlObjectName)!= null){\r
895 SAPcdBuildDef.put(moduleId,\r
896 (XmlObject) SANode.get(xmlObjectName));\r
897\r
898 }\r
899 } catch (Exception e){\r
900 EdkLog.log(EdkLog.EDK_INFO, e.getMessage());\r
901 }\r
902 }\r
903 return SAPcdBuildDef;\r
904 }\r
905\r
906 public synchronized static Map<FpdModuleIdentification,XmlObject> getFpdPcdBuildDefinitions() {\r
907 Map<FpdModuleIdentification,XmlObject> pcdBuildDef = getFpdModuleSaXmlObject ("PcdBuildDefinition");\r
908\r
909 return pcdBuildDef;\r
910 }\r
911}\r
912\r