]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java
Modify autogen code for DynamicEx type PCD.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / pcd / action / PCDAutoGenAction.java
index 796aff62c3ef1350d3d1fd2528847ed13ad5ab0d..dd33b540c1ffd3b70144ab50c9b4be5bff656450 100644 (file)
@@ -17,11 +17,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 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
@@ -252,6 +254,10 @@ public class PCDAutoGenAction extends BuildAction {
     {\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
@@ -295,7 +301,6 @@ public class PCDAutoGenAction extends BuildAction {
             }\r
         }\r
 \r
-\r
         if(usageInstanceArray.size() != 0) {\r
             //\r
             // Add "#include 'PcdLib.h'" for Header file\r
@@ -303,16 +308,63 @@ public class PCDAutoGenAction extends BuildAction {
             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
@@ -343,8 +395,8 @@ public class PCDAutoGenAction extends BuildAction {
     **/\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
@@ -366,11 +418,11 @@ public class PCDAutoGenAction extends BuildAction {
         //\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
@@ -379,10 +431,5 @@ public class PCDAutoGenAction extends BuildAction {
         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