]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java
Change to new XML Schema.
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / fpd / PlatformBuildFileGenerator.java
diff --git a/Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java b/Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java
new file mode 100644 (file)
index 0000000..b41ea21
--- /dev/null
@@ -0,0 +1,479 @@
+/** @file\r
\r
+ Copyright (c) 2006, Intel Corporation\r
+ All rights reserved. This program and the accompanying materials\r
+ are licensed and made available under the terms and conditions of the BSD License\r
+ which accompanies this distribution.  The full text of the license may be found at\r
+ http://opensource.org/licenses/bsd-license.php\r
+\r
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ **/\r
+package org.tianocore.build.fpd;\r
+\r
+import java.io.File;\r
+import java.util.Iterator;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+import javax.xml.transform.OutputKeys;\r
+import javax.xml.transform.Result;\r
+import javax.xml.transform.Source;\r
+import javax.xml.transform.Transformer;\r
+import javax.xml.transform.TransformerFactory;\r
+import javax.xml.transform.dom.DOMSource;\r
+import javax.xml.transform.stream.StreamResult;\r
+\r
+import org.apache.tools.ant.BuildException;\r
+import org.apache.tools.ant.Project;\r
+import org.tianocore.build.global.GlobalData;\r
+import org.tianocore.build.global.SurfaceAreaQuery;\r
+import org.tianocore.build.id.FpdModuleIdentification;\r
+import org.tianocore.build.id.ModuleIdentification;\r
+import org.w3c.dom.Comment;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.Element;\r
+import org.w3c.dom.Node;\r
+\r
+public class PlatformBuildFileGenerator {\r
+\r
+    private String platformName;\r
+    \r
+    ///\r
+    /// Mapping from modules identification to out put file name\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
+        + "File auto-generated by build utility\n" \r
+        + "\n" \r
+        + "Abstract:\n"\r
+        + "Auto-generated ANT build file for building of EFI Modules/Platforms\n";\r
+\r
+    public PlatformBuildFileGenerator(Project project, Map<FpdModuleIdentification, String> outfiles, Map<String, Set<FpdModuleIdentification>> fvs, Map<String, Set<String>> sequences, boolean isUnified){\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
+    \r
+    /**\r
+      Generate build.out.xml file.\r
+     \r
+      @throws BuildException\r
+                  build.out.xml XML document create error\r
+    **/\r
+    public void genBuildFile() throws BuildException {\r
+        DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();\r
+        try {\r
+            DocumentBuilder dombuilder = domfac.newDocumentBuilder();\r
+            Document document = dombuilder.newDocument();\r
+            Comment rootComment = document.createComment(info);\r
+            //\r
+            // create root element and its attributes\r
+            //\r
+            Element root = document.createElement("project");\r
+            root.setAttribute("name", project.getProperty("PLATFORM"));\r
+            root.setAttribute("default", "all");\r
+            root.setAttribute("basedir", ".");\r
+            \r
+            //\r
+            // element for External ANT tasks\r
+            //\r
+            root.appendChild(document.createComment("Apply external ANT tasks"));\r
+            Element ele = document.createElement("taskdef");\r
+            ele.setAttribute("resource", "GenBuild.tasks");\r
+            root.appendChild(ele);\r
+\r
+            ele = document.createElement("taskdef");\r
+            ele.setAttribute("resource", "frameworktasks.tasks");\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
+            ele.setAttribute("depends", dependsStr + ", userextensions");\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
+\r
+            //\r
+            // Clean Target\r
+            //\r
+            applyClean(document, root);\r
+            \r
+            //\r
+            // Deep Clean Target\r
+            //\r
+            applyCleanall(document, root);\r
+            \r
+            //\r
+            // User Extension\r
+            //\r
+            applyUserExtensions(document, root);\r
+            \r
+            document.appendChild(rootComment);\r
+            document.appendChild(root);\r
+            //\r
+            // Prepare the DOM document for writing\r
+            //\r
+            Source source = new DOMSource(document);\r
+            //\r
+            // Prepare the output file\r
+            //\r
+            File file = new File(project.getProperty("PLATFORM_DIR") + File.separatorChar + platformName + "_build.xml");\r
+            //\r
+            // generate all directory path\r
+            //\r
+            (new File(file.getParent())).mkdirs();\r
+            Result result = new StreamResult(file);\r
+            //\r
+            // Write the DOM document to the file\r
+            //\r
+            Transformer xformer = TransformerFactory.newInstance().newTransformer();\r
+            xformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");\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
+        }\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
+        ele.setAttribute("name", "modules" + num);\r
+        \r
+        Set<String> fvNameSet = sequences.get(num);\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
+\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
+        root.appendChild(ele);\r
+    }\r
+    \r
+    private void applyFvs(Document document, Node root, String num) {\r
+        Set<String> fvNameSet = sequences.get(num);\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
+\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
+                String fvOutputDir = project.getProperty("BUILD_DIR") + File.separatorChar \r
+                                        + targetList[i] + File.separatorChar \r
+                                        + toolchainList[i] + File.separatorChar + "FV";\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
+                }\r
+            }\r
+        }\r
+        root.appendChild(ele);\r
+    }\r
+    \r
+    private void applyClean(Document document, Node root) {\r
+        //\r
+        // Clean Target\r
+        //\r
+        root.appendChild(document.createComment("Clean target"));\r
+        Element ele = document.createElement("target");\r
+        ele.setAttribute("name", "clean");\r
+\r
+        if (isUnified) {\r
+            Element cleanEle = document.createElement("delete");\r
+            cleanEle.setAttribute("includeemptydirs", "true");\r
+            Element filesetEle = document.createElement("fileset");\r
+            filesetEle.setAttribute("dir", project.getProperty("BUILD_DIR"));\r
+            filesetEle.setAttribute("includes", "**\\OUTPUT\\**");\r
+            cleanEle.appendChild(filesetEle);\r
+            ele.appendChild(cleanEle);\r
+        } else {\r
+            Set set = outfiles.keySet();\r
+            Iterator iter = set.iterator();\r
+            while (iter.hasNext()) {\r
+                FpdModuleIdentification fpdModuleId = (FpdModuleIdentification) iter.next();\r
+                ModuleIdentification moduleId = fpdModuleId.getModule();\r
+\r
+                Element ifEle = document.createElement("if");\r
+                Element availableEle = document.createElement("available");\r
+                availableEle.setAttribute("file", moduleId.getMsaFile().getParent() + File.separatorChar\r
+                                                  + "build.xml");\r
+                ifEle.appendChild(availableEle);\r
+                Element elseEle = document.createElement("then");\r
+\r
+                Element moduleEle = document.createElement("ant");\r
+                moduleEle.setAttribute("antfile", moduleId.getMsaFile().getParent() + File.separatorChar\r
+                                                  + "build.xml");\r
+                moduleEle.setAttribute("target", "clean");\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
+                // PACKAGE\r
+                //\r
+                property = document.createElement("property");\r
+                property.setAttribute("name", "PACKAGE");\r
+                property.setAttribute("value", moduleId.getPackage().getName());\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
+                //\r
+                // MODULE_DIR\r
+                //\r
+                property = document.createElement("property");\r
+                property.setAttribute("name", "MODULE_DIR");\r
+                property.setAttribute("value", moduleId.getMsaFile().getParent());\r
+                moduleEle.appendChild(property);\r
+                elseEle.appendChild(moduleEle);\r
+                ifEle.appendChild(elseEle);\r
+                ele.appendChild(ifEle);\r
+            }\r
+        }\r
+        root.appendChild(ele);\r
+    }\r
+    \r
+    private void applyCleanall(Document document, Node root) {\r
+        //\r
+        // Deep Clean Target\r
+        //\r
+        root.appendChild(document.createComment("Clean All target"));\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
+        } else {\r
+            Set set = outfiles.keySet();\r
+            Iterator iter = set.iterator();\r
+            while (iter.hasNext()) {\r
+                FpdModuleIdentification fpdModuleId = (FpdModuleIdentification) iter.next();\r
+                ModuleIdentification moduleId = fpdModuleId.getModule();\r
+\r
+                Element ifEle = document.createElement("if");\r
+                Element availableEle = document.createElement("available");\r
+                availableEle.setAttribute("file", moduleId.getMsaFile().getParent() + File.separatorChar\r
+                                                  + "build.xml");\r
+                ifEle.appendChild(availableEle);\r
+                Element elseEle = document.createElement("then");\r
+\r
+                Element moduleEle = document.createElement("ant");\r
+                moduleEle.setAttribute("antfile", moduleId.getMsaFile().getParent() + File.separatorChar\r
+                                                  + "build.xml");\r
+                moduleEle.setAttribute("target", "cleanall");\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
+                // PACKAGE\r
+                //\r
+                property = document.createElement("property");\r
+                property.setAttribute("name", "PACKAGE");\r
+                property.setAttribute("value", moduleId.getPackage().getName());\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
+                //\r
+                // MODULE_DIR\r
+                //\r
+                property = document.createElement("property");\r
+                property.setAttribute("name", "MODULE_DIR");\r
+                property.setAttribute("value", moduleId.getMsaFile().getParent());\r
+                moduleEle.appendChild(property);\r
+                elseEle.appendChild(moduleEle);\r
+                ifEle.appendChild(elseEle);\r
+                ele.appendChild(ifEle);\r
+            }\r
+        }\r
+        root.appendChild(ele);\r
+    }\r
+    \r
+    private void applyUserExtensions(Document document, Node root) {\r
+        //\r
+        // User Extensions\r
+        //\r
+        root.appendChild(document.createComment("User Extensions"));\r
+        Element ele = document.createElement("target");\r
+        ele.setAttribute("name", "userextensions");\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
+            }\r
+        }\r
+        return false;\r
+    }\r
+}\r