]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Java/Source/GenBuild/org/tianocore/build/fpd/FpdParserTask.java
Update PEI Apriori Module GUID based on PIWG spec.
[mirror_edk2.git] / Tools / Java / Source / GenBuild / org / tianocore / build / fpd / FpdParserTask.java
index 7d86c64a2d82d84512252a6f33b8d503f6204c2c..e28ac19eca828986a16440a12ab11ccd82d81b4a 100644 (file)
@@ -91,15 +91,24 @@ public class FpdParserTask extends Task {
     ///\r
     Map<String, Set<FpdModuleIdentification>> fvs = new HashMap<String, Set<FpdModuleIdentification>>();\r
 \r
+    ///\r
+    /// Mapping from FV apriori file to its type (PEI or DXE)\r
+    ///\r
+    Map<String, String> aprioriType = new HashMap<String, String>();\r
+    \r
     ///\r
     /// FpdParserTask can specify some ANT properties.\r
     ///\r
     private Vector<Property> properties = new Vector<Property>();\r
 \r
     SurfaceAreaQuery saq = null;\r
-    \r
-    boolean isUnified = true;\r
 \r
+    boolean isUnified = true;\r
+    \r
+    public static String PEI_APRIORI_GUID = "1b45cc0a-156a-428a-af62-49864da0e6e6";\r
+    \r
+    public static String DXE_APRIORI_GUID = "fc510ee7-ffdc-11d4-bd41-0080c73c8881";\r
+    \r
     /**\r
       Public construct method. It is necessary for ANT task.\r
     **/\r
@@ -163,7 +172,7 @@ public class FpdParserTask extends Task {
         // Gen build.xml\r
         //\r
         String platformBuildFile = buildDir + File.separatorChar + platformId.getName() + "_build.xml";\r
-        PlatformBuildFileGenerator fileGenerator = new PlatformBuildFileGenerator(getProject(), outfiles, fvs, isUnified, saq, platformBuildFile);\r
+        PlatformBuildFileGenerator fileGenerator = new PlatformBuildFileGenerator(getProject(), outfiles, fvs, isUnified, saq, platformBuildFile, aprioriType);\r
         fileGenerator.genBuildFile();\r
 \r
         //\r
@@ -318,6 +327,33 @@ public class FpdParserTask extends Task {
                 if (files != null) {\r
                     bw.write("[files]");\r
                     bw.newLine();\r
+                    \r
+                    Set<FpdModuleIdentification> modules = null;\r
+                    \r
+                    if ( (modules = getPeiApriori(validFv[i])) != null) {\r
+                        //\r
+                        // Special GUID - validFv[i].FFS\r
+                        //\r
+                        String str = ffsCommonDir + File.separatorChar + "FV" + File.separatorChar + PEI_APRIORI_GUID + "-" + validFv[i] + ".FFS";\r
+                        bw.write(getProject().replaceProperties("EFI_FILE_NAME = " + str));\r
+                        bw.newLine();\r
+                        \r
+                        File aprioriFile = new File(getProject().getProperty("FV_DIR") + File.separatorChar + validFv[i] + ".apr");\r
+                        aprioriType.put(validFv[i], PEI_APRIORI_GUID);\r
+                        genAprioriFile(modules, aprioriFile);\r
+                    } else if((modules = getDxeApriori(validFv[i])) != null) {\r
+                        //\r
+                        // Special GUID - validFv[i].FFS\r
+                        //\r
+                        String str = ffsCommonDir + File.separatorChar + "FV" + File.separatorChar + DXE_APRIORI_GUID + "-" + validFv[i] + ".FFS";\r
+                        bw.write(getProject().replaceProperties("EFI_FILE_NAME = " + str));\r
+                        bw.newLine();\r
+                        \r
+                        File aprioriFile = new File(getProject().getProperty("FV_DIR") + File.separatorChar + validFv[i] + ".apr");\r
+                        aprioriType.put(validFv[i], DXE_APRIORI_GUID);\r
+                        genAprioriFile(modules, aprioriFile);\r
+                    }\r
+                    \r
                     for (int j = 0; j < files.length; j++) {\r
                         String str = ffsCommonDir + File.separatorChar + outfiles.get(files[j]);\r
                         bw.write(getProject().replaceProperties("EFI_FILE_NAME = " + str));\r
@@ -375,7 +411,7 @@ public class FpdParserTask extends Task {
         }\r
 \r
         String platformBuildFile = buildDir + File.separatorChar + platformId.getName() + "_build.xml";\r
-        PlatformBuildFileGenerator fileGenerator = new PlatformBuildFileGenerator(getProject(), outfiles, fvs, isUnified, saq, platformBuildFile);\r
+        PlatformBuildFileGenerator fileGenerator = new PlatformBuildFileGenerator(getProject(), outfiles, fvs, isUnified, saq, platformBuildFile, aprioriType);\r
         fileGenerator.genBuildFile();\r
         \r
         Ant ant = new Ant();\r
@@ -529,6 +565,14 @@ public class FpdParserTask extends Task {
             GlobalData.addMsaBuildOption(moduleId, parseMsaBuildOptions(false));\r
             GlobalData.addMsaFamilyBuildOption(moduleId, parseMsaBuildOptions(true));\r
     \r
+            ModuleIdentification[] libraryInstances = saq.getLibraryInstance(null);\r
+            for (int i = 0; i < libraryInstances.length; i++) {\r
+                saq.push(GlobalData.getDoc(libraryInstances[i], fpdModuleId.getArch()));\r
+                GlobalData.addMsaBuildOption(libraryInstances[i], parseMsaBuildOptions(false));\r
+                GlobalData.addMsaFamilyBuildOption(libraryInstances[i], parseMsaBuildOptions(true));\r
+                saq.pop();\r
+            }\r
+            \r
             saq.pop();\r
         }\r
     }\r
@@ -680,6 +724,97 @@ public class FpdParserTask extends Task {
         return archs;\r
     }\r
     \r
+    private void genAprioriFile(Set<FpdModuleIdentification> modules, File file) {\r
+        try {\r
+            FileWriter fw = new FileWriter(file);\r
+            BufferedWriter bw = new BufferedWriter(fw);\r
+            \r
+            Iterator<FpdModuleIdentification> iter = modules.iterator();\r
+            while(iter.hasNext()) {\r
+                bw.write(iter.next().getModule().getGuid());\r
+                bw.newLine();\r
+            }\r
+            \r
+            bw.flush();\r
+            bw.close();\r
+            fw.close();\r
+        }  catch (IOException ex) {\r
+            BuildException buildException = new BuildException("Generation of the Apriori file [" + file.getPath() + "] failed!\n" + ex.getMessage());\r
+            buildException.setStackTrace(ex.getStackTrace());\r
+            throw buildException;\r
+        }\r
+    }\r
+    \r
+    private Set<FpdModuleIdentification> getPeiApriori(String fvName) throws EdkException {\r
+        Node node = saq.getPeiApriori(fvName);\r
+        Set<FpdModuleIdentification> result = new LinkedHashSet<FpdModuleIdentification>();\r
+        if (node == null) {\r
+            return null;\r
+        }\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
+                //\r
+                // Find child elements "IncludeModules"\r
+                //\r
+                if (childItem.getNodeName().compareTo("IncludeModules") == 0) {\r
+                    //\r
+                    // result will be updated\r
+                    //\r
+                    processNodes(childItem, result);\r
+                } else if (childItem.getNodeName().compareTo("FvName") == 0) {\r
+                    \r
+                } else if (childItem.getNodeName().compareTo("InfFileName") == 0) {\r
+                    \r
+                } else {\r
+                    //\r
+                    // Report Warning\r
+                    //\r
+                    EdkLog.log(this, EdkLog.EDK_WARNING, "Unrecognised element " + childItem.getNodeName() + " under FPD.BuildOptions.UserExtensions[UserID='APRIORI' Identifier='0']");\r
+                }\r
+            }\r
+        }\r
+        \r
+        return result;\r
+    }\r
+\r
+    private Set<FpdModuleIdentification> getDxeApriori(String fvName) throws EdkException {\r
+        Node node = saq.getDxeApriori(fvName);\r
+        Set<FpdModuleIdentification> result = new LinkedHashSet<FpdModuleIdentification>();\r
+        if (node == null) {\r
+            return null;\r
+        }\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
+                //\r
+                // Find child elements "IncludeModules"\r
+                //\r
+                if (childItem.getNodeName().compareTo("IncludeModules") == 0) {\r
+                    //\r
+                    // result will be updated\r
+                    //\r
+                    processNodes(childItem, result);\r
+                } else if (childItem.getNodeName().compareTo("FvName") == 0) {\r
+                    \r
+                } else if (childItem.getNodeName().compareTo("InfFileName") == 0) {\r
+                    \r
+                } else {\r
+                    //\r
+                    // Report Warning\r
+                    //\r
+                    EdkLog.log(this, EdkLog.EDK_WARNING, "Unrecognised element " + childItem.getNodeName() + " under FPD.BuildOptions.UserExtensions[UserID='APRIORI' Identifier='1']");\r
+                }\r
+            }\r
+        }\r
+        \r
+        return result;\r
+    }\r
+    \r
     private Set<FpdModuleIdentification> getModuleSequenceForFv(String fvName) throws EdkException {\r
         Node node = saq.getFpdModuleSequence(fvName);\r
         Set<FpdModuleIdentification> result = new LinkedHashSet<FpdModuleIdentification>();\r
@@ -780,19 +915,26 @@ public class FpdParserTask extends Task {
         ToolChainInfo toolChainInfo = GlobalData.getToolChainInfo();\r
 \r
         if (toolChainInfo.getTargets().length == 0) {\r
-            throw new EdkException("No valid target specified! Please check your TARGET definition in Tools/Conf/target.txt.");\r
+            throw new EdkException("No valid target found! "+\r
+                                   "Please check the TARGET definition in Tools/Conf/target.txt, "+\r
+                                   "or the <BuildTarget>, <BuildOptions> in the FPD file.");\r
         }\r
 \r
         if (toolChainInfo.getTagnames().length == 0) {\r
-            throw new EdkException("No valid tool chain specified! Please check your TOOL_CHAIN_TAG definition in Tools/Conf/target.txt.");\r
+            throw new EdkException("No valid tool chain found! "+\r
+                                   "Please check the TOOL_CHAIN_TAG definition in Tools/Conf/target.txt, "+\r
+                                   "or the <BuildOptions> in the FPD file.");\r
         }\r
 \r
         if (toolChainInfo.getArchs().length == 0) {\r
-            throw new EdkException("No valid ARCH specified! Please check your TARGET_ARCH definition in Tools/Conf/target.txt.");\r
+            throw new EdkException("No valid architecture found! "+\r
+                                   "Please check the TARGET_ARCH definition in Tools/Conf/target.txt, "+\r
+                                   "or the <SupportedArchitectures>, <BuildOptions> in the FPD file.");\r
         }\r
 \r
         if (toolChainInfo.getCommands().length == 0) {\r
-            throw new EdkException("No valid COMMAND specified! Please check your TARGET definition in Tools/Conf/tools_def.txt.");\r
+            throw new EdkException("No valid COMMAND found! Please check the tool chain definitions "+\r
+                                   "in Tools/Conf/tools_def.txt.");\r
         }\r
     }\r
 }\r