/** @file\r
- GlobalData class. \r
- \r
+ GlobalData class.\r
+\r
GlobalData provide initializing, instoring, querying and update global data.\r
It is a bridge to intercommunicate between multiple component, such as AutoGen,\r
- PCD and so on. \r
- \r
+ PCD and so on.\r
+\r
Copyright (c) 2006, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
**/\r
package org.tianocore.build.global;\r
\r
+import java.io.File;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
import org.apache.tools.ant.BuildException;\r
import org.apache.xmlbeans.XmlObject;\r
+\r
+import org.tianocore.common.exception.EdkException;\r
+import org.tianocore.common.logger.EdkLog;\r
+import org.tianocore.pcd.entity.MemoryDatabaseManager;\r
import org.tianocore.DbPathAndFilename;\r
import org.tianocore.FrameworkDatabaseDocument;\r
import org.tianocore.ModuleSurfaceAreaDocument;\r
-import org.tianocore.PcdBuildDefinitionDocument;\r
import org.tianocore.ModuleSurfaceAreaDocument.ModuleSurfaceArea;\r
import org.tianocore.build.id.FpdModuleIdentification;\r
import org.tianocore.build.id.ModuleIdentification;\r
import org.tianocore.build.id.PackageIdentification;\r
import org.tianocore.build.id.PlatformIdentification;\r
-import org.tianocore.build.pcd.entity.MemoryDatabaseManager;\r
import org.tianocore.build.toolchain.ToolChainAttribute;\r
import org.tianocore.build.toolchain.ToolChainConfig;\r
import org.tianocore.build.toolchain.ToolChainElement;\r
import org.tianocore.build.toolchain.ToolChainInfo;\r
import org.tianocore.build.toolchain.ToolChainKey;\r
import org.tianocore.build.toolchain.ToolChainMap;\r
-import org.tianocore.exception.EdkException;\r
-import org.tianocore.logger.EdkLog;\r
-\r
-import java.io.File;\r
-import java.util.HashMap;\r
-import java.util.HashSet;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-import java.util.Map;\r
-import java.util.Set;\r
-import java.util.logging.Logger;\r
\r
/**\r
GlobalData provide initializing, instoring, querying and update global data.\r
It is a bridge to intercommunicate between multiple component, such as AutoGen,\r
- PCD and so on. \r
- \r
- <p>Note that all global information are initialized incrementally. All data will \r
+ PCD and so on.\r
+\r
+ <p>Note that all global information are initialized incrementally. All data will\r
parse and record only of necessary during build time. </p>\r
- \r
+\r
@since GenBuild 1.0\r
**/\r
public class GlobalData {\r
-\r
- public static Logger log = Logger.getAnonymousLogger();\r
- \r
///\r
/// Record current WORKSPACE Directory\r
///\r
private static String workspaceDir = "";\r
- \r
+\r
///\r
/// Be used to ensure Global data will be initialized only once.\r
///\r
private static boolean globalFlag = false;\r
- \r
+\r
///\r
/// Framework Database information: package list and platform list\r
///\r
- private static Set<PackageIdentification> packageList = new HashSet<PackageIdentification>(); \r
+ private static Set<PackageIdentification> packageList = new HashSet<PackageIdentification>();\r
\r
private static Set<PlatformIdentification> platformList = new HashSet<PlatformIdentification>();\r
\r
private static XmlObject fpdBuildOptions;\r
\r
private static XmlObject fpdDynamicPcds;\r
- \r
+\r
///\r
/// Parsed modules list\r
///\r
private static Map<FpdModuleIdentification, Map<String, XmlObject>> parsedModules = new HashMap<FpdModuleIdentification, Map<String, XmlObject>>();\r
- \r
+\r
///\r
/// built modules list with ARCH, TARGET, TOOLCHAIN\r
///\r
private static Set<FpdModuleIdentification> builtModules = new HashSet<FpdModuleIdentification>();\r
- \r
+\r
///\r
/// PCD memory database stored all PCD information which collected from FPD,MSA and SPD.\r
///\r
-// private static final MemoryDatabaseManager pcdDbManager = new MemoryDatabaseManager();\r
+ private static final MemoryDatabaseManager pcdDbManager = new MemoryDatabaseManager();\r
\r
///\r
/// build target + tool chain family/tag name + arch + command types + command options\r
/// toolsDef - build tool program information\r
/// fpdBuildOption - all modules's build options for tool tag or tool chain families\r
/// moduleSaBuildOption - build options for a specific module\r
- /// \r
+ ///\r
private static ToolChainConfig toolsDef;\r
\r
private static ToolChainInfo toolChainInfo;\r
private static Map<FpdModuleIdentification, ToolChainMap> moduleToolChainOption = new HashMap<FpdModuleIdentification, ToolChainMap>();\r
private static Map<FpdModuleIdentification, ToolChainMap> moduleToolChainFamilyOption = new HashMap<FpdModuleIdentification, ToolChainMap>();\r
\r
- private static final MemoryDatabaseManager pcdDbManager = new MemoryDatabaseManager();\r
-\r
- \r
-\r
/**\r
Parse framework database (DB) and all SPD files listed in DB to initialize\r
the environment for next build. This method will only be executed only once\r
- in the whole build process. \r
- \r
+ in the whole build process.\r
+\r
@param workspaceDatabaseFile the file name of framework database\r
@param workspaceDir current workspace directory path\r
@throws BuildException\r
Framework Dababase or SPD or MSA file is not valid\r
**/\r
- public synchronized static void initInfo(String workspaceDatabaseFile, String workspaceDir, String toolsDefFilename) throws BuildException {\r
+ public synchronized static void initInfo(String workspaceDatabaseFile, String workspaceDir, String toolsDefFilename ) throws BuildException {\r
//\r
// ensure this method will be revoked only once\r
//\r
return;\r
}\r
globalFlag = true;\r
- \r
- //\r
+\r
+ //\r
// Backup workspace directory. It will be used by other method\r
//\r
GlobalData.workspaceDir = workspaceDir.replaceAll("(\\\\)", "/");\r
- \r
+\r
//\r
// Parse tools definition file\r
//\r
// CONF dir + tools definition file name\r
//\r
File toolsDefFile = new File(workspaceDir + File.separatorChar + toolsDefFilename);\r
- System.out.println("Using file [" + toolsDefFile.getPath() + "] as tools definition file. ");\r
- toolsDef = new ToolChainConfig(toolsDefFile);\r
- \r
+ System.out.println("Using tool definiton file [" + toolsDefFile.getPath() + "].");\r
+ try {\r
+ toolsDef = new ToolChainConfig(toolsDefFile);\r
+ } catch (Exception e) {\r
+ throw new BuildException(e.getMessage());\r
+ }\r
+\r
//\r
// Parse Framework Database\r
//\r
//\r
// validate FrameworkDatabaseFile\r
//\r
- if (! db.validate()) {\r
- throw new BuildException("Framework Database file [" + dbFile.getPath() + "] is invalid.");\r
+ if (!db.validate()) {\r
+ throw new BuildException("Framework Database file [" + dbFile.getPath() + "] format is invalid!");\r
}\r
//\r
// Get package list\r
while (iter.hasNext()) {\r
String fileName = iter.next().getStringValue();\r
File fpdFile = new File(workspaceDir + File.separatorChar + fileName);\r
- if ( ! fpdFile.exists() ) {\r
+ if ( !fpdFile.exists() ) {\r
throw new BuildException("Platform file [" + fpdFile.getPath() + "] not exists. ");\r
}\r
XmlObject fpdDoc = XmlObject.Factory.parse(fpdFile);\r
//\r
// Verify FPD file, if is invalid, throw Exception\r
//\r
- if (! fpdDoc.validate()) {\r
- throw new BuildException("Framework Platform Surface Area file [" + fpdFile.getPath() + "] is invalid. ");\r
+ if (!fpdDoc.validate()) {\r
+ throw new BuildException("Framework Platform Surface Area file [" + fpdFile.getPath() + "] format is invalid!");\r
}\r
//\r
// We can change Map to XmlObject\r
}\r
}\r
} catch (Exception e) {\r
- e.printStackTrace();\r
- throw new BuildException("Parse workspace Database [" + dbFile.getPath() + "] Error.\n" + e.getMessage());\r
+ throw new BuildException("Parse WORKSPACE Database file [" + dbFile.getPath() + "] Error.\n" + e.getMessage());\r
}\r
}\r
- \r
+\r
/**\r
- Get the current WORKSPACE Directory. \r
- \r
+ Get the current WORKSPACE Directory.\r
+\r
@return current workspace directory\r
**/\r
public synchronized static String getWorkspacePath() {\r
public synchronized static File getMsaFile(ModuleIdentification moduleId) throws BuildException {\r
File msaFile = null;\r
//\r
- // TBD. Do only when package is null. \r
+ // TBD. Do only when package is null.\r
//\r
Iterator iter = packageList.iterator();\r
while (iter.hasNext()) {\r
}\r
}\r
if (msaFile == null){\r
- throw new BuildException("Can't find Module [" + moduleId.getName() + "] in all packages. ");\r
- }\r
- else {\r
+ throw new BuildException("Can't find Module [" + moduleId.getName() + "] in any SPD package!");\r
+ } else {\r
return msaFile;\r
}\r
}\r
if (moduleId.getPackage() != null) {\r
return moduleId.getPackage();\r
}\r
- \r
+\r
PackageIdentification packageId = null;\r
Iterator iter = packageList.iterator();\r
while (iter.hasNext()) {\r
}\r
}\r
if (packageId == null){\r
- throw new BuildException("Can't find Module [" + moduleId.getName() + "] in all packages. ");\r
- }\r
- else {\r
+ throw new BuildException("Can't find Module [" + moduleId.getName() + "] in any SPD package!");\r
+ } else {\r
return packageId;\r
}\r
}\r
- \r
+\r
/**\r
Difference between build and parse: ToolChain and Target\r
**/\r
public synchronized static boolean isModuleBuilt(FpdModuleIdentification moduleId) {\r
return builtModules.contains(moduleId);\r
}\r
- \r
+\r
public synchronized static void registerBuiltModule(FpdModuleIdentification fpdModuleId) {\r
builtModules.add(fpdModuleId);\r
}\r
\r
- \r
+\r
public synchronized static void registerFpdModuleSA(FpdModuleIdentification fpdModuleId, Map<String, XmlObject> doc) {\r
Map<String, XmlObject> result = new HashMap<String, XmlObject>();\r
Set keySet = doc.keySet();\r
}\r
fpdModuleSA.put(fpdModuleId, result);\r
}\r
- \r
+\r
+ public synchronized static boolean hasFpdModuleSA(FpdModuleIdentification fpdModuleId) {\r
+ return fpdModuleSA.containsKey(fpdModuleId);\r
+ }\r
+\r
/**\r
- Query overrided module surface area information. If current is Package\r
- or Platform build, also include the information from FPD file. \r
- \r
- <p>Note that surface area parsing is incremental. That means the method will \r
- only parse the MSA and MBD files if necessary. </p>\r
+ Query module surface area information.\r
+\r
+ <p>Note that surface area parsing is incremental. That means the method will\r
+ only parse the MSA files if necessary. </p>\r
\r
- @param moduleName the base name of the module\r
- @return the overrided module surface area information\r
- @throws BuildException\r
- MSA or MBD is not valid\r
+ @param fpdModuleId Module ID with arch\r
+ @return ModuleSA info and MSA info for fpdModuleId\r
+ @throws BuildException Can't find MSA\r
**/\r
public synchronized static Map<String, XmlObject> getDoc(FpdModuleIdentification fpdModuleId) throws BuildException {\r
if (parsedModules.containsKey(fpdModuleId)) {\r
// First part: get the MSA files info\r
//\r
doc.putAll(getNativeMsa(moduleId));\r
- \r
+\r
//\r
// Second part: put build options\r
//\r
doc.put("BuildOptions", fpdBuildOptions);\r
- \r
+\r
//\r
// Third part: get Module info from FPD, such as Library instances, PCDs\r
//\r
return getDoc(fpdModuleId);\r
}\r
/**\r
- Query the native MSA information with module base name. \r
- \r
- <p>Note that MSA parsing is incremental. That means the method will \r
+ Query the native MSA information with module base name.\r
+\r
+ <p>Note that MSA parsing is incremental. That means the method will\r
only to parse the MSA files when never parsed before. </p>\r
- \r
+\r
@param moduleName the base name of the module\r
@return the native MSA information\r
@throws BuildException\r
nativeMsa.put(moduleId, msaMap);\r
return msaMap;\r
}\r
- \r
+\r
public synchronized static Map<String, XmlObject> getNativeMsa(File msaFile) throws BuildException {\r
- if (! msaFile.exists()) {\r
- throw new BuildException("Surface Area file [" + msaFile.getPath() + "] can't found.");\r
+ if (!msaFile.exists()) {\r
+ throw new BuildException("Module Surface Area file [" + msaFile.getPath() + "] can't be found!");\r
}\r
try {\r
ModuleSurfaceAreaDocument doc = (ModuleSurfaceAreaDocument)XmlObject.Factory.parse(msaFile);\r
//\r
// Validate File if they accord with XML Schema\r
//\r
- if ( ! doc.validate()){\r
- throw new BuildException("Module Surface Area file [" + msaFile.getPath() + "] is invalid.");\r
+ if ( !doc.validate()){\r
+ throw new BuildException("Module Surface Area file [" + msaFile.getPath() + "] format is invalid!");\r
}\r
//\r
// parse MSA file\r
throw new BuildException(ex.getMessage());\r
}\r
}\r
- \r
+\r
public static Map<String, XmlObject> getFpdBuildOptions() {\r
Map<String, XmlObject> map = new HashMap<String, XmlObject>();\r
map.put("BuildOptions", fpdBuildOptions);\r
return map;\r
}\r
- \r
+\r
public static void setFpdBuildOptions(XmlObject fpdBuildOptions) {\r
GlobalData.fpdBuildOptions = cloneXmlObject(fpdBuildOptions, true);\r
}\r
GlobalData.fpdDynamicPcds = fpdDynamicPcds;\r
}\r
\r
- //////////////////////////////////////////////\r
- //////////////////////////////////////////////\r
- \r
public static Set<ModuleIdentification> getModules(PackageIdentification packageId){\r
Spd spd = spdTable.get(packageId);\r
if (spd == null ) {\r
Set<ModuleIdentification> dummy = new HashSet<ModuleIdentification>();\r
return dummy;\r
- }\r
- else {\r
+ } else {\r
return spd.getModules();\r
}\r
}\r
// If can't find library class declaration in every package\r
//\r
throw new BuildException("Can not find library class [" + name\r
- + "] declaration in every packages. ");\r
+ + "] declaration in any SPD package!");\r
}\r
\r
/**\r
return null;\r
\r
}\r
- \r
+\r
public synchronized static PlatformIdentification getPlatformByName(String name) throws BuildException {\r
Iterator iter = platformList.iterator();\r
while(iter.hasNext()){\r
return platformId;\r
}\r
}\r
- throw new BuildException("Can't find platform [" + name + "] in current workspace database. ");\r
+ throw new BuildException("Can't find platform [" + name + "] in the current WORKSPACE database!");\r
}\r
- \r
+\r
public synchronized static PlatformIdentification getPlatform(String filename) throws BuildException {\r
File file = new File(workspaceDir + File.separatorChar + filename);\r
Iterator iter = platformList.iterator();\r
return platformId;\r
}\r
}\r
- throw new BuildException("Can't find platform file [" + filename + "] in current workspace database. ");\r
+ throw new BuildException("Can't find platform file [" + filename + "] in the current WORKSPACE database!");\r
}\r
- \r
+\r
public synchronized static PackageIdentification refreshPackageIdentification(PackageIdentification packageId) throws BuildException {\r
Iterator iter = packageList.iterator();\r
while(iter.hasNext()){\r
return packageId;\r
}\r
}\r
- throw new BuildException("Can't find package GUID value " + packageId.getGuid() + " under current workspace. ");\r
+ throw new BuildException("Can't find package GUID value " + packageId.getGuid() + " in the current workspace!");\r
}\r
- \r
+\r
public synchronized static ModuleIdentification refreshModuleIdentification(ModuleIdentification moduleId) throws BuildException {\r
-// System.out.println("1");\r
-// System.out.println("##" + moduleId.getGuid());\r
PackageIdentification packageId = getPackageForModule(moduleId);\r
-// System.out.println("" + packageId.getGuid());\r
moduleId.setPackage(packageId);\r
Spd spd = spdTable.get(packageId);\r
if (spd == null) {\r
- throw new BuildException("Can't find package GUID value " + packageId.getGuid() + " under current workspace. ");\r
+ throw new BuildException("Can't find package GUID value " + packageId.getGuid() + " in the current workspace!");\r
}\r
Set<ModuleIdentification> modules = spd.getModules();\r
Iterator<ModuleIdentification> iter = modules.iterator();\r
return moduleId;\r
}\r
}\r
- throw new BuildException("Can't find module GUID value " + moduleId.getGuid() + " in " + packageId + " under current workspace. ");\r
+ throw new BuildException("Can't find module GUID value " + moduleId.getGuid() + " in package, " + packageId + ", in the current workspace!");\r
}\r
- \r
+\r
public synchronized static Set<PackageIdentification> getPackageList(){\r
return packageList;\r
}\r
- ///// remove!!\r
+\r
+ /**\r
+ BUGBUG: It is a walk around method. If do not clone, can't query info with\r
+ XPath correctly. \r
+ \r
+ @param object XmlObject\r
+ @param deep flag for deep clone\r
+ @return XmlObject after clone\r
+ @throws BuildException parse original XmlObject error. \r
+ **/\r
private static XmlObject cloneXmlObject(XmlObject object, boolean deep) throws BuildException {\r
if ( object == null) {\r
return null;\r
return result;\r
}\r
\r
- ////// Tool Chain Related, try to refine and put some logic process to ToolChainFactory\r
-\r
+ ///\r
+ /// Tool Chain Related, try to refine and put some logic process to ToolChainFactory\r
+ ///\r
public static ToolChainInfo getToolChainInfo() {\r
-// GlobalData.log.info(toolsDef.getConfigInfo() + "" + toolChainEnvInfo + toolChainPlatformInfo);\r
if (toolChainInfo == null) {\r
toolChainInfo = toolsDef.getConfigInfo().intersection(toolChainEnvInfo);\r
if (toolChainPlatformInfo != null) {\r
}\r
toolChainInfo.addCommands(toolsDef.getConfigInfo().getCommands());\r
toolChainInfo.normalize();\r
- GlobalData.log.info(toolChainInfo + "");\r
+ System.out.println("Current build tool chain information summary: ");\r
+ System.out.println(toolChainInfo + "");\r
}\r
return toolChainInfo;\r
}\r
\r
-\r
-\r
public static void setPlatformToolChainFamilyOption(ToolChainMap map) {\r
platformToolChainFamilyOption = map;\r
}\r
\r
public static String getCommandSetting(String[] commandDescription, FpdModuleIdentification fpdModuleId) throws EdkException {\r
ToolChainKey toolChainKey = new ToolChainKey(commandDescription);\r
- ToolChainMap toolChainConfig = toolsDef.getConfig(); \r
+ ToolChainMap toolChainConfig = toolsDef.getConfig();\r
String setting = null;\r
\r
if (!commandDescription[ToolChainElement.ATTRIBUTE.value].equals(ToolChainAttribute.FLAGS.toString())) {\r
toolChainFamilyKey.setKey(ToolChainAttribute.FLAGS.toString(), ToolChainElement.ATTRIBUTE.value);\r
\r
option = moduleToolChainFamilyOption.get(fpdModuleId);\r
- if (option != null) { \r
+ if (option != null) {\r
setting = option.get(toolChainFamilyKey);\r
}\r
}\r
\r
return setting;\r
}\r
- \r
+\r
public static void setToolChainEnvInfo(ToolChainInfo envInfo) {\r
toolChainEnvInfo = envInfo;\r
}\r
//\r
// For PCD get tokenSpaceGUid\r
//\r
- public synchronized static String[] getGuidInfoFromCname(String cName){\r
- String cNameGuid[] = null;\r
+ public synchronized static String getGuidInfoFromCname(String cName){\r
+ String cNameGuid = null;\r
String guid = null;\r
Set set = spdTable.keySet();\r
Iterator iter = set.iterator();\r
Spd spd = (Spd) spdTable.get(iter.next());\r
guid = spd.getGuidFromCname(cName);\r
if (guid != null){\r
- cNameGuid = new String[2];\r
- cNameGuid[0] = cName;\r
- cNameGuid[1] = guid;\r
+ cNameGuid = guid;\r
break;\r
}\r
}\r
//\r
// For PCD\r
//\r
- public synchronized static Map<FpdModuleIdentification, XmlObject> getFpdModuleSaXmlObject(\r
- String xmlObjectName) {\r
+ public synchronized static Map<FpdModuleIdentification, XmlObject>\r
+ getFpdModuleSaXmlObject(String xmlObjectName) {\r
Set<FpdModuleIdentification> fpdModuleSASet = fpdModuleSA.keySet();\r
Iterator item = fpdModuleSASet.iterator();\r
- \r
+\r
\r
Map<FpdModuleIdentification, XmlObject> SAPcdBuildDef = new HashMap<FpdModuleIdentification, XmlObject>();\r
Map<String, XmlObject> SANode = new HashMap<String, XmlObject>();\r
FpdModuleIdentification moduleId;\r
while (item.hasNext()) {\r
- \r
+\r
moduleId = (FpdModuleIdentification) item.next();\r
SANode = fpdModuleSA.get(moduleId);\r
try{\r
if (SANode.get(xmlObjectName)!= null){\r
SAPcdBuildDef.put(moduleId,\r
- (XmlObject) SANode\r
- .get(xmlObjectName));\r
+ (XmlObject) SANode.get(xmlObjectName));\r
\r
}\r
- \r
- \r
} catch (Exception e){\r
EdkLog.log(EdkLog.EDK_INFO, e.getMessage());\r
}\r
- }\r
+ }\r
return SAPcdBuildDef;\r
}\r
+\r
+ public synchronized static Map<FpdModuleIdentification,XmlObject> getFpdPcdBuildDefinitions() {\r
+ Map<FpdModuleIdentification,XmlObject> pcdBuildDef = getFpdModuleSaXmlObject ("PcdBuildDefinition");\r
+\r
+ return pcdBuildDef;\r
+ }\r
}\r
\r