From 30b41b6da19430d184ede0735121f5397b0d2abb Mon Sep 17 00:00:00 2001 From: Sean Evoy Date: Tue, 25 Jan 2005 20:28:15 +0000 Subject: [PATCH] Fix for bugzilla 76080. One of the reported errors in this bug was valid. When a directory containing source was deleted, the Gnu makefilegenerator would mistakenly place it in a list of directories to regenerate makefiles for. The fix places those directories in a list to be deleted. --- .../gnu/DefaultGCCDependencyCalculator.java | 1 - .../makegen/gnu/GnuMakefileGenerator.java | 62 ++++++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/DefaultGCCDependencyCalculator.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/DefaultGCCDependencyCalculator.java index eb67e9e27c8..a053429a9f2 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/DefaultGCCDependencyCalculator.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/DefaultGCCDependencyCalculator.java @@ -100,7 +100,6 @@ public class DefaultGCCDependencyCalculator implements IManagedDependencyGenerat IManagedBuilderMakefileGenerator.WHITESPACE + buildFlags + IManagedBuilderMakefileGenerator.WHITESPACE + - IManagedBuilderMakefileGenerator.WHITESPACE + IManagedBuilderMakefileGenerator.IN_MACRO + IManagedBuilderMakefileGenerator.WHITESPACE + ">>" + //$NON-NLS-1$ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java index 4d8af592772..f161e995ffe 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java @@ -119,7 +119,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { if (!generator.isGeneratedResource(resource)) { // This is a source file so just add its container if (info.buildsFileType(ext)) { - generator.appendModifiedSubdirectory(resource); + generator.appendDeletedSubdirectory(resource); generator.appendDeletedFile(resource); } } @@ -214,6 +214,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { private String buildTargetName; private Vector buildTools; private Vector deletedFileList; + private Vector deletedDirList; private Vector dependencyMakefiles; private String extension; private IManagedBuildInfo info; @@ -741,6 +742,27 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { } } + /** + * Adds the container of the argument to a list of subdirectories that are part + * of an incremental rebuild of the project. The makefile fragments for these + * directories will be regenerated as a result of the build. + * + * @param resource + */ + protected void appendDeletedSubdirectory(IResource resource) { + IContainer container = resource.getParent(); + // If the path contains a space relative to the project, reject it from the build + if (resource.getProjectRelativePath().toString().indexOf(" ") != -1) { //$NON-NLS-1$ + // Only add the container once + if (!getInvalidDirList().contains(container)) { + getInvalidDirList().add(container); + } + } else { + if (!getDeletedDirList().contains(container)) { + getDeletedDirList().add(container); + } + } + } /** * If a file is removed from a source folder (either because of a delete * or move action on the part of the user), the makefilegenerator has to @@ -1070,6 +1092,14 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { populateFragmentMakefile(subDir); checkCancel(); } + + // Remove deleted folders from generated build directory + iter = getDeletedDirList().listIterator(); + while (iter.hasNext()) { + IContainer subDir = (IContainer) iter.next(); + removeGeneratedDirectory(subDir); + checkCancel(); + } // How did we do if (!getInvalidDirList().isEmpty()) { @@ -1110,6 +1140,16 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { } + /** + * @return Returns the deletedDirList. + */ + private Vector getDeletedDirList() { + if (deletedDirList == null) { + deletedDirList = new Vector(); + } + return deletedDirList; + } + /* (non-Javadoc) * @return */ @@ -1751,6 +1791,26 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { return status; } + /* (non-Javadoc) + * @param subDir + */ + private void removeGeneratedDirectory(IContainer subDir) { + IPath moduleRelativePath = subDir.getProjectRelativePath(); + IPath buildRoot = getBuildWorkingDir(); + if (buildRoot == null) { + return; + } + IPath moduleOutputPath = buildRoot.append(moduleRelativePath); + IFolder folder = project.getFolder(moduleOutputPath); + if (folder.exists()) { + try { + folder.delete(true, new SubProgressMonitor(monitor, 1)); + } catch (CoreException e) { + // TODO Log this + } + } + } + /* (non-Javadoc) * @param msg */