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.ArrayList;\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
{\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
}\r
}\r
\r
-\r
if(usageInstanceArray.size() != 0) {\r
//\r
// Add "#include 'PcdLib.h'" for Header file\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(isBuildUsedLibrary);\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
+ if (!isBuildUsedLibrary) {\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
+ 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
public static void main(String argv[]) {\r
\r
- String WorkSpace = "M:/ForPcd/edk2";\r
- String logFilePath = WorkSpace + "/MdePkg/MdePkg.fpd";\r
+ String WorkSpace = "M:/tianocore/edk2";\r
+ String logFilePath = WorkSpace + "/EdkNt32Pkg/Nt32.fpd";\r
String[] nameArray = null;\r
\r
//\r
//\r
// Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c\r
//\r
- PCDAutoGenAction autogenAction = new PCDAutoGenAction("BaseLib",\r
- null,\r
+ PCDAutoGenAction autogenAction = new PCDAutoGenAction("MonoStatusCode",\r
null,\r
null,\r
null,\r
+ "IA32",\r
null,\r
false,\r
nameArray);\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
}\r
}\r