]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - Tools/Source/GenBuild/org/tianocore/build/global/GlobalData.java
typecast some return values
[mirror_edk2.git] / Tools / 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.exception.EdkException;\r
32import org.tianocore.common.logger.EdkLog;\r
33import org.tianocore.pcd.entity.MemoryDatabaseManager;\r
34import org.tianocore.DbPathAndFilename;\r
35import org.tianocore.FrameworkDatabaseDocument;\r
36import org.tianocore.ModuleSurfaceAreaDocument;\r
37import org.tianocore.ModuleSurfaceAreaDocument.ModuleSurfaceArea;\r
38import org.tianocore.build.id.FpdModuleIdentification;\r
39import org.tianocore.build.id.ModuleIdentification;\r
40import org.tianocore.build.id.PackageIdentification;\r
41import org.tianocore.build.id.PlatformIdentification;\r
42import org.tianocore.build.toolchain.ToolChainAttribute;\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 /**\r
134 Parse framework database (DB) and all SPD files listed in DB to initialize\r
135 the environment for next build. This method will only be executed only once\r
136 in the whole build process.\r
137\r
138 @param workspaceDatabaseFile the file name of framework database\r
139 @param workspaceDir current workspace directory path\r
140 @throws BuildException\r
141 Framework Dababase or SPD or MSA file is not valid\r
142 **/\r
143 public synchronized static void initInfo(String workspaceDatabaseFile, String workspaceDir, String toolsDefFilename ) throws EdkException {\r
144 //\r
145 // ensure this method will be revoked only once\r
146 //\r
147 if (globalFlag) {\r
148 return;\r
149 }\r
150 globalFlag = true;\r
151\r
152 //\r
153 // Backup workspace directory. It will be used by other method\r
154 //\r
155 GlobalData.workspaceDir = workspaceDir.replaceAll("(\\\\)", "/");\r
156\r
157 //\r
158 // Parse tools definition file\r
159 //\r
160 //\r
161 // If ToolChain has been set up before, do nothing.\r
162 // CONF dir + tools definition file name\r
163 //\r
164 File toolsDefFile = new File(workspaceDir + File.separatorChar + toolsDefFilename);\r
165 EdkLog.log("Init", EdkLog.EDK_ALWAYS, "Using tool definition file [" + toolsDefFile.getPath() + "].");\r
166 toolsDef = new ToolChainConfig(toolsDefFile);\r
167\r
168 //\r
169 // Parse Framework Database\r
170 //\r
171 File dbFile = new File(workspaceDir + File.separatorChar + workspaceDatabaseFile);\r
172 try {\r
173 FrameworkDatabaseDocument db = (FrameworkDatabaseDocument) XmlObject.Factory.parse(dbFile);\r
174 //\r
175 // validate FrameworkDatabaseFile\r
176 //\r
177 if (!db.validate()) {\r
178 throw new EdkException("Framework Database file [" + dbFile.getPath() + "] format is invalid!");\r
179 }\r
180 //\r
181 // Get package list\r
182 //\r
183 if (db.getFrameworkDatabase().getPackageList() != null ) {\r
184 List<DbPathAndFilename> packages = db.getFrameworkDatabase().getPackageList().getFilenameList();\r
185 Iterator<DbPathAndFilename> iter = packages.iterator();\r
186 while (iter.hasNext()) {\r
187 String fileName = iter.next().getStringValue().trim();\r
188 Spd spd = new Spd(new File(workspaceDir + File.separatorChar + fileName));\r
189 packageList.add(spd.getPackageId());\r
190 //\r
191 // Report warning if existing two packages with same GUID and Version\r
192 //\r
193 if (spdTable.containsKey(spd.getPackageId())) {\r
194 //\r
195 // BUGBUG\r
196 //\r
197 EdkLog.log("Init", EdkLog.EDK_WARNING, "Warning: Existing two packages with same GUID and Version. They are ... " + spd.getPackageId().getSpdFile().getPath());\r
198 }\r
199 spdTable.put(spd.getPackageId(), spd);\r
200 }\r
201 }\r
202\r
203 //\r
204 // Get platform list\r
205 //\r
206 if (db.getFrameworkDatabase().getPlatformList() != null) {\r
207 List<DbPathAndFilename> platforms = db.getFrameworkDatabase().getPlatformList().getFilenameList();\r
208 Iterator<DbPathAndFilename> iter = platforms.iterator();\r
209 while (iter.hasNext()) {\r
210 String fileName = iter.next().getStringValue().trim();\r
211 File fpdFile = new File(workspaceDir + File.separatorChar + fileName);\r
212 if ( !fpdFile.exists() ) {\r
213 throw new EdkException("Platform file [" + fpdFile.getPath() + "] not exists. ");\r
214 }\r
215 XmlObject fpdDoc = XmlObject.Factory.parse(fpdFile);\r
216 //\r
217 // Verify FPD file, if is invalid, throw Exception\r
218 //\r
219 if (!fpdDoc.validate()) {\r
220 throw new EdkException("Framework Platform Surface Area file [" + fpdFile.getPath() + "] format is invalid!");\r
221 }\r
222 //\r
223 // We can change Map to XmlObject\r
224 //\r
225 Map<String, XmlObject> fpdDocMap = new HashMap<String, XmlObject>();\r
226 fpdDocMap.put("PlatformSurfaceArea", fpdDoc);\r
227 SurfaceAreaQuery saq = new SurfaceAreaQuery(fpdDocMap);\r
228 PlatformIdentification platformId = saq.getFpdHeader();\r
229 platformId.setFpdFile(fpdFile);\r
230 //\r
231 // Report warning if existing two platfrom with same GUID and Version\r
232 //\r
233 if (platformList.contains(platformId)) {\r
234 //\r
235 // BUGBUG\r
236 //\r
237 EdkLog.log("Init", EdkLog.EDK_WARNING, "Warning: Existing two platforms with same GUID and Version. They are ... " + fpdFile.getPath());\r
238 }\r
239 platformList.add(platformId);\r
240 }\r
241 }\r
242 } catch(IOException ex) {\r
243 EdkException edkException = new EdkException("Parse WORKSPACE Database file [" + dbFile.getPath() + "] Error.\n" + ex.getMessage());\r
244 edkException.setStackTrace(ex.getStackTrace());\r
245 throw edkException;\r
246 } catch(XmlException 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 }\r
251 }\r
252\r
253 /**\r
254 Get the current WORKSPACE Directory.\r
255\r
256 @return current workspace directory\r
257 **/\r
258 public synchronized static String getWorkspacePath() {\r
259 return workspaceDir;\r
260 }\r
261\r
262\r
263 /**\r
264 Get the MSA file name with absolute path\r
265 */\r
266 public synchronized static File getMsaFile(ModuleIdentification moduleId) throws EdkException {\r
267 File msaFile = null;\r
268 //\r
269 // TBD. Do only when package is null.\r
270 //\r
271 Iterator iter = packageList.iterator();\r
272 while (iter.hasNext()) {\r
273 PackageIdentification packageId = (PackageIdentification)iter.next();\r
274 Spd spd = spdTable.get(packageId);\r
275 msaFile = spd.getModuleFile(moduleId);\r
276 if (msaFile != null ) {\r
277 break ;\r
278 }\r
279 }\r
280 if (msaFile == null){\r
281 throw new EdkException("Can't find Module [" + moduleId.getName() + "] in any SPD package!");\r
282 } else {\r
283 return msaFile;\r
284 }\r
285 }\r
286\r
287 public synchronized static PackageIdentification getPackageForModule(ModuleIdentification moduleId) throws EdkException {\r
288 //\r
289 // If package already defined in module\r
290 //\r
291 if (moduleId.getPackage() != null) {\r
292 return moduleId.getPackage();\r
293 }\r
294\r
295 PackageIdentification packageId = null;\r
296 Iterator iter = packageList.iterator();\r
297 while (iter.hasNext()) {\r
298 packageId = (PackageIdentification)iter.next();\r
299 moduleId.setPackage(packageId);\r
300 Spd spd = spdTable.get(packageId);\r
301 File tempMsaFile = null;\r
302 if ((tempMsaFile = spd.getModuleFile(moduleId)) != null ) {\r
303 if (tempMsaFile.getParent().equalsIgnoreCase(moduleId.getMsaFile().getParent())) {\r
304 break ;\r
305 }\r
306 tempMsaFile = null;\r
307 }\r
308 }\r
309 if (packageId == null){\r
310 throw new EdkException("Can't find Module [" + moduleId.getName() + "] in any SPD package!");\r
311 } else {\r
312 return packageId;\r
313 }\r
314 }\r
315\r
316 /**\r
317 Difference between build and parse: ToolChain and Target\r
318 **/\r
319 public synchronized static boolean isModuleBuilt(FpdModuleIdentification moduleId) {\r
320 return builtModules.contains(moduleId);\r
321 }\r
322\r
323 public synchronized static void registerBuiltModule(FpdModuleIdentification fpdModuleId) {\r
324 builtModules.add(fpdModuleId);\r
325 }\r
326\r
327\r
328 public synchronized static void registerFpdModuleSA(FpdModuleIdentification fpdModuleId, Map<String, XmlObject> doc) throws EdkException{\r
329 Map<String, XmlObject> result = new HashMap<String, XmlObject>();\r
330 Set keySet = doc.keySet();\r
331 Iterator iter = keySet.iterator();\r
332 while (iter.hasNext()){\r
333 String key = (String)iter.next();\r
334 XmlObject item = cloneXmlObject(doc.get(key), true);\r
335 result.put(key, item);\r
336 }\r
337 fpdModuleSA.put(fpdModuleId, result);\r
338 }\r
339\r
340 public synchronized static boolean hasFpdModuleSA(FpdModuleIdentification fpdModuleId) {\r
341 return fpdModuleSA.containsKey(fpdModuleId);\r
342 }\r
343\r
344 /**\r
345 Query module surface area information.\r
346\r
347 <p>Note that surface area parsing is incremental. That means the method will\r
348 only parse the MSA files if necessary. </p>\r
349 \r
350 @param fpdModuleId Module ID with arch\r
351 @return ModuleSA info and MSA info for fpdModuleId\r
352 @throws BuildException Can't find MSA\r
353 **/\r
354 public synchronized static Map<String, XmlObject> getDoc(FpdModuleIdentification fpdModuleId) throws EdkException{\r
355 if (parsedModules.containsKey(fpdModuleId)) {\r
356 return parsedModules.get(fpdModuleId);\r
357 }\r
358 Map<String, XmlObject> doc = new HashMap<String, XmlObject>();\r
359 ModuleIdentification moduleId = fpdModuleId.getModule();\r
360 //\r
361 // First part: get the MSA files info\r
362 //\r
363 doc.putAll(getNativeMsa(moduleId));\r
364\r
365 //\r
366 // Second part: put build options\r
367 //\r
368 doc.put("BuildOptions", fpdBuildOptions);\r
369\r
370 //\r
371 // Third part: get Module info from FPD, such as Library instances, PCDs\r
372 //\r
373 if (fpdModuleSA.containsKey(fpdModuleId)){\r
374 //\r
375 // merge module info in FPD to final Doc\r
376 // For Library Module, do nothing here\r
377 //\r
378 doc.putAll(fpdModuleSA.get(fpdModuleId));\r
379 }\r
380 parsedModules.put(fpdModuleId, doc);\r
381 return doc;\r
382 }\r
383\r
384 public synchronized static Map<String, XmlObject> getDoc(ModuleIdentification moduleId, String arch) throws EdkException{\r
385 FpdModuleIdentification fpdModuleId = new FpdModuleIdentification(moduleId, arch);\r
386 return getDoc(fpdModuleId);\r
387 }\r
388 \r
389 /**\r
390 Query the native MSA information with module base name.\r
391\r
392 <p>Note that MSA parsing is incremental. That means the method will\r
393 only to parse the MSA files when never parsed before. </p>\r
394\r
395 @param moduleName the base name of the module\r
396 @return the native MSA information\r
397 @throws BuildException\r
398 MSA file is not valid\r
399 **/\r
400 public synchronized static Map<String, XmlObject> getNativeMsa(ModuleIdentification moduleId) throws EdkException {\r
401 if (nativeMsa.containsKey(moduleId)) {\r
402 return nativeMsa.get(moduleId);\r
403 }\r
404 File msaFile = getMsaFile(moduleId);\r
405 Map<String, XmlObject> msaMap = getNativeMsa(msaFile);\r
406 nativeMsa.put(moduleId, msaMap);\r
407 return msaMap;\r
408 }\r
409\r
410 public synchronized static Map<String, XmlObject> getNativeMsa(File msaFile) throws EdkException {\r
411 if (!msaFile.exists()) {\r
412 throw new EdkException("Module Surface Area file [" + msaFile.getPath() + "] can't be found!");\r
413 }\r
414 try {\r
415 ModuleSurfaceAreaDocument doc = (ModuleSurfaceAreaDocument)XmlObject.Factory.parse(msaFile);\r
416 //\r
417 // Validate File if they accord with XML Schema\r
418 //\r
419 if ( !doc.validate()){\r
420 throw new EdkException("Module Surface Area file [" + msaFile.getPath() + "] format is invalid!");\r
421 }\r
422 //\r
423 // parse MSA file\r
424 //\r
425 ModuleSurfaceArea msa= doc.getModuleSurfaceArea();\r
426 Map<String, XmlObject> msaMap = new HashMap<String, XmlObject>();\r
427 msaMap.put("MsaHeader", cloneXmlObject(msa.getMsaHeader(), true));\r
428 msaMap.put("ModuleDefinitions", cloneXmlObject(msa.getModuleDefinitions(), true));\r
429 msaMap.put("LibraryClassDefinitions", cloneXmlObject(msa.getLibraryClassDefinitions(), true));\r
430 msaMap.put("SourceFiles", cloneXmlObject(msa.getSourceFiles(), true));\r
431 msaMap.put("PackageDependencies", cloneXmlObject(msa.getPackageDependencies(), true));\r
432 msaMap.put("Protocols", cloneXmlObject(msa.getProtocols(), true));\r
433 msaMap.put("PPIs", cloneXmlObject(msa.getPPIs(), true));\r
434 msaMap.put("Guids", cloneXmlObject(msa.getGuids(), true));\r
435 msaMap.put("Externs", cloneXmlObject(msa.getExterns(), true));\r
436 msaMap.put("PcdCoded", cloneXmlObject(msa.getPcdCoded(), true));\r
437 return msaMap;\r
438 } catch(IOException ex) {\r
439 EdkException edkException = new EdkException("Parsing MSA file [" + msaFile.getPath() + "] error. \n" + ex.getMessage());\r
440 edkException.setStackTrace(ex.getStackTrace());\r
441 throw edkException;\r
442 } catch(XmlException ex) {\r
443 EdkException edkException = new EdkException("Parsing MSA file [" + msaFile.getPath() + "] error. \n" + ex.getMessage());\r
444 edkException.setStackTrace(ex.getStackTrace());\r
445 throw edkException;\r
446 }\r
447 }\r
448\r
449 public static Map<String, XmlObject> getFpdBuildOptionsMap() {\r
450 return fpdBuildOptionsMap;\r
451 }\r
452\r
453 public static void setFpdBuildOptions(XmlObject fpdBuildOptions) throws EdkException {\r
454 GlobalData.fpdBuildOptions = cloneXmlObject(fpdBuildOptions, true);\r
455 fpdBuildOptionsMap.put("BuildOptions", GlobalData.fpdBuildOptions);\r
456 }\r
457\r
458 public static XmlObject getFpdDynamicPcds() {\r
459 return fpdDynamicPcds;\r
460 }\r
461\r
462 public static void setFpdDynamicPcds(XmlObject fpdDynamicPcds) {\r
463 GlobalData.fpdDynamicPcds = fpdDynamicPcds;\r
464 }\r
465\r
466 public static Set<ModuleIdentification> getModules(PackageIdentification packageId){\r
467 Spd spd = spdTable.get(packageId);\r
468 if (spd == null ) {\r
469 Set<ModuleIdentification> dummy = new HashSet<ModuleIdentification>();\r
470 return dummy;\r
471 } else {\r
472 return spd.getModules();\r
473 }\r
474 }\r
475\r
476 /**\r
477 * The header file path is relative to workspace dir\r
478 */\r
479 public static String[] getLibraryClassHeaderFiles(\r
480 PackageIdentification[] packages, String name) throws EdkException{\r
481 if (packages == null) {\r
482 // throw Exception or not????\r
483 return new String[0];\r
484 }\r
485 String[] result = null;\r
486 for (int i = 0; i < packages.length; i++) {\r
487 Spd spd = spdTable.get(packages[i]);\r
488 //\r
489 // If find one package defined the library class\r
490 //\r
491 if ((result = spd.getLibClassIncluder(name)) != null) {\r
492 return result;\r
493 }\r
494 }\r
495 //\r
496 // If can't find library class declaration in every package\r
497 //\r
498 throw new EdkException("Can not find library class [" + name\r
499 + "] declaration in any SPD package!");\r
500 }\r
501\r
502 /**\r
503 * The header file path is relative to workspace dir\r
504 */\r
505 public static String getPackageHeaderFiles(PackageIdentification packages,\r
506 String moduleType) {\r
507 if (packages == null) {\r
508 return new String("");\r
509 }\r
510 Spd spd = spdTable.get(packages);\r
511 //\r
512 // If can't find package header file, skip it\r
513 //\r
514 String temp = null;\r
515 if (spd != null) {\r
516 if ((temp = spd.getPackageIncluder(moduleType)) != null) {\r
517 return temp;\r
518 } else {\r
519 temp = "";\r
520 return temp;\r
521 }\r
522 } else {\r
523 return null;\r
524 }\r
525 }\r
526\r
527 /**\r
528 * return two values: {cName, GuidValue}\r
529 */\r
530 public static String[] getGuid(List<PackageIdentification> packages, String name) {\r
531 if (packages == null) {\r
532 // throw Exception or not????\r
533 return new String[0];\r
534 }\r
535 String[] result = null;\r
536 Iterator item = packages.iterator();\r
537 while (item.hasNext()){\r
538 Spd spd = spdTable.get(item.next());\r
539 //\r
540 // If find one package defined the GUID\r
541 //\r
542 if ((result = spd.getGuid(name)) != null) {\r
543 return result;\r
544 }\r
545 }\r
546\r
547 return null;\r
548 }\r
549\r
550 /**\r
551 * return two values: {cName, GuidValue}\r
552 */\r
553 public static String[] getPpiGuid(List<PackageIdentification> packages,\r
554 String name) {\r
555 if (packages == null) {\r
556 return new String[0];\r
557 }\r
558 String[] result = null;\r
559 Iterator item = packages.iterator();\r
560 while (item.hasNext()){\r
561 Spd spd = spdTable.get(item.next());\r
562 //\r
563 // If find one package defined the Ppi GUID\r
564 //\r
565 if ((result = spd.getPpi(name)) != null) {\r
566 return result;\r
567 }\r
568 }\r
569 return null;\r
570 }\r
571\r
572 /**\r
573 * return two values: {cName, GuidValue}\r
574 */\r
575 public static String[] getProtocolGuid(List<PackageIdentification> packages,\r
576 String name) {\r
577 if (packages == null) {\r
578 return new String[0];\r
579 }\r
580 String[] result = null;\r
581 Iterator item = packages.iterator();\r
582 while (item.hasNext()){\r
583 Spd spd = spdTable.get(item.next());\r
584 //\r
585 // If find one package defined the protocol GUID\r
586 //\r
587 if ((result = spd.getProtocol(name))!= null){\r
588 return result;\r
589 }\r
590 }\r
591 return null;\r
592\r
593 }\r
594\r
595 public synchronized static PlatformIdentification getPlatformByName(String name) throws EdkException {\r
596 Iterator iter = platformList.iterator();\r
597 while(iter.hasNext()){\r
598 PlatformIdentification platformId = (PlatformIdentification)iter.next();\r
599 if (platformId.getName().equalsIgnoreCase(name)) {\r
600 return platformId;\r
601 }\r
602 }\r
603 throw new EdkException("Can't find platform [" + name + "] in the current WORKSPACE database!");\r
604 }\r
605\r
606 public synchronized static PlatformIdentification getPlatform(String filename) throws EdkException {\r
607 File file = new File(workspaceDir + File.separatorChar + filename);\r
608 Iterator iter = platformList.iterator();\r
609 while(iter.hasNext()){\r
610 PlatformIdentification platformId = (PlatformIdentification)iter.next();\r
611 if (platformId.getFpdFile().getPath().equalsIgnoreCase(file.getPath())) {\r
612 return platformId;\r
613 }\r
614 }\r
615 throw new EdkException("Can't find platform file [" + filename + "] in the current WORKSPACE database!");\r
616 }\r
617\r
618 public synchronized static PackageIdentification refreshPackageIdentification(PackageIdentification packageId) throws EdkException {\r
619 Iterator iter = packageList.iterator();\r
620 while(iter.hasNext()){\r
621 PackageIdentification packageItem = (PackageIdentification)iter.next();\r
622 if (packageItem.equals(packageId)) {\r
623 packageId.setName(packageItem.getName());\r
624 packageId.setSpdFile(packageItem.getSpdFile());\r
625 return packageId;\r
626 }\r
627 }\r
628 throw new EdkException("Can't find package GUID value " + packageId.toGuidString() + " in the current workspace!");\r
629 }\r
630\r
631 public synchronized static ModuleIdentification refreshModuleIdentification(ModuleIdentification moduleId) throws EdkException {\r
632 PackageIdentification packageId = getPackageForModule(moduleId);\r
633 moduleId.setPackage(packageId);\r
634 Spd spd = spdTable.get(packageId);\r
635 if (spd == null) {\r
636 throw new EdkException("Can't find package GUID value " + packageId.toGuidString() + " in the current workspace!");\r
637 }\r
638 Set<ModuleIdentification> modules = spd.getModules();\r
639 Iterator<ModuleIdentification> iter = modules.iterator();\r
640 while (iter.hasNext()) {\r
641 ModuleIdentification item = iter.next();\r
642 if (item.equals(moduleId)) {\r
643 moduleId.setName(item.getName());\r
644 moduleId.setModuleType(item.getModuleType());\r
645 moduleId.setMsaFile(item.getMsaFile());\r
646 return moduleId;\r
647 }\r
648 }\r
649 throw new EdkException("Can't find module GUID value " + moduleId.toGuidString() + " in " + packageId + " under the current workspace!");\r
650 }\r
651\r
652 public synchronized static Set<PackageIdentification> getPackageList(){\r
653 return packageList;\r
654 }\r
655\r
656 /**\r
657 BUGBUG: It is a walk around method. If do not clone, can't query info with\r
658 XPath correctly. \r
659 \r
660 @param object XmlObject\r
661 @param deep flag for deep clone\r
662 @return XmlObject after clone\r
663 @throws BuildException parse original XmlObject error. \r
664 **/\r
665 private static XmlObject cloneXmlObject(XmlObject object, boolean deep) throws EdkException {\r
666 if ( object == null) {\r
667 return null;\r
668 }\r
669 XmlObject result = null;\r
670 try {\r
671 result = XmlObject.Factory.parse(object.getDomNode()\r
672 .cloneNode(deep));\r
673 } catch (XmlException ex) {\r
674 EdkException edkException = new EdkException(ex.getMessage());\r
675 edkException.setStackTrace(ex.getStackTrace());\r
676 throw edkException;\r
677 }\r
678 return result;\r
679 }\r
680\r
681 ///\r
682 /// Tool Chain Related, try to refine and put some logic process to ToolChainFactory\r
683 ///\r
684 public static ToolChainInfo getToolChainInfo() {\r
685 if (toolChainInfo == null) {\r
686 toolChainInfo = toolsDef.getConfigInfo().intersection(toolChainEnvInfo);\r
687 if (toolChainPlatformInfo != null) {\r
688 toolChainInfo = toolChainInfo.intersection(toolChainPlatformInfo);\r
689 }\r
690 toolChainInfo.addCommands(toolsDef.getConfigInfo().getCommands());\r
691 toolChainInfo.normalize();\r
692 EdkLog.log("Init", EdkLog.EDK_ALWAYS, "Current build tool chain information summary: ");\r
693 EdkLog.log("Init", EdkLog.EDK_ALWAYS, toolChainInfo + "");\r
694 }\r
695 return toolChainInfo;\r
696 }\r
697\r
698 public static void setPlatformToolChainFamilyOption(ToolChainMap map) {\r
699 platformToolChainFamilyOption = map;\r
700 }\r
701\r
702 public static void setPlatformToolChainOption(ToolChainMap map) {\r
703 platformToolChainOption = map;\r
704 }\r
705\r
706 public static void addModuleToolChainOption(FpdModuleIdentification fpdModuleId,\r
707 ToolChainMap toolChainOption) {\r
708 moduleToolChainOption.put(fpdModuleId, toolChainOption);\r
709 }\r
710\r
711 public static void addModuleToolChainFamilyOption(FpdModuleIdentification fpdModuleId,\r
712 ToolChainMap toolChainOption) {\r
713 moduleToolChainFamilyOption.put(fpdModuleId, toolChainOption);\r
714 }\r
715\r
716 public static boolean isCommandSet(String target, String toolchain, String arch) {\r
717 String[] commands = getToolChainInfo().getCommands();\r
718\r
719 for (int i = 0; i < commands.length; ++i) {\r
720 String cmdName = toolsDef.getConfig().get(new String[] {target, toolchain, arch, commands[i], ToolChainAttribute.NAME.toString()});\r
721 if (cmdName != null && cmdName.length() != 0) {\r
722 return true;\r
723 }\r
724 }\r
725\r
726 return false;\r
727 }\r
728\r
729 public static String getCommandSetting(String[] commandDescription, FpdModuleIdentification fpdModuleId) throws EdkException {\r
730 ToolChainKey toolChainKey = new ToolChainKey(commandDescription);\r
731 ToolChainMap toolChainConfig = toolsDef.getConfig();\r
732 String setting = null;\r
733\r
734 if (!commandDescription[ToolChainElement.ATTRIBUTE.value].equals(ToolChainAttribute.FLAGS.toString())) {\r
735 setting = toolChainConfig.get(toolChainKey);\r
736 if (setting == null) {\r
737 setting = "";\r
738 }\r
739 return setting;\r
740 }\r
741\r
742 //\r
743 // get module specific options, if any\r
744 //\r
745 // tool tag first\r
746 ToolChainMap option = moduleToolChainOption.get(fpdModuleId);\r
747 ToolChainKey toolChainFamilyKey = null;\r
748\r
749 if ((option == null) || (option != null && (setting = option.get(toolChainKey)) == null)) {\r
750 //\r
751 // then tool chain family\r
752 //\r
753 toolChainFamilyKey = new ToolChainKey(commandDescription);\r
754 toolChainFamilyKey.setKey(ToolChainAttribute.FAMILY.toString(), ToolChainElement.ATTRIBUTE.value);\r
755 String family = toolChainConfig.get(toolChainFamilyKey);\r
756 toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value);\r
757 toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value);\r
758\r
759 option = moduleToolChainFamilyOption.get(fpdModuleId);\r
760 if (option != null) {\r
761 setting = option.get(toolChainFamilyKey);\r
762 }\r
763 }\r
764\r
765 //\r
766 // get platform options, if any\r
767 //\r
768 if (setting == null) {\r
769 // tool tag first\r
770 if (platformToolChainOption == null || (setting = platformToolChainOption.get(toolChainKey)) == null) {\r
771 // then tool chain family\r
772 if (toolChainFamilyKey == null) {\r
773 toolChainFamilyKey = new ToolChainKey(commandDescription);\r
774 toolChainFamilyKey.setKey(ToolChainAttribute.FAMILY.toString(), ToolChainElement.ATTRIBUTE.value);\r
775 String family = toolChainConfig.get(toolChainFamilyKey);\r
776 toolChainFamilyKey.setKey(family, ToolChainElement.TOOLCHAIN.value);\r
777 toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value);\r
778 }\r
779\r
780 setting = platformToolChainFamilyOption.get(toolChainFamilyKey);\r
781 }\r
782 }\r
783\r
784 if (setting == null) {\r
785 setting = "";\r
786 }\r
787\r
788 return setting;\r
789 }\r
790\r
791 public static void setToolChainEnvInfo(ToolChainInfo envInfo) {\r
792 toolChainEnvInfo = envInfo;\r
793 }\r
794 public static void setToolChainPlatformInfo(ToolChainInfo platformInfo) {\r
795 toolChainPlatformInfo = platformInfo;\r
796 }\r
797\r
798 //\r
799 // for PCD\r
800 //\r
801 public synchronized static MemoryDatabaseManager getPCDMemoryDBManager() {\r
802 return pcdDbManager;\r
803 }\r
804\r
805 //\r
806 // For PCD get tokenSpaceGUid\r
807 //\r
808 public synchronized static String getGuidInfoFromCname(String cName){\r
809 String cNameGuid = null;\r
810 String guid = null;\r
811 Set set = spdTable.keySet();\r
812 Iterator iter = set.iterator();\r
813\r
814 if (iter == null) {\r
815 return null;\r
816 }\r
817\r
818 while (iter.hasNext()){\r
819 Spd spd = (Spd) spdTable.get(iter.next());\r
820 guid = spd.getGuidFromCname(cName);\r
821 if (guid != null){\r
822 cNameGuid = guid;\r
823 break;\r
824 }\r
825 }\r
826 return cNameGuid;\r
827 }\r
828\r
829 //\r
830 // For PCD\r
831 //\r
832 public synchronized static Map<FpdModuleIdentification, XmlObject>\r
833 getFpdModuleSaXmlObject(String xmlObjectName) {\r
834 Set<FpdModuleIdentification> fpdModuleSASet = fpdModuleSA.keySet();\r
835 Iterator item = fpdModuleSASet.iterator();\r
836\r
837\r
838 Map<FpdModuleIdentification, XmlObject> SAPcdBuildDef = new HashMap<FpdModuleIdentification, XmlObject>();\r
839 Map<String, XmlObject> SANode = new HashMap<String, XmlObject>();\r
840 FpdModuleIdentification moduleId;\r
841 while (item.hasNext()) {\r
842\r
843 moduleId = (FpdModuleIdentification) item.next();\r
844 SANode = fpdModuleSA.get(moduleId);\r
845 try{\r
846 if (SANode.get(xmlObjectName)!= null){\r
847 SAPcdBuildDef.put(moduleId,\r
848 (XmlObject) SANode.get(xmlObjectName));\r
849\r
850 }\r
851 } catch (Exception e){\r
852 EdkLog.log(EdkLog.EDK_INFO, e.getMessage());\r
853 }\r
854 }\r
855 return SAPcdBuildDef;\r
856 }\r
857\r
858 public synchronized static Map<FpdModuleIdentification,XmlObject> getFpdPcdBuildDefinitions() {\r
859 Map<FpdModuleIdentification,XmlObject> pcdBuildDef = getFpdModuleSaXmlObject ("PcdBuildDefinition");\r
860\r
861 return pcdBuildDef;\r
862 }\r
863}\r
864\r