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