X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=Tools%2FSource%2FGenBuild%2Forg%2Ftianocore%2Fbuild%2FFfsProcess.java;h=66ad11ab5567675fd3e0d79382f51b24fd1fa4b6;hb=534089527b1bbaf45305bec95c2c2a263a9ae424;hp=267a50e4e36bd9c1c2490ecafe8d115790f0d116;hpb=dae8a1b2353b914916ffb685c2f287dbef7c04c4;p=mirror_edk2.git diff --git a/Tools/Source/GenBuild/org/tianocore/build/FfsProcess.java b/Tools/Source/GenBuild/org/tianocore/build/FfsProcess.java index 267a50e4e3..66ad11ab55 100644 --- a/Tools/Source/GenBuild/org/tianocore/build/FfsProcess.java +++ b/Tools/Source/GenBuild/org/tianocore/build/FfsProcess.java @@ -14,29 +14,25 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. package org.tianocore.build; import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; import java.util.Vector; import javax.xml.namespace.QName; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.xmlbeans.XmlCursor; -import org.apache.xmlbeans.XmlObject; +import org.tianocore.BuildOptionsDocument; +import org.tianocore.build.global.GlobalData; +import org.tianocore.build.global.SurfaceAreaQuery; +import org.tianocore.build.id.FpdModuleIdentification; +import org.tianocore.common.definitions.EdkDefinitions; import org.w3c.dom.Document; import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; /**

FfsProcess is a class to find the corresponding FFS layout.

-

Property COMMON_FILE specified which file to search. The element - in COMMON_FILE is like following:

+

The FFS Layout is like following:

     <Ffs type="APPLICATION">
@@ -56,10 +52,7 @@ import org.w3c.dom.NodeList;
 **/
 public class FfsProcess {
 
-    ///
-    /// Xml Document Node for corresponding FFS layout
-    ///
-    private Node ffs;
+    private BuildOptionsDocument.BuildOptions.Ffs ffsXmlObject;
 
     ///
     /// ANT script to call GenFfs
@@ -89,20 +82,14 @@ public class FfsProcess {
     ///
     /// mapping from section type to section output file extension
     ///
-    public static final String[][] sectionExt = { { "EFI_SECTION_FREEFORM_SUBTYPE_GUID", ".sec" },
-                                                 { "EFI_SECTION_VERSION", ".ver" },
-                                                 { "EFI_SECTION_USER_INTERFACE", ".ui" },
-                                                 { "EFI_SECTION_DXE_DEPEX", ".dpx" },
-                                                 { "EFI_SECTION_PEI_DEPEX", ".dpx" }, 
-                                                 { "EFI_SECTION_PE32", ".pe32" },
-                                                 { "EFI_SECTION_PIC", ".pic" }, 
-                                                 { "EFI_SECTION_TE", ".tes" },
-                                                 { "EFI_SECTION_RAW", ".sec" }, 
-                                                 { "EFI_SECTION_COMPRESSION", ".sec" },
-                                                 { "EFI_SECTION_GUID_DEFINED", ".sec" },
-                                                 { "EFI_SECTION_COMPATIBILITY16", ".sec" },
-                                                 { "EFI_SECTION_FIRMWARE_VOLUME_IMAGE", ".sec" } };
+    public static final String[][] sectionExt = EdkDefinitions.SectionTypeExtensions;
 
+    private SurfaceAreaQuery saq = null;
+    
+    public FfsProcess(SurfaceAreaQuery saq) {
+        this.saq = saq;
+    }
+    
     /**
       search in the type, if componentType is listed in type, return true; 
       otherwise return false.
@@ -122,65 +109,39 @@ public class FfsProcess {
     }
 
     /**
-      Find the corresponding FFS layout in COMMON_FILE if it
-      does not specify in module's surface area. 
+      Find the corresponding FFS layout in FPD. 
       
       @param buildType Current module's component type
       @param project Ant project
       @return whether find the corresponding FFS layout
       @throws BuildException
-              If specified COMMON_FILE XML file is not valide.
+              If can't find FFS Layout in FPD.
     **/
-    public boolean initSections(String buildType, Project project) throws BuildException {
+    public boolean initSections(String buildType, Project project, FpdModuleIdentification fpdModuleId) throws BuildException {
         //
-        // first try to sections defined in PLATFORM level
+        // Try to find Ffs layout from FPD file
         //
-
-        //
-        // if module specify sections itself, it's okay
-        // otherwise find sections from WORKSPACE default setting with
-        // ComponentType
-        //
-        if (ffs == null) {
-            File file = new File(project.getProperty("COMMON_FILE"));
-            //
-            // if common file is not existed, just return
-            //
-            if (!file.exists()) {
-                return false;
-            }
-            DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
-            try {
-                DocumentBuilder dombuilder = domfac.newDocumentBuilder();
-                InputStream is = new FileInputStream(file);
-                Document doc = dombuilder.parse(is);
-                Element root = doc.getDocumentElement();
-                NodeList items = root.getChildNodes();
-                for (int i = 0; i < items.getLength(); i++) {
-                    Node node = items.item(i);
-                    if (node.getNodeType() == Node.ELEMENT_NODE) {
-                        String nodeName = node.getNodeName();
-                        if (nodeName.equalsIgnoreCase("Ffs")) {
-                            NamedNodeMap attr = node.getAttributes();
-                            Node type = attr.getNamedItem("type");
-                            if (type != null) {
-                                if (isMatch(type.getTextContent(), buildType)) {
-                                    ffs = node;
-                                    return true;
-                                }
-                            }
-                        }
-                    }
-                }
-            } catch (Exception e) {
-                throw new BuildException("Parse COMMON_FILE [" + file.getPath() + "] error!\n" + e.getMessage());
+        saq.push(GlobalData.getFpdBuildOptions());
+        BuildOptionsDocument.BuildOptions.Ffs[] ffsArray = saq.getFpdFfs();
+        saq.pop();
+        for (int i = 0; i < ffsArray.length; i++) {
+            if (isMatch(ffsArray[i].getFfsKey(), buildType)) {
+                ffsXmlObject = ffsArray[i];
+                return true;
             }
         }
-        if (ffs == null) {
-            return false;
+        
+        //
+        // If FfsFormatKey is not null, report exception and fail build
+        // Otherwise report warning message
+        //
+        if (buildType == null) {
+            System.out.println("Warning: this module doesn't specify a FfsFormatKey. ");
         } else {
-            return true;
+            throw new BuildException("Can't find the FfsFormatKey [" + buildType + "] attribute in the FPD file!");            
         }
+
+        return false;
     }
     
     /**
@@ -194,35 +155,36 @@ public class FfsProcess {
     **/
     public String[] getGenSectionElements(Document document, String basename, String guid, String targetFilename) {
         this.basename = basename;
-        if (ffs == null) {
+        if (ffsXmlObject == null) {
             return new String[0];
         }
         Vector sectionList = new Vector();
         XmlCursor cursor = null;
         try {
-            cursor = XmlObject.Factory.parse(ffs).newCursor();
+            cursor = ffsXmlObject.newCursor();
         } catch (Exception e) {
             return null;
         }
         int mode = MODE_NONE;
-        Element root = document.createElement("genffsfile");
-        root.setAttribute("outputDir", "${BIN_DIR}");
-        root.setAttribute("BaseName", basename);
-        root.setAttribute("fileGuid", guid);
-        cursor.toFirstChild();
+        Element genffsfileEle = document.createElement("genffsfile");
+        genffsfileEle.setAttribute("outputDir", "${BIN_DIR}");
+        genffsfileEle.setAttribute("moduleType", "${MODULE_TYPE}");
+        genffsfileEle.setAttribute("BaseName", basename);
+        genffsfileEle.setAttribute("fileGuid", guid);
+
         if (cursor.toFirstChild()) {
             do {
                 if (cursor.getName().getLocalPart().equalsIgnoreCase("Attribute")) {
                     String name = cursor.getAttributeText(new QName("Name"));
                     String value = cursor.getAttributeText(new QName("Value"));
-                    root.setAttribute(changeAttributeName(name), value);
+                    genffsfileEle.setAttribute(changeAttributeName(name), value);
                 } else if (cursor.getName().getLocalPart().equalsIgnoreCase("Section")) {
                     cursor.push();
-                    dealSection(mode, document, root, cursor, sectionList);
+                    dealSection(mode, document, genffsfileEle, cursor, sectionList);
                     cursor.pop();
                 } else if (cursor.getName().getLocalPart().equalsIgnoreCase("Sections")) {
                     cursor.push();
-                    dealSections(mode, document, root, cursor, sectionList);
+                    dealSections(mode, document, genffsfileEle, cursor, sectionList);
                     cursor.pop();
                 }
             } while (cursor.toNextSibling());
@@ -243,11 +205,11 @@ public class FfsProcess {
         outofdateEle.appendChild(sourceEle);
         Element targetEle = document.createElement("targetfiles");
         Element fileEle = document.createElement("file");
-        fileEle.setAttribute("name", "${BIN_DIR}\\" + targetFilename);
+        fileEle.setAttribute("name", "${BIN_DIR}" + File.separatorChar + targetFilename);
         targetEle.appendChild(fileEle);
         outofdateEle.appendChild(targetEle);
         Element sequentialEle = document.createElement("sequential");
-        sequentialEle.appendChild(root);
+        sequentialEle.appendChild(genffsfileEle);
         outofdateEle.appendChild(sequentialEle);
         ffsNode = outofdateEle;
         return result;
@@ -346,26 +308,61 @@ public class FfsProcess {
     **/
     private void dealSection(int mode, Document doc, Element root, XmlCursor cursor, Vector list) {
         String type = cursor.getAttributeText(new QName("SectionType"));
-        list.addElement(type);
+        
+        //
+        // Judge if file is specified? Yes, just use the file, else call Build Macro
+        // If fileName is null, means without FileNames specify in FPD file
+        //
+        String fileName = null;
+        cursor.push();
+        if (cursor.toFirstChild()) {
+            do {
+                if (cursor.getName().getLocalPart().equalsIgnoreCase("Filenames")) {
+                    cursor.push();
+                    if (cursor.toFirstChild()) {
+                        do {
+                            if (cursor.getName().getLocalPart().equalsIgnoreCase("Filename")) {
+                                fileName = cursor.getTextValue();
+                            }
+                        } while (cursor.toNextSibling());
+                    }
+                    cursor.pop();
+                }
+            } while (cursor.toNextSibling());
+        }
+
+        cursor.pop();
+        
+        if (fileName == null) {
+            list.addElement(type);
+        }
         if (mode == MODE_GUID_DEFINED) {
             //
             // 
             //
             Element ele = doc.createElement("input");
-            ele.setAttribute("file", "${DEST_DIR_OUTPUT}" + File.separatorChar + basename + getSectionExt(type));
+            if (fileName == null) {
+                ele.setAttribute("file", "${DEST_DIR_OUTPUT}" + File.separatorChar + basename + getSectionExt(type));
+            } else {
+                ele.setAttribute("file", "${PLATFORM_DIR}" + File.separatorChar + fileName);
+            }
             root.appendChild(ele);
         } else {
             //
             // 
             //
             Element ele = doc.createElement("sectFile");
-            ele.setAttribute("fileName", "${DEST_DIR_OUTPUT}" + File.separatorChar + basename + getSectionExt(type));
+            if (fileName == null) {
+                ele.setAttribute("fileName", "${DEST_DIR_OUTPUT}" + File.separatorChar + basename + getSectionExt(type));
+            } else {
+                ele.setAttribute("fileName", "${PLATFORM_DIR}" + File.separatorChar + fileName);
+            }
             root.appendChild(ele);
         }
     }
 
     /**
-       Get the corresponding section file suffix.
+      Get the corresponding section file suffix.
        
       @param type Section type
       @return Corresponding section file extension