+++ /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