Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-dev] Patch proposal for bug 44134

Hi All,
I have a simple patch proposal for a critical bug, 44134. The problem lies 
in how the makefile is generated when a build target references other 
projects. The makefile creates a command to change to the build directory 
of the referenced project and call $(MAKE) there, i.e.

        cd <dep_project_build_dir>; $(MAKE) clean all 

The problem arises when the directory change fails. As of RC0, the command 
after the semi-colon is evaluated. Unfortunately, it evaluates to a 
recursive make call in the build directory of the build target and 'make' 
will keep invoking more 'make's until Eclipse runs out of memory. With a 
manual build, the user can still cancel the build. When autobuild is 
turned on, they cannot. The only way to shut down Eclipse under that 
scenario is to kill it, and when it restarts, autobuild is still enabled 
and the problem repeats.

The best solution is to ignore dependencies on empty projects, but the 
simplest (and more generally applicable) solution is to NOT perform the 
'make' command if the 'cd' fails, i.e.

        cd <dep_project_build_dir> && $(MAKE) clean all 

When the dependencies are generated this way, the 'cd' will fail as will 
the build. The final tweak is to ignore the 'cd' failure and allow the 
rest of the build to continue, i.e.

        -cd <dep_project_build_dir> && -$(MAKE) clean all 

I think that this is a legitimate problem that is severe enough to justify 
a new RC. The patch amounts to a 2-line change in my code, and has no 
impact on the rest of the build system. 

I would like to get a committer vote on this proposal. I have included the 
patch so you can evaluate the delta.

Thanks,

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.13
diff -u -r1.13 ChangeLog
--- ChangeLog	2 Oct 2003 02:56:46 -0000	1.13
+++ ChangeLog	3 Oct 2003 20:49:39 -0000
@@ -1,3 +1,29 @@
+2003-10-03 Sean Evoy
+	Fix for critical bug 44134. 
+	
+	The problem lies in how the makefile is generated when a build target 
+	references other projects. The makefile creates a command to change to 
+	the build directory of the referenced project and call $(MAKE) there, i.e.
+		cd <dep_project_build_dir>; $(MAKE) clean all 
+
+	The problem arises when the directory change fails. As of RC0, the command 
+	after the semi-colon is evaluated. Unfortunately, it evaluates to a recursive 
+	make call in the build directory of the build target and 'make' will keep 
+	invoking more 'make's until Eclipse runs out of memory. With a manual build, 
+	the user can still cancel the build. When autobuild is turned on, they cannot. 
+	The only way to shut down Eclipse under that scenario is to kill it, and when 
+	it restarts, autobuild is still enabled and the problem repeats.
+
+	The solution is to NOT perform the 'make' command if the 'cd' fails, i.e.
+		cd <dep_project_build_dir> && $(MAKE) clean all 
+
+	When the dependencies are generated this way, the 'cd' will fail as will the 
+	build. The final tweak is to ignore the 'cd' failure and allow the rest of 
+	the build to continue, i.e.
+		-cd <dep_project_build_dir> && -$(MAKE) clean all 
+		
+	*  src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java
+
 2003-10-01 Sean Evoy
 	Final fix for bugs 44020.
 	The problem lay with the way that new projects were being created when the 
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.9
diff -u -r1.9 MakefileGenerator.java
--- src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java	1 Oct 2003 14:25:35 -0000	1.9
+++ src/org/eclipse/cdt/managedbuilder/internal/core/MakefileGenerator.java	3 Oct 2003 20:49:40 -0000
@@ -68,7 +68,7 @@
 	protected static final String MODFILE_NAME = "subdir.mk";	//$NON-NLS-1$
 	protected static final String LINEBREAK = "\\";
 	protected static final String NEWLINE = System.getProperty("line.separator");
-	protected static final String SEMI_COLON = ";";
+	protected static final String LOGICAL_AND = "&&";
 	protected static final String SEPARATOR = "/";
 	protected static final String TAB = "\t";	
 	protected static final String WHITESPACE = " ";
@@ -562,7 +562,7 @@
 						}
 						managedProjectOutputs.add(buildDir + SEPARATOR + depPrefix + depTarget);
 					}
-					buffer.append(TAB + "cd" + WHITESPACE + buildDir + SEMI_COLON + WHITESPACE + "$(MAKE) " + depTargets + NEWLINE);
+					buffer.append(TAB + "-cd" + WHITESPACE + buildDir + WHITESPACE + LOGICAL_AND + WHITESPACE + "-$(MAKE) " + depTargets + NEWLINE);
 				}
 			}
 			buffer.append(NEWLINE);

Back to the top