[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Build Model Changes
|
The UI and build work is now at the
stage of generating simple makefiles from user settings. To that end, several
additional bits of information have been added to Targets and the project
build file (.cdtbuild) to make this possible. This patch contains some
of that work and an updated test to verify that it works.
- I have added artifact name and
default extension attributes to the target schema. The artifact name is
intended to hold the name the user has selected as the final build object
(i.e. test.exe, foo.so, etc). The default extension will be used by the
toolchain provider to specify a default extension for the final build object
(i.e. .dll.a for Cygwin shared libs vs .so for Linux shared libs).
- The ITarget interface has been
updated to extract the name information. Targets will also serialize it
properly.
- The resource build information
store now remembers the top configuration for a target as selected by the
user in the UI. This is needed by the makefile generator and in persisted
in the project build file.
- The test has been updated to
reflect these changes.
Sean Evoy
Rational Software - IBM Software Group
Ottawa, Ontario, Canada
Index: build/org/eclipse/cdt/core/build/managed/ITarget.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ITarget.java,v
retrieving revision 1.8
diff -u -r1.8 ITarget.java
--- build/org/eclipse/cdt/core/build/managed/ITarget.java 29 May 2003 14:00:58 -0000 1.8
+++ build/org/eclipse/cdt/core/build/managed/ITarget.java 30 May 2003 18:26:00 -0000
@@ -19,36 +19,46 @@
public interface ITarget extends IBuildObject {
/**
- * Returns whether this target is abstract
+ * Creates a configuration for the target populated with the tools and
+ * options settings from the parent configuration. As options and tools
+ * change in the parent, unoverridden values are updated in the child
+ * config as well.
+ *
+ * @param parent
+ * @param id
* @return
*/
- public boolean isAbstract();
-
+ public IConfiguration createConfiguration(IConfiguration parent, String id);
+
/**
- * Gets the resource that this target is applied to.
+ * Creates a new configuration for the target. It is populated with
+ * the tools defined for that target and options set at their defaults.
*
+ * @param id id for this configuration.
* @return
*/
- public IResource getOwner();
-
+ public IConfiguration createConfiguration(String id);
+
/**
- * @return the <code>ITarget</code> that is the parent of the receiver.
+ * Get the name of the final build artifact.
+ *
+ * @return
*/
- public ITarget getParent();
+ public String getArtifactName();
/**
- * Returns the list of platform specific tools associated with this
- * platform.
- *
+ * Returns all of the configurations defined by this target.
* @return
*/
- public ITool[] getTools();
+ public IConfiguration[] getConfigurations();
/**
- * Returns all of the configurations defined by this target.
+ * Get the default extension that should be applied to build artifacts
+ * created by this target.
+ *
* @return
*/
- public IConfiguration[] getConfigurations();
+ public String getDefaultExtension();
/**
* Returns the configuration with the given id, or null if not found.
@@ -59,23 +69,37 @@
public IConfiguration getConfiguration(String id);
/**
- * Creates a new configuration for the target. It is populated with
- * the tools defined for that target and options set at their defaults.
+ * Gets the resource that this target is applied to.
*
- * @param id id for this configuration.
* @return
*/
- public IConfiguration createConfiguration(String id);
+ public IResource getOwner();
+
+ /**
+ * @return the <code>ITarget</code> that is the parent of the receiver.
+ */
+ public ITarget getParent();
/**
- * Creates a configuration for the target populated with the tools and
- * options settings from the parent configuration. As options and tools
- * change in the parent, unoverridden values are updated in the child
- * config as well.
+ * Returns the list of platform specific tools associated with this
+ * platform.
*
- * @param parent
- * @param id
* @return
*/
- public IConfiguration createConfiguration(IConfiguration parent, String id);
+ public ITool[] getTools();
+
+ /**
+ * Returns whether this target is abstract.
+ * @return
+ */
+ public boolean isAbstract();
+
+ /**
+ * Set the name of the artifact that will be produced when the receiver
+ * is built.
+ *
+ * @param name The name of the build artifact.
+ */
+ public void setBuildArtifact(String name);
+
}
Index: build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java,v
retrieving revision 1.7
diff -u -r1.7 ManagedBuildManager.java
--- build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java 29 May 2003 14:00:58 -0000 1.7
+++ build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java 30 May 2003 18:26:00 -0000
@@ -138,7 +138,7 @@
*
* @param resource
* @param parentTarget
- * @return
+ * @return new <code>ITarget</code> with settings based on the parent passed in the arguments
* @throws BuildException
*/
public static ITarget createTarget(IResource resource, ITarget parentTarget)
@@ -164,6 +164,21 @@
// Passed validation
return new Target(resource, parentTarget);
+ }
+
+ /**
+ * @param project
+ * @param newDefault
+ */
+ public static void setDefaultConfiguration(IProject project, IConfiguration newDefault) {
+ if (project == null || newDefault == null) {
+ return;
+ }
+ // Set the default in build information for the project
+ ResourceBuildInfo info = getBuildInfo(project);
+ if (info != null) {
+ info.setDefaultConfiguration(newDefault);
+ }
}
/**
Index: build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java,v
retrieving revision 1.2
diff -u -r1.2 ResourceBuildInfo.java
--- build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java 29 May 2003 14:00:58 -0000 1.2
+++ build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java 30 May 2003 18:26:00 -0000
@@ -14,8 +14,10 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.ListIterator;
import java.util.Map;
+import org.eclipse.cdt.core.build.managed.IConfiguration;
import org.eclipse.core.resources.IResource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -26,6 +28,8 @@
private IResource owner;
private Map targetMap;
private List targets;
+ // TODO if support multiple targets is needed this must be a map
+ private IConfiguration defaultConfiguration;
public ResourceBuildInfo() {
targetMap = new HashMap();
@@ -34,14 +38,56 @@
public ResourceBuildInfo(IResource owner, Element element) {
this();
-
+ // The id of the default configuration
+ String defaultId = null;
Node child = element.getFirstChild();
while (child != null) {
if (child.getNodeName().equals("target")) {
new Target(this, (Element)child);
+ } else if (child.getNodeName().equals("defaultConfig")) {
+ // We may not have read the config in yet, so just cache it
+ defaultId = ((Element)child).getAttribute("id");
}
child = child.getNextSibling();
}
+ // All the available configs have been read in
+ ListIterator iter = targets.listIterator();
+ while (iter.hasNext()) {
+ Target targ = (Target) iter.next();
+ IConfiguration conf = targ.getConfiguration(defaultId);
+ if (conf != null) {
+ defaultConfiguration = conf;
+ break;
+ }
+ }
+ }
+
+ public void addTarget(Target target) {
+ targetMap.put(target.getId(), target);
+ targets.add(target);
+ }
+
+ /**
+ * Get the configuration that the user has selected as the default or
+ * top configuration.
+ *
+ * @return
+ */
+ public IConfiguration getDefaultConfiguration() {
+ if (defaultConfiguration == null) {
+ // Get the first configuration defined in the first target
+ ListIterator iter = targets.listIterator();
+ while (iter.hasNext()) {
+ Target targ = (Target) iter.next();
+ IConfiguration[] configs = targ.getConfigurations();
+ if (configs.length > 0) {
+ defaultConfiguration = configs[0];
+ break;
+ }
+ }
+
+ }
+ return defaultConfiguration;
}
public IResource getOwner() {
@@ -56,16 +102,25 @@
return targets;
}
- public void addTarget(Target target) {
- targetMap.put(target.getId(), target);
- targets.add(target);
- }
-
public void serialize(Document doc, Element element) {
for (int i = 0; i < targets.size(); ++i) {
Element targetElement = doc.createElement("target");
element.appendChild(targetElement);
((Target)targets.get(i)).serialize(doc, targetElement);
}
+ String defaultId = getDefaultConfiguration().getId();
+ if (defaultId != null){
+ Element config = doc.createElement("defaultConfig");
+ element.appendChild(config);
+ config.setAttribute("id", defaultId);
+ }
}
+
+ /**
+ * @param configuration
+ */
+ public void setDefaultConfiguration(IConfiguration configuration) {
+ defaultConfiguration = configuration;
+ }
+
}
Index: build/org/eclipse/cdt/internal/core/build/managed/Target.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java,v
retrieving revision 1.8
diff -u -r1.8 Target.java
--- build/org/eclipse/cdt/internal/core/build/managed/Target.java 29 May 2003 14:00:58 -0000 1.8
+++ build/org/eclipse/cdt/internal/core/build/managed/Target.java 30 May 2003 18:26:00 -0000
@@ -37,8 +37,11 @@
private List configurations;
private Map configMap;
private boolean isAbstract = false;
+ private String artifactName;
+ private String defaultExtension;
private static final IConfiguration[] emptyConfigs = new IConfiguration[0];
+ private static final String EMPTY_STRING = new String();
public Target(IResource owner) {
this.owner = owner;
@@ -58,6 +61,8 @@
this.parent = parent;
setId(parent.getId() + ".1");
setName(parent.getName());
+ this.artifactName = parent.getArtifactName();
+ this.defaultExtension = parent.getDefaultExtension();
// Hook me up
ResourceBuildInfo buildInfo = ManagedBuildManager.getBuildInfo(owner, true);
@@ -76,9 +81,16 @@
// hook me up
ManagedBuildManager.addExtensionTarget(this);
- // name
+ // Get the target name
setName(element.getAttribute("name"));
+ // Get the name of the build artifact associated with target (usually
+ // in the plugin specification).
+ artifactName = element.getAttribute("artifactName");
+
+ // Get the default extension
+ defaultExtension = element.getAttribute("defaultExtension");
+
// parent
String parentId = element.getAttribute("parent");
if (parentId != null) {
@@ -123,6 +135,13 @@
// name
setName(element.getAttribute("name"));
+ // Get the name of the build artifact associated with target (should
+ // contain what the user entered in the UI).
+ artifactName = element.getAttribute("artifactName");
+
+ // Get the default extension
+ defaultExtension = element.getAttribute("defaultExtension");
+
// parent
String parentId = element.getAttribute("parent");
if (parentId != null)
@@ -139,8 +158,6 @@
}
child = child.getNextSibling();
}
-
-
}
/**
@@ -155,7 +172,9 @@
if (parent != null)
element.setAttribute("parent", parent.getId());
element.setAttribute("isAbstract", isAbstract ? "true" : "false");
-
+ element.setAttribute("artifactName", getArtifactName());
+ element.setAttribute("defaultExtension", getDefaultExtension());
+
if (configurations != null)
for (int i = 0; i < configurations.size(); ++i) {
Configuration config = (Configuration)configurations.get(i);
@@ -231,6 +250,24 @@
return emptyConfigs;
}
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.build.managed.ITarget#getDefaultExtension()
+ */
+ public String getDefaultExtension() {
+ return defaultExtension == null ? EMPTY_STRING : defaultExtension;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.build.managed.ITarget#getArtifactName()
+ */
+ public String getArtifactName() {
+ // Return name or an empty string
+ return artifactName == null ? EMPTY_STRING : artifactName;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.build.managed.ITarget#getConfiguration()
+ */
public IConfiguration getConfiguration(String id) {
return (IConfiguration)configMap.get(id);
}
@@ -263,6 +300,13 @@
*/
public IConfiguration createConfiguration(IConfiguration parent, String id) {
return new Configuration(this, parent, id);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.build.managed.ITarget#setBuildArtifact(java.lang.String)
+ */
+ public void setBuildArtifact(String name) {
+ artifactName = name;
}
}
Index: schema/ManagedBuildTools.exsd
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/schema/ManagedBuildTools.exsd,v
retrieving revision 1.5
diff -u -r1.5 ManagedBuildTools.exsd
--- schema/ManagedBuildTools.exsd 21 May 2003 16:29:58 -0000 1.5
+++ schema/ManagedBuildTools.exsd 30 May 2003 18:26:02 -0000
@@ -273,14 +273,14 @@
<attribute name="id" type="string" use="required">
<annotation>
<documentation>
-
+ Used by the build model to uniquely identify the target.
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string" use="required">
<annotation>
<documentation>
-
+ A human-readable target name, such as 'Linux Executable'. This will be the name the user sees displayed in the UI.
</documentation>
</annotation>
</attribute>
@@ -298,6 +298,20 @@
</documentation>
</annotation>
</attribute>
+ <attribute name="artifactName" type="string">
+ <annotation>
+ <documentation>
+ This is the name of the final build artifact associated with the target. The user will specify this is the UI, so there is no need to supply a default value.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="defaultExtension" type="string">
+ <annotation>
+ <documentation>
+ This is the extensionthat will be applied to any build artifact created by the target.
+ </documentation>
+ </annotation>
+ </attribute>
</complexType>
</element>
@@ -394,4 +408,4 @@
</documentation>
</annotation>
-</schema>
\ No newline at end of file
+</schema>
Index: src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java,v
retrieving revision 1.1
diff -u -r1.1 GeneratedMakefileBuilder.java
--- src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java 29 May 2003 14:00:58 -0000 1.1
+++ src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java 30 May 2003 18:26:02 -0000
@@ -77,8 +77,33 @@
buffer.append("LDFLAGS = " + NEWLINE);
buffer.append("RM = rm -f" + NEWLINE);
buffer.append("MAKE = make" + NEWLINE);
-
+ buffer.append("EXT = " + NEWLINE);
+ buffer.append(NEWLINE);
+ }
+
+ /**
+ * @param buffer
+ */
+ private void addSources(StringBuffer buffer) throws CoreException {
+ // Add the list of project files to be built
+ buffer.append("SRCS = \\" + NEWLINE);
+
+ //Get a list of files from the project
+ IResource[] members = getProject().members();
+ for (int index = 0; index < members.length; index++) {
+ IResource resource = members[index];
+ String ext = resource.getFileExtension();
+ if (ext != null && (ext.equalsIgnoreCase("c") ||
+ ext.equalsIgnoreCase("cpp") ||
+ ext.equalsIgnoreCase("cc") ||
+ ext.equalsIgnoreCase("cxx"))
+ ) {
+ String name = resource.getName();
+ buffer.append(name + " \\" + NEWLINE);
+ }
+ }
buffer.append(NEWLINE);
+ //TODO get this list from the build info
}
/**
@@ -239,6 +264,9 @@
// Add the macro definitions
addMacros(buffer, info);
+ // Add a list of source files
+ addSources(buffer);
+
// Add targets
addTargets(buffer);
Index: plugin.xml
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/plugin.xml,v
retrieving revision 1.12
diff -u -r1.12 plugin.xml
--- plugin.xml 29 May 2003 14:01:04 -0000 1.12
+++ plugin.xml 30 May 2003 18:26:20 -0000
@@ -94,6 +94,7 @@
</target>
<target
name="Test Root"
+ defaultExtension=".exe"
isAbstract="false"
id="test.root">
<tool
Index: build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java,v
retrieving revision 1.9
diff -u -r1.9 AllBuildTests.java
--- build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java 29 May 2003 14:01:04 -0000 1.9
+++ build/org/eclipse/cdt/core/build/managed/tests/AllBuildTests.java 30 May 2003 18:26:20 -0000
@@ -23,6 +23,7 @@
import org.eclipse.cdt.core.build.managed.ITarget;
import org.eclipse.cdt.core.build.managed.ITool;
import org.eclipse.cdt.core.build.managed.ManagedBuildManager;
+import org.eclipse.cdt.internal.core.build.managed.ResourceBuildInfo;
import org.eclipse.cdt.internal.core.build.managed.ToolReference;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
@@ -35,7 +36,7 @@
*/
public class AllBuildTests extends TestCase {
private static final boolean boolVal = true;
- private static final String newConfigName = "test.config.override";
+ private static final String testConfigName = "test.config.override";
private static final String enumVal = "Another Enum";
private static final String[] listVal = {"_DEBUG", "/usr/include", "libglade.a"};
private static final String projectName = "BuildTest";
@@ -51,14 +52,12 @@
suite.addTest(new AllBuildTests("testExtensions"));
suite.addTest(new AllBuildTests("testProject"));
suite.addTest(new AllBuildTests("testConfigurations"));
+ suite.addTest(new AllBuildTests("testTargetArtifacts"));
+ suite.addTest(new AllBuildTests("cleanup"));
return suite;
}
- public void testThatAlwaysFails() {
- assertTrue(false);
- }
-
/**
* Navigates through the build info as defined in the extensions
* defined in this plugin
@@ -106,6 +105,16 @@
assertNotNull(testSub);
}
+ /**
+ * Create a new configuration based on one defined in the plugin file.
+ * Overrides all of the configuration settings. Saves, closes, and reopens
+ * the project. Then calls a method to check the overridden options.
+ *
+ * Tests creating a new configuration.
+ * Tests setting options.
+ * Tests persisting overridden options between project sessions.
+ *
+ */
public void testConfigurations() throws CoreException, BuildException {
// Open the test project
IProject project = createProject(projectName);
@@ -119,7 +128,7 @@
IConfiguration baseConfig = definedConfigs[0];
// Create a new configuration
- IConfiguration newConfig = rootTarget.createConfiguration(baseConfig, newConfigName);
+ IConfiguration newConfig = rootTarget.createConfiguration(baseConfig, testConfigName);
assertEquals(3, rootTarget.getConfigurations().length);
// There is only one tool
@@ -174,10 +183,17 @@
assertFalse(target.equals(targetDef));
// Copy over the configs
+ IConfiguration defaultConfig = null;
IConfiguration[] configs = targetDef.getConfigurations();
- for (int i = 0; i < configs.length; ++i)
- target.createConfiguration(configs[i], target.getId() + "." + i);
-
+ for (int i = 0; i < configs.length; ++i) {
+ // Make the first configuration the default
+ if (i == 0) {
+ defaultConfig = target.createConfiguration(configs[i], target.getId() + "." + i);
+ } else {
+ target.createConfiguration(configs[i], target.getId() + "." + i);
+ }
+ }
+ ManagedBuildManager.setDefaultConfiguration(project, defaultConfig);
checkRootTarget(target, "x");
// Override the "String Option in Category" option value
@@ -198,29 +214,23 @@
ManagedBuildManager.removeBuildInfo(project);
project.open(null);
+ // Test that the default config was remembered
+ ResourceBuildInfo info = ManagedBuildManager.getBuildInfo(project);
+ assertEquals(defaultConfig.getId(), info.getDefaultConfiguration().getId());
+
+ // Get the targets
targets = ManagedBuildManager.getTargets(project);
assertEquals(1, targets.length);
checkRootTarget(targets[0], "z");
}
- IProject createProject(String name) throws CoreException {
- IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
- IProject project = root.getProject(name);
- if (!project.exists()) {
- project.create(null);
- } else {
- project.refreshLocal(IResource.DEPTH_INFINITE, null);
- }
-
- if (!project.isOpen()) {
- project.open(null);
- }
-
- //CCorePlugin.getDefault().convertProjectToC(project, null, CCorePlugin.PLUGIN_ID + ".make", true);
-
- return project;
- }
-
+ /**
+ * Tests that overridden options are properly read into build model.
+ * Test that option values that are not overridden remain the same.
+ *
+ * @param project The project to get build model information for.
+ * @throws BuildException
+ */
private void checkOptionReferences(IProject project) throws BuildException {
// Get the targets out of the project
ITarget[] definedTargets = ManagedBuildManager.getTargets(project);
@@ -230,7 +240,7 @@
// Now get the configs
IConfiguration[] definedConfigs = rootTarget.getConfigurations();
assertEquals(3, definedConfigs.length);
- IConfiguration newConfig = rootTarget.getConfiguration(newConfigName);
+ IConfiguration newConfig = rootTarget.getConfiguration(testConfigName);
assertNotNull(newConfig);
// Now get the tool options and make sure the values are correct
@@ -376,4 +386,89 @@
assertEquals("-e2", options[1].getEnumCommand(valueList[1]));
}
+ /**
+ * Remove all the project information associated with the project used during test.
+ */
+ public void cleanup() {
+ removeProject(projectName);
+ }
+
+ /**
+ * Create a new project named <code>name</code> or return the project in
+ * the workspace of the same name if it exists.
+ *
+ * @param name The name of the project to create or retrieve.
+ * @return
+ * @throws CoreException
+ */
+ private IProject createProject(String name) throws CoreException {
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IProject project = root.getProject(name);
+ if (!project.exists()) {
+ project.create(null);
+ } else {
+ project.refreshLocal(IResource.DEPTH_INFINITE, null);
+ }
+
+ if (!project.isOpen()) {
+ project.open(null);
+ }
+
+ //CCorePlugin.getDefault().convertProjectToC(project, null, CCorePlugin.PLUGIN_ID + ".make", true);
+
+ return project;
+ }
+
+ /**
+ * Remove the <code>IProject</code> with the name specified in the argument from the
+ * receiver's workspace.
+ *
+ * @param name
+ */
+ private void removeProject(String name) {
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ IProject project = root.getProject(name);
+ if (project.exists()) {
+ try {
+ project.delete(true, false, null);
+ } catch (CoreException e) {
+ assertTrue(false);
+ }
+ }
+ }
+
+ /**
+ * Test that the build artifact of a <code>ITarget</code> can be modified
+ * programmatically.
+ */
+ public void testTargetArtifacts () throws CoreException {
+ // Open the test project
+ IProject project = createProject(projectName);
+
+ // Make sure there is one and only one target
+ ITarget[] definedTargets = ManagedBuildManager.getTargets(project);
+ assertEquals(1, definedTargets.length);
+ ITarget rootTarget = definedTargets[0];
+
+ // Set the build artifact of the target
+ String ext = rootTarget.getDefaultExtension();
+ String name = project.getName() + "." + ext;
+ rootTarget.setBuildArtifact(name);
+
+ // Save, close, reopen and test again
+ ManagedBuildManager.saveBuildInfo(project);
+ project.close(null);
+ ManagedBuildManager.removeBuildInfo(project);
+ project.open(null);
+
+ // Make sure there is one and only one target
+ definedTargets = ManagedBuildManager.getTargets(project);
+ assertEquals(1, definedTargets.length);
+ rootTarget = definedTargets[0];
+ assertEquals(name, rootTarget.getArtifactName());
+ }
+
+ public void testThatAlwaysFails() {
+ assertTrue(false);
+ }
}