]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java
Fixed grammar in messages.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / fpd / PlatformBuildFileGenerator.java
index b41ea211d25d35162666f49b5ba0f588cb81329d..e6a1002da3b711bbd0384b719b07a8e9e07bc680 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.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.Node;\r
+import org.w3c.dom.NodeList;\r
 \r
 public class PlatformBuildFileGenerator {\r
 \r
 \r
 public class PlatformBuildFileGenerator {\r
 \r
@@ -46,31 +48,19 @@ public class PlatformBuildFileGenerator {
     ///\r
     private Map<FpdModuleIdentification, String> outfiles;\r
 \r
     ///\r
     private Map<FpdModuleIdentification, String> outfiles;\r
 \r
-    ///\r
-    /// Mapping from FV name to its modules\r
-    ///\r
-    private Map<String, Set<FpdModuleIdentification>> fvs;\r
-\r
-    ///\r
-    /// Mapping from sequence number to FV names\r
-    ///\r
-    private Map<String, Set<String>> sequences;\r
-    \r
     private boolean isUnified = true;\r
     \r
     private Project project;\r
     \r
     private String info = "DO NOT EDIT \n" \r
     private boolean isUnified = true;\r
     \r
     private Project project;\r
     \r
     private String info = "DO NOT EDIT \n" \r
-        + "File auto-generated by build utility\n" \r
+        + "This file is auto-generated by the build utility\n" \r
         + "\n" \r
         + "Abstract:\n"\r
         + "\n" \r
         + "Abstract:\n"\r
-        + "Auto-generated ANT build file for building of EFI Modules/Platforms\n";\r
+        + "Auto-generated ANT build file for building EFI Modules and Platforms\n";\r
 \r
 \r
-    public PlatformBuildFileGenerator(Project project, Map<FpdModuleIdentification, String> outfiles, Map<String, Set<FpdModuleIdentification>> fvs, Map<String, Set<String>> sequences, boolean isUnified){\r
+    public PlatformBuildFileGenerator(Project project, Map<FpdModuleIdentification, String> outfiles, boolean isUnified){\r
         this.project = project;\r
         this.outfiles = outfiles;\r
         this.project = project;\r
         this.outfiles = outfiles;\r
-        this.fvs = fvs;\r
-        this.sequences = sequences;\r
         this.isUnified = isUnified;\r
         this.platformName = project.getProperty("PLATFORM");\r
     }\r
         this.isUnified = isUnified;\r
         this.platformName = project.getProperty("PLATFORM");\r
     }\r
@@ -107,39 +97,29 @@ public class PlatformBuildFileGenerator {
             ele.setAttribute("resource", "frameworktasks.tasks");\r
             root.appendChild(ele);\r
 \r
             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
             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
-            while (sequenceIter.hasNext()) {\r
-                String num = (String)sequenceIter.next();\r
-                if (dependsStr.length() > 0) {\r
-                    dependsStr += " , ";\r
-                }\r
-                dependsStr += "modules" + num + ", fvs" + num;\r
-            }\r
-            \r
             //\r
             // Default Target\r
             //\r
             root.appendChild(document.createComment("Default target"));\r
             ele = document.createElement("target");\r
             ele.setAttribute("name", "all");\r
             //\r
             // Default Target\r
             //\r
             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", "prebuild, modules, fvs, postbuild");\r
             root.appendChild(ele);\r
             \r
             //\r
             // Modules and Fvs Target\r
             //\r
             root.appendChild(ele);\r
             \r
             //\r
             // Modules and Fvs Target\r
             //\r
-            sequenceIter = sequenceKeys.iterator();\r
-            while (sequenceIter.hasNext()) {\r
-                String num = (String)sequenceIter.next();\r
-                applyModules(document, root, num);\r
-                applyFvs(document, root, num);\r
-            }\r
+            applyModules(document, root);\r
+            \r
+            applyFvs(document, root);\r
 \r
             //\r
             // Clean Target\r
 \r
             //\r
             // Clean Target\r
@@ -152,9 +132,14 @@ public class PlatformBuildFileGenerator {
             applyCleanall(document, root);\r
             \r
             //\r
             applyCleanall(document, root);\r
             \r
             //\r
-            // User Extension\r
+            // User Extension pre build\r
             //\r
             //\r
-            applyUserExtensions(document, root);\r
+            applyUserExtensionsPreBuild(document, root);\r
+            \r
+            //\r
+            // User Extension Post build\r
+            //\r
+            applyUserExtensionsPostBuild(document, root);\r
             \r
             document.appendChild(rootComment);\r
             document.appendChild(root);\r
             \r
             document.appendChild(rootComment);\r
             document.appendChild(root);\r
@@ -179,86 +164,79 @@ public class PlatformBuildFileGenerator {
             xformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
             xformer.transform(source, result);\r
         } catch (Exception ex) {\r
             xformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
             xformer.transform(source, result);\r
         } catch (Exception ex) {\r
-            ex.printStackTrace();\r
-            throw new BuildException("Generate " + platformName + "_build.xml failed. \n" + ex.getMessage());\r
+            throw new BuildException("Generation of the " + platformName + "_build.xml failed!\n" + ex.getMessage());\r
         }\r
     }\r
         }\r
     }\r
-    private void applyModules(Document document, Node root, String num) {\r
+    \r
+    private void applyModules(Document document, Node root) {\r
         root.appendChild(document.createComment("Modules target"));\r
         Element ele = document.createElement("target");\r
         root.appendChild(document.createComment("Modules target"));\r
         Element ele = document.createElement("target");\r
-        ele.setAttribute("name", "modules" + num);\r
-        \r
-        Set<String> fvNameSet = sequences.get(num);\r
+        ele.setAttribute("name", "modules");\r
 \r
 \r
-        Iterator fvNameIter = fvNameSet.iterator();\r
-        while (fvNameIter.hasNext()) {\r
-            String fvName = (String)fvNameIter.next();\r
-            Set<FpdModuleIdentification> set = fvs.get(fvName);\r
-            Iterator iter = set.iterator();\r
-            while (iter.hasNext()) {\r
-                FpdModuleIdentification fpdModuleId = (FpdModuleIdentification) iter.next();\r
-                ModuleIdentification moduleId = fpdModuleId.getModule();\r
-                Element moduleEle = document.createElement("GenBuild");\r
-                moduleEle.setAttribute("type", "build");\r
-                //\r
-                // Inherit Properties.\r
-                //{"ARCH", "PACKAGE", "PACKAGE_GUID", "PACKAGE_VERSION", "MODULE_DIR"}\r
-                //\r
-                \r
-                //\r
-                // ARCH\r
-                //\r
-                Element property = document.createElement("property");\r
-                property.setAttribute("name", "ARCH");\r
-                property.setAttribute("value", fpdModuleId.getArch());\r
-                moduleEle.appendChild(property);\r
+        Set<FpdModuleIdentification> set = outfiles.keySet();\r
+        Iterator iter = set.iterator();\r
+        while (iter.hasNext()) {\r
+            FpdModuleIdentification fpdModuleId = (FpdModuleIdentification) iter.next();\r
+            ModuleIdentification moduleId = fpdModuleId.getModule();\r
+            Element moduleEle = document.createElement("GenBuild");\r
+            moduleEle.setAttribute("type", "build");\r
+            //\r
+            // Inherit Properties.\r
+            //{"ARCH", "PACKAGE", "PACKAGE_GUID", "PACKAGE_VERSION", "MODULE_DIR"}\r
+            //\r
+            \r
+            //\r
+            // ARCH\r
+            //\r
+            Element property = document.createElement("property");\r
+            property.setAttribute("name", "ARCH");\r
+            property.setAttribute("value", fpdModuleId.getArch());\r
+            moduleEle.appendChild(property);\r
 \r
 \r
-                //\r
-                // MODULE_GUID\r
-                //\r
-                property = document.createElement("property");\r
-                property.setAttribute("name", "MODULE_GUID");\r
-                property.setAttribute("value", moduleId.getGuid());\r
-                moduleEle.appendChild(property);\r
-                \r
-                //\r
-                // MODULE_VERSION\r
-                //\r
-                property = document.createElement("property");\r
-                property.setAttribute("name", "MODULE_VERSION");\r
-                property.setAttribute("value", moduleId.getVersion());\r
-                moduleEle.appendChild(property);\r
-                \r
-                //\r
-                // PACKAGE_GUID\r
-                //\r
-                property = document.createElement("property");\r
-                property.setAttribute("name", "PACKAGE_GUID");\r
-                property.setAttribute("value", moduleId.getPackage().getGuid());\r
-                moduleEle.appendChild(property);\r
-                \r
-                //\r
-                // PACKAGE_VERSION\r
-                //\r
-                property = document.createElement("property");\r
-                property.setAttribute("name", "PACKAGE_VERSION");\r
-                property.setAttribute("value", moduleId.getPackage().getVersion());\r
-                moduleEle.appendChild(property);\r
-                \r
-                ele.appendChild(moduleEle);\r
-            }\r
+            //\r
+            // MODULE_GUID\r
+            //\r
+            property = document.createElement("property");\r
+            property.setAttribute("name", "MODULE_GUID");\r
+            property.setAttribute("value", moduleId.getGuid());\r
+            moduleEle.appendChild(property);\r
+            \r
+            //\r
+            // MODULE_VERSION\r
+            //\r
+            property = document.createElement("property");\r
+            property.setAttribute("name", "MODULE_VERSION");\r
+            property.setAttribute("value", moduleId.getVersion());\r
+            moduleEle.appendChild(property);\r
+            \r
+            //\r
+            // PACKAGE_GUID\r
+            //\r
+            property = document.createElement("property");\r
+            property.setAttribute("name", "PACKAGE_GUID");\r
+            property.setAttribute("value", moduleId.getPackage().getGuid());\r
+            moduleEle.appendChild(property);\r
+            \r
+            //\r
+            // PACKAGE_VERSION\r
+            //\r
+            property = document.createElement("property");\r
+            property.setAttribute("name", "PACKAGE_VERSION");\r
+            property.setAttribute("value", moduleId.getPackage().getVersion());\r
+            moduleEle.appendChild(property);\r
+            \r
+            ele.appendChild(moduleEle);\r
         }\r
         root.appendChild(ele);\r
     }\r
     \r
         }\r
         root.appendChild(ele);\r
     }\r
     \r
-    private void applyFvs(Document document, Node root, String num) {\r
-        Set<String> fvNameSet = sequences.get(num);\r
+    private void applyFvs(Document document, Node root) {\r
         //\r
         // FVS Target\r
         //\r
         root.appendChild(document.createComment("FVs target"));\r
         Element ele = document.createElement("target");\r
         //\r
         // FVS Target\r
         //\r
         root.appendChild(document.createComment("FVs target"));\r
         Element ele = document.createElement("target");\r
-        ele.setAttribute("name", "fvs" + num);\r
+        ele.setAttribute("name", "fvs");\r
 \r
         //\r
         // For every Target and ToolChain\r
 \r
         //\r
         // For every Target and ToolChain\r
@@ -269,16 +247,14 @@ public class PlatformBuildFileGenerator {
             for(int j = 0; j < toolchainList.length; j++){\r
                 String fvOutputDir = project.getProperty("BUILD_DIR") + File.separatorChar \r
                                         + targetList[i] + File.separatorChar \r
             for(int j = 0; j < toolchainList.length; j++){\r
                 String fvOutputDir = project.getProperty("BUILD_DIR") + File.separatorChar \r
                                         + targetList[i] + File.separatorChar \r
-                                        + toolchainList[i] + File.separatorChar + "FV";\r
+                                        + toolchainList[j] + File.separatorChar + "FV";\r
                 String[] validFv = SurfaceAreaQuery.getFpdValidImageNames();\r
                 for (int k = 0; k < validFv.length; k++) {\r
                 String[] validFv = SurfaceAreaQuery.getFpdValidImageNames();\r
                 for (int k = 0; k < validFv.length; k++) {\r
-                    if (fvNameSet.contains(validFv[k]) || ! isListInSequence(validFv[k])) {\r
-                        String inputFile = fvOutputDir + "" + File.separatorChar + validFv[k].toUpperCase() + ".inf";\r
-                        Element fvEle = document.createElement("genfvimage");\r
-                        fvEle.setAttribute("infFile", inputFile);\r
-                        fvEle.setAttribute("outputDir", fvOutputDir);\r
-                        ele.appendChild(fvEle);\r
-                    }\r
+                    String inputFile = fvOutputDir + "" + File.separatorChar + validFv[k].toUpperCase() + ".inf";\r
+                    Element fvEle = document.createElement("genfvimage");\r
+                    fvEle.setAttribute("infFile", inputFile);\r
+                    fvEle.setAttribute("outputDir", fvOutputDir);\r
+                    ele.appendChild(fvEle);\r
                 }\r
             }\r
         }\r
                 }\r
             }\r
         }\r
@@ -375,14 +351,17 @@ public class PlatformBuildFileGenerator {
         //\r
         // Deep Clean Target\r
         //\r
         //\r
         // Deep Clean Target\r
         //\r
-        root.appendChild(document.createComment("Clean All target"));\r
+        root.appendChild(document.createComment("Target: cleanall"));\r
         Element ele = document.createElement("target");\r
         ele.setAttribute("name", "cleanall");\r
 \r
         if (isUnified) {\r
         Element ele = document.createElement("target");\r
         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
         } else {\r
             Set set = outfiles.keySet();\r
             Iterator iter = set.iterator();\r
@@ -453,27 +432,113 @@ public class PlatformBuildFileGenerator {
         root.appendChild(ele);\r
     }\r
     \r
         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
         //\r
         // User Extensions\r
         //\r
-        root.appendChild(document.createComment("User Extensions"));\r
+        root.appendChild(document.createComment("Pre-Build Processing"));\r
         Element ele = document.createElement("target");\r
         Element ele = document.createElement("target");\r
-        ele.setAttribute("name", "userextensions");\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
         \r
         root.appendChild(ele);\r
     }\r
     \r
+    private void applyUserExtensionsPostBuild(Document document, Node root) {\r
+        //\r
+        // User Extensions\r
+        //\r
+        root.appendChild(document.createComment("Post-Build Processing"));\r
+        Element ele = document.createElement("target");\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
     \r
-    private boolean isListInSequence(String fvName) {\r
-        Set<String> numbers = sequences.keySet();\r
-        Iterator<String> iter = numbers.iterator();\r
-        while (iter.hasNext()) {\r
-            Set<String> fvNameSet = sequences.get(iter.next());\r
-            if (fvNameSet.contains(fvName)) {\r
-                return true;\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
             }\r
         }\r
-        return false;\r
+        return root;\r
     }\r
 }\r
     }\r
 }\r