git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@696 6f19259b-4bc3-4df7-8a09-765794883524

This commit is contained in:
wuyizhong 2006-06-30 20:10:58 +00:00
parent 85c483cb18
commit 6ec40aef55
3 changed files with 461 additions and 0 deletions

View File

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

View File

@ -0,0 +1,88 @@
/** @file
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
package org.tianocore.build.tools;
import org.apache.tools.ant.BuildException;
public class ModuleItem {
private String moduleName;
private String moduleGuid;
private String moduleVersion;
private String packageName;
private String packageGuid;
private String packageVersion;
public ModuleItem(){
}
public void execute() throws BuildException {
}
public String getModuleGuid() {
return moduleGuid;
}
public void setModuleGuid(String moduleGuid) {
this.moduleGuid = moduleGuid;
}
public String getModuleName() {
return moduleName;
}
public void setModuleName(String moduleName) {
this.moduleName = moduleName;
}
public String getModuleVersion() {
return moduleVersion;
}
public void setModuleVersion(String moduleVersion) {
this.moduleVersion = moduleVersion;
}
public String getPackageGuid() {
return packageGuid;
}
public void setPackageGuid(String packageGuid) {
this.packageGuid = packageGuid;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getPackageVersion() {
return packageVersion;
}
public void setPackageVersion(String packageVersion) {
this.packageVersion = packageVersion;
}
}

View File

@ -0,0 +1,60 @@
/** @file
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
package org.tianocore.build.tools;
import org.apache.tools.ant.BuildException;
import org.tianocore.build.global.SurfaceAreaQuery;
public class PackageItem {
private String packageName;
private String packageGuid;
private String packageVersion;
public PackageItem(){
}
public void execute() throws BuildException {
}
public String toString(){
return "[" + packageName + packageGuid + "]";
}
public String getPackageGuid() {
return packageGuid;
}
public void setPackageGuid(String packageGuid) {
this.packageGuid = packageGuid;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getPackageVersion() {
return packageVersion;
}
public void setPackageVersion(String packageVersion) {
this.packageVersion = packageVersion;
}
}