]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java
Support prebuild and postbuild for UserExtension for Platform build. If UserExtension...
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / fpd / PlatformBuildFileGenerator.java
index b41ea211d25d35162666f49b5ba0f588cb81329d..929ddeaadcf92cfd20e403eb9d2b563e0f9cb48a 100644 (file)
@@ -35,7 +35,9 @@ import org.tianocore.build.id.ModuleIdentification;
 import org.w3c.dom.Comment;\r
 import org.w3c.dom.Document;\r
 import org.w3c.dom.Element;\r
+import org.w3c.dom.NamedNodeMap;\r
 import org.w3c.dom.Node;\r
+import org.w3c.dom.NodeList;\r
 \r
 public class PlatformBuildFileGenerator {\r
 \r
@@ -107,13 +109,17 @@ public class PlatformBuildFileGenerator {
             ele.setAttribute("resource", "frameworktasks.tasks");\r
             root.appendChild(ele);\r
 \r
+            ele = document.createElement("taskdef");\r
+            ele.setAttribute("resource", "net/sf/antcontrib/antlib.xml");\r
+            root.appendChild(ele);\r
+            \r
             ele = document.createElement("property");\r
             ele.setAttribute("environment", "env");\r
             root.appendChild(ele);\r
             \r
             Set<String> sequenceKeys = sequences.keySet();\r
             Iterator sequenceIter = sequenceKeys.iterator();\r
-            String dependsStr = "";\r
+            String dependsStr = "prebuild";\r
             while (sequenceIter.hasNext()) {\r
                 String num = (String)sequenceIter.next();\r
                 if (dependsStr.length() > 0) {\r
@@ -128,7 +134,7 @@ public class PlatformBuildFileGenerator {
             root.appendChild(document.createComment("Default target"));\r
             ele = document.createElement("target");\r
             ele.setAttribute("name", "all");\r
-            ele.setAttribute("depends", dependsStr + ", userextensions");\r
+            ele.setAttribute("depends", dependsStr + ", postbuild");\r
             root.appendChild(ele);\r
             \r
             //\r
@@ -152,9 +158,14 @@ public class PlatformBuildFileGenerator {
             applyCleanall(document, root);\r
             \r
             //\r
-            // User Extension\r
+            // User Extension pre build\r
+            //\r
+            applyUserExtensionsPreBuild(document, root);\r
+            \r
+            //\r
+            // User Extension Post build\r
             //\r
-            applyUserExtensions(document, root);\r
+            applyUserExtensionsPostBuild(document, root);\r
             \r
             document.appendChild(rootComment);\r
             document.appendChild(root);\r
@@ -183,6 +194,7 @@ public class PlatformBuildFileGenerator {
             throw new BuildException("Generate " + platformName + "_build.xml failed. \n" + ex.getMessage());\r
         }\r
     }\r
+    \r
     private void applyModules(Document document, Node root, String num) {\r
         root.appendChild(document.createComment("Modules target"));\r
         Element ele = document.createElement("target");\r
@@ -380,9 +392,12 @@ public class PlatformBuildFileGenerator {
         ele.setAttribute("name", "cleanall");\r
 \r
         if (isUnified) {\r
-            Element cleanAllEle = document.createElement("delete");\r
-            cleanAllEle.setAttribute("dir", project.getProperty("BUILD_DIR"));\r
-            ele.appendChild(cleanAllEle);\r
+            String[] targetList = GlobalData.getToolChainInfo().getTargets();\r
+            for (int i = 0; i < targetList.length; ++i) {\r
+                Element cleanAllEle = document.createElement("delete");\r
+                cleanAllEle.setAttribute("dir", project.getProperty("BUILD_DIR") + File.separatorChar + targetList[i]);\r
+                ele.appendChild(cleanAllEle);\r
+            }\r
         } else {\r
             Set set = outfiles.keySet();\r
             Iterator iter = set.iterator();\r
@@ -453,17 +468,115 @@ public class PlatformBuildFileGenerator {
         root.appendChild(ele);\r
     }\r
     \r
-    private void applyUserExtensions(Document document, Node root) {\r
+    private void applyUserExtensionsPreBuild(Document document, Node root) {\r
+        //\r
+        // User Extensions\r
+        //\r
+        root.appendChild(document.createComment("Pre Build Processing"));\r
+        Element ele = document.createElement("target");\r
+        ele.setAttribute("name", "prebuild");\r
+        \r
+        Node node = SurfaceAreaQuery.getFpdUserExtensionPreBuild();\r
+        if (node != null) {\r
+            //\r
+            // For every Target and ToolChain\r
+            //\r
+            String[] targetList = GlobalData.getToolChainInfo().getTargets();\r
+            for (int i = 0; i < targetList.length; i++){\r
+                String[] toolchainList = GlobalData.getToolChainInfo().getTagnames();\r
+                for(int j = 0; j < toolchainList.length; j++){\r
+                    //\r
+                    // Prepare FV_DIR\r
+                    //\r
+                    String ffsCommonDir = project.getProperty("BUILD_DIR") + File.separatorChar \r
+                                    + targetList[i] + File.separatorChar \r
+                                    + toolchainList[j];\r
+                    File fvDir = new File(ffsCommonDir + File.separatorChar + "FV");\r
+                    Element fvEle = document.createElement("var");\r
+                    fvEle.setAttribute("name", "FV_DIR");\r
+                    fvEle.setAttribute("value", fvDir.getPath().replaceAll("(\\\\)", "/"));\r
+                    ele.appendChild(fvEle);\r
+                    \r
+                    NodeList childNodes = node.getChildNodes();\r
+                    for (int k = 0; k < childNodes.getLength(); k++) {\r
+                        Node childItem = childNodes.item(k);\r
+                        if (childItem.getNodeType() == Node.ELEMENT_NODE) {\r
+                            ele.appendChild(recursiveNode(childItem, document));\r
+                        }\r
+                    }\r
+                \r
+                }\r
+            }\r
+        }\r
+        \r
+        root.appendChild(ele);\r
+    }\r
+    \r
+    private void applyUserExtensionsPostBuild(Document document, Node root) {\r
         //\r
         // User Extensions\r
         //\r
-        root.appendChild(document.createComment("User Extensions"));\r
+        root.appendChild(document.createComment("Post Build Processing"));\r
         Element ele = document.createElement("target");\r
-        ele.setAttribute("name", "userextensions");\r
+        ele.setAttribute("name", "postbuild");\r
+        \r
+        Node node = SurfaceAreaQuery.getFpdUserExtensionPostBuild();\r
+        if (node != null) {\r
+            //\r
+            // For every Target and ToolChain\r
+            //\r
+            String[] targetList = GlobalData.getToolChainInfo().getTargets();\r
+            for (int i = 0; i < targetList.length; i++){\r
+                String[] toolchainList = GlobalData.getToolChainInfo().getTagnames();\r
+                for(int j = 0; j < toolchainList.length; j++){\r
+                    //\r
+                    // Prepare FV_DIR\r
+                    //\r
+                    String ffsCommonDir = project.getProperty("BUILD_DIR") + File.separatorChar \r
+                                    + targetList[i] + File.separatorChar \r
+                                    + toolchainList[j];\r
+                    File fvDir = new File(ffsCommonDir + File.separatorChar + "FV");\r
+                    Element fvEle = document.createElement("var");\r
+                    fvEle.setAttribute("name", "FV_DIR");\r
+                    fvEle.setAttribute("value", fvDir.getPath().replaceAll("(\\\\)", "/"));\r
+                    ele.appendChild(fvEle);\r
+                    \r
+                    NodeList childNodes = node.getChildNodes();\r
+                    for (int k = 0; k < childNodes.getLength(); k++) {\r
+                        Node childItem = childNodes.item(k);\r
+                        if (childItem.getNodeType() == Node.ELEMENT_NODE) {\r
+                            ele.appendChild(recursiveNode(childItem, document));\r
+                        }\r
+                    }\r
+                \r
+                }\r
+            }\r
+        }\r
         \r
         root.appendChild(ele);\r
     }\r
     \r
+    private Element recursiveNode(Node node, Document document) {\r
+        Element root = document.createElement(node.getNodeName());\r
+        NamedNodeMap attr = node.getAttributes();\r
+        for (int i = 0; i < attr.getLength(); i++) {\r
+            Node attrItem = attr.item(i);\r
+            root.setAttribute(attrItem.getNodeName(), attrItem.getNodeValue());\r
+        }\r
+        NodeList childNodes = node.getChildNodes();\r
+        for (int i = 0; i < childNodes.getLength(); i++) {\r
+            Node childItem = childNodes.item(i);\r
+            if (childItem.getNodeType() == Node.ELEMENT_NODE) {\r
+                root.appendChild(recursiveNode(childItem, document));\r
+            }\r
+            else if (childItem.getNodeType() == Node.TEXT_NODE){\r
+                if ( ! childItem.getNodeValue().trim().equalsIgnoreCase("")) {\r
+                    root.setTextContent(childItem.getNodeValue());\r
+                }\r
+            }\r
+        }\r
+        return root;\r
+    }\r
     \r
     private boolean isListInSequence(String fvName) {\r
         Set<String> numbers = sequences.keySet();\r