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
import org.w3c.dom.Node;\r
import org.w3c.dom.NodeList;\r
\r
+/**\r
+ class PlatformBuildFileGenerator is used to generate ${PLATFORM}_build.xml file. \r
+\r
+ @since GenBuild 1.0\r
+**/\r
public class PlatformBuildFileGenerator {\r
\r
private String platformName;\r
/// Mapping from modules identification to out put file name\r
///\r
private Map<FpdModuleIdentification, String> outfiles;\r
-\r
+ \r
///\r
/// Mapping from FV name to its modules\r
///\r
- private Map<String, Set<FpdModuleIdentification>> fvs;\r
+ private Map<String, Set<FpdModuleIdentification>> fvs = new HashMap<String, Set<FpdModuleIdentification>>();\r
+\r
\r
- ///\r
- /// Mapping from sequence number to FV names\r
- ///\r
- private Map<String, Set<String>> sequences;\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
- + "File auto-generated by build utility\n" \r
+ + "This file is auto-generated by the build utility\n" \r
+ "\n" \r
+ "Abstract:\n"\r
- + "Auto-generated ANT build file for building of EFI Modules/Platforms\n";\r
+ + "Auto-generated ANT build file for building EFI Modules and Platforms\n";\r
\r
- public PlatformBuildFileGenerator(Project project, Map<FpdModuleIdentification, String> outfiles, Map<String, Set<FpdModuleIdentification>> fvs, Map<String, Set<String>> sequences, 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.fvs = fvs;\r
- this.sequences = sequences;\r
this.isUnified = isUnified;\r
+ this.fvs = fvs;\r
+ this.saq = saq;\r
this.platformName = project.getProperty("PLATFORM");\r
}\r
\r
ele.setAttribute("environment", "env");\r
root.appendChild(ele);\r
\r
- Set<String> sequenceKeys = sequences.keySet();\r
- Iterator sequenceIter = sequenceKeys.iterator();\r
- String dependsStr = "prebuild";\r
- while (sequenceIter.hasNext()) {\r
- String num = (String)sequenceIter.next();\r
- if (dependsStr.length() > 0) {\r
- dependsStr += " , ";\r
- }\r
- dependsStr += "modules" + num + ", fvs" + num;\r
- }\r
- \r
//\r
// Default Target\r
//\r
root.appendChild(document.createComment("Default target"));\r
ele = document.createElement("target");\r
ele.setAttribute("name", "all");\r
- ele.setAttribute("depends", dependsStr + ", postbuild");\r
+ ele.setAttribute("depends", "prebuild, modules, fvs, postbuild");\r
root.appendChild(ele);\r
\r
//\r
// Modules and Fvs Target\r
//\r
- sequenceIter = sequenceKeys.iterator();\r
- while (sequenceIter.hasNext()) {\r
- String num = (String)sequenceIter.next();\r
- applyModules(document, root, num);\r
- applyFvs(document, root, num);\r
- }\r
+ applyModules(document, root);\r
+ \r
+ applyFvs(document, root);\r
\r
//\r
// Clean Target\r
xformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
xformer.transform(source, result);\r
} catch (Exception ex) {\r
- throw new BuildException("Generate " + platformName + "_build.xml failed. \n" + ex.getMessage());\r
+ throw new BuildException("Generation of the " + platformName + "_build.xml failed!\n" + ex.getMessage());\r
}\r
}\r
\r
- private void applyModules(Document document, Node root, String num) {\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" + num);\r
+ ele.setAttribute("name", "modules");\r
+\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
- Set<String> fvNameSet = sequences.get(num);\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
- Iterator fvNameIter = fvNameSet.iterator();\r
- while (fvNameIter.hasNext()) {\r
- String fvName = (String)fvNameIter.next();\r
- Set<FpdModuleIdentification> set = fvs.get(fvName);\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
+ 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
- ele.appendChild(moduleEle);\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
- root.appendChild(ele);\r
+ return false;\r
}\r
\r
- private void applyFvs(Document document, Node root, String num) {\r
- Set<String> fvNameSet = sequences.get(num);\r
+ private void applyFvs(Document document, Node root) {\r
//\r
// FVS Target\r
//\r
root.appendChild(document.createComment("FVs target"));\r
Element ele = document.createElement("target");\r
- ele.setAttribute("name", "fvs" + num);\r
+ ele.setAttribute("name", "fvs");\r
\r
//\r
// For every Target and ToolChain\r
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
- + toolchainList[i] + File.separatorChar + "FV";\r
- String[] validFv = SurfaceAreaQuery.getFpdValidImageNames();\r
+ + targetList[i] + "_" \r
+ + toolchainList[j] + File.separatorChar + "FV";\r
+ String[] validFv = saq.getFpdValidImageNames();\r
for (int k = 0; k < validFv.length; k++) {\r
- if (fvNameSet.contains(validFv[k]) || ! isListInSequence(validFv[k])) {\r
- String inputFile = fvOutputDir + "" + File.separatorChar + validFv[k].toUpperCase() + ".inf";\r
- Element fvEle = document.createElement("genfvimage");\r
- fvEle.setAttribute("infFile", inputFile);\r
- fvEle.setAttribute("outputDir", fvOutputDir);\r
- ele.appendChild(fvEle);\r
- }\r
+ String inputFile = fvOutputDir + "" + File.separatorChar + validFv[k].toUpperCase() + ".inf";\r
+ Element fvEle = document.createElement("genfvimage");\r
+ fvEle.setAttribute("infFile", inputFile);\r
+ fvEle.setAttribute("outputDir", fvOutputDir);\r
+ ele.appendChild(fvEle);\r
}\r
}\r
}\r
//\r
// Deep Clean Target\r
//\r
- root.appendChild(document.createComment("Clean All target"));\r
+ root.appendChild(document.createComment("Target: cleanall"));\r
Element ele = document.createElement("target");\r
ele.setAttribute("name", "cleanall");\r
\r
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
//\r
// User Extensions\r
//\r
- root.appendChild(document.createComment("Pre Build Processing"));\r
+ root.appendChild(document.createComment("Pre-Build Processing"));\r
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
// 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
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
ele.appendChild(recursiveNode(childItem, document));\r
}\r
}\r
- \r
}\r
}\r
}\r
//\r
// User Extensions\r
//\r
- root.appendChild(document.createComment("Post Build Processing"));\r
+ root.appendChild(document.createComment("Post-Build Processing"));\r
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
// 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
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
root.appendChild(recursiveNode(childItem, document));\r
}\r
else if (childItem.getNodeType() == Node.TEXT_NODE){\r
- if ( ! childItem.getNodeValue().trim().equalsIgnoreCase("")) {\r
+ if (!childItem.getNodeValue().trim().equalsIgnoreCase("")) {\r
root.setTextContent(childItem.getNodeValue());\r
}\r
}\r
}\r
return root;\r
}\r
- \r
- private boolean isListInSequence(String fvName) {\r
- Set<String> numbers = sequences.keySet();\r
- Iterator<String> iter = numbers.iterator();\r
- while (iter.hasNext()) {\r
- Set<String> fvNameSet = sequences.get(iter.next());\r
- if (fvNameSet.contains(fvName)) {\r
- return true;\r
- }\r
- }\r
- return false;\r
- }\r
}\r