Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] auto build fix

Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/ChangeLog,v
retrieving revision 1.36
diff -u -r1.36 ChangeLog
--- ChangeLog	20 Nov 2002 14:31:35 -0000	1.36
+++ ChangeLog	20 Nov 2002 16:00:42 -0000
@@ -1,4 +1,9 @@
 2002-11-20 David Inglis
+	* src/.../internal/core/CBuilder.java
+	fix AUTO_BUILDs so that the builder only builds when the resources change
+	in the project.
+	
+2002-11-20 David Inglis
 	* plugin.xml
 	fixed bug #26640

Index: src/org/eclipse/cdt/core/ConsoleOutputStream.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/core/ConsoleOutputStream.java,v
retrieving revision 1.2
diff -u -r1.2 ConsoleOutputStream.java
--- src/org/eclipse/cdt/core/ConsoleOutputStream.java	23 Oct 2002 13:07:33 -0000	1.2
+++ src/org/eclipse/cdt/core/ConsoleOutputStream.java	20 Nov 2002 16:00:43 -0000
@@ -21,7 +21,7 @@
 	}

 		
-	public String readBuffer() {
+	public synchronized String readBuffer() {
 		String buf = fBuffer.toString();
 		fBuffer.setLength(0);
 		return buf;
Index: src/org/eclipse/cdt/internal/core/CBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CBuilder.java,v
retrieving revision 1.11
diff -u -r1.11 CBuilder.java
--- src/org/eclipse/cdt/internal/core/CBuilder.java	13 Nov 2002 14:31:26 -0000	1.11
+++ src/org/eclipse/cdt/internal/core/CBuilder.java	20 Nov 2002 16:00:43 -0000
@@ -23,6 +23,8 @@
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
 import org.eclipse.core.resources.IWorkspace;
 import org.eclipse.core.resources.IncrementalProjectBuilder;
 import org.eclipse.core.runtime.CoreException;
@@ -33,63 +35,87 @@
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.SubProgressMonitor;

+public class CBuilder extends ACBuilder {

+	private static final String BUILD_ERROR = "CBuilder.build_error";

-public class CBuilder extends ACBuilder {
-	
-	private static final String BUILD_ERROR= "CBuilder.build_error";
-	
 	public CBuilder() {
 	}

-    public IPath getWorkingDirectory() {
-		IProject currProject= getProject();
-		IPath workingDirectory = new Path(MakeUtil.getSessionBuildDir((IResource)currProject));
+	public IPath getWorkingDirectory() {
+		IProject currProject = getProject();
+		IPath workingDirectory = new Path(MakeUtil.getSessionBuildDir((IResource) currProject));
 		if (workingDirectory.isEmpty())
 			workingDirectory = currProject.getLocation();
 		return workingDirectory;
-    }
+	}

+	public class MyResourceDeltaVisitor implements IResourceDeltaVisitor {
+		boolean bContinue;
+
+		public boolean visit(IResourceDelta delta) throws CoreException {
+			IResource resource = delta.getResource();
+			if (resource != null && resource.getProject() == getProject()) {
+				bContinue = true;
+				return false;
+			}
+			return true;
+		}
+		public boolean shouldBuild() {
+			return bContinue;
+		}
+	}
 	/**
 	 * @see IncrementalProjectBuilder#build
-	 */	
-	protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {	
-		boolean isClean = invokeMake((kind == IncrementalProjectBuilder.FULL_BUILD), monitor);
-		if ( isClean ) {
-			forgetLastBuiltState();
+	 */
+	protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+		boolean bPerformBuild = true;
+		if (kind == IncrementalProjectBuilder.AUTO_BUILD) {
+			MyResourceDeltaVisitor vis = new MyResourceDeltaVisitor();
+			IResourceDelta delta = getDelta(getProject());
+			if  (delta != null )  {
+				delta.accept(vis);
+				bPerformBuild = vis.shouldBuild();
+			} else
+				bPerformBuild = false;
+		}
+		if ( bPerformBuild ) {
+			boolean isClean = invokeMake((kind == IncrementalProjectBuilder.FULL_BUILD), monitor);
+			if (isClean) {
+				forgetLastBuiltState();
+			}
 		}
 		checkCancel(monitor);
 		return getProject().getReferencedProjects();
 	}
-	
-	
+
 	private boolean invokeMake(boolean fullBuild, IProgressMonitor monitor) {
 		boolean isClean = false;
 		boolean fatalBuild = false;
 		boolean isCanceled = false;
-		IProject currProject= getProject();
+		IProject currProject = getProject();
 		SubProgressMonitor subMonitor = null;

 		if (monitor == null) {
-			monitor= new NullProgressMonitor();
+			monitor = new NullProgressMonitor();
 		}
 		monitor.beginTask("Invoking the C Builder: " + currProject.getName(), IProgressMonitor.UNKNOWN);

 		try {
-			CProjectNature nature= (CProjectNature)currProject.getNature(CProjectNature.C_NATURE_ID);
-			IPath makepath= nature.getBuildCommand();
+			CProjectNature nature = (CProjectNature) currProject.getNature(CProjectNature.C_NATURE_ID);
+			IPath makepath = nature.getBuildCommand();
 			if (!makepath.isEmpty()) {
 				IConsole console = CCorePlugin.getDefault().getConsole();
 				console.start(currProject);

 				ConsoleOutputStream cos = console.getOutputStream();
-				
+
 				// remove all markers for this project
 				removeAllMarkers(currProject);

-				IPath workingDirectory= getWorkingDirectory();
-				String[] userArgs= parseArguments(fullBuild, nature.getIncrBuildArguments());				
-				if ( userArgs.length != 0 && userArgs[userArgs.length-1].equals("clean") )
+				IPath workingDirectory = getWorkingDirectory();
+				String[] userArgs = parseArguments(fullBuild, nature.getIncrBuildArguments());
+				if (userArgs.length != 0 && userArgs[userArgs.length - 1].equals("clean"))
 					isClean = true;
 				// Before launching give visual cues via the monitor
 				subMonitor = new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN);
@@ -104,23 +130,23 @@
 				Properties props = launcher.getEnvironment();
 				props.put("CWD", workingDirectory.toOSString());
 				props.put("PWD", workingDirectory.toOSString());
-				String[] env= null;
+				String[] env = null;
 				ArrayList envList = new ArrayList();
 				Enumeration names = props.propertyNames();
 				if (names != null) {
 					while (names.hasMoreElements()) {
-						String key = (String)names.nextElement();
-						envList.add(key +"=" +props.getProperty(key));
+						String key = (String) names.nextElement();
+						envList.add(key + "=" + props.getProperty(key));
 					}
-					env = (String []) envList.toArray(new String [envList.size()]);
+					env = (String[]) envList.toArray(new String[envList.size()]);
 				}
-				ErrorParserManager epm= new ErrorParserManager(this);
+				ErrorParserManager epm = new ErrorParserManager(this);
 				epm.setOutputStream(cos);
-				
+
 				launcher.execute(makepath, userArgs, env, workingDirectory);
 				if (launcher.waitAndRead(epm.getOutputStream(), epm.getOutputStream(), subMonitor) != CommandLauncher.OK)
 					errMsg = launcher.getErrorMessage();
-		
+
 				isCanceled = monitor.isCanceled();
 				monitor.setCanceled(false);
 				subMonitor = new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN);
@@ -128,7 +154,8 @@

 				try {
 					currProject.refreshLocal(IResource.DEPTH_INFINITE, subMonitor);
-				} catch (CoreException e) {
+				}
+				catch (CoreException e) {
 				}

 				subMonitor = new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN);
@@ -137,8 +164,8 @@
 				fatalBuild = epm.reportProblems();

 				if (errMsg != null) {
-					String errorDesc= CCorePlugin.getFormattedString(BUILD_ERROR, makepath.toString());
-					StringBuffer buf= new StringBuffer(errorDesc);
+					String errorDesc = CCorePlugin.getFormattedString(BUILD_ERROR, makepath.toString());
+					StringBuffer buf = new StringBuffer(errorDesc);
 					buf.append(System.getProperty("line.separator", "\n"));
 					buf.append("(").append(errMsg).append(")");
 					cos.write(buf.toString().getBytes());
@@ -149,7 +176,8 @@
 				subMonitor.done();
 				monitor.setCanceled(isCanceled);
 			}
-		} catch (Exception e) {
+		}
+		catch (Exception e) {
 			CCorePlugin.log(e);
 		}
 		monitor.done();
@@ -165,19 +193,21 @@
 	}

 	private String[] parseArguments(boolean fullBuild, String override_args) {
-		ArrayList list= new ArrayList();
+		ArrayList list = new ArrayList();
 		IProject currProject = getProject();
 		try {
-			CProjectNature nature= (CProjectNature)currProject.getNature(CProjectNature.C_NATURE_ID);			
+			CProjectNature nature = (CProjectNature) currProject.getNature(CProjectNature.C_NATURE_ID);
 			if (nature.isDefaultBuildCmd()) {
 				if (!nature.isStopOnError()) {
 					list.add("-k");
 				}
-			} else {
+			}
+			else {
 				String[] ovrd_args = makeArray(nature.getFullBuildArguments());
 				list.addAll(Arrays.asList(ovrd_args));
 			}
-		} catch (CoreException e) {
+		}
+		catch (CoreException e) {
 		}

 		String sessionTarget = MakeUtil.getSessionTarget((IResource) currProject);
@@ -194,11 +224,11 @@

 		return (String[]) list.toArray(new String[list.size()]);
 	}
-	
+
 	// Turn the string into an array.
 	String[] makeArray(String string) {
-		string.trim();
-		char []array = string.toCharArray();
+		string.trim();
+		char[] array = string.toCharArray();
 		ArrayList aList = new ArrayList();
 		StringBuffer buffer = new StringBuffer();
 		boolean inComment = false;
@@ -207,22 +237,24 @@
 			if (array[i] == '"' || array[i] == '\'') {
 				if (i > 0 && array[i - 1] == '\\') {
 					inComment = false;
-				} else {
+				}
+				else {
 					inComment = !inComment;
 				}
 			}
 			if (c == ' ' && !inComment) {
 				aList.add(buffer.toString());
 				buffer = new StringBuffer();
-			} else {
+			}
+			else {
 				buffer.append(c);
 			}
 		}
 		if (buffer.length() > 0)
 			aList.add(buffer.toString());
-		return (String[])aList.toArray(new String[aList.size()]);
+		return (String[]) aList.toArray(new String[aList.size()]);
 	}
-	
+
 	//private void clearConsole(final IDocument doc) {
 	//	Display.getDefault().syncExec(new Runnable() {
 	//		public void run() {
@@ -230,12 +262,12 @@
 	//		}
 	//	});	
 	//}
-	
+
 	private void removeAllMarkers(IProject currProject) throws CoreException {
-		IWorkspace workspace= currProject.getWorkspace();
-		
+		IWorkspace workspace = currProject.getWorkspace();
+
 		// remove all markers
-		IMarker[] markers= currProject.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
+		IMarker[] markers = currProject.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
 		if (markers != null) {
 			workspace.deleteMarkers(markers);
 		}



Back to the top