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 inCOMMON_FILE
if it - does not specify in module's surface area. + Find the corresponding FFS layout inFPD
. @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]; } VectorsectionList = 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