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