]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/pcd/action/PCDAutoGenAction.java
Change Workspace to X:
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / pcd / action / PCDAutoGenAction.java
index ca65c7546c5666db3b0d523d306971d9d7b17a1d..63698b1473b0c8a8b1322b9b85dfb9669762d1e4 100644 (file)
@@ -115,22 +115,6 @@ public class PCDAutoGenAction extends BuildAction {
         if(!isEmulatedPCDDriver && moduleName.length() == 0) {\r
             throw new BuildActionException("Wrong module name parameter for PCDAutoGenAction tool!");\r
         }\r
-\r
-        //\r
-        // Check the PCD memory database manager is valid.\r
-        //\r
-        if(GlobalData.getPCDMemoryDBManager() == null) {\r
-            throw new BuildActionException("Memory database has not been initlizated!");\r
-        }\r
-\r
-        dbManager = GlobalData.getPCDMemoryDBManager();\r
-\r
-        if(dbManager.getDBSize() == 0) {\r
-            throw new BuildActionException("Memory database does not contain any record!");\r
-        }\r
-\r
-        ActionMessage.debug(this,\r
-                            "PCD memory database contains " + dbManager.getDBSize() + " PCD tokens");\r
     }\r
 \r
     /**\r
@@ -146,6 +130,22 @@ public class PCDAutoGenAction extends BuildAction {
     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
+        if(GlobalData.getPCDMemoryDBManager() == null) {\r
+            throw new BuildActionException("Memory database has not been initlizated!");\r
+        }\r
+\r
+        dbManager = GlobalData.getPCDMemoryDBManager();\r
+\r
+        if(dbManager.getDBSize() == 0) {\r
+           return; \r
+        }\r
+\r
+        ActionMessage.debug(this,\r
+                            "PCD memory database contains " + dbManager.getDBSize() + " PCD tokens");\r
 \r
         hAutoGenString = "";\r
         cAutoGenString = "";\r
@@ -190,6 +190,14 @@ public class PCDAutoGenAction extends BuildAction {
             }\r
         }\r
 \r
+        if (moduleName.equalsIgnoreCase("PcdPeim")) {\r
+            hAutoGenString += dbManager.PcdPeimHString;\r
+            cAutoGenString += dbManager.PcdPeimCString;\r
+        } else if (moduleName.equalsIgnoreCase("PcdDxe")) {\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
@@ -221,22 +229,27 @@ public class PCDAutoGenAction extends BuildAction {
             // 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
-                    continue;\r
-                }\r
-\r
-                usageInstance = tokenArray[index].consumers.get(0);\r
-                try {\r
-                    usageInstance.generateAutoGen();\r
-                } catch(EntityException exp) {\r
-                    throw new BuildActionException(exp.getMessage());\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
-                hAutoGenString += usageInstance.getHAutogenStr();\r
-                cAutoGenString += usageInstance.getCAutogenStr();\r
-\r
-                hAutoGenString += "\r\n";\r
-                cAutoGenString += "\r\n";\r
             }\r
         }\r
 \r
@@ -251,6 +264,111 @@ public class PCDAutoGenAction extends BuildAction {
 \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
@@ -274,12 +392,6 @@ public class PCDAutoGenAction extends BuildAction {
         for(index = 0; index < tokenArray.length; index ++) {\r
             token = tokenArray[index];\r
 \r
-            if((token.producers.size() == 0) &&(token.consumers.size() == 0)) {\r
-                //\r
-                // If no one use this PCD token, it will not generated in emulated array.\r
-                //\r
-                continue;\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
@@ -299,13 +411,6 @@ public class PCDAutoGenAction extends BuildAction {
         for(index = 0; index < tokenArray.length; index ++) {\r
             token = tokenArray[index];\r
 \r
-            if((token.producers.size() == 0) &&(token.consumers.size() == 0)) {\r
-                //\r
-                // If no one use this PCD token, it will not generated in emulated array.\r
-                //\r
-                continue;\r
-            }\r
-\r
             if(index != 0) {\r
                 cAutoGenString += ",\r\n";\r
             }\r
@@ -421,7 +526,9 @@ public class PCDAutoGenAction extends BuildAction {
       @param argv  paramter from command line\r
     **/\r
     public static void main(String argv[]) {\r
-        String logFilePath = "G:/mdk/EdkNt32Pkg/build/Nt32.fpd";\r
+\r
+        String WorkSpace = "X:/edk2";\r
+        String logFilePath = WorkSpace  + "/EdkNt32Pkg/Nt32.fpd";\r
 \r
         //\r
         // At first, CollectPCDAction should be invoked to collect\r
@@ -429,12 +536,12 @@ public class PCDAutoGenAction extends BuildAction {
         //\r
         CollectPCDAction collectionAction = new CollectPCDAction();\r
         GlobalData.initInfo("Tools" + File.separator + "Conf" + File.separator + "FrameworkDatabase.db",\r
-                            "G:/mdk");\r
+                            WorkSpace);\r
 \r
         GlobalData.getPCDMemoryDBManager().setLogFileName(logFilePath + ".PCDMemroyDatabaseLog.txt");\r
 \r
         try {\r
-            collectionAction.perform("G:/mdk"\r
+            collectionAction.perform(WorkSpace\r
                                      logFilePath,\r
                                      ActionMessage.MAX_MESSAGE_LEVEL);\r
         } catch(Exception e) {\r
@@ -444,9 +551,18 @@ public class PCDAutoGenAction extends BuildAction {
         //\r
         // Then execute the PCDAuotoGenAction to get generated Autogen.h and Autogen.c\r
         //\r
-        PCDAutoGenAction autogenAction = new PCDAutoGenAction("HelloWorld",\r
-                                                              true\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
     }\r
 }\r