package org.tianocore.build.pcd.action;\r
\r
import java.io.File;\r
+import java.util.ArrayList;\r
import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.UUID;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
\r
+import org.apache.xmlbeans.XmlObject;\r
import org.tianocore.build.global.GlobalData;\r
+import org.tianocore.build.global.SurfaceAreaQuery;\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 String moduleName;\r
///\r
- /// Wheter current module is PCD emulated driver. It is only for \r
- /// emulated PCD driver and will be kept until PCD IMAGE tool ready.\r
+ /// The Guid of module which is analyzed currently.\r
+ /// \r
+ private UUID moduleGuid;\r
///\r
- private boolean isEmulatedPCDDriver;\r
+ /// The name of package whose module is analysized currently.\r
+ /// \r
+ private String packageName;\r
+ ///\r
+ /// The Guid of package whose module is analyszed curretnly.\r
+ /// \r
+ private UUID packageGuid;\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 generated string for header file.\r
///\r
///\r
/// The generated string for C code file.\r
///\r
- private String cAutoGenString; \r
-\r
+ private String cAutoGenString;\r
+ ///\r
+ /// The name array of <PcdCoded> in a module.\r
+ /// \r
+ private String[] pcdNameArray;\r
/**\r
Set parameter ModuleName\r
\r
}\r
\r
/**\r
- Set parameter isEmulatedPCDDriver\r
- \r
- @param isEmulatedPCDDriver whether this module is PeiEmulatedPCD driver\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 setIsEmulatedPCDDriver(boolean isEmulatedPCDDriver) {\r
- this.isEmulatedPCDDriver = isEmulatedPCDDriver;\r
+ public void setPackageGuid(UUID packageGuid) {\r
+ this.packageGuid = packageGuid;\r
+ }\r
+\r
+ /**\r
+ set Arch parameter.\r
+ \r
+ @param arch\r
+ **/\r
+ public void setArch(String arch) {\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
+ public void setIsBuildUsedLibrary(boolean isBuildUsedLibrary) {\r
+ this.isBuildUsedLibrary = isBuildUsedLibrary;\r
+ }\r
+ /**\r
+ set pcdNameArray parameter.\r
+ \r
+ @param pcdNameArray\r
+ */\r
+ public void setPcdNameArray(String[] pcdNameArray) {\r
+ this.pcdNameArray = pcdNameArray;\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
- Construct function\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
+ 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
- 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, boolean isEmulatedPCDDriver) {\r
- dbManager = null;\r
- setIsEmulatedPCDDriver(isEmulatedPCDDriver);\r
- setModuleName(moduleName);\r
- }\r
-\r
/**\r
check the parameter for action class.\r
\r
@throws BuildActionException Bad parameter.\r
**/\r
void checkParameter() throws BuildActionException {\r
- if(!isEmulatedPCDDriver &&(moduleName == null)) {\r
- throw new BuildActionException("Wrong module name parameter for PCDAutoGenAction tool!");\r
- }\r
-\r
- if(!isEmulatedPCDDriver && moduleName.length() == 0) {\r
- throw new BuildActionException("Wrong module name parameter for PCDAutoGenAction tool!");\r
- }\r
+ \r
}\r
\r
/**\r
void performAction() throws BuildActionException {\r
ActionMessage.debug(this, \r
"Starting PCDAutoGenAction to generate autogen.h and autogen.c!...");\r
- \r
//\r
// Check the PCD memory database manager is valid.\r
//\r
dbManager = GlobalData.getPCDMemoryDBManager();\r
\r
if(dbManager.getDBSize() == 0) {\r
- return; \r
+ return;\r
}\r
\r
ActionMessage.debug(this,\r
"PCD memory database contains " + dbManager.getDBSize() + " PCD tokens");\r
\r
- hAutoGenString = "";\r
- cAutoGenString = "";\r
\r
- if(isEmulatedPCDDriver) {\r
- generateAutogenForPCDEmulatedDriver();\r
- } else {\r
- generateAutogenForModule();\r
- }\r
+\r
+ generateAutogenForModule();\r
}\r
\r
/**\r
**/\r
private void generateAutogenForModule()\r
{\r
- int index;\r
- List<UsageInstance> usageInstanceArray;\r
+ int index, index2;\r
+ List<UsageInstance> usageInstanceArray, usageContext;\r
+ String[] guidStringArray = null;\r
+ String guidStringCName = null;\r
+ String guidString = null;\r
+ UsageInstance usageInstance = null;\r
+\r
+ if (!isBuildUsedLibrary) {\r
+ usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName,\r
+ moduleGuid,\r
+ packageName,\r
+ packageGuid,\r
+ arch,\r
+ version);\r
+ dbManager.UsageInstanceContext = usageInstanceArray;\r
+ dbManager.CurrentModuleName = moduleName; \r
+ } else {\r
+ usageContext = dbManager.UsageInstanceContext;\r
+ //\r
+ // For building MDE 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
+ } else {\r
+ usageInstanceArray = new ArrayList<UsageInstance>();\r
+ //\r
+ // Remove PCD entries which are not belong to this library.\r
+ // \r
+ for (index = 0; index < usageContext.size(); index++) {\r
+ if ((pcdNameArray == null) || (pcdNameArray.length == 0)){\r
+ break;\r
+ }\r
\r
- usageInstanceArray = dbManager.getUsageInstanceArrayByModuleName(moduleName);\r
+ for (index2 = 0; index2 < pcdNameArray.length; index2 ++) {\r
+ if (pcdNameArray[index2].equalsIgnoreCase(usageContext.get(index).parentToken.cName)) {\r
+ usageInstanceArray.add(usageContext.get(index));\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
\r
if(usageInstanceArray.size() != 0) {\r
//\r
hAutoGenString = "#include <MdePkg/Include/Library/PcdLib.h>\r\n";\r
}\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
- usageInstanceArray.get(index).generateAutoGen();\r
- hAutoGenString += usageInstanceArray.get(index).getHAutogenStr() + "\r\n";\r
- cAutoGenString += usageInstanceArray.get(index).getCAutogenStr() + "\r\n";\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.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
+ }\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(exp.getMessage());\r
+ throw new BuildActionException("[PCD Autogen Error]: " + exp.getMessage());\r
}\r
}\r
\r
+ //\r
+ // Work around code, In furture following code should be modified that get \r
+ // these information from Uplevel Autogen tools.\r
+ // \r
if (moduleName.equalsIgnoreCase("PcdPeim")) {\r
hAutoGenString += dbManager.PcdPeimHString;\r
cAutoGenString += dbManager.PcdPeimCString;\r
);\r
}\r
\r
- /**\r
- Generate all PCD autogen string and the emulated PCD IMAGE array for emulated driver.\r
- \r
- Currently, we should generated all PCD information(maybe all dynamic) as array \r
- in Pei emulated driver for simulating PCD runtime database. \r
- \r
- **/\r
- private void generateAutogenForPCDEmulatedDriver() {\r
- int index;\r
- Token[] tokenArray;\r
- UsageInstance usageInstance;\r
-\r
- //\r
- // Add "#include 'PcdLib.h'" for Header file\r
- //\r
- hAutoGenString = "#include <MdePkg/Include/Library/PcdLib.h>\r\n";\r
-\r
- tokenArray = dbManager.getRecordArray();\r
- for(index = 0; index < tokenArray.length; index ++) {\r
- //\r
- // Get one consumer instance and generate autogen for this token.\r
- //\r
- if(tokenArray[index].consumers != null ) {\r
- if(tokenArray[index].consumers.size() != 0) {\r
- usageInstance = tokenArray[index].consumers.get(0);\r
- try {\r
- usageInstance.generateAutoGen();\r
- } catch(EntityException exp) {\r
- throw new BuildActionException(exp.getMessage());\r
- }\r
- \r
- hAutoGenString += usageInstance.getHAutogenStr();\r
- cAutoGenString += usageInstance.getCAutogenStr();\r
- \r
- hAutoGenString += "\r\n";\r
- cAutoGenString += "\r\n";\r
- } else {\r
- //\r
- // If the PCD does *not* usded by any module, also generate \r
- // it into autogen.h/autogen.c in Pcd driver according the\r
- // information in FPD file.\r
- //\r
- generateUnReferencePcdAutogenString(tokenArray[index]);\r
- }\r
- }\r
- }\r
-\r
- generatePCDEmulatedArray(tokenArray);\r
-\r
- ActionMessage.debug(this,\r
- "PCD emulated driver's header: \r\n" + hAutoGenString + "\r\n"\r
- );\r
- ActionMessage.debug(this,\r
- "PCD emulated driver's C code: \r\n" + cAutoGenString + "\r\n"\r
- );\r
-\r
- }\r
-\r
- /**\r
- Generate unreference token definition string for PCD emulated string. \r
- \r
- Maybe some PCD token definition in FPD but not used by any module or library, we \r
- should also generate token definition in autoge.h/autogen.c, because maybe some\r
- driver loaded in shell will use this PCD. \r
-\r
- @param token The token who want be generated autogen string.\r
- \r
- **/\r
- private void generateUnReferencePcdAutogenString(Token token) {\r
- hAutoGenString += String.format("#define _PCD_TOKEN_%s 0x%016x\r\n", \r
- token.cName, token.tokenNumber);\r
- switch (token.pcdType) {\r
- case FEATURE_FLAG:\r
- hAutoGenString += String.format(\r
- "#define _PCD_VALUE_%s %s\r\n", \r
- token.cName, \r
- token.datum.toString()\r
- );\r
- hAutoGenString += String.format(\r
- "extern const BOOLEAN _gPcd_FixedAtBuild_%s;\r\n", \r
- token.cName\r
- );\r
- cAutoGenString += String.format(\r
- "GLOBAL_REMOVE_IF_UNREFERENCED const BOOLEAN _gPcd_FixedAtBuild_%s = _PCD_VALUE_%s;\r\n",\r
- token.cName,\r
- token.cName\r
- );\r
- hAutoGenString += String.format(\r
- "#define _PCD_MODE_%s_%s _PCD_VALUE_%s\r\n",\r
- Token.GetAutogenDefinedatumTypeString(token.datumType),\r
- token.cName,\r
- token.cName\r
- );\r
- break;\r
- case FIXED_AT_BUILD:\r
- hAutoGenString += String.format(\r
- "#define _PCD_VALUE_%s %s\r\n", \r
- token.cName, \r
- token.datum.toString()\r
- );\r
- hAutoGenString += String.format(\r
- "extern const %s _gPcd_FixedAtBuild_%s;\r\n",\r
- Token.getAutogendatumTypeString(token.datumType),\r
- token.cName\r
- );\r
- cAutoGenString += String.format(\r
- "GLOBAL_REMOVE_IF_UNREFERENCED const %s _gPcd_FixedAtBuild_%s = _PCD_VALUE_%s;\r\n",\r
- Token.getAutogendatumTypeString(token.datumType),\r
- token.cName,\r
- token.cName\r
- );\r
- hAutoGenString += String.format(\r
- "#define _PCD_MODE_%s_%s _PCD_VALUE_%s\r\n",\r
- Token.GetAutogenDefinedatumTypeString(token.datumType),\r
- token.cName,\r
- token.cName\r
- );\r
- break;\r
- case PATCHABLE_IN_MODULE:\r
- hAutoGenString += String.format(\r
- "#define _PCD_VALUE_%s %s\r\n", \r
- token.cName, \r
- token.datum.toString()\r
- );\r
- hAutoGenString += String.format(\r
- "extern %s _gPcd_BinaryPatch_%s;\r\n",\r
- Token.getAutogendatumTypeString(token.datumType),\r
- token.cName\r
- );\r
- cAutoGenString += String.format(\r
- "GLOBAL_REMOVE_IF_UNREFERENCED %s _gPcd_BinaryPatch_%s = _PCD_VALUE_%s;\r\n",\r
- Token.getAutogendatumTypeString(token.datumType),\r
- token.cName,\r
- token.cName\r
- );\r
- hAutoGenString += String.format(\r
- "#define _PCD_MODE_%s_%s _gPcd_BinaryPatch_%s\r\n",\r
- Token.GetAutogenDefinedatumTypeString(token.datumType),\r
- token.cName,\r
- token.cName\r
- );\r
- break;\r
- case DYNAMIC:\r
- hAutoGenString += String.format(\r
- "#define _PCD_MODE_%s_%s LibPcdGet%s(_PCD_TOKEN_%s)\r\n",\r
- Token.GetAutogenDefinedatumTypeString(token.datumType),\r
- token.cName,\r
- Token.getAutogenLibrarydatumTypeString(token.datumType),\r
- token.cName\r
- );\r
- break;\r
- case DYNAMIC_EX:\r
- break;\r
- default:\r
- ActionMessage.warning(this, \r
- "The PCD_TYPE setted by platform is unknown"\r
- );\r
- }\r
-\r
- hAutoGenString += "\r\n";\r
- cAutoGenString += "\r\n";\r
- }\r
- \r
- /**\r
- Generate PCDEmulated array in PCDEmulated driver for emulated runtime database.\r
- \r
- @param tokenArray All PCD token in memory database.\r
- \r
- @throws BuildActionException Unknown PCD_TYPE\r
- **/\r
- private void generatePCDEmulatedArray(Token[] tokenArray)\r
- throws BuildActionException {\r
- int index;\r
- Token token;\r
- String[] guidStrArray;\r
- String value;\r
-\r
- //\r
- // The value of String type of PCD entry maybe use byte array but not string direcly\r
- // such as {0x1, 0x2, 0x3}, and define PCD1_STRING_Value as L"string define here"\r
- // For this case, we should generate a string array to C output and use the address\r
- // of generated string array.\r
- //\r
- for(index = 0; index < tokenArray.length; index ++) {\r
- token = tokenArray[index];\r
-\r
- value = token.datum.toString();\r
- if(token.datumType == Token.DATUM_TYPE.POINTER) {\r
- if(!((value.charAt(0) == 'L' && value.charAt(1) == '"') ||(value.charAt(0) == '"'))) {\r
- cAutoGenString += String.format("UINT8 _mPcdArray%08x[] = %s;\r\n", \r
- index, \r
- value\r
- );\r
- }\r
- }\r
- }\r
-\r
- //\r
- // Output emulated PCD entry array\r
- //\r
- cAutoGenString += "\r\nEMULATED_PCD_ENTRY gEmulatedPcdEntry[] = {\r\n";\r
-\r
- for(index = 0; index < tokenArray.length; index ++) {\r
- token = tokenArray[index];\r
-\r
- if(index != 0) {\r
- cAutoGenString += ",\r\n";\r
- }\r
-\r
- //\r
- // Print Start "{" for a Token item in array\r
- //\r
- cAutoGenString += " {\r\n";\r
-\r
- //\r
- // Print Token Name\r
- //\r
- cAutoGenString += String.format(" _PCD_TOKEN_%s,\r\n", token.cName);\r
-\r
- //\r
- // Print Hii information\r
- //\r
- if(token.hiiEnabled) {\r
- cAutoGenString += String.format(" TRUE,\r\n");\r
- } else {\r
- cAutoGenString += String.format(" FALSE,\r\n");\r
- }\r
-\r
- //\r
- // Print sku information\r
- //\r
- if(token.skuEnabled) {\r
- cAutoGenString += String.format(" TRUE,\r\n");\r
- } else {\r
- cAutoGenString += String.format(" FALSE,\r\n");\r
- }\r
-\r
- //\r
- // Print maxSkuCount\r
- //\r
- cAutoGenString += String.format(" %d,\r\n", token.maxSkuCount);\r
-\r
- cAutoGenString += String.format(" %d,\r\n", token.skuId);\r
-\r
- if(token.variableGuid == null) {\r
- cAutoGenString += " { 0x00000000, 0x0000, 0x0000, { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } },\r\n";\r
- } else {\r
- guidStrArray =(token.variableGuid.toString()).split("-");\r
-\r
- cAutoGenString += 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\n",\r
- guidStrArray[0],\r
- guidStrArray[1],\r
- guidStrArray[2],\r
- (guidStrArray[3].substring(0, 2)),\r
- (guidStrArray[3].substring(2, 4)),\r
- (guidStrArray[4].substring(0, 2)),\r
- (guidStrArray[4].substring(2, 4)),\r
- (guidStrArray[4].substring(4, 6)),\r
- (guidStrArray[4].substring(6, 8)),\r
- (guidStrArray[4].substring(8, 10)),\r
- (guidStrArray[4].substring(10, 12))\r
- );\r
-\r
- }\r
-\r
- value = token.datum.toString();\r
- if(token.datumType == Token.DATUM_TYPE.POINTER) {\r
- if((value.charAt(0) == 'L' && value.charAt(1) == '"') || value.charAt(0) == '"') {\r
- cAutoGenString += String.format(" sizeof(_PCD_VALUE_%s),\r\n", token.cName);\r
- cAutoGenString += String.format(" 0, %s, %s,\r\n", token.variableName, value);\r
- } else {\r
- cAutoGenString += String.format(" sizeof(_mPcdArray%08x),\r\n", index);\r
- cAutoGenString += String.format(" 0, &_mPcdArray%08x, %s,\r\n", index, token.variableName);\r
- }\r
- } else {\r
- switch(token.datumType) {\r
- case UINT8:\r
- cAutoGenString += " 1,\r\n";\r
- break;\r
- case UINT16:\r
- cAutoGenString += " 2,\r\n";\r
- break;\r
- case UINT32:\r
- cAutoGenString += " 4,\r\n";\r
- break;\r
- case UINT64:\r
- cAutoGenString += " 8,\r\n";\r
- break;\r
- case BOOLEAN:\r
- cAutoGenString += " 1,\r\n";\r
- break;\r
- default:\r
- throw new BuildActionException("Unknown datum size");\r
- }\r
- cAutoGenString += String.format(" %s, %s, NULL,\r\n", value, token.variableName);\r
- }\r
-\r
- //\r
- // Print end "}" for a token item in array\r
- //\r
- cAutoGenString += " }";\r
- }\r
-\r
- cAutoGenString += "\r\n};\r\n";\r
- cAutoGenString += "\r\n";\r
- cAutoGenString += "UINTN\r\n";\r
- cAutoGenString += "GetPcdDataBaseSize(\r\n";\r
- cAutoGenString += " VOID\r\n";\r
- cAutoGenString += " )\r\n";\r
- cAutoGenString += "{\r\n";\r
- cAutoGenString += " return sizeof(gEmulatedPcdEntry);\r\n";\r
- cAutoGenString += "}\r\n";\r
- }\r
-\r
/**\r
Test case function\r
\r
**/\r
public static void main(String argv[]) {\r
\r
- String WorkSpace = "G:/edk2";\r
+ String WorkSpace = "X:/edk2";\r
String logFilePath = WorkSpace + "/EdkNt32Pkg/Nt32.fpd";\r
+ String[] nameArray = null;\r
\r
//\r
// At first, CollectPCDAction should be invoked to collect\r
//\r
CollectPCDAction collectionAction = new CollectPCDAction();\r
GlobalData.initInfo("Tools" + File.separator + "Conf" + File.separator + "FrameworkDatabase.db",\r
- WorkSpace);\r
-\r
- GlobalData.getPCDMemoryDBManager().setLogFileName(logFilePath + ".PCDMemroyDatabaseLog.txt");\r
+ WorkSpace,null);\r
\r
try {\r
collectionAction.perform(WorkSpace, \r
//\r
// Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c\r
//\r
- PCDAutoGenAction autogenAction = new PCDAutoGenAction("PcdDxe",\r
- false\r
- );\r
- autogenAction.execute();\r
-\r
- System.out.println(autogenAction.OutputH());\r
- System.out.println("WQWQWQWQWQ");\r
- System.out.println(autogenAction.OutputC());\r
-\r
-\r
- System.out.println (autogenAction.hAutoGenString);\r
- System.out.println (autogenAction.cAutoGenString);\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