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