import org.apache.xmlbeans.XmlObject;\r
import org.tianocore.build.global.GlobalData;\r
import org.tianocore.build.global.SurfaceAreaQuery;\r
+import org.tianocore.build.id.ModuleIdentification;\r
import org.tianocore.build.pcd.entity.MemoryDatabaseManager;\r
import org.tianocore.build.pcd.entity.Token;\r
import org.tianocore.build.pcd.entity.UsageInstance;\r
///\r
private MemoryDatabaseManager dbManager;\r
///\r
- /// The name of module which is analysised currently.\r
- ///\r
- private String moduleName;\r
- ///\r
- /// The Guid of module which is analyzed currently.\r
- /// \r
- private UUID moduleGuid;\r
- ///\r
- /// The name of package whose module is analysized currently.\r
+ /// The identification for a module.\r
/// \r
- private String packageName;\r
- ///\r
- /// The Guid of package whose module is analyszed curretnly.\r
- /// \r
- private UUID packageGuid;\r
+ private ModuleIdentification moduleId;\r
///\r
/// The arch of current module\r
/// \r
private String arch;\r
///\r
- /// The version of current module\r
- /// \r
- private String version;\r
- ///\r
/// Whether current autogen is for building library used by current module.\r
/// \r
private boolean isBuildUsedLibrary;\r
///\r
/// The name array of <PcdCoded> in a module.\r
/// \r
- private String[] pcdNameArray;\r
+ private String[] pcdNameArrayInMsa;\r
/**\r
- Set parameter ModuleName\r
+ Set parameter moduleId\r
\r
@param moduleName the module name parameter.\r
**/\r
- public void setModuleName(String moduleName) {\r
- this.moduleName = moduleName;\r
- }\r
-\r
- /**\r
- set the moduleGuid parameter.\r
- \r
- @param moduleGuid\r
- **/\r
- public void setModuleGuid(UUID moduleGuid) {\r
- this.moduleGuid = moduleGuid;\r
- }\r
-\r
- /**\r
- set packageName parameter.\r
- \r
- @param packageName\r
- **/\r
- public void setPackageName(String packageName) {\r
- this.packageName = packageName;\r
- }\r
-\r
- /**\r
- set packageGuid parameter.\r
- \r
- @param packageGuid\r
- **/\r
- public void setPackageGuid(UUID packageGuid) {\r
- this.packageGuid = packageGuid;\r
+ public void setModuleId(ModuleIdentification moduleId) {\r
+ this.moduleId = moduleId;\r
}\r
\r
/**\r
this.arch = arch;\r
}\r
\r
- /**\r
- set version parameter\r
- \r
- @param version\r
- */\r
- public void setVersion(String version) {\r
- this.version = version;\r
- }\r
-\r
/**\r
set isBuildUsedLibrary parameter.\r
\r
@param isBuildUsedLibrary\r
- */\r
+ **/\r
public void setIsBuildUsedLibrary(boolean isBuildUsedLibrary) {\r
this.isBuildUsedLibrary = isBuildUsedLibrary;\r
}\r
+\r
/**\r
- set pcdNameArray parameter.\r
+ set pcdNameArrayInMsa parameter.\r
\r
- @param pcdNameArray\r
+ @param pcdNameArrayInMsa\r
*/\r
- public void setPcdNameArray(String[] pcdNameArray) {\r
- this.pcdNameArray = pcdNameArray;\r
+ public void setPcdNameArrayInMsa(String[] pcdNameArrayInMsa) {\r
+ this.pcdNameArrayInMsa = pcdNameArrayInMsa;\r
}\r
\r
/**\r
return cAutoGenString;\r
}\r
\r
-// /**\r
-// Construct function\r
-// \r
-// This function mainly initialize some member variable.\r
-// \r
-// @param moduleName Parameter of this action class.\r
-// @param isEmulatedPCDDriver Parameter of this action class.\r
-// **/\r
-// public PCDAutoGenAction(String moduleName, \r
-// UUID moduleGuid, \r
-// String packageName,\r
-// UUID packageGuid,\r
-// String arch,\r
-// String version,\r
-// boolean isBuildUsedLibrary,\r
-// String[] pcdNameArray) {\r
-// dbManager = null;\r
-// hAutoGenString = "";\r
-// cAutoGenString = "";\r
-//\r
-// setModuleName(moduleName);\r
-// setModuleGuid(moduleGuid);\r
-// setPackageName(packageName);\r
-// setPackageGuid(packageGuid);\r
-// setPcdNameArray(pcdNameArray);\r
-// setArch(arch);\r
-// setVersion(version);\r
-// setIsBuildUsedLibrary(isBuildUsedLibrary);\r
-// }\r
-\r
- \r
+ \r
/**\r
- Construct function\r
+ Construct function\r
\r
- This function mainly initialize some member variable.\r
+ This function mainly initialize some member variable.\r
\r
- @param moduleName Parameter of this action class.\r
- @param isEmulatedPCDDriver Parameter of this action class.\r
- **/\r
- public PCDAutoGenAction(String moduleName, \r
- String moduleGuidString, \r
- String packageName,\r
- String packageGuidString,\r
- String arch,\r
- String version,\r
- boolean isBuildUsedLibrary,\r
- String[] pcdNameArray) \r
- throws BuildActionException {\r
- dbManager = null;\r
- hAutoGenString = "";\r
- cAutoGenString = "";\r
- try {\r
- setModuleName(moduleName);\r
- setModuleGuid(translateSchemaStringToUUID(moduleGuidString));\r
- setPackageName(packageName);\r
- setPackageGuid(translateSchemaStringToUUID(packageGuidString));\r
- setPcdNameArray(pcdNameArray);\r
- setArch(arch);\r
- setVersion(version);\r
- setIsBuildUsedLibrary(isBuildUsedLibrary);\r
- } catch (EntityException e){\r
- throw new BuildActionException(e.getMessage());\r
- }\r
- }\r
-\r
- /**\r
- Translate the schema string to UUID instance.\r
- \r
- In schema, the string of UUID is defined as following two types string:\r
- 1) GuidArrayType: pattern = 0x[a-fA-F0-9]{1,8},( )*0x[a-fA-F0-9]{1,4},(\r
- )*0x[a-fA-F0-9]{1,4}(,( )*\{)?(,?( )*0x[a-fA-F0-9]{1,2}){8}( )*(\})?\r
- \r
- 2) GuidNamingConvention: pattern =\r
- [a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}\r
- \r
- This function will convert string and create uuid instance.\r
- \r
- @param uuidString UUID string in XML file\r
- \r
- @return UUID UUID instance\r
-**/\r
-private UUID translateSchemaStringToUUID(String uuidString) \r
- throws EntityException {\r
- String temp;\r
- String[] splitStringArray;\r
- int index;\r
- int chIndex;\r
- int chLen;\r
-\r
- if (uuidString == null) {\r
- return null;\r
- }\r
-\r
- if (uuidString.length() == 0) {\r
- return null;\r
- }\r
-\r
- if (uuidString.equals("0") ||\r
- uuidString.equalsIgnoreCase("0x0")) {\r
- return new UUID(0, 0);\r
- }\r
-\r
- uuidString = uuidString.replaceAll("\\{", "");\r
- uuidString = uuidString.replaceAll("\\}", "");\r
-\r
- //\r
- // If the UUID schema string is GuidArrayType type then need translate \r
- // to GuidNamingConvention type at first.\r
- // \r
- if ((uuidString.charAt(0) == '0') && ((uuidString.charAt(1) == 'x') || (uuidString.charAt(1) == 'X'))) {\r
- splitStringArray = uuidString.split("," );\r
- if (splitStringArray.length != 11) {\r
- throw new EntityException ("[FPD file error] Wrong format for UUID string: " + uuidString);\r
- }\r
-\r
- //\r
- // Remove blank space from these string and remove header string "0x"\r
- // \r
- for (index = 0; index < 11; index ++) {\r
- splitStringArray[index] = splitStringArray[index].trim();\r
- splitStringArray[index] = splitStringArray[index].substring(2, splitStringArray[index].length());\r
- }\r
-\r
- //\r
- // Add heading '0' to normalize the string length\r
- // \r
- for (index = 3; index < 11; index ++) {\r
- chLen = splitStringArray[index].length();\r
- for (chIndex = 0; chIndex < 2 - chLen; chIndex ++) {\r
- splitStringArray[index] = "0" + splitStringArray[index];\r
- }\r
- }\r
-\r
- //\r
- // construct the final GuidNamingConvention string\r
- // \r
- temp = String.format("%s-%s-%s-%s%s-%s%s%s%s%s%s",\r
- splitStringArray[0],\r
- splitStringArray[1],\r
- splitStringArray[2],\r
- splitStringArray[3],\r
- splitStringArray[4],\r
- splitStringArray[5],\r
- splitStringArray[6],\r
- splitStringArray[7],\r
- splitStringArray[8],\r
- splitStringArray[9],\r
- splitStringArray[10]);\r
- uuidString = temp;\r
- }\r
-\r
- return UUID.fromString(uuidString);\r
- }\r
- \r
+ @param moduleId the identification for module\r
+ @param arch the architecture for module\r
+ @param isBuildUsedLibary Is the current module library.\r
+ @param pcdNameArrayInMsa the pcd name array got from MSA file.\r
+ **/\r
+ public PCDAutoGenAction(ModuleIdentification moduleId, \r
+ String arch,\r
+ boolean isBuildUsedLibrary,\r
+ String[] pcdNameArrayInMsa) {\r
+ dbManager = null;\r
+ hAutoGenString = "";\r
+ cAutoGenString = "";\r
+\r
+ setModuleId(moduleId);\r
+ setArch(arch);\r
+ setIsBuildUsedLibrary(isBuildUsedLibrary);\r
+ setPcdNameArrayInMsa(pcdNameArrayInMsa);\r
+ }\r
+\r
/**\r
check the parameter for action class.\r
\r
ActionMessage.debug(this,\r
"PCD memory database contains " + dbManager.getDBSize() + " PCD tokens");\r
\r
-\r
-\r
generateAutogenForModule();\r
}\r
\r
String[] guidStringArray = null;\r
String guidStringCName = null;\r
String guidString = null;\r
+ String moduleName = moduleId.getName();\r
UsageInstance usageInstance = null;\r
boolean found = false;\r
\r
usageInstanceArray = null;\r
if (!isBuildUsedLibrary) {\r
- usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName,\r
- moduleGuid,\r
- packageName,\r
- packageGuid,\r
- arch,\r
- version);\r
+ usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleId, arch);\r
dbManager.UsageInstanceContext = usageInstanceArray;\r
dbManager.CurrentModuleName = moduleName; \r
- } else if ((pcdNameArray != null) && (pcdNameArray.length > 0)) {\r
+ } else if ((pcdNameArrayInMsa != null) && (pcdNameArrayInMsa.length > 0)) {\r
usageContext = dbManager.UsageInstanceContext;\r
//\r
// For building library package, although all module are library, but PCD entries of \r
// these library should be used to autogen.\r
// \r
if (usageContext == null) {\r
- usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName,\r
- moduleGuid,\r
- packageName,\r
- packageGuid,\r
- arch,\r
- version);\r
+ usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleId, arch);\r
} else {\r
usageInstanceArray = new ArrayList<UsageInstance>();\r
\r
// Try to find all PCD defined in library's PCD in all <PcdEntry> in module's \r
// <ModuleSA> in FPD file.\r
// \r
- for (index = 0; index < pcdNameArray.length; index++) {\r
+ for (index = 0; index < pcdNameArrayInMsa.length; index++) {\r
found = false;\r
for (index2 = 0; index2 < usageContext.size(); index2 ++) {\r
- if (pcdNameArray[index].equalsIgnoreCase(usageContext.get(index2).parentToken.cName)) {\r
+ if (pcdNameArrayInMsa[index].equalsIgnoreCase(usageContext.get(index2).parentToken.cName)) {\r
usageInstanceArray.add(usageContext.get(index2));\r
found = true;\r
break;\r
"it in the %s's <ModuleSA> in FPD file!",\r
dbManager.CurrentModuleName,\r
moduleName,\r
- pcdNameArray[index],\r
+ pcdNameArrayInMsa[index],\r
dbManager.CurrentModuleName\r
));\r
}\r
// Generate all PCD entry for a module.\r
// \r
for(index = 0; index < usageInstanceArray.size(); index ++) {\r
- ActionMessage.debug(this,\r
- "Module " + moduleName + "'s PCD [" + Integer.toHexString(index) + \r
- "]: " + usageInstanceArray.get(index).parentToken.cName);\r
- try {\r
- usageInstance = usageInstanceArray.get(index);\r
+ usageInstance = usageInstanceArray.get(index);\r
+ //\r
+ // Before generate any PCD information into autogen.h/autogen.c for a module,\r
+ // generate TokenSpaceGuid array variable firstly. For every dynamicEx type\r
+ // PCD in this module the token, they are all reference to TokenSpaceGuid \r
+ // array.\r
+ // \r
+ if (usageInstanceArray.get(index).modulePcdType == Token.PCD_TYPE.DYNAMIC_EX) {\r
+ guidStringArray = usageInstance.parentToken.tokenSpaceName.split("-");\r
+ guidStringCName = "_gPcd_TokenSpaceGuid_" + \r
+ usageInstance.parentToken.tokenSpaceName.replaceAll("-", "_");\r
+ guidString = String.format("{ 0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}",\r
+ guidStringArray[0],\r
+ guidStringArray[1],\r
+ guidStringArray[2],\r
+ (guidStringArray[3].substring(0, 2)),\r
+ (guidStringArray[3].substring(2, 4)),\r
+ (guidStringArray[4].substring(0, 2)),\r
+ (guidStringArray[4].substring(2, 4)),\r
+ (guidStringArray[4].substring(4, 6)),\r
+ (guidStringArray[4].substring(6, 8)),\r
+ (guidStringArray[4].substring(8, 10)),\r
+ (guidStringArray[4].substring(10, 12)));\r
+ \r
+ Pattern pattern = Pattern.compile("(" + guidStringCName + ")+?");\r
+ Matcher matcher = pattern.matcher(cAutoGenString + " ");\r
//\r
- // Before generate any PCD information into autogen.h/autogen.c for a module,\r
- // generate TokenSpaceGuid array variable firstly. For every dynamicEx type\r
- // PCD in this module the token, they are all reference to TokenSpaceGuid \r
- // array.\r
+ // Find whether this guid array variable has been generated into autogen.c\r
+ // For different DyanmicEx pcd token who use same token space guid, the token space\r
+ // guid array should be only generated once.\r
// \r
- if (usageInstanceArray.get(index).modulePcdType == Token.PCD_TYPE.DYNAMIC_EX) {\r
- guidStringArray = usageInstance.parentToken.tokenSpaceName.toString().split("-");\r
- guidStringCName = "_gPcd_TokenSpaceGuid_" + \r
- usageInstance.parentToken.tokenSpaceName.toString().replaceAll("-", "_");\r
- guidString = String.format("{ 0x%s, 0x%s, 0x%s, {0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s, 0x%s}}",\r
- guidStringArray[0],\r
- guidStringArray[1],\r
- guidStringArray[2],\r
- (guidStringArray[3].substring(0, 2)),\r
- (guidStringArray[3].substring(2, 4)),\r
- (guidStringArray[4].substring(0, 2)),\r
- (guidStringArray[4].substring(2, 4)),\r
- (guidStringArray[4].substring(4, 6)),\r
- (guidStringArray[4].substring(6, 8)),\r
- (guidStringArray[4].substring(8, 10)),\r
- (guidStringArray[4].substring(10, 12)));\r
- \r
- Pattern pattern = Pattern.compile("(" + guidStringCName + ")+?");\r
- Matcher matcher = pattern.matcher(cAutoGenString + " ");\r
- //\r
- // Find whether this guid array variable has been generated into autogen.c\r
- // For different DyanmicEx pcd token who use same token space guid, the token space\r
- // guid array should be only generated once.\r
- // \r
- if (!matcher.find()) {\r
- hAutoGenString += String.format("extern EFI_GUID %s;\r\n",\r
- guidStringCName);\r
- if (!isBuildUsedLibrary) {\r
- cAutoGenString += String.format("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID %s = %s;\r\n",\r
- guidStringCName,\r
- guidString);\r
- } \r
- }\r
+ if (!matcher.find()) {\r
+ hAutoGenString += String.format("extern EFI_GUID %s;\r\n",\r
+ guidStringCName);\r
+ if (!isBuildUsedLibrary) {\r
+ cAutoGenString += String.format("GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID %s = %s;\r\n",\r
+ guidStringCName,\r
+ guidString);\r
+ } \r
}\r
-\r
- usageInstance.generateAutoGen(isBuildUsedLibrary);\r
- //\r
- // For every PCD entry for this module(usage instance), autogen string would\r
- // be appand.\r
- // \r
- hAutoGenString += usageInstance.getHAutogenStr() + "\r\n";\r
- cAutoGenString += usageInstance.getCAutogenStr();\r
-\r
- } catch(EntityException exp) {\r
- throw new BuildActionException("[PCD Autogen Error]: " + exp.getMessage());\r
}\r
+\r
+ usageInstance.generateAutoGen(isBuildUsedLibrary);\r
+ //\r
+ // For every PCD entry for this module(usage instance), autogen string would\r
+ // be appand.\r
+ // \r
+ hAutoGenString += usageInstance.getHAutogenStr() + "\r\n";\r
+ cAutoGenString += usageInstance.getCAutogenStr();\r
}\r
\r
//\r
hAutoGenString += dbManager.PcdDxeHString;\r
cAutoGenString += dbManager.PcdDxeCString;\r
}\r
-\r
- ActionMessage.debug(this,\r
- "Module " + moduleName + "'s PCD header file:\r\n" + hAutoGenString + "\r\n"\r
- );\r
- ActionMessage.debug(this,\r
- "Module " + moduleName + "'s PCD C file:\r\n" + cAutoGenString + "\r\n"\r
- );\r
}\r
\r
/**\r
} catch(Exception e) {\r
e.printStackTrace();\r
}\r
-\r
- //\r
- // Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c\r
- //\r
-// PCDAutoGenAction autogenAction = new PCDAutoGenAction("MonoStatusCode",\r
-// null,\r
-// null,\r
-// null,\r
-// "IA32",\r
-// null,\r
-// false,\r
-// nameArray);\r
-// autogenAction.execute();\r
-//\r
-// System.out.println(autogenAction.OutputH());\r
-// System.out.println("WQWQWQWQWQ");\r
-// System.out.println(autogenAction.OutputC());\r
}\r
}\r