Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Camelon2003-07-04 18:36:47 +0000
committerJohn Camelon2003-07-04 18:36:47 +0000
commit8b844d54f156b1a762e4719145cd624225a82839 (patch)
tree404326aee3385f2e385658368fb1709b9c550b36 /core/org.eclipse.cdt.core
parent2e6093590f9042739ece8f185717dc2fdfe0f67a (diff)
downloadorg.eclipse.cdt-8b844d54f156b1a762e4719145cd624225a82839.tar.gz
org.eclipse.cdt-8b844d54f156b1a762e4719145cd624225a82839.tar.xz
org.eclipse.cdt-8b844d54f156b1a762e4719145cd624225a82839.zip
Patch for Sean Evoy.
The change logs contain an overview of what has been done to implement a new interface between a build model (any build model) and clients of the model that need to extract include search paths and defined symbols. For the most part, I have tried to leave the old build system as unchanged as possible. For example, project properties like the make search path, and whether or not to continue on build failures are still stored as persistent properties on the project through the CNature (ugh). The new information I have added is managed by a new build manager on a per-project basis and is associated with a project as a session property. The information is persisted in the 'cdtbuild' file introduced by the new managed build system.
Diffstat (limited to 'core/org.eclipse.cdt.core')
-rw-r--r--core/org.eclipse.cdt.core/ChangeLog54
-rw-r--r--core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IManagedBuildInfo.java (renamed from core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IResourceBuildInfo.java)2
-rw-r--r--core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java172
-rw-r--r--core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/standard/StandardBuildManager.java308
-rw-r--r--core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ManagedBuildInfo.java (renamed from core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java)42
-rw-r--r--core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java6
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfo.java (renamed from core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IManagedBuildPathInfo.java)19
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfoChangeListener.java26
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfoProvider.java44
-rw-r--r--core/org.eclipse.cdt.core/plugin.xml14
-rw-r--r--core/org.eclipse.cdt.core/schema/ManagedBuildTools.exsd2
-rw-r--r--core/org.eclipse.cdt.core/schema/ScannerInfoProvider.exsd121
-rw-r--r--core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/BuildInfoFactory.java139
-rw-r--r--core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CProjectNature.java60
-rw-r--r--core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IStandardBuildInfo.java (renamed from core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IBuildInfo.java)26
-rw-r--r--core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java16
16 files changed, 914 insertions, 137 deletions
diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog
index 3e7152c0572..cda4b11f18e 100644
--- a/core/org.eclipse.cdt.core/ChangeLog
+++ b/core/org.eclipse.cdt.core/ChangeLog
@@ -19,6 +19,60 @@
* src/org/eclipse/cdt/internal/core/model/CModelManager.java
+2003-07-03 Sean Evoy
+ New schema and extension point for registering an interface
+ between the build system (managed and standard) and the scanner
+ clients that need it (like the indexer).
+ * plugin.xml
+ * schema/ScannerInfoProvider.exsd
+
+ Added some documentation to the schema for managed build information
+ * schema/ManagedBuildTools.exsd
+
+ Added three new interfaces for getting build information for the scanner.
+ IScannerInfo contains the actual information the scanner needs and is passed
+ to the scanner by the build model. IScannerInfoChangeListener is the interface
+ that must be implemented by the scanner client that uses the IScannerInfo.
+ IScannerInfoProvider is the interface implemented by the build model. It is
+ registered through an extension point so clients can discover providers at
+ run time. IScannerInfoListener implementors subscribe and unsubscribe with the
+ provider and the provider passes them the IScannerInfo when it changes.
+ * parser/org/eclipse/cdt/core/parser/IScannerInfo.java
+ * parser/org/eclipse/cdt/core/parser/IScannerInfoChangeListener.java
+ * parser/org/eclipse/cdt/core/parser/IScannerInfoProvider.java
+
+ Changed the name of some of the managed build system elements.
+ * build/org/eclipse/cdt/core/build/managed/IManagedBuildInfo.java
+
+ This resulted in superficial changes to the Target and ManagedBuildManager
+ * build/org/eclipse/cdt/internal/core/build/managed/Target.java
+
+ Implemented the new scanner interfaces in the managed system
+ * build/org/eclipse/cdt/internal/core/build/managed/ManagedBuildInfo.java
+ * build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java
+
+ Added a new manager for the standard make system that implements the new
+ scanner interfaces. This manager uses the .cdtbuild file to persist
+ include path and symbol information (in otherwords, real build information).
+ Like the managed build manager, it also gives clients access to the build
+ information associated with a project. It does not effect the older preferences
+ which are still managed by the CNature.
+ * build/org/eclipse/cdt/core/build/standard/StandardBuildManager.java
+
+ Removed the responsibiolity for includes paths and symbols from CNature
+ added in last patch.
+ * src/org/eclipse/cdt/core/CProjectNature.java
+
+ Added code for persisting the standard build information for includes paths and
+ symbols in a file, and implemented the IScannerInfo interface in the BuildInfoFactory.
+ Did not rename it, although ...
+ * src/org/eclipse/cdt/core/BuildInfoFactory.java
+
+ I did rename the interface it implements since it was the only reference
+ * src/org/eclipse/cdt/core/resources/IStandardBuildInfo.java
+
+
+
2003-06-26 Sean Evoy
Added methods to add and extract include paths and preprocessor
symbols from standard make C and C++ projects.
diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IResourceBuildInfo.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IManagedBuildInfo.java
index c42170e900d..7684d41f982 100644
--- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IResourceBuildInfo.java
+++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IManagedBuildInfo.java
@@ -13,7 +13,7 @@ import java.util.List;
* IBM Rational Software - Initial API and implementation
***********************************************************************/
-public interface IResourceBuildInfo {
+public interface IManagedBuildInfo {
/**
* Add a new target to the build information for the receiver
diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java
index 8d261f0d547..fe6443a2593 100644
--- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java
+++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/ManagedBuildManager.java
@@ -17,6 +17,7 @@ import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.ListIterator;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
@@ -28,7 +29,8 @@ import org.apache.xml.serialize.OutputFormat;
import org.apache.xml.serialize.Serializer;
import org.apache.xml.serialize.SerializerFactory;
import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.internal.core.build.managed.ResourceBuildInfo;
+import org.eclipse.cdt.core.parser.*;
+import org.eclipse.cdt.internal.core.build.managed.ManagedBuildInfo;
import org.eclipse.cdt.internal.core.build.managed.Target;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
@@ -46,11 +48,12 @@ import org.w3c.dom.Node;
* This is the main entry point for getting at the build information
* for the managed build system.
*/
-public class ManagedBuildManager {
+public class ManagedBuildManager implements IScannerInfoProvider {
private static final QualifiedName buildInfoProperty
- = new QualifiedName(CCorePlugin.PLUGIN_ID, "buildInfo");
-
+ = new QualifiedName(CCorePlugin.PLUGIN_ID, "managedBuildInfo");
+ private static final String ROOT_ELEM_NAME = "ManagedProjectBuildInfo";
+ private static final String FILE_NAME = ".cdtbuild";
private static final ITarget[] emptyTargets = new ITarget[0];
// Targets defined by extensions (i.e., not associated with a resource)
@@ -58,6 +61,9 @@ public class ManagedBuildManager {
private static List extensionTargets;
private static Map extensionTargetMap;
+ // Listeners interested in build model changes
+ private static Map buildModelListeners;
+
/**
* Returns the list of targets that are defined by this project,
* projects referenced by this project, and by the extensions.
@@ -108,7 +114,7 @@ public class ManagedBuildManager {
* @return
*/
public static ITarget[] getTargets(IResource resource) {
- IResourceBuildInfo buildInfo = getBuildInfo(resource);
+ IManagedBuildInfo buildInfo = getBuildInfo(resource);
if (buildInfo != null) {
List targets = buildInfo.getTargets();
@@ -131,7 +137,7 @@ public class ManagedBuildManager {
ITarget target = null;
// Check if the target is spec'd in the build info for the resource
if (resource != null) {
- IResourceBuildInfo buildInfo = getBuildInfo(resource);
+ IManagedBuildInfo buildInfo = getBuildInfo(resource);
if (buildInfo != null)
target = buildInfo.getTarget(id);
}
@@ -187,13 +193,35 @@ public class ManagedBuildManager {
return;
}
// Set the default in build information for the project
- IResourceBuildInfo info = getBuildInfo(project);
+ IManagedBuildInfo info = getBuildInfo(project);
if (info != null) {
info.setDefaultConfiguration(newDefault);
}
}
/**
+ * @param config
+ * @param option
+ */
+ private static void setDirty(IConfiguration config, IOption option) {
+ // Don't bother unless this is something that effect the
+ if (!(option.getValueType() == IOption.INCLUDE_PATH
+ || option.getValueType() == IOption.PREPROCESSOR_SYMBOLS)) {
+ return;
+ }
+ // Figure out if there is a listener for this change
+ IResource resource = config.getOwner();
+ List listeners = (List) getBuildModelListeners().get(resource);
+ if (listeners == null) {
+ return;
+ }
+ ListIterator iter = listeners.listIterator();
+ while (iter.hasNext()) {
+ ((IScannerInfoChangeListener)iter.next()).changeNotification(resource, getScannerInfo(resource));
+ }
+ }
+
+ /**
* Set the string value for an option for a given config.
*
* @param config The configuration the option belongs to.
@@ -203,6 +231,7 @@ public class ManagedBuildManager {
public static void setOption(IConfiguration config, IOption option, boolean value) {
try {
config.setOption(option, value);
+ setDirty(config, option);
} catch (BuildException e) {
return;
}
@@ -218,6 +247,7 @@ public class ManagedBuildManager {
public static void setOption(IConfiguration config, IOption option, String value) {
try {
config.setOption(option, value);
+ setDirty(config, option);
} catch (BuildException e) {
return;
}
@@ -233,6 +263,7 @@ public class ManagedBuildManager {
public static void setOption(IConfiguration config, IOption option, String[] value) {
try {
config.setOption(option, value);
+ setDirty(config, option);
} catch (BuildException e) {
return;
}
@@ -247,11 +278,11 @@ public class ManagedBuildManager {
public static void saveBuildInfo(IProject project) {
// Create document
Document doc = new DocumentImpl();
- Element rootElement = doc.createElement("buildInfo");
+ Element rootElement = doc.createElement(ROOT_ELEM_NAME);
doc.appendChild(rootElement);
// Save the build info
- ResourceBuildInfo buildInfo = (ResourceBuildInfo) getBuildInfo(project);
+ ManagedBuildInfo buildInfo = (ManagedBuildInfo) getBuildInfo(project);
if (buildInfo != null)
buildInfo.serialize(doc, rootElement);
@@ -266,7 +297,7 @@ public class ManagedBuildManager {
= SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(new OutputStreamWriter(s, "UTF8"), format);
serializer.asDOMSerializer().serialize(doc);
xml = s.toString("UTF8"); //$NON-NLS-1$
- IFile rscFile = project.getFile(".cdtbuild");
+ IFile rscFile = project.getFile(FILE_NAME);
InputStream inputStream = new ByteArrayInputStream(xml.getBytes());
// update the resource content
if (rscFile.exists()) {
@@ -316,9 +347,9 @@ public class ManagedBuildManager {
}
}
- private static ResourceBuildInfo loadBuildInfo(IProject project) {
- ResourceBuildInfo buildInfo = null;
- IFile file = project.getFile(".cdtbuild");
+ private static ManagedBuildInfo loadBuildInfo(IProject project) {
+ ManagedBuildInfo buildInfo = null;
+ IFile file = project.getFile(FILE_NAME);
if (!file.exists())
return null;
@@ -327,8 +358,8 @@ public class ManagedBuildManager {
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(stream);
Node rootElement = document.getFirstChild();
- if (rootElement.getNodeName().equals("buildInfo")) {
- buildInfo = new ResourceBuildInfo(project, (Element)rootElement);
+ if (rootElement.getNodeName().equals(ROOT_ELEM_NAME)) {
+ buildInfo = new ManagedBuildInfo(project, (Element)rootElement);
project.setSessionProperty(buildInfoProperty, buildInfo);
}
} catch (Exception e) {
@@ -338,13 +369,14 @@ public class ManagedBuildManager {
return buildInfo;
}
- private static ResourceBuildInfo findBuildInfo(IResource resource, boolean create) {
+ private static ManagedBuildInfo findBuildInfo(IResource resource, boolean create) {
// Make sure the extension information is loaded first
loadExtensions();
- ResourceBuildInfo buildInfo = null;
+ ManagedBuildInfo buildInfo = null;
try {
- buildInfo = (ResourceBuildInfo)resource.getSessionProperty(buildInfoProperty);
+ buildInfo = (ManagedBuildInfo)resource.getSessionProperty(buildInfoProperty);
} catch (CoreException e) {
+ return buildInfo;
}
if (buildInfo == null && resource instanceof IProject) {
@@ -353,7 +385,7 @@ public class ManagedBuildManager {
if (buildInfo == null && create) {
try {
- buildInfo = new ResourceBuildInfo();
+ buildInfo = new ManagedBuildInfo();
resource.setSessionProperty(buildInfoProperty, buildInfo);
} catch (CoreException e) {
buildInfo = null;
@@ -363,12 +395,22 @@ public class ManagedBuildManager {
return buildInfo;
}
- public static IResourceBuildInfo getBuildInfo(IResource resource, boolean create) {
- return (IResourceBuildInfo) findBuildInfo(resource, create);
+ public static IManagedBuildInfo getBuildInfo(IResource resource, boolean create) {
+ return (IManagedBuildInfo) findBuildInfo(resource, create);
}
- public static IResourceBuildInfo getBuildInfo(IResource resource) {
- return (IResourceBuildInfo) findBuildInfo(resource, false);
+ public static IManagedBuildInfo getBuildInfo(IResource resource) {
+ return (IManagedBuildInfo) findBuildInfo(resource, false);
+ }
+
+ /*
+ * @return
+ */
+ private static Map getBuildModelListeners() {
+ if (buildModelListeners == null) {
+ buildModelListeners = new HashMap();
+ }
+ return buildModelListeners;
}
/**
@@ -378,8 +420,88 @@ public class ManagedBuildManager {
* @param resource
* @return
*/
- public static IManagedBuildPathInfo getBuildPathInfo(IResource resource) {
- return (IManagedBuildPathInfo) getBuildInfo(resource, false);
+ private static IScannerInfo getScannerInfo(IResource resource) {
+ return (IScannerInfo) getBuildInfo(resource, false);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#subscribe(org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
+ */
+ public synchronized void subscribe(IResource resource, IScannerInfoChangeListener listener) {
+ IResource project = null;
+ if (resource instanceof IProject) {
+ project = resource;
+ } else if (resource instanceof IFile) {
+ project = ((IFile)resource).getProject();
+ } else {
+ return;
+ }
+ // Get listeners for this resource
+ Map map = getBuildModelListeners();
+ List list = (List) map.get(project);
+ if (list == null) {
+ // Create a new list
+ list = new ArrayList();
+ }
+ if (!list.contains(listener)) {
+ // Add the new listener for the resource
+ list.add(listener);
+ map.put(project, list);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#managesResource(org.eclipse.core.resources.IResource)
+ */
+ public boolean managesResource(IResource resource) {
+ // The managed build manager manages build information for the
+ // resource IFF it it is a project and has a build file with the proper
+ // root element
+ IProject project = null;
+ if (resource instanceof IProject){
+ project = (IProject)resource;
+ } else if (resource instanceof IFile) {
+ project = ((IFile)resource).getProject();
+ } else {
+ return false;
+ }
+ IFile file = project.getFile(FILE_NAME);
+ if (file.exists()) {
+ try {
+ InputStream stream = file.getContents();
+ DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ Document document = parser.parse(stream);
+ Node rootElement = document.getFirstChild();
+ if (rootElement.getNodeName().equals(ROOT_ELEM_NAME)) {
+ return true;
+ }
+ } catch (Exception e) {
+ return false;
+ }
+ }
+ return false;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#unsubscribe(org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
+ */
+ public synchronized void unsubscribe(IResource resource, IScannerInfoChangeListener listener) {
+ IResource project = null;
+ if (resource instanceof IProject) {
+ project = resource;
+ } else if (resource instanceof IFile) {
+ project = ((IFile)resource).getProject();
+ } else {
+ return;
+ }
+ // Remove the listener
+ Map map = getBuildModelListeners();
+ List list = (List) map.get(project);
+ if (list != null && !list.isEmpty()) {
+ // The list is not empty so try to remove listener
+ list.remove(listener);
+ map.put(project, list);
+ }
}
}
diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/standard/StandardBuildManager.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/standard/StandardBuildManager.java
new file mode 100644
index 00000000000..263e307cbdc
--- /dev/null
+++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/standard/StandardBuildManager.java
@@ -0,0 +1,308 @@
+package org.eclipse.cdt.core.build.standard;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStreamWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.xerces.dom.DocumentImpl;
+import org.apache.xml.serialize.Method;
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.Serializer;
+import org.apache.xml.serialize.SerializerFactory;
+import org.eclipse.cdt.core.BuildInfoFactory;
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.parser.IScannerInfo;
+import org.eclipse.cdt.core.parser.IScannerInfoChangeListener;
+import org.eclipse.cdt.core.parser.IScannerInfoProvider;
+import org.eclipse.cdt.core.resources.IStandardBuildInfo;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.QualifiedName;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+/**********************************************************************
+ * Copyright (c) 2002,2003 Rational Software Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+***********************************************************************/
+
+public class StandardBuildManager implements IScannerInfoProvider {
+ // Name we will use to store build property with the project
+ private static final QualifiedName buildInfoProperty
+ = new QualifiedName(CCorePlugin.PLUGIN_ID, "standardBuildInfo");
+
+ // Listeners interested in build model changes
+ private static Map buildModelListeners;
+
+ private static final String FILE_NAME = ".cdtbuild";
+ private static final String ROOT_ELEM_NAME = "StandardProjectBuildInfo";
+
+ /**
+ * @param project
+ * @return
+ */
+ private static IStandardBuildInfo findBuildInfo(IResource resource, boolean create) {
+ IStandardBuildInfo buildInfo = null;
+ // See if there's already one associated with the resource for this session
+ try {
+ buildInfo = (IStandardBuildInfo)resource.getSessionProperty(buildInfoProperty);
+ } catch (CoreException e) {
+ return buildInfo;
+ }
+
+ // Try to load one for the project
+ if (buildInfo == null && resource instanceof IProject) {
+ buildInfo = loadBuildInfo((IProject)resource);
+ }
+
+ // There is nothing persisted for the session, or saved in a file so
+ // create a build info object
+ if (buildInfo == null && create) {
+ buildInfo = BuildInfoFactory.create((IProject)resource);
+ try {
+ ((IProject)resource).setSessionProperty(buildInfoProperty, buildInfo);
+ } catch (CoreException e) {
+ buildInfo = null;
+ }
+ }
+ return buildInfo;
+ }
+
+ public static IStandardBuildInfo getBuildInfo(IProject project) {
+ return findBuildInfo(project, false);
+ }
+
+ public static IStandardBuildInfo getBuildInfo(IProject project, boolean create) {
+ return findBuildInfo(project, create);
+ }
+
+ /*
+ * @return
+ */
+ private static synchronized Map getBuildModelListeners() {
+ if (buildModelListeners == null) {
+ buildModelListeners = new HashMap();
+ }
+ return buildModelListeners;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#managesResource(org.eclipse.core.resources.IResource)
+ */
+ public boolean managesResource(IResource resource) {
+ /*
+ * Answers true if this project has a build info associated with it
+ */
+
+ IProject project = null;
+ if (resource instanceof IProject) {
+ project = (IProject)resource;
+ } else if (resource instanceof IFile) {
+ project = ((IFile)resource).getProject();
+ } else {
+ return false;
+ }
+
+ // Look for (but do not create) the build information
+ IStandardBuildInfo info = getBuildInfo(project);
+
+ // If there's info, I manage the resource
+ return info == null ? false : true;
+ }
+
+ public static void setPreprocessorSymbols(IProject project, String[] symbols) {
+ // Get the information for the project
+ IStandardBuildInfo info = getBuildInfo(project);
+ // Set the new information
+ if (info != null) {
+ String[] oldSymbols = info.getPreprocessorSymbols();
+ if (!Arrays.equals(oldSymbols, symbols)) {
+ info.setPreprocessorSymbols(symbols);
+ // Alert the listeners
+ setScannerInfoDirty(project, info);
+ }
+ }
+ }
+
+ public static void setIncludePaths(IProject project, String[] paths) {
+ // Get the build info for the project
+ IStandardBuildInfo info = getBuildInfo(project);
+ if (info != null) {
+ String[] oldPaths = info.getIncludePaths();
+ if (!Arrays.equals(oldPaths, paths)) {
+ info.setIncludePaths(paths);
+ setScannerInfoDirty(project, info);
+ }
+ }
+ }
+
+ /**
+ * @param project
+ * @param info
+ */
+ private static void setScannerInfoDirty(IProject project, IStandardBuildInfo info) {
+ // Call in the cavalry
+ List listeners = (List) getBuildModelListeners().get(project);
+ if (listeners == null) {
+ return;
+ }
+ ListIterator iter = listeners.listIterator();
+ while (iter.hasNext()) {
+ ((IScannerInfoChangeListener)iter.next()).changeNotification(project, (IScannerInfo) info);
+ }
+
+ }
+
+ /*
+ * Loads the build file and parses the nodes for build information. The
+ * information is then associated with the resource for the duration of
+ * the session.
+ */
+ private static IStandardBuildInfo loadBuildInfo(IProject project) {
+ IStandardBuildInfo buildInfo = null;
+ IFile file = project.getFile(FILE_NAME);
+ if (!file.exists())
+ return null;
+
+ try {
+ InputStream stream = file.getContents();
+ DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+ Document document = parser.parse(stream);
+ Node rootElement = document.getFirstChild();
+ if (rootElement.getNodeName().equals(ROOT_ELEM_NAME)) {
+ buildInfo = BuildInfoFactory.create(project, (Element)rootElement);
+ project.setSessionProperty(buildInfoProperty, buildInfo);
+ }
+ } catch (Exception e) {
+ buildInfo = null;
+ }
+
+ return buildInfo;
+ }
+
+ /**
+ * The build model manager for standard builds only caches the build
+ * information for a resource on a per-session basis. This method
+ * allows clients of the build model manager to programmatically
+ * remove the association between the resource and the information
+ * while the reource is still open or in the workspace. The Eclipse core
+ * will take care of removing it if a resource is closed or deleted.
+ *
+ * @param resource
+ */
+ public static void removeBuildInfo(IResource resource) {
+ try {
+ resource.setSessionProperty(buildInfoProperty, null);
+ } catch (CoreException e) {
+ }
+ }
+
+ /**
+ * Persists build-specific information in the build file. Build
+ * information for standard make projects consists of preprocessor
+ * symbols and includes paths. Other project-related information is
+ * stored in the persistent properties of the project.
+ *
+ * @param project
+ */
+ public static void saveBuildInfo(IProject project) {
+ // Create document
+ Document doc = new DocumentImpl();
+ Element rootElement = doc.createElement(ROOT_ELEM_NAME);
+ doc.appendChild(rootElement);
+
+ // Save the build info
+ IStandardBuildInfo buildInfo = getBuildInfo(project);
+ if (buildInfo != null)
+ buildInfo.serialize(doc, rootElement);
+
+ // Save the document
+ ByteArrayOutputStream s = new ByteArrayOutputStream();
+ OutputFormat format = new OutputFormat();
+ format.setIndenting(true);
+ format.setLineSeparator(System.getProperty("line.separator")); //$NON-NLS-1$
+ String xml = null;
+ try {
+ Serializer serializer = SerializerFactory.getSerializerFactory(Method.XML).makeSerializer(new OutputStreamWriter(s, "UTF8"), format);
+ serializer.asDOMSerializer().serialize(doc);
+ xml = s.toString("UTF8"); //$NON-NLS-1$
+ IFile rscFile = project.getFile(FILE_NAME);
+ InputStream inputStream = new ByteArrayInputStream(xml.getBytes());
+ // update the resource content
+ if (rscFile.exists()) {
+ rscFile.setContents(inputStream, IResource.FORCE, null);
+ } else {
+ rscFile.create(inputStream, IResource.FORCE, null);
+ }
+ } catch (Exception e) {
+ return;
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#subscribe(org.eclipse.core.resources.IResource, org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
+ */
+ public synchronized void subscribe(IResource resource, IScannerInfoChangeListener listener) {
+ IResource project = null;
+ if (resource instanceof IProject) {
+ project = resource;
+ } else if (resource instanceof IFile) {
+ project = ((IFile)resource).getProject();
+ } else {
+ return;
+ }
+ // Get listeners for this resource
+ Map map = getBuildModelListeners();
+ List list = (List) map.get(project);
+ if (list == null) {
+ // Create a new list
+ list = new ArrayList();
+ }
+ if (!list.contains(listener)) {
+ // Add the new listener for the resource
+ list.add(listener);
+ map.put(project, list);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.parser.IScannerInfoProvider#unsubscribe(org.eclipse.core.resources.IResource, org.eclipse.cdt.core.parser.IScannerInfoChangeListener)
+ */
+ public synchronized void unsubscribe(IResource resource, IScannerInfoChangeListener listener) {
+ IResource project = null;
+ if (resource instanceof IProject) {
+ project = resource;
+ } else if (resource instanceof IFile) {
+ project = ((IFile)resource).getProject();
+ } else {
+ return;
+ }
+ // Remove the listener
+ Map map = getBuildModelListeners();
+ List list = (List) map.get(project);
+ if (list != null && !list.isEmpty()) {
+ // The list is not empty so try to remove listener
+ list.remove(listener);
+ map.put(project, list);
+ }
+ }
+}
diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ManagedBuildInfo.java
index 8cd236cbadc..04502ea575e 100644
--- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ResourceBuildInfo.java
+++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/ManagedBuildInfo.java
@@ -19,18 +19,18 @@ import java.util.ListIterator;
import java.util.Map;
import org.eclipse.cdt.core.build.managed.BuildException;
-import org.eclipse.cdt.core.build.managed.IManagedBuildPathInfo;
import org.eclipse.cdt.core.build.managed.IConfiguration;
import org.eclipse.cdt.core.build.managed.IOption;
-import org.eclipse.cdt.core.build.managed.IResourceBuildInfo;
+import org.eclipse.cdt.core.build.managed.IManagedBuildInfo;
import org.eclipse.cdt.core.build.managed.ITarget;
import org.eclipse.cdt.core.build.managed.ITool;
+import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.core.resources.IResource;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
-public class ResourceBuildInfo implements IResourceBuildInfo, IManagedBuildPathInfo {
+public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo {
private IResource owner;
private Map targetMap;
@@ -38,13 +38,13 @@ public class ResourceBuildInfo implements IResourceBuildInfo, IManagedBuildPathI
private Map defaultConfigurations;
private ITarget defaultTarget;
- public ResourceBuildInfo() {
+ public ManagedBuildInfo() {
targetMap = new HashMap();
targets = new ArrayList();
defaultConfigurations = new HashMap();
}
- public ResourceBuildInfo(IResource owner, Element element) {
+ public ManagedBuildInfo(IResource owner, Element element) {
this();
// The id of the default configuration
String defaultTargetId = null;
@@ -277,11 +277,11 @@ public class ResourceBuildInfo implements IResourceBuildInfo, IManagedBuildPathI
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.core.build.managed.IBuildParseInfo#getDefinedSymbols()
+ * @see org.eclipse.cdt.core.build.managed.IScannerInfo#getDefinedSymbols()
*/
- public String[] getDefinedSymbols() {
- // Return the include paths for the default configuration
- ArrayList paths = new ArrayList();
+ public Map getDefinedSymbols() {
+ // Return the defined symbols for the default configuration
+ HashMap symbols = new HashMap();
IConfiguration config = getDefaultConfiguration(getDefaultTarget());
ITool[] tools = config.getTools();
for (int i = 0; i < tools.length; i++) {
@@ -291,7 +291,24 @@ public class ResourceBuildInfo implements IResourceBuildInfo, IManagedBuildPathI
IOption option = opts[j];
if (option.getValueType() == IOption.PREPROCESSOR_SYMBOLS) {
try {
- paths.addAll(Arrays.asList(option.getDefinedSymbols()));
+ String[] symbolList = option.getDefinedSymbols();
+ for (int k = 0; k < symbolList.length; k++) {
+ String symbol = symbolList[k];
+ if (symbol.length() == 0){
+ continue;
+ }
+ String key = new String();
+ String value = new String();
+ int index = symbol.indexOf("=");
+ if (index != -1) {
+ key = symbol.substring(0, index).trim();
+ value = symbol.substring(index + 1).trim();
+ } else {
+ key = symbol.trim();
+ }
+ symbols.put(key, value);
+ }
+
} catch (BuildException e) {
// we should never get here
continue;
@@ -299,12 +316,11 @@ public class ResourceBuildInfo implements IResourceBuildInfo, IManagedBuildPathI
}
}
}
- paths.trimToSize();
- return (String[])paths.toArray(new String[paths.size()]);
+ return symbols;
}
/* (non-Javadoc)
- * @see org.eclipse.cdt.core.build.managed.IBuildParseInfo#getIncludePaths()
+ * @see org.eclipse.cdt.core.build.managed.IScannerInfo#getIncludePaths()
*/
public String[] getIncludePaths() {
// Return the include paths for the default configuration
diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java
index 406972b5674..b01bf3ba74d 100644
--- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java
+++ b/core/org.eclipse.cdt.core/build/org/eclipse/cdt/internal/core/build/managed/Target.java
@@ -16,7 +16,7 @@ import java.util.List;
import java.util.Map;
import org.eclipse.cdt.core.build.managed.IConfiguration;
-import org.eclipse.cdt.core.build.managed.IResourceBuildInfo;
+import org.eclipse.cdt.core.build.managed.IManagedBuildInfo;
import org.eclipse.cdt.core.build.managed.ITarget;
import org.eclipse.cdt.core.build.managed.ITool;
import org.eclipse.cdt.core.build.managed.ManagedBuildManager;
@@ -68,7 +68,7 @@ public class Target extends BuildObject implements ITarget {
this.isTest = parent.isTestTarget();
// Hook me up
- IResourceBuildInfo buildInfo = ManagedBuildManager.getBuildInfo(owner, true);
+ IManagedBuildInfo buildInfo = ManagedBuildManager.getBuildInfo(owner, true);
buildInfo.addTarget(this);
}
@@ -129,7 +129,7 @@ public class Target extends BuildObject implements ITarget {
* @param buildInfo
* @param element
*/
- public Target(ResourceBuildInfo buildInfo, Element element) {
+ public Target(ManagedBuildInfo buildInfo, Element element) {
this(buildInfo.getOwner());
// id
diff --git a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IManagedBuildPathInfo.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfo.java
index 03fbcc20f11..c0170f09d27 100644
--- a/core/org.eclipse.cdt.core/build/org/eclipse/cdt/core/build/managed/IManagedBuildPathInfo.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfo.java
@@ -1,4 +1,6 @@
-package org.eclipse.cdt.core.build.managed;
+package org.eclipse.cdt.core.parser;
+
+import java.util.Map;
/**********************************************************************
* Copyright (c) 2002,2003 Rational Software Corporation and others.
@@ -11,15 +13,20 @@ package org.eclipse.cdt.core.build.managed;
* IBM Rational Software - Initial API and implementation
***********************************************************************/
-public interface IManagedBuildPathInfo {
+public interface IScannerInfo {
/**
- * Answers a <code>String</code> array containing all the defined
- * preprocessor symbols. If there are no defined symbols, the receiver
- * will return an empty array, never <code>null</code>
+ * Answers a <code>Map</code> containing all the defined preprocessor
+ * symbols and their values as string tuples, (symbol_name, symbol_value).
+ * Symbols defined without values have an empty string for a value. For
+ * example,-Dsymbol=value would have a map entry (symbol,value). A symbol
+ * defined as -Dsymbol would have a map entry of (symbol,"").
*
+ * If there are no defined symbols, the receiver will return
+ * an empty Map, never <code>null</code>.
+ *
* @return
*/
- public String[] getDefinedSymbols();
+ public Map getDefinedSymbols();
/**
* Answers a <code>String</code> array containing all the known include
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfoChangeListener.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfoChangeListener.java
new file mode 100644
index 00000000000..161dc941e4a
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfoChangeListener.java
@@ -0,0 +1,26 @@
+package org.eclipse.cdt.core.parser;
+
+import org.eclipse.core.resources.IResource;
+
+/**********************************************************************
+ * Copyright (c) 2002,2003 Rational Software Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+***********************************************************************/
+
+public interface IScannerInfoChangeListener {
+
+ /**
+ * The listener must implement this method in order to receive the new
+ * information from the provider.
+ *
+ * @param info
+ */
+ public void changeNotification(IResource project, IScannerInfo info);
+
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfoProvider.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfoProvider.java
new file mode 100644
index 00000000000..db15f417dd2
--- /dev/null
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/IScannerInfoProvider.java
@@ -0,0 +1,44 @@
+package org.eclipse.cdt.core.parser;
+
+import org.eclipse.core.resources.IResource;
+
+/**********************************************************************
+ * Copyright (c) 2002,2003 Rational Software Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * IBM Rational Software - Initial API and implementation
+***********************************************************************/
+
+public interface IScannerInfoProvider {
+
+ /**
+ * The receiver will register the listener specified in the argument
+ * to receive change notifications when the information for the
+ * <code>IResource</code> it is responsible for changes.
+ *
+ * @param listener
+ */
+ public void subscribe(IResource resource, IScannerInfoChangeListener listener);
+
+ /**
+ * Answers <code>true</code> if the receiver has information for
+ * the resource specified in the argument, else <code>false</code>.
+ *
+ * @param resource
+ * @return
+ */
+ public boolean managesResource(IResource resource);
+
+ /**
+ * The receiver will no longer notify the listener specified in
+ * the argument when information about the reource it is responsible
+ * for changes.
+ *
+ * @param listener
+ */
+ public void unsubscribe(IResource resource, IScannerInfoChangeListener listener);
+}
diff --git a/core/org.eclipse.cdt.core/plugin.xml b/core/org.eclipse.cdt.core/plugin.xml
index 7fcd93752b1..b7f4b930ad2 100644
--- a/core/org.eclipse.cdt.core/plugin.xml
+++ b/core/org.eclipse.cdt.core/plugin.xml
@@ -33,6 +33,7 @@
<extension-point id="CBuildVariable" name="C/C++ Build Variable" schema="schema/CBuildVariable.exsd"/>
<extension-point id="CToolType" name="C/C++ Tool Type" schema="schema/CToolType.exsd"/>
<extension-point id="ManagedBuildInfo" name="Managed Build Tools" schema="schema/ManagedBuildTools.exsd"/>
+ <extension-point id="ScannerInfoProvider" name="Scanner Information Provider" schema="schema/ScannerInfoProvider.exsd"/>
<extension
point="org.eclipse.cdt.core.CToolType">
@@ -279,6 +280,19 @@
pattern="*.exe">
</ignore>
</extension>
+ <extension
+ id="org.eclipse.cdt.core.ScannerInfoProvider"
+ name="Scanner Information Provider"
+ point="org.eclipse.cdt.core.ScannerInfoProvider">
+ <provider
+ class="org.eclipse.cdt.core.build.managed.ManagedBuildManager"
+ id="org.eclipse.cdt.core.provider.managed">
+ </provider>
+ <provider
+ class="org.eclipse.cdt.core.build.standard.StandardBuildManager"
+ id="org.eclipse.cdt.core.provider.standard">
+ </provider>
+ </extension>
<extension id="task" name="%CTaskName" point="org.eclipse.core.resources.markers">
<super type="org.eclipse.core.resources.taskmarker"/>
diff --git a/core/org.eclipse.cdt.core/schema/ManagedBuildTools.exsd b/core/org.eclipse.cdt.core/schema/ManagedBuildTools.exsd
index 022f635c190..5c86003ad6b 100644
--- a/core/org.eclipse.cdt.core/schema/ManagedBuildTools.exsd
+++ b/core/org.eclipse.cdt.core/schema/ManagedBuildTools.exsd
@@ -393,7 +393,7 @@ Two additional types exist to flag options of special relevance to the build mod
<meta.section type="since"/>
</appInfo>
<documentation>
- CDT 1.1
+ 1.2
</documentation>
</annotation>
diff --git a/core/org.eclipse.cdt.core/schema/ScannerInfoProvider.exsd b/core/org.eclipse.cdt.core/schema/ScannerInfoProvider.exsd
new file mode 100644
index 00000000000..9980b0ca2f9
--- /dev/null
+++ b/core/org.eclipse.cdt.core/schema/ScannerInfoProvider.exsd
@@ -0,0 +1,121 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.cdt.core">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.cdt.core" id="ScannerInfoProvider" name="Scanner Information Provider"/>
+ </appInfo>
+ <documentation>
+ This extension point provides a mechanism for the clients of the scanner to discover providers of information the scanner requires to function properly. This information is usually provided by a build system.
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <complexType>
+ <sequence>
+ <element ref="provider" minOccurs="1" maxOccurs="unbounded"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="provider">
+ <complexType>
+ <attribute name="id" type="string" use="required">
+ <annotation>
+ <documentation>
+ A unique name that will be used to reference this parser.
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="class" type="string">
+ <annotation>
+ <documentation>
+ A fully qualified name of the Java class that implements &lt;samp&gt;org.eclipse.cdt.core.parser.IScannerProviderInfo&lt;/samp&gt; interface
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="java" basedOn="org.eclipse.cdt.core.parser.IScannerProviderInfo"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 1.2
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiInfo"/>
+ </appInfo>
+ <documentation>
+ The following is an example of the extension point usage:
+&lt;p&gt;
+&lt;pre&gt;
+&lt;extension
+ id=&quot;org.eclipse.cdt.core.ScannerInfoProvider&quot;
+ name=&quot;Scanner Information Provider&quot;
+ point=&quot;org.eclipse.cdt.core.ScannerInfoProvider&quot;&gt;
+ &lt;provider
+ id=&quot;org.eclipse.cdt.core.provider.managed&quot;
+ class=&quot;org.eclipse.cdt.core.build.managed.ManagedBuildManager&quot;&gt;
+ &lt;/provider&gt;
+&lt;/extension&gt;
+&lt;/pre&gt;
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="copyright"/>
+ </appInfo>
+ <documentation>
+
+ </documentation>
+ </annotation>
+
+</schema>
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/BuildInfoFactory.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/BuildInfoFactory.java
index 90ab6163217..76310bd998f 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/BuildInfoFactory.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/BuildInfoFactory.java
@@ -6,6 +6,15 @@ package org.eclipse.cdt.core;
*/
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+
+import org.eclipse.cdt.core.parser.IScannerInfo;
+import org.eclipse.cdt.core.resources.IStandardBuildInfo;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
@@ -15,8 +24,9 @@ import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Preferences;
import org.eclipse.core.runtime.QualifiedName;
-
-import org.eclipse.cdt.core.resources.IBuildInfo;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
public class BuildInfoFactory {
public static final String LOCATION = "buildLocation";
@@ -25,10 +35,17 @@ public class BuildInfoFactory {
public static final String STOP_ON_ERROR = "stopOnError";
// public static final String CLEAR_CONSOLE = "clearConsole";
public static final String DEFAULT_BUILD_CMD = "useDefaultBuildCmd";
- public static final String INCLUDE_PATHS = "includePaths";
- public static final String DEFINED_SYMBOLS = "definedSymbols";
+ public static final String PROJECT_NAME = "projectName";
+ public static final String INCLUDE_PATH = "includePath";
+ public static final String PATH = "path";
+ public static final String DEFINED_SYMBOL = "definedSymbol";
+ public static final String SYMBOL = "symbol";
- public static abstract class Store implements IBuildInfo {
+ public static abstract class Store implements IStandardBuildInfo, IScannerInfo {
+ // List of include paths
+ protected List pathList;
+ protected List symbolList;
+
public String getBuildLocation() {
if ( isDefaultBuildCmd() ) {
Plugin plugin = CCorePlugin.getDefault();
@@ -51,16 +68,41 @@ public class BuildInfoFactory {
return getString(LOCATION);
}
- public String getDefinedSymbols() {
- return getString(DEFINED_SYMBOLS);
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.build.managed.IScannerInfo#getIncludePaths()
+ */
+ public Map getDefinedSymbols() {
+ // Return the defined symbols for the default configuration
+ HashMap symbols = new HashMap();
+ String[] symbolList = getPreprocessorSymbols();
+ for (int i = 0; i < symbolList.length; ++i) {
+ String symbol = symbolList[i];
+ if (symbol.length() == 0) {
+ continue;
+ }
+ String key = new String();
+ String value = new String();
+ int index = symbol.indexOf("=");
+ if (index != -1) {
+ key = symbol.substring(0, index).trim();
+ value = symbol.substring(index + 1).trim();
+ } else {
+ key = symbol.trim();
+ }
+ symbols.put(key, value);
+ }
+ return symbols;
}
public String getFullBuildArguments() {
return getString(FULL_ARGUMENTS);
}
- public String getIncludePaths() {
- return getString(INCLUDE_PATHS);
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.build.managed.IScannerInfo#getIncludePaths()
+ */
+ public String[] getIncludePaths() {
+ return (String[]) getPathList().toArray(new String[getPathList().size()]);
}
public String getIncrementalBuildArguments() {
@@ -75,16 +117,20 @@ public class BuildInfoFactory {
putValue(LOCATION, location);
}
- public void setDefinedSymbols(String argument) {
- putValue(DEFINED_SYMBOLS, argument);
+ public void setPreprocessorSymbols(String[] symbols) {
+ // Clear out any existing symbols and add the new stuff
+ getSymbolList().clear();
+ getSymbolList().addAll(Arrays.asList(symbols));
}
public void setFullBuildArguments(String arguments) {
putValue(FULL_ARGUMENTS, arguments);
}
- public void setIncludePaths(String arguments) {
- putValue(INCLUDE_PATHS, arguments);
+ public void setIncludePaths(String[] paths) {
+ // Clear the existing list and add the paths
+ getPathList().clear();
+ getPathList().addAll(Arrays.asList(paths));
}
public void setIncrementalBuildArguments(String arguments) {
@@ -117,10 +163,48 @@ public class BuildInfoFactory {
public void putValue(String name, String value) {
}
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.resources.IBuildInfo#serialize(org.w3c.dom.Document, org.w3c.dom.Element)
+ */
+ public void serialize(Document doc, Element rootElement) {
+ // Serialize the include paths
+ ListIterator iter = getPathList().listIterator();
+ while (iter.hasNext()){
+ Element pathElement = doc.createElement(INCLUDE_PATH);
+ pathElement.setAttribute(PATH, (String)iter.next());
+ rootElement.appendChild(pathElement);
+ }
+ // Now do the same for the symbols
+ iter = getSymbolList().listIterator();
+ while (iter.hasNext()) {
+ Element symbolElement = doc.createElement(DEFINED_SYMBOL);
+ symbolElement.setAttribute(SYMBOL, (String)iter.next());
+ rootElement.appendChild(symbolElement);
+ }
+ }
+
+ protected List getPathList() {
+ if (pathList == null) {
+ pathList = new ArrayList();
+ }
+ return pathList;
+ }
+
public String getString(String property) {
return null;
}
+ public String[] getPreprocessorSymbols() {
+ return (String[]) getSymbolList().toArray(new String[getSymbolList().size()]);
+ }
+
+ protected List getSymbolList() {
+ if (symbolList == null) {
+ symbolList = new ArrayList();
+ }
+ return symbolList;
+ }
+
}
public static class Preference extends Store {
@@ -169,18 +253,41 @@ public class BuildInfoFactory {
public void setDefault(String name, String def) {
}
-
+
+
// public boolean isClearBuildConsole() {
// return (new Preference()).isClearBuildConsole();
// }
}
- public static IBuildInfo create() {
+ public static IStandardBuildInfo create() {
return new BuildInfoFactory.Preference();
}
- public static IBuildInfo create(IProject project) {
+ public static IStandardBuildInfo create(IProject project) {
return new BuildInfoFactory.Property(project);
}
+
+ /**
+ * @param project
+ * @param element
+ * @return
+ */
+ public static IStandardBuildInfo create(IProject project, Element element) {
+ // Create a new info property object
+ Property buildProperties = new Property(project);
+ Node child = element.getFirstChild();
+ while (child != null) {
+ if (child.getNodeName().equals(INCLUDE_PATH)) {
+ // Add the path to the property list
+ buildProperties.getPathList().add(((Element)child).getAttribute(PATH));
+ } else if (child.getNodeName().equals(DEFINED_SYMBOL)) {
+ // Add the symbol to the symbol list
+ buildProperties.getSymbolList().add(((Element)child).getAttribute(SYMBOL));
+ }
+ child = child.getNextSibling();
+ }
+ return (IStandardBuildInfo)buildProperties;
+ }
}
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CProjectNature.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CProjectNature.java
index c1ab2814e66..99b3c8014df 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CProjectNature.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CProjectNature.java
@@ -9,7 +9,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import org.eclipse.cdt.core.resources.IBuildInfo;
+import org.eclipse.cdt.core.build.standard.StandardBuildManager;
+import org.eclipse.cdt.core.resources.IStandardBuildInfo;
import org.eclipse.core.resources.ICommand;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
@@ -30,7 +31,7 @@ public class CProjectNature implements IProjectNature {
public static final String C_NATURE_ID= CCorePlugin.PLUGIN_ID + ".cnature";
private IProject fProject;
- private IBuildInfo fBuildInfo;
+ private IStandardBuildInfo fBuildInfo;
public CProjectNature() {
}
@@ -106,30 +107,6 @@ public class CProjectNature implements IProjectNature {
return new Path(buildLocation);
}
- /**
- * Answers a comma-separated list of defined preprocessor symbols
- * for the project, or an empty string if there are none.
- *
- * @return
- * @throws CoreException
- */
- public String getDefinedSymbols() throws CoreException {
- String symbols = fBuildInfo.getDefinedSymbols();
- return symbols == null ? new String() : symbols;
- }
-
- /**
- * Sets the defined symbols for the project.
- *
- * @param symbols
- */
- public void setDefinedSymbols(String symbols, IProgressMonitor monitor) throws CoreException {
- String oldSymbols = fBuildInfo.getDefinedSymbols();
- if (symbols != null && !symbols.equals(oldSymbols)) {
- fBuildInfo.setDefinedSymbols(symbols);
- }
- }
-
/**
* Sets the arguments for the full build.
*/
@@ -152,32 +129,6 @@ public class CProjectNature implements IProjectNature {
}
/**
- * Answers a comma-separated list of include paths defined for
- * the project, or an empty string if there are none.
- *
- * @return
- * @throws CoreException
- */
- public String getIncludePaths() throws CoreException {
- String paths = fBuildInfo.getIncludePaths();
- return paths == null ? new String() : paths;
- }
-
- /**
- * Sets the include path information for the project.
- *
- * @param paths
- * @param monitor
- * @throws CoreException
- */
- public void setIncludePaths(String paths, IProgressMonitor monitor) throws CoreException {
- String oldPaths = fBuildInfo.getIncludePaths();
- if (paths != null && !paths.equals(oldPaths)) {
- fBuildInfo.setIncludePaths(paths);
- }
- }
-
- /**
* Sets the arguments for the incremental build.
*/
public void setIncrBuildArguments(String arguments, IProgressMonitor monitor) throws CoreException {
@@ -318,7 +269,7 @@ public class CProjectNature implements IProjectNature {
*/
public void configure() throws CoreException {
addToBuildSpec(getBuilderID(), null);
- IBuildInfo info = BuildInfoFactory.create();
+ IStandardBuildInfo info = BuildInfoFactory.create();
fBuildInfo.setBuildLocation(info.getBuildLocation());
fBuildInfo.setFullBuildArguments("");
fBuildInfo.setIncrementalBuildArguments("");
@@ -346,6 +297,7 @@ public class CProjectNature implements IProjectNature {
*/
public void setProject(IProject project) {
fProject= project;
- fBuildInfo = BuildInfoFactory.create(fProject);
+ fBuildInfo = StandardBuildManager.getBuildInfo(fProject, true);
}
+
}
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IBuildInfo.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IStandardBuildInfo.java
index b05e68b3b6f..80e3aa5309f 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IBuildInfo.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/resources/IStandardBuildInfo.java
@@ -1,30 +1,38 @@
package org.eclipse.cdt.core.resources;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+
+
/*
* (c) Copyright QNX Software Systems Ltd. 2002.
* All Rights Reserved.
*/
-public interface IBuildInfo {
- public static final String SEPARATOR = ",";
-
+public interface IStandardBuildInfo {
String getBuildLocation();
- String getDefinedSymbols();
+ public String[] getPreprocessorSymbols();
String getFullBuildArguments();
- String getIncludePaths();
+ public String[] getIncludePaths();
String getIncrementalBuildArguments();
boolean isStopOnError();
-
+
void setBuildLocation(String location);
- void setDefinedSymbols(String symbols);
+ public void setPreprocessorSymbols(String[] symbols);
void setFullBuildArguments(String arguments);
- void setIncludePaths(String paths);
- void setIncrementalBuildArguments(String arguments);
+ public void setIncludePaths(String[] paths);
+ void setIncrementalBuildArguments(String arguments);
void setStopOnError(boolean on);
// boolean isClearBuildConsole();
boolean isDefaultBuildCmd();
void setUseDefaultBuildCmd(boolean on);
+
+ /**
+ * @param doc
+ * @param rootElement
+ */
+ void serialize(Document doc, Element rootElement);
}
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java
index 69aef8c99ef..34bbb1811e5 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/GeneratedMakefileBuilder.java
@@ -14,7 +14,7 @@ package org.eclipse.cdt.internal.core;
import java.io.ByteArrayInputStream;
import java.util.Map;
import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.build.managed.IResourceBuildInfo;
+import org.eclipse.cdt.core.build.managed.IManagedBuildInfo;
import org.eclipse.cdt.core.build.managed.ManagedBuildManager;
import org.eclipse.cdt.core.resources.ACBuilder;
import org.eclipse.cdt.core.resources.MakeUtil;
@@ -72,14 +72,14 @@ public class GeneratedMakefileBuilder extends ACBuilder {
*
* @param buffer
*/
- private void addMacros(StringBuffer buffer, IResourceBuildInfo info) {
+ private void addMacros(StringBuffer buffer, IManagedBuildInfo info) {
// TODO this should come from the build model
buffer.append("RM = rm -f" + NEWLINE);
buffer.append("MAKE = make" + NEWLINE);
buffer.append(NEWLINE);
}
- private void addRule(StringBuffer buffer, IPath sourcePath, String outputName, IResourceBuildInfo info) {
+ private void addRule(StringBuffer buffer, IPath sourcePath, String outputName, IManagedBuildInfo info) {
// Add the rule to the makefile
buffer.append(outputName + COLON + " " + sourcePath.toString());
// Add all of the dependencies on the source file
@@ -96,7 +96,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
*
* @param buffer
*/
- private void addSources(StringBuffer buffer, IResourceBuildInfo info) throws CoreException {
+ private void addSources(StringBuffer buffer, IManagedBuildInfo info) throws CoreException {
// Add the list of project files to be built
buffer.append("OBJS = \\" + NEWLINE);
@@ -133,7 +133,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
/**
* @param buffer
*/
- private void addTargets(StringBuffer buffer, IResourceBuildInfo info) {
+ private void addTargets(StringBuffer buffer, IManagedBuildInfo info) {
// Generate a rule per source
// This is the top build rule
@@ -270,9 +270,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
monitor.subTask(statusMsg);
// Get a filehandle for the makefile
- IPath filePath = getWorkingDirectory();
- filePath.addTrailingSeparator();
- filePath.append(FILENAME);
+ IPath filePath = getWorkingDirectory().append(IPath.SEPARATOR + FILENAME);
IFile fileHandle = getMakefile(filePath, monitor);
// Now populate it
@@ -289,7 +287,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
private void populateMakefile(IFile fileHandle, IProgressMonitor monitor) throws CoreException {
// Write out the contents of the build model
StringBuffer buffer = new StringBuffer();
- IResourceBuildInfo info = ManagedBuildManager.getBuildInfo(getProject());
+ IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject());
// Add the macro definitions
addMacros(buffer, info);

Back to the top