Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Bug fix for 41275

Hi All,
This is a fix for the bug 41275. The problem was pretty simple; the delta 
passed to a project when one of the projects it depends on changes, is 
empty. I tried to optimize the managed builder to run only when a change 
was passed to it, but this is a valid case. Now, if there is a 0-length 
delta passed to a project, it simply calls make without regenerating any 
makefiles.

Sean Evoy
Rational Software - IBM Software Group
Ottawa, Ontario, Canada

Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.managedbuilder.core/ChangeLog,v
retrieving revision 1.8
diff -u -r1.8 ChangeLog
--- ChangeLog	29 Sep 2003 01:42:26 -0000	1.8
+++ ChangeLog	29 Sep 2003 18:21:39 -0000
@@ -1,3 +1,19 @@
+2003-09-26 Sean Evoy
+	I added a fix to the builder and makefile generator to properly handle the following case.
+	Project A depends on Project B. Something changes in project B and the user requests 
+	that A be built. Inthis case, the incremental builder is invoked, but it is passed a 
+	0-length delta on the top resource. Now, the logic of the builder is to treat that case as a 
+	build event that triggers no makefile regeneration, just an invocation of make.
+	
+	Now handles the case where there is no flag applied to the make command and just 
+	passes the targets as arguments.
+	* src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java
+	
+	The makefile generator now considers the case where the delta is for a project resource 
+	and has no children. If so, it flags that a build is needed but no makefile generation 
+	occurs. It also throws a new exception if the top makefile is not saved.
+	* src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java
+
 2003-09-25 Sean Evoy
 	A patch to resolve the problem with refreshing the project after a build, or
 	bug 42522 if you care about those sorts of things. The managed make builder was
Index: src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java,v
retrieving revision 1.4
diff -u -r1.4 GeneratedMakefileBuilder.java
--- src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java	29 Sep 2003 01:42:26 -0000	1.4
+++ src/org/eclipse/cdt/managedbuilder/internal/core/GeneratedMakefileBuilder.java	29 Sep 2003 18:21:39 -0000
@@ -171,6 +171,9 @@
 					if (e.getStatus().getCode() == GeneratedMakefileBuilder.EMPTY_PROJECT_BUILD_ERROR) {
 						// Just keep looking for other projects
 						continue;
+					} else {
+						// Throw the exception back to the builder
+						throw e;
 					}
 				}
 			}
@@ -312,7 +315,10 @@
 	
 				// Get the arguments to be passed to make from build model
 				ArrayList makeArgs = new ArrayList();
-				makeArgs.add(info.getMakeArguments());
+				String args = info.getMakeArguments();
+				if (args.length() > 0) {
+					makeArgs.add(args);
+				}
 				makeArgs.addAll(Arrays.asList(getMakeTargets(fullBuild)));
 				String[] makeTargets = (String[]) makeArgs.toArray(new String[makeArgs.size()]);
 			
Index: src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java,v
retrieving revision 1.6
diff -u -r1.6 MakefileGenerator.java
--- src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java	29 Sep 2003 01:42:26 -0000	1.6
+++ src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java	29 Sep 2003 18:21:40 -0000
@@ -205,12 +205,21 @@
 						keepLooking = true;
 						break;
 				}
+			} if (resource.getType() == IResource.PROJECT) {
+				// If there is a zero-length delta, something the project depends on has changed so just call make
+				IResourceDelta[] children = delta.getAffectedChildren();
+				if (children != null && children.length == 0) {
+					generator.shouldRunBuild(true);
+				} else {
+					keepLooking = true;
+				}
 			} else {
 				// If the resource is part of the generated directory structure don't recurse
 				if (!generator.isGeneratedResource(resource)) {
 					keepLooking = true;
 				}
 			}
+
 			return keepLooking;
 		}
 	}	
@@ -816,7 +825,7 @@
 	 * @param fileHandle The file to place the contents in.
 	 * @param rebuild FLag signalling that the user is doing a full rebuild
 	 */
-	protected void populateTopMakefile(IFile fileHandle, boolean rebuild) {
+	protected void populateTopMakefile(IFile fileHandle, boolean rebuild) throws CoreException {
 		StringBuffer buffer = new StringBuffer();
 		
 		// Add the macro definitions
@@ -829,12 +838,7 @@
 		buffer.append(addTargets(rebuild));
 
 		// Save the file
-		try {
-			Util.save(buffer, fileHandle);
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
+		Util.save(buffer, fileHandle);
 	}
 
 	/* (non-javadoc)

Back to the top