/*
*
* Copyright 2004-2008 The Ant-Contrib project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sf.antcontrib.cpptasks.ide;
import net.sf.antcontrib.cpptasks.CCTask;
import net.sf.antcontrib.cpptasks.CUtil;
import net.sf.antcontrib.cpptasks.TargetInfo;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
/**
* Requests the creation of an IDE project file. Experimental.
*
* Implementation status: msdev5, msdev6 and cbuilderx
* generate reasonable project files for simple projects,
* xcode and msdev7 and msdev71 capture source file lists and
* a few settings.
*
* @author Curt Arnold
*/
public final class ProjectDef
extends DataType {
/**
* Name of property that must be present or definition will be ignored. May
* be null.
*/
private String ifProp;
/**
* Name of property that must be absent or definition will be ignored. May
* be null.
*/
private String unlessProp;
/**
* Project file name.
*/
private File outFile;
/**
* Project name.
*/
private String name;
/**
* Fail on error.
*/
private boolean failOnError = true;
/**
* Overwrite existing project file.
*/
private boolean overwrite = true;
/**
* Project writer.
*/
private ProjectWriter projectWriter;
/**
* Object directory.
*
*/
private File objDir;
/**
* List of dependency definitions.
*/
private List dependencies = new ArrayList();
/**
* List of comments.
*/
private List comments = new ArrayList();
/**
* Constructor.
*
*/
public ProjectDef() {
}
/**
* Set project type.
*
*
*
Supported project formats
*
* cbuilderx |
* Borland C++BuilderX |
*
*
* msvc5 |
* Microsoft Visual C++ 97 |
*
*
* msvc6 |
* Microsoft Visual C++ 6 |
*
*
* msvc7 |
* Microsoft Visual C++.NET |
*
*
* msvc71 |
* Microsoft Visual C++.NET 2003 |
*
*
* msvc8 |
* Microsoft Visual C++ 2005 |
*
*
* msvc9 |
* Microsoft Visual C++ 2008 |
*
*
* xcode |
* Apple Xcode |
*
*
*
* @param value new value
*/
public void setType(final ProjectWriterEnum value) {
projectWriter = value.getProjectWriter();
}
/**
* Sets the name for the generated project file.
*
* @param outfile
* output file name
*/
public void setOutfile(final File outfile) {
//
// if file name was empty, skip link step
//
if (outfile == null || outfile.toString().length() > 0) {
outFile = outfile;
}
}
/**
* Sets whether a failure to write the project file should cause the
* task to fail. Default is true.
*
* @param value new value
*/
public void setFailonerror(final boolean value) {
failOnError = value;
}
/**
* Sets whether an existing project file should be overwritten,
* default is true. If false and the project file exists,
* the value of failonerror will determine if the task fails.
*
* @param value new value
*/
public void setOverwrite(final boolean value) {
overwrite = value;
}
/**
* Gets whether an existing project file should be overwritten,
* default is true. If false and the project file exists,
* the value of failonerror will determine if the task fails.
*
* @return value
*/
public boolean getOverwrite() {
return overwrite;
}
/**
* Determine if this def should be used.
*
* Definition will be active if the "if" variable (if specified) is set and
* the "unless" variable (if specified) is not set and that all reference
* or extended definitions are active
*
* @return true if processor is active
*/
public boolean isActive() {
Project project = getProject();
if (!CUtil.isActive(project, ifProp, unlessProp)) {
return false;
}
return true;
}
/**
* Class name for a user-supplied project writer. Use the "type"
* attribute to specify built-in project writer implementations.
*
* @param className
* full class name
*
*/
public void setClassname(final String className) {
Object proc = null;
try {
Class implClass = ProjectDef.class.getClassLoader().loadClass(
className);
try {
Method getInstance = implClass.getMethod("getInstance",
new Class[0]);
proc = getInstance.invoke(null, new Object[0]);
} catch (Exception ex) {
proc = implClass.newInstance();
}
} catch (Exception ex) {
throw new BuildException(ex);
}
projectWriter = (ProjectWriter) proc;
}
/**
* Sets the property name for the 'if' condition.
*
* The configuration will be ignored unless the property is defined.
*
* The value of the property is insignificant, but values that would imply
* misinterpretation ("false", "no") will throw an exception when
* evaluated.
*
* @param propName
* name of property
*/
public void setIf(final String propName) {
ifProp = propName;
}
/**
* Set the property name for the 'unless' condition.
*
* If named property is set, the configuration will be ignored.
*
* The value of the property is insignificant, but values that would imply
* misinterpretation ("false", "no") of the behavior will throw an
* exception when evaluated.
*
* @param propName
* name of property
*/
public void setUnless(final String propName) {
unlessProp = propName;
}
/**
* Get name.
* @return String name
*/
public String getName() {
return name;
}
/**
* Set name.
* @param value String name
*/
public void setName(final String value) {
name = value;
}
/**
* Executes the task. Compiles the given files.
*
* @param task cc task
* @param sources source files (includes headers)
* @param targets compilation targets
* @param linkTarget link target
*/
public void execute(final CCTask task,
final List sources,
final Hashtable targets,
final TargetInfo linkTarget) {
try {
projectWriter.writeProject(outFile,
task,
this,
sources,
targets,
linkTarget);
} catch (BuildException ex) {
if (failOnError) {
throw ex;
} else {
task.log(ex.toString());
}
} catch (Exception ex) {
if (failOnError) {
throw new BuildException(ex);
} else {
task.log(ex.toString());
}
}
}
/**
* Gets the object files directory.
* @return directory, may be null.
*/
public File getObjdir() {
return objDir;
}
/**
* Sets the directory used for object files. If not specified,
* the object files directory from cc task will be used.
* @param oDir object file directory.
*/
public void getObjdir(final File oDir) {
this.objDir = oDir;
}
/**
* Add a dependency definition to the project.
* @param dependency dependency.
*/
public void addDependency(final DependencyDef dependency) {
dependencies.add(dependency);
}
public List getDependencies() {
return new ArrayList(dependencies);
}
/**
* Add comment for the generated project file.
* @param comment comment, may not be null.
*/
public void addComment(final CommentDef comment) {
comments.add(comment);
}
public List getComments() {
return new ArrayList(comments);
}
/**
* Required by documentation generator.
*/
public void execute() {
throw new org.apache.tools.ant.BuildException(
"Not an actual task, but looks like one for documentation purposes");
}
}