X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=Tools%2FSource%2FGenBuild%2Forg%2Ftianocore%2Fbuild%2Ffpd%2FPlatformBuildFileGenerator.java;h=e6a1002da3b711bbd0384b719b07a8e9e07bc680;hp=b41ea211d25d35162666f49b5ba0f588cb81329d;hb=391dbbb1c00daefe78e7e44499d048943ca866ae;hpb=a29c47e01d9689fad735bbeccfaef67676a425d1 diff --git a/Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java b/Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java index b41ea211d2..e6a1002da3 100644 --- a/Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java +++ b/Tools/Source/GenBuild/org/tianocore/build/fpd/PlatformBuildFileGenerator.java @@ -35,7 +35,9 @@ import org.tianocore.build.id.ModuleIdentification; import org.w3c.dom.Comment; 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; public class PlatformBuildFileGenerator { @@ -46,31 +48,19 @@ public class PlatformBuildFileGenerator { /// private Map outfiles; - /// - /// Mapping from FV name to its modules - /// - private Map> fvs; - - /// - /// Mapping from sequence number to FV names - /// - private Map> sequences; - private boolean isUnified = true; private Project project; private String info = "DO NOT EDIT \n" - + "File auto-generated by build utility\n" + + "This file is auto-generated by the build utility\n" + "\n" + "Abstract:\n" - + "Auto-generated ANT build file for building of EFI Modules/Platforms\n"; + + "Auto-generated ANT build file for building EFI Modules and Platforms\n"; - public PlatformBuildFileGenerator(Project project, Map outfiles, Map> fvs, Map> sequences, boolean isUnified){ + public PlatformBuildFileGenerator(Project project, Map outfiles, boolean isUnified){ this.project = project; this.outfiles = outfiles; - this.fvs = fvs; - this.sequences = sequences; this.isUnified = isUnified; this.platformName = project.getProperty("PLATFORM"); } @@ -107,39 +97,29 @@ public class PlatformBuildFileGenerator { ele.setAttribute("resource", "frameworktasks.tasks"); root.appendChild(ele); + ele = document.createElement("taskdef"); + ele.setAttribute("resource", "net/sf/antcontrib/antlib.xml"); + root.appendChild(ele); + ele = document.createElement("property"); ele.setAttribute("environment", "env"); root.appendChild(ele); - Set sequenceKeys = sequences.keySet(); - Iterator sequenceIter = sequenceKeys.iterator(); - String dependsStr = ""; - while (sequenceIter.hasNext()) { - String num = (String)sequenceIter.next(); - if (dependsStr.length() > 0) { - dependsStr += " , "; - } - dependsStr += "modules" + num + ", fvs" + num; - } - // // Default Target // root.appendChild(document.createComment("Default target")); ele = document.createElement("target"); ele.setAttribute("name", "all"); - ele.setAttribute("depends", dependsStr + ", userextensions"); + ele.setAttribute("depends", "prebuild, modules, fvs, postbuild"); root.appendChild(ele); // // Modules and Fvs Target // - sequenceIter = sequenceKeys.iterator(); - while (sequenceIter.hasNext()) { - String num = (String)sequenceIter.next(); - applyModules(document, root, num); - applyFvs(document, root, num); - } + applyModules(document, root); + + applyFvs(document, root); // // Clean Target @@ -152,9 +132,14 @@ public class PlatformBuildFileGenerator { applyCleanall(document, root); // - // User Extension + // User Extension pre build // - applyUserExtensions(document, root); + applyUserExtensionsPreBuild(document, root); + + // + // User Extension Post build + // + applyUserExtensionsPostBuild(document, root); document.appendChild(rootComment); document.appendChild(root); @@ -179,86 +164,79 @@ public class PlatformBuildFileGenerator { xformer.setOutputProperty(OutputKeys.INDENT, "yes"); xformer.transform(source, result); } catch (Exception ex) { - ex.printStackTrace(); - throw new BuildException("Generate " + platformName + "_build.xml failed. \n" + ex.getMessage()); + throw new BuildException("Generation of the " + platformName + "_build.xml failed!\n" + ex.getMessage()); } } - private void applyModules(Document document, Node root, String num) { + + private void applyModules(Document document, Node root) { root.appendChild(document.createComment("Modules target")); Element ele = document.createElement("target"); - ele.setAttribute("name", "modules" + num); - - Set fvNameSet = sequences.get(num); + ele.setAttribute("name", "modules"); - Iterator fvNameIter = fvNameSet.iterator(); - while (fvNameIter.hasNext()) { - String fvName = (String)fvNameIter.next(); - Set set = fvs.get(fvName); - Iterator iter = set.iterator(); - while (iter.hasNext()) { - FpdModuleIdentification fpdModuleId = (FpdModuleIdentification) iter.next(); - ModuleIdentification moduleId = fpdModuleId.getModule(); - Element moduleEle = document.createElement("GenBuild"); - moduleEle.setAttribute("type", "build"); - // - // Inherit Properties. - //{"ARCH", "PACKAGE", "PACKAGE_GUID", "PACKAGE_VERSION", "MODULE_DIR"} - // - - // - // ARCH - // - Element property = document.createElement("property"); - property.setAttribute("name", "ARCH"); - property.setAttribute("value", fpdModuleId.getArch()); - moduleEle.appendChild(property); + Set set = outfiles.keySet(); + Iterator iter = set.iterator(); + while (iter.hasNext()) { + FpdModuleIdentification fpdModuleId = (FpdModuleIdentification) iter.next(); + ModuleIdentification moduleId = fpdModuleId.getModule(); + Element moduleEle = document.createElement("GenBuild"); + moduleEle.setAttribute("type", "build"); + // + // Inherit Properties. + //{"ARCH", "PACKAGE", "PACKAGE_GUID", "PACKAGE_VERSION", "MODULE_DIR"} + // + + // + // ARCH + // + Element property = document.createElement("property"); + property.setAttribute("name", "ARCH"); + property.setAttribute("value", fpdModuleId.getArch()); + moduleEle.appendChild(property); - // - // MODULE_GUID - // - property = document.createElement("property"); - property.setAttribute("name", "MODULE_GUID"); - property.setAttribute("value", moduleId.getGuid()); - moduleEle.appendChild(property); - - // - // MODULE_VERSION - // - property = document.createElement("property"); - property.setAttribute("name", "MODULE_VERSION"); - property.setAttribute("value", moduleId.getVersion()); - moduleEle.appendChild(property); - - // - // PACKAGE_GUID - // - property = document.createElement("property"); - property.setAttribute("name", "PACKAGE_GUID"); - property.setAttribute("value", moduleId.getPackage().getGuid()); - moduleEle.appendChild(property); - - // - // PACKAGE_VERSION - // - property = document.createElement("property"); - property.setAttribute("name", "PACKAGE_VERSION"); - property.setAttribute("value", moduleId.getPackage().getVersion()); - moduleEle.appendChild(property); - - ele.appendChild(moduleEle); - } + // + // MODULE_GUID + // + property = document.createElement("property"); + property.setAttribute("name", "MODULE_GUID"); + property.setAttribute("value", moduleId.getGuid()); + moduleEle.appendChild(property); + + // + // MODULE_VERSION + // + property = document.createElement("property"); + property.setAttribute("name", "MODULE_VERSION"); + property.setAttribute("value", moduleId.getVersion()); + moduleEle.appendChild(property); + + // + // PACKAGE_GUID + // + property = document.createElement("property"); + property.setAttribute("name", "PACKAGE_GUID"); + property.setAttribute("value", moduleId.getPackage().getGuid()); + moduleEle.appendChild(property); + + // + // PACKAGE_VERSION + // + property = document.createElement("property"); + property.setAttribute("name", "PACKAGE_VERSION"); + property.setAttribute("value", moduleId.getPackage().getVersion()); + moduleEle.appendChild(property); + + ele.appendChild(moduleEle); } root.appendChild(ele); } - private void applyFvs(Document document, Node root, String num) { - Set fvNameSet = sequences.get(num); + private void applyFvs(Document document, Node root) { // // FVS Target // root.appendChild(document.createComment("FVs target")); Element ele = document.createElement("target"); - ele.setAttribute("name", "fvs" + num); + ele.setAttribute("name", "fvs"); // // For every Target and ToolChain @@ -269,16 +247,14 @@ public class PlatformBuildFileGenerator { for(int j = 0; j < toolchainList.length; j++){ String fvOutputDir = project.getProperty("BUILD_DIR") + File.separatorChar + targetList[i] + File.separatorChar - + toolchainList[i] + File.separatorChar + "FV"; + + toolchainList[j] + File.separatorChar + "FV"; String[] validFv = SurfaceAreaQuery.getFpdValidImageNames(); for (int k = 0; k < validFv.length; k++) { - if (fvNameSet.contains(validFv[k]) || ! isListInSequence(validFv[k])) { - String inputFile = fvOutputDir + "" + File.separatorChar + validFv[k].toUpperCase() + ".inf"; - Element fvEle = document.createElement("genfvimage"); - fvEle.setAttribute("infFile", inputFile); - fvEle.setAttribute("outputDir", fvOutputDir); - ele.appendChild(fvEle); - } + String inputFile = fvOutputDir + "" + File.separatorChar + validFv[k].toUpperCase() + ".inf"; + Element fvEle = document.createElement("genfvimage"); + fvEle.setAttribute("infFile", inputFile); + fvEle.setAttribute("outputDir", fvOutputDir); + ele.appendChild(fvEle); } } } @@ -375,14 +351,17 @@ public class PlatformBuildFileGenerator { // // Deep Clean Target // - root.appendChild(document.createComment("Clean All target")); + root.appendChild(document.createComment("Target: cleanall")); Element ele = document.createElement("target"); ele.setAttribute("name", "cleanall"); if (isUnified) { - Element cleanAllEle = document.createElement("delete"); - cleanAllEle.setAttribute("dir", project.getProperty("BUILD_DIR")); - ele.appendChild(cleanAllEle); + String[] targetList = GlobalData.getToolChainInfo().getTargets(); + for (int i = 0; i < targetList.length; ++i) { + Element cleanAllEle = document.createElement("delete"); + cleanAllEle.setAttribute("dir", project.getProperty("BUILD_DIR") + File.separatorChar + targetList[i]); + ele.appendChild(cleanAllEle); + } } else { Set set = outfiles.keySet(); Iterator iter = set.iterator(); @@ -453,27 +432,113 @@ public class PlatformBuildFileGenerator { root.appendChild(ele); } - private void applyUserExtensions(Document document, Node root) { + private void applyUserExtensionsPreBuild(Document document, Node root) { // // User Extensions // - root.appendChild(document.createComment("User Extensions")); + root.appendChild(document.createComment("Pre-Build Processing")); Element ele = document.createElement("target"); - ele.setAttribute("name", "userextensions"); + ele.setAttribute("name", "prebuild"); + + Node node = SurfaceAreaQuery.getFpdUserExtensionPreBuild(); + if (node != null) { + // + // For every Target and ToolChain + // + String[] targetList = GlobalData.getToolChainInfo().getTargets(); + for (int i = 0; i < targetList.length; i++){ + String[] toolchainList = GlobalData.getToolChainInfo().getTagnames(); + for(int j = 0; j < toolchainList.length; j++){ + // + // Prepare FV_DIR + // + String ffsCommonDir = project.getProperty("BUILD_DIR") + File.separatorChar + + targetList[i] + File.separatorChar + + toolchainList[j]; + File fvDir = new File(ffsCommonDir + File.separatorChar + "FV"); + Element fvEle = document.createElement("var"); + fvEle.setAttribute("name", "FV_DIR"); + fvEle.setAttribute("value", fvDir.getPath().replaceAll("(\\\\)", "/")); + ele.appendChild(fvEle); + + NodeList childNodes = node.getChildNodes(); + for (int k = 0; k < childNodes.getLength(); k++) { + Node childItem = childNodes.item(k); + if (childItem.getNodeType() == Node.ELEMENT_NODE) { + ele.appendChild(recursiveNode(childItem, document)); + } + } + + } + } + } root.appendChild(ele); } + private void applyUserExtensionsPostBuild(Document document, Node root) { + // + // User Extensions + // + root.appendChild(document.createComment("Post-Build Processing")); + Element ele = document.createElement("target"); + ele.setAttribute("name", "postbuild"); + + Node node = SurfaceAreaQuery.getFpdUserExtensionPostBuild(); + if (node != null) { + // + // For every Target and ToolChain + // + String[] targetList = GlobalData.getToolChainInfo().getTargets(); + for (int i = 0; i < targetList.length; i++){ + String[] toolchainList = GlobalData.getToolChainInfo().getTagnames(); + for(int j = 0; j < toolchainList.length; j++){ + // + // Prepare FV_DIR + // + String ffsCommonDir = project.getProperty("BUILD_DIR") + File.separatorChar + + targetList[i] + File.separatorChar + + toolchainList[j]; + File fvDir = new File(ffsCommonDir + File.separatorChar + "FV"); + Element fvEle = document.createElement("var"); + fvEle.setAttribute("name", "FV_DIR"); + fvEle.setAttribute("value", fvDir.getPath().replaceAll("(\\\\)", "/")); + ele.appendChild(fvEle); + + NodeList childNodes = node.getChildNodes(); + for (int k = 0; k < childNodes.getLength(); k++) { + Node childItem = childNodes.item(k); + if (childItem.getNodeType() == Node.ELEMENT_NODE) { + ele.appendChild(recursiveNode(childItem, document)); + } + } + + } + } + } + + root.appendChild(ele); + } - private boolean isListInSequence(String fvName) { - Set numbers = sequences.keySet(); - Iterator iter = numbers.iterator(); - while (iter.hasNext()) { - Set fvNameSet = sequences.get(iter.next()); - if (fvNameSet.contains(fvName)) { - return true; + private Element recursiveNode(Node node, Document document) { + Element root = document.createElement(node.getNodeName()); + NamedNodeMap attr = node.getAttributes(); + for (int i = 0; i < attr.getLength(); i++) { + Node attrItem = attr.item(i); + root.setAttribute(attrItem.getNodeName(), attrItem.getNodeValue()); + } + NodeList childNodes = node.getChildNodes(); + for (int i = 0; i < childNodes.getLength(); i++) { + Node childItem = childNodes.item(i); + if (childItem.getNodeType() == Node.ELEMENT_NODE) { + root.appendChild(recursiveNode(childItem, document)); + } + else if (childItem.getNodeType() == Node.TEXT_NODE){ + if ( ! childItem.getNodeValue().trim().equalsIgnoreCase("")) { + root.setTextContent(childItem.getNodeValue()); + } } } - return false; + return root; } }