--- /dev/null
+/** @file\r
+ This file is an ANT task.\r
+ \r
+ LibBuildFileGenerator task is used to generate module's build.xml file.\r
+\r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+package org.tianocore.build.tools;\r
+\r
+import java.io.File;\r
+import java.util.Iterator;\r
+import java.util.LinkedHashSet;\r
+import java.util.Set;\r
+\r
+import javax.xml.parsers.DocumentBuilder;\r
+import javax.xml.parsers.DocumentBuilderFactory;\r
+import javax.xml.transform.OutputKeys;\r
+import javax.xml.transform.Result;\r
+import javax.xml.transform.Source;\r
+import javax.xml.transform.Transformer;\r
+import javax.xml.transform.TransformerFactory;\r
+import javax.xml.transform.dom.DOMSource;\r
+import javax.xml.transform.stream.StreamResult;\r
+\r
+import org.apache.tools.ant.BuildException;\r
+import org.apache.tools.ant.Task;\r
+import org.tianocore.build.global.GlobalData;\r
+import org.tianocore.build.id.ModuleIdentification;\r
+import org.tianocore.build.id.PackageIdentification;\r
+import org.w3c.dom.Document;\r
+import org.w3c.dom.Element;\r
+\r
+public class DefaultBuildFileGenerator extends Task {\r
+\r
+ private Set<ModuleIdentification> modules = new LinkedHashSet<ModuleIdentification>();\r
+ \r
+ private Set<PackageIdentification> packages = new LinkedHashSet<PackageIdentification>();\r
+ \r
+ //\r
+ // <DefaultBuildFileGenerator mode="WORKSPACE | PACKAGE | MODULE">\r
+ // <PackageItem packageName="" packageGuid="" packageVersion="" />\r
+ // <ModuleItem moduleName="HelloWorld" moduleGuid="" moduleVersion="" packageName="" packageGuid="" packageVersion="" />\r
+ // </DefaultBuildFileGenerator>\r
+ //\r
+ private String mode = "MODULE";\r
+ \r
+ private String license = " Copyright (c) 2006, Intel Corporation \n"\r
+ + "All rights reserved. This program and the accompanying materials \n"\r
+ + "are licensed and made available under the terms and conditions of the BSD License \n"\r
+ + "which accompanies this distribution. The full text of the license may be found at \n"\r
+ + "http://opensource.org/licenses/bsd-license.php \n"\r
+ + "\n"\r
+ + "THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN \"AS IS\" BASIS, \n"\r
+ + "WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.";\r
+ \r
+ /**\r
+ Public construct method. It is necessary for ANT task.\r
+ **/\r
+ public DefaultBuildFileGenerator () {\r
+ }\r
+\r
+ public void execute() throws BuildException {\r
+ //\r
+ // Global Data initialization\r
+ //\r
+ GlobalData.initInfo("Tools" + File.separatorChar + "Conf" + File.separatorChar + "FrameworkDatabase.db",\r
+ getProject().getProperty("WORKSPACE_DIR"), "tools_def.txt");\r
+ \r
+ if (mode.equalsIgnoreCase("WORKSPACE")) {\r
+ modules.clear();\r
+ packages = GlobalData.getPackageList();\r
+ } \r
+ else if (mode.equalsIgnoreCase("PACKAGE")) {\r
+ modules.clear();\r
+ }\r
+ if (mode.equalsIgnoreCase("WORKSPACE") || mode.equalsIgnoreCase("PACKAGE")) {\r
+ Iterator iter = packages.iterator();\r
+ while (iter.hasNext()) {\r
+ PackageIdentification packageId = (PackageIdentification)iter.next();\r
+ modules.addAll(GlobalData.getModules(packageId));\r
+ }\r
+ }\r
+ \r
+ Iterator iter = modules.iterator();\r
+ while (iter.hasNext()) {\r
+ ModuleIdentification moduleId = (ModuleIdentification)iter.next();\r
+ genBuildFile (moduleId);\r
+ }\r
+ }\r
+ \r
+ private void genBuildFile(ModuleIdentification moduleId) {\r
+ DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();\r
+ try {\r
+ DocumentBuilder dombuilder = domfac.newDocumentBuilder();\r
+ Document document = dombuilder.newDocument();\r
+ //\r
+ // create root element and its attributes\r
+ //\r
+ document.appendChild(document.createComment(license));\r
+ Element root = document.createElement("project");\r
+ root.setAttribute("default", "all");\r
+ root.setAttribute("basedir", ".");\r
+ root.setAttribute("name", moduleId.getName());\r
+ \r
+ //\r
+ // element for External ANT tasks\r
+ //\r
+ root.appendChild(document.createComment("Apply external ANT tasks"));\r
+ Element ele = document.createElement("taskdef");\r
+ ele.setAttribute("resource", "GenBuild.tasks");\r
+ root.appendChild(ele);\r
+ \r
+ //\r
+ // <taskdef resource="net/sf/antcontrib/antlib.xml" />\r
+ //\r
+ ele = document.createElement("taskdef");\r
+ ele.setAttribute("resource", "net/sf/antcontrib/antlib.xml");\r
+ root.appendChild(ele);\r
+ \r
+ ele = document.createElement("property");\r
+ ele.setAttribute("environment", "env");\r
+ root.appendChild(ele);\r
+\r
+ ele = document.createElement("property");\r
+ ele.setAttribute("name", "WORKSPACE_DIR");\r
+ ele.setAttribute("value", "${env.WORKSPACE}");\r
+ root.appendChild(ele);\r
+ \r
+ ele = document.createElement("property");\r
+ ele.setAttribute("name", "MSA_FILENAME");\r
+ ele.setAttribute("value", GlobalData.getMsaFile(moduleId).getName());\r
+ root.appendChild(ele);\r
+ \r
+ ele = document.createElement("property");\r
+ ele.setAttribute("name", "BASE_NAME");\r
+ ele.setAttribute("value", moduleId.getName());\r
+ root.appendChild(ele);\r
+ \r
+ //\r
+ // Don't change it!!\r
+ //\r
+ ele = document.createElement("import");\r
+ ele.setAttribute("file", "${WORKSPACE_DIR}/Tools/Conf/BuildMacro.xml");\r
+ root.appendChild(ele);\r
+ \r
+ //\r
+ // <target name="all">\r
+ // <GenBuild msaFile="HelloWorld.msa"/>\r
+ // </target>\r
+ //\r
+ Element targetEle = document.createElement("target");\r
+ targetEle.setAttribute("name", "all");\r
+ \r
+ ele = document.createElement("GenBuild");\r
+ ele.setAttribute("msaFile", "${MSA_FILENAME}");\r
+ targetEle.appendChild(ele);\r
+ \r
+ root.appendChild(targetEle);\r
+ \r
+ //\r
+ // <target name="clean">\r
+ // <OutputDirSetup msaFile="HelloWorld.msa"/>\r
+ // <if>\r
+ // <available file="${DEST_DIR_OUTPUT}/HelloWorld_build.xml"/>\r
+ // <then>\r
+ // <ant antfile="${DEST_DIR_OUTPUT}/HelloWorld_build.xml" target="clean"/>\r
+ // </then>\r
+ // </if>\r
+ // <delete dir="${DEST_DIR_OUTPUT}" excludes="*.xml"/>\r
+ // </target>\r
+ //\r
+ targetEle = document.createElement("target");\r
+ targetEle.setAttribute("name", "clean");\r
+ \r
+ ele = document.createElement("OutputDirSetup");\r
+ ele.setAttribute("msaFile", "${MSA_FILENAME}");\r
+ targetEle.appendChild(ele);\r
+ \r
+ ele = document.createElement("if");\r
+ \r
+ Element availableEle = document.createElement("available");\r
+ availableEle.setAttribute("file", "${DEST_DIR_OUTPUT}/${BASE_NAME}_build.xml");\r
+ ele.appendChild(availableEle);\r
+ \r
+ Element thenEle = document.createElement("then");\r
+ Element antEle = document.createElement("ant");\r
+ antEle.setAttribute("antfile", "${DEST_DIR_OUTPUT}/${BASE_NAME}_build.xml");\r
+ antEle.setAttribute("target", "clean");\r
+ thenEle.appendChild(antEle);\r
+ ele.appendChild(thenEle);\r
+ targetEle.appendChild(ele);\r
+ \r
+ ele = document.createElement("delete");\r
+ ele.setAttribute("dir", "${DEST_DIR_OUTPUT}");\r
+ ele.setAttribute("excludes", "*.xml");\r
+ targetEle.appendChild(ele);\r
+ \r
+ root.appendChild(targetEle);\r
+ \r
+ //\r
+ // <target name="cleanall">\r
+ // <OutputDirSetup msaFile="HelloWorld.msa"/>\r
+ // <if>\r
+ // <available file="${DEST_DIR_OUTPUT}/HelloWorld_build.xml"/>\r
+ // <then>\r
+ // <ant antfile="${DEST_DIR_OUTPUT}/HelloWorld_build.xml" target="cleanall"/>\r
+ // </then>\r
+ // </if>\r
+ // <delete dir="${DEST_DIR_OUTPUT}"/>\r
+ // <delete dir="${DEST_DIR_DEBUG}"/>\r
+ // <delete>\r
+ // <fileset dir="${BIN_DIR}" includes="**HelloWorld*"/>\r
+ // </delete>\r
+ // </target>\r
+ //\r
+ targetEle = document.createElement("target");\r
+ targetEle.setAttribute("name", "cleanall");\r
+ \r
+ ele = document.createElement("OutputDirSetup");\r
+ ele.setAttribute("msaFile", "${MSA_FILENAME}");\r
+ targetEle.appendChild(ele);\r
+ \r
+ ele = document.createElement("if");\r
+ \r
+ availableEle = document.createElement("available");\r
+ availableEle.setAttribute("file", "${DEST_DIR_OUTPUT}/${BASE_NAME}_build.xml");\r
+ ele.appendChild(availableEle);\r
+ \r
+ thenEle = document.createElement("then");\r
+ antEle = document.createElement("ant");\r
+ antEle.setAttribute("antfile", "${DEST_DIR_OUTPUT}/${BASE_NAME}_build.xml");\r
+ antEle.setAttribute("target", "cleanall");\r
+ thenEle.appendChild(antEle);\r
+ ele.appendChild(thenEle);\r
+ targetEle.appendChild(ele);\r
+ \r
+ ele = document.createElement("delete");\r
+ ele.setAttribute("dir", "${DEST_DIR_OUTPUT}");\r
+ targetEle.appendChild(ele);\r
+ \r
+ ele = document.createElement("delete");\r
+ ele.setAttribute("dir", "${DEST_DIR_DEBUG}");\r
+ targetEle.appendChild(ele);\r
+ \r
+ ele = document.createElement("delete");\r
+ \r
+ Element filesetEle = document.createElement("fileset");\r
+ filesetEle.setAttribute("dir", "${BIN_DIR}");\r
+ filesetEle.setAttribute("includes", "**${BASE_NAME}*");\r
+ ele.appendChild(filesetEle);\r
+ \r
+ targetEle.appendChild(ele);\r
+ \r
+ root.appendChild(targetEle);\r
+\r
+ \r
+ document.appendChild(root);\r
+ \r
+ //\r
+ // Prepare the DOM document for writing\r
+ //\r
+ Source source = new DOMSource(document);\r
+ \r
+ //\r
+ // Prepare the output file\r
+ //\r
+ String filename = GlobalData.getMsaFile(moduleId).getParent() + File.separatorChar + "build.xml";\r
+ File file = new File(getProject().replaceProperties(filename));\r
+ \r
+ GlobalData.log.info("File generating - " + filename);\r
+ //\r
+ // generate all directory path\r
+ //\r
+ Result result = new StreamResult(file);\r
+ \r
+ //\r
+ // Write the DOM document to the file\r
+ //\r
+ Transformer xformer = TransformerFactory.newInstance()\r
+ .newTransformer();\r
+ xformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");\r
+ xformer.setOutputProperty(OutputKeys.INDENT, "yes");\r
+ xformer.transform(source, result);\r
+ } catch (Exception ex) {\r
+ System.out.println("##" + ex);\r
+ }\r
+ \r
+ }\r
+ \r
+ public void addConfiguredModuleItem(ModuleItem moduleItem) {\r
+ PackageIdentification packageId = new PackageIdentification(moduleItem.getPackageName(), moduleItem.getPackageGuid(), moduleItem.getPackageVersion());\r
+ ModuleIdentification moduleId = new ModuleIdentification(moduleItem.getModuleName(), moduleItem.getModuleGuid(), moduleItem.getModuleVersion());\r
+ moduleId.setPackage(packageId);\r
+ modules.add(moduleId);\r
+ }\r
+ \r
+ public void addConfiguredPackageItem(PackageItem packageItem) {\r
+ PackageIdentification packageId = new PackageIdentification(packageItem.getPackageName(), packageItem.getPackageGuid(), packageItem.getPackageVersion());\r
+ packages.add(packageId);\r
+ }\r
+\r
+ public void setMode(String mode) {\r
+ this.mode = mode;\r
+ }\r
+}\r