]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java
Add one more platform level common property "TARGET_DIR". Take Nt32 for example:...
[mirror_edk2.git] / Tools / Source / GenBuild / org / tianocore / build / fpd / PlatformBuildFileGenerator.java
index a20f17bc1626129c6509f83475da1bfaaaeed0fb..375122483f7e04f4f9f458c0f939c45d1222ba4e 100644 (file)
@@ -12,6 +12,7 @@
 package org.tianocore.build.fpd;\r
 \r
 import java.io.File;\r
+import java.util.HashMap;\r
 import java.util.Iterator;\r
 import java.util.Map;\r
 import java.util.Set;\r
@@ -52,9 +53,17 @@ public class PlatformBuildFileGenerator {
     /// 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 = new HashMap<String, Set<FpdModuleIdentification>>();\r
+\r
 \r
     private boolean isUnified = true;\r
     \r
+    private SurfaceAreaQuery saq = null;\r
+    \r
     private Project project;\r
     \r
     private String info = "DO NOT EDIT \n" \r
@@ -63,10 +72,12 @@ public class PlatformBuildFileGenerator {
         + "Abstract:\n"\r
         + "Auto-generated ANT build file for building EFI Modules and Platforms\n";\r
 \r
-    public PlatformBuildFileGenerator(Project project, Map<FpdModuleIdentification, String> outfiles, boolean isUnified){\r
+    public PlatformBuildFileGenerator(Project project, Map<FpdModuleIdentification, String> outfiles, Map<String, Set<FpdModuleIdentification>> fvs, boolean isUnified, SurfaceAreaQuery saq){\r
         this.project = project;\r
         this.outfiles = outfiles;\r
         this.isUnified = isUnified;\r
+        this.fvs = fvs;\r
+        this.saq = saq;\r
         this.platformName = project.getProperty("PLATFORM");\r
     }\r
     \r
@@ -173,68 +184,119 @@ public class PlatformBuildFileGenerator {
         }\r
     }\r
     \r
+    /**\r
+      1. Get All valid Fv Image Names in sequence\r
+      2. For each FV, get modules by sequences\r
+      3. Get other modules\r
+      \r
+      @param document XML document\r
+      @param root Node\r
+    **/\r
     private void applyModules(Document document, Node root) {\r
         root.appendChild(document.createComment("Modules target"));\r
         Element ele = document.createElement("target");\r
         ele.setAttribute("name", "modules");\r
 \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
-            // 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
+        // Get all valid FV name\r
+        //\r
+        String[] validFv = saq.getFpdValidImageNames();\r
+        \r
+        //\r
+        // For each valid FV, get all modules in sequence\r
+        //\r
+        for (int i = 0; i < validFv.length; i++) {\r
+            if (fvs.containsKey(validFv[i])) {\r
+                Set<FpdModuleIdentification> set = fvs.get(validFv[i]);\r
+                Iterator<FpdModuleIdentification> iter = set.iterator();\r
+                while (iter.hasNext()) {\r
+                    FpdModuleIdentification fpdModuleId = iter.next();\r
+                    applySingleModule(document, ele, fpdModuleId);\r
+                }\r
+            }\r
         }\r
+        \r
+        //\r
+        // Get all other modules\r
+        //\r
+        Iterator<String> fvsNameIter = fvs.keySet().iterator();\r
+        \r
+        while (fvsNameIter.hasNext()) {\r
+            String fvName = fvsNameIter.next();\r
+            if (!isContain(validFv, fvName)) {\r
+                Set<FpdModuleIdentification> set = fvs.get(fvName);\r
+                Iterator iter = set.iterator();\r
+                while (iter.hasNext()) {\r
+                    FpdModuleIdentification fpdModuleId = (FpdModuleIdentification) iter.next();\r
+                    applySingleModule(document, ele, fpdModuleId);\r
+                }\r
+            }\r
+        }\r
+\r
         root.appendChild(ele);\r
     }\r
     \r
+    private void applySingleModule(Document document, Node root, FpdModuleIdentification fpdModuleId) {\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
+        root.appendChild(moduleEle);\r
+    }\r
+    \r
+    private boolean isContain(String[] list, String item) {\r
+        for (int i = 0; i < list.length; i++) {\r
+            if (list[i].equalsIgnoreCase(item)) {\r
+                return true;\r
+            }\r
+        }\r
+        return false;\r
+    }\r
+    \r
     private void applyFvs(Document document, Node root) {\r
         //\r
         // FVS Target\r
@@ -251,9 +313,9 @@ public class PlatformBuildFileGenerator {
             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
+                                        + targetList[i] + "_" \r
                                         + toolchainList[j] + File.separatorChar + "FV";\r
-                String[] validFv = SurfaceAreaQuery.getFpdValidImageNames();\r
+                String[] validFv = saq.getFpdValidImageNames();\r
                 for (int k = 0; k < validFv.length; k++) {\r
                     String inputFile = fvOutputDir + "" + File.separatorChar + validFv[k].toUpperCase() + ".inf";\r
                     Element fvEle = document.createElement("genfvimage");\r
@@ -363,9 +425,12 @@ public class PlatformBuildFileGenerator {
         if (isUnified) {\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
+                String[] toolchainList = GlobalData.getToolChainInfo().getTagnames();\r
+                for(int j = 0; j < toolchainList.length; j++) {\r
+                    Element cleanAllEle = document.createElement("delete");\r
+                    cleanAllEle.setAttribute("dir", project.getProperty("BUILD_DIR") + File.separatorChar + targetList[i] + "_" + toolchainList[j]);\r
+                    ele.appendChild(cleanAllEle);\r
+                }\r
             }\r
         } else {\r
             Set set = outfiles.keySet();\r
@@ -445,7 +510,7 @@ public class PlatformBuildFileGenerator {
         Element ele = document.createElement("target");\r
         ele.setAttribute("name", "prebuild");\r
         \r
-        Node node = SurfaceAreaQuery.getFpdUserExtensionPreBuild();\r
+        Node node = saq.getFpdUserExtensionPreBuild();\r
         if (node != null) {\r
             //\r
             // For every Target and ToolChain\r
@@ -458,7 +523,7 @@ public class PlatformBuildFileGenerator {
                     // Prepare FV_DIR\r
                     //\r
                     String ffsCommonDir = project.getProperty("BUILD_DIR") + File.separatorChar \r
-                                    + targetList[i] + File.separatorChar \r
+                                    + targetList[i] + "_" \r
                                     + toolchainList[j];\r
                     File fvDir = new File(ffsCommonDir + File.separatorChar + "FV");\r
                     Element fvEle = document.createElement("var");\r
@@ -466,6 +531,11 @@ public class PlatformBuildFileGenerator {
                     fvEle.setAttribute("value", fvDir.getPath().replaceAll("(\\\\)", "/"));\r
                     ele.appendChild(fvEle);\r
                     \r
+                    Element targetDirEle = document.createElement("var");\r
+                    targetDirEle.setAttribute("name", "TARGET_DIR");\r
+                    targetDirEle.setAttribute("value", ffsCommonDir.replaceAll("(\\\\)", "/"));\r
+                    ele.appendChild(targetDirEle);\r
+                    \r
                     NodeList childNodes = node.getChildNodes();\r
                     for (int k = 0; k < childNodes.getLength(); k++) {\r
                         Node childItem = childNodes.item(k);\r
@@ -473,7 +543,6 @@ public class PlatformBuildFileGenerator {
                             ele.appendChild(recursiveNode(childItem, document));\r
                         }\r
                     }\r
-                \r
                 }\r
             }\r
         }\r
@@ -489,7 +558,7 @@ public class PlatformBuildFileGenerator {
         Element ele = document.createElement("target");\r
         ele.setAttribute("name", "postbuild");\r
         \r
-        Node node = SurfaceAreaQuery.getFpdUserExtensionPostBuild();\r
+        Node node = saq.getFpdUserExtensionPostBuild();\r
         if (node != null) {\r
             //\r
             // For every Target and ToolChain\r
@@ -502,7 +571,7 @@ public class PlatformBuildFileGenerator {
                     // Prepare FV_DIR\r
                     //\r
                     String ffsCommonDir = project.getProperty("BUILD_DIR") + File.separatorChar \r
-                                    + targetList[i] + File.separatorChar \r
+                                    + targetList[i] + "_" \r
                                     + toolchainList[j];\r
                     File fvDir = new File(ffsCommonDir + File.separatorChar + "FV");\r
                     Element fvEle = document.createElement("var");\r
@@ -510,6 +579,11 @@ public class PlatformBuildFileGenerator {
                     fvEle.setAttribute("value", fvDir.getPath().replaceAll("(\\\\)", "/"));\r
                     ele.appendChild(fvEle);\r
                     \r
+                    Element targetDirEle = document.createElement("var");\r
+                    targetDirEle.setAttribute("name", "TARGET_DIR");\r
+                    targetDirEle.setAttribute("value", ffsCommonDir.replaceAll("(\\\\)", "/"));\r
+                    ele.appendChild(targetDirEle);\r
+                    \r
                     NodeList childNodes = node.getChildNodes();\r
                     for (int k = 0; k < childNodes.getLength(); k++) {\r
                         Node childItem = childNodes.item(k);\r