1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-08 18:26:01 +02:00

Fix for bug 58714 - Cannot rebuild after renaming a referenced project

This commit is contained in:
Sean Evoy 2004-05-27 20:28:20 +00:00
parent cf466da37f
commit ae5b03a319
6 changed files with 86 additions and 62 deletions

View file

@ -258,6 +258,12 @@ public interface IManagedBuildInfo {
*/ */
public void setDefaultConfiguration(IConfiguration configuration); public void setDefaultConfiguration(IConfiguration configuration);
/**
* @param configuration
* @return
*/
public boolean setDefaultConfiguration(String configName);
/** /**
* Set the primary target for the receiver. * Set the primary target for the receiver.
* *

View file

@ -774,7 +774,10 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
return false; return false;
} }
private static synchronized ManagedBuildInfo findBuildInfo(IResource resource, boolean create) { private static ManagedBuildInfo findBuildInfo(IResource resource, boolean create) {
// I am sick of NPEs
if (resource == null) return null;
// Make sure the extension information is loaded first // Make sure the extension information is loaded first
try { try {
loadExtensions(); loadExtensions();

View file

@ -33,6 +33,7 @@ import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin;
import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderDependencyCalculator; import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderDependencyCalculator;
import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator; import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
@ -77,6 +78,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
protected List resourcesToBuild; protected List resourcesToBuild;
protected List ruleList; protected List ruleList;
protected IManagedBuilderMakefileGenerator generator; protected IManagedBuilderMakefileGenerator generator;
protected IProject[] referencedProjects;
public class ResourceDeltaVisitor implements IResourceDeltaVisitor { public class ResourceDeltaVisitor implements IResourceDeltaVisitor {
private boolean buildNeeded = true; private boolean buildNeeded = true;
@ -162,12 +164,13 @@ public class GeneratedMakefileBuilder extends ACBuilder {
*/ */
protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException { protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
// We should always tell the build system what projects we reference // We should always tell the build system what projects we reference
IProject[] refdProjects = getProject().getReferencedProjects(); referencedProjects = getProject().getReferencedProjects();
checkCancel(monitor);
// Get the build information // Get the build information
IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject()); IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject());
if (info == null) { if (info == null) {
return refdProjects; return referencedProjects;
} }
// So let's figure out why we got called // So let's figure out why we got called
@ -197,8 +200,8 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Scrub the build info of all the projects participating in the build // Scrub the build info of all the projects participating in the build
info.setRebuildState(false); info.setRebuildState(false);
for (int i = 0; i < refdProjects.length; i++) { for (int i = 0; i < referencedProjects.length; i++) {
IProject project = refdProjects[i]; IProject project = referencedProjects[i];
IManagedBuildInfo depInfo = ManagedBuildManager.getBuildInfo(project); IManagedBuildInfo depInfo = ManagedBuildManager.getBuildInfo(project);
// May not be a managed project // May not be a managed project
if (depInfo != null) { if (depInfo != null) {
@ -207,7 +210,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
} }
// Ask build mechanism to compute deltas for project dependencies next time // Ask build mechanism to compute deltas for project dependencies next time
return refdProjects; return referencedProjects;
} }
/** /**
@ -216,10 +219,20 @@ public class GeneratedMakefileBuilder extends ACBuilder {
*/ */
protected void cleanBuild(IProgressMonitor monitor, IManagedBuildInfo info) { protected void cleanBuild(IProgressMonitor monitor, IManagedBuildInfo info) {
// Make sure that there is a top level directory and a set of makefiles // Make sure that there is a top level directory and a set of makefiles
String targetID = info.getDefaultTarget().getParent().getId();
generator = ManagedBuildManager.getMakefileGenerator(targetID);
IPath buildDir = new Path(info.getConfigurationName());
IPath makefilePath = buildDir.append(generator.getMakefileName());
IWorkspaceRoot root = CCorePlugin.getWorkspace().getRoot();
IFile makefile = root.getFileForLocation(makefilePath);
if (buildDir != null && makefile != null && makefile.exists()) {
// invoke make with the clean argument // invoke make with the clean argument
String statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.starting", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg);
checkCancel(monitor);
invokeMake(CLEAN_BUILD, buildDir, info, monitor);
}
} }
@ -244,27 +257,10 @@ public class GeneratedMakefileBuilder extends ACBuilder {
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
} }
// Regenerate the makefiles for any managed projects this project depends on
IProject[] deps = getProject().getReferencedProjects();
for (int i = 0; i < deps.length; i++) {
IProject depProject = deps[i];
if (ManagedBuildManager.manages(depProject)) {
IManagedBuildInfo depInfo = ManagedBuildManager.getBuildInfo(depProject);
String targetID = depInfo.getDefaultTarget().getParent().getId();
IManagedBuilderMakefileGenerator generator = ManagedBuildManager.getMakefileGenerator(targetID);
generator.initialize(depProject, depInfo, monitor);
try {
generator.regenerateMakefiles();
} catch (CoreException e) {
// Throw the exception back to the builder
throw e;
}
}
}
// Regenerate the makefiles for this project // Regenerate the makefiles for this project
String statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.rebuild.makefiles", getProject().getName()); //$NON-NLS-1$ String statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.rebuild.makefiles", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg); monitor.subTask(statusMsg);
checkCancel(monitor);
String targetID = info.getDefaultTarget().getParent().getId(); String targetID = info.getDefaultTarget().getParent().getId();
generator = ManagedBuildManager.getMakefileGenerator(targetID); generator = ManagedBuildManager.getMakefileGenerator(targetID);
generator.initialize(getProject(), info, monitor); generator.initialize(getProject(), info, monitor);
@ -279,6 +275,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Now call make // Now call make
statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.starting", getProject().getName()); //$NON-NLS-1$ statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.starting", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg); monitor.subTask(statusMsg);
checkCancel(monitor);
IPath topBuildDir = generator.getBuildWorkingDir(); IPath topBuildDir = generator.getBuildWorkingDir();
if (topBuildDir != null) { if (topBuildDir != null) {
invokeMake(FULL_BUILD, topBuildDir, info, monitor); invokeMake(FULL_BUILD, topBuildDir, info, monitor);
@ -292,6 +289,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Now regenerate the dependencies // Now regenerate the dependencies
statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.regen.deps", getProject().getName()); //$NON-NLS-1$ statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.regen.deps", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg); monitor.subTask(statusMsg);
checkCancel(monitor);
try { try {
generator.regenerateDependencies(false); generator.regenerateDependencies(false);
} catch (CoreException e) { } catch (CoreException e) {
@ -398,28 +396,10 @@ public class GeneratedMakefileBuilder extends ACBuilder {
monitor = new NullProgressMonitor(); monitor = new NullProgressMonitor();
} }
// Regenerate the makefiles for any managed projects this project depends on
IProject[] deps = getProject().getReferencedProjects();
for (int i = 0; i < deps.length; i++) {
IProject depProject = deps[i];
if (ManagedBuildManager.manages(depProject)) {
IManagedBuildInfo depInfo = ManagedBuildManager.getBuildInfo(depProject);
String targetID = depInfo.getDefaultTarget().getParent().getId();
IManagedBuilderMakefileGenerator generator = ManagedBuildManager.getMakefileGenerator(targetID);
generator.initialize(depProject, depInfo, monitor);
try {
generator.regenerateMakefiles();
} catch (CoreException e) {
// Throw the exception back to the builder
ManagedBuilderCorePlugin.log(e);
throw e;
}
}
}
// Ask the makefile generator to generate any makefiles needed to build delta // Ask the makefile generator to generate any makefiles needed to build delta
String statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.update.makefiles", getProject().getName()); //$NON-NLS-1$ String statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.update.makefiles", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg); monitor.subTask(statusMsg);
checkCancel(monitor);
String targetID = info.getDefaultTarget().getParent().getId(); String targetID = info.getDefaultTarget().getParent().getId();
generator = ManagedBuildManager.getMakefileGenerator(targetID); generator = ManagedBuildManager.getMakefileGenerator(targetID);
generator.initialize(getProject(), info, monitor); generator.initialize(getProject(), info, monitor);
@ -435,6 +415,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Run the build // Run the build
statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.starting", getProject().getName()); //$NON-NLS-1$ statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.starting", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg); monitor.subTask(statusMsg);
checkCancel(monitor);
IPath buildDir = new Path(info.getConfigurationName()); IPath buildDir = new Path(info.getConfigurationName());
if (buildDir != null) { if (buildDir != null) {
invokeMake(INCREMENTAL_BUILD, buildDir, info, monitor); invokeMake(INCREMENTAL_BUILD, buildDir, info, monitor);
@ -448,6 +429,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Generate the dependencies for all changes // Generate the dependencies for all changes
statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.updating.deps", getProject().getName()); //$NON-NLS-1$ statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.updating.deps", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg); monitor.subTask(statusMsg);
checkCancel(monitor);
try { try {
generator.generateDependencies(); generator.generateDependencies();
} catch (CoreException e) { } catch (CoreException e) {
@ -527,9 +509,8 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Remove all markers for this project // Remove all markers for this project
removeAllMarkers(currentProject); removeAllMarkers(currentProject);
IProject[] deps = currentProject.getReferencedProjects(); for (int i = 0; i < referencedProjects.length; i++) {
for (int i = 0; i < deps.length; i++) { IProject project = referencedProjects[i];
IProject project = deps[i];
removeAllMarkers(project); removeAllMarkers(project);
} }
@ -591,8 +572,8 @@ public class GeneratedMakefileBuilder extends ACBuilder {
monitor.subTask(ManagedMakeMessages.getResourceString(REFRESH)); monitor.subTask(ManagedMakeMessages.getResourceString(REFRESH));
try { try {
currentProject.refreshLocal(IResource.DEPTH_INFINITE, null); currentProject.refreshLocal(IResource.DEPTH_INFINITE, null);
for (int j = 0; j < deps.length; ++j) { for (int j = 0; j < referencedProjects.length; ++j) {
IProject project = deps[j]; IProject project = referencedProjects[j];
project.refreshLocal(IResource.DEPTH_INFINITE, null); project.refreshLocal(IResource.DEPTH_INFINITE, null);
} }
} catch (CoreException e) { } catch (CoreException e) {
@ -633,14 +614,24 @@ public class GeneratedMakefileBuilder extends ACBuilder {
} }
} }
private void removeAllMarkers(IProject project) throws CoreException { private void removeAllMarkers(IProject project) {
if (project == null || !project.exists()) return;
// Clear out the problem markers
IWorkspace workspace = project.getWorkspace(); IWorkspace workspace = project.getWorkspace();
IMarker[] markers;
// remove all markers try {
IMarker[] markers = project.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE); markers = project.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
} catch (CoreException e) {
ManagedBuilderCorePlugin.log(e);
return;
}
if (markers != null) { if (markers != null) {
try {
workspace.deleteMarkers(markers); workspace.deleteMarkers(markers);
} catch (CoreException e) {
ManagedBuilderCorePlugin.log(e);
}
} }
} }
} }

View file

@ -930,6 +930,24 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo {
} }
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo#setDefaultConfiguration(java.lang.String)
*/
public boolean setDefaultConfiguration(String configName) {
if (configName != null) {
// Look for the configuration with the same name as the argument
IConfiguration[] configs = getDefaultTarget().getConfigurations();
for (int index = configs.length - 1; index >= 0; --index) {
IConfiguration config = configs[index];
if (configName.equalsIgnoreCase(config.getName())) {
setDefaultConfiguration(config);
return true;
}
}
}
return false;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#setDefaultTarget(org.eclipse.cdt.core.build.managed.ITarget) * @see org.eclipse.cdt.core.build.managed.IManagedBuildInfo#setDefaultTarget(org.eclipse.cdt.core.build.managed.ITarget)
*/ */
@ -1024,4 +1042,5 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo {
} }
} }
} }
} }

View file

@ -534,12 +534,17 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
* deps: * deps:
* <cd <Proj_Dep_1/build_dir>; $(MAKE) [clean all | all]> * <cd <Proj_Dep_1/build_dir>; $(MAKE) [clean all | all]>
*/ */
Vector managedProjectOutputs = new Vector(); Vector managedProjectOutputs = new Vector(refdProjects.length);
if (refdProjects.length > 0) { if (refdProjects.length > 0) {
buffer.append("dependents:" + NEWLINE); //$NON-NLS-1$ boolean addDeps = true;
if (refdProjects != null) { if (refdProjects != null) {
for (int i = 0; i < refdProjects.length; i++) { for (int i = 0; i < refdProjects.length; i++) {
IProject dep = refdProjects[i]; IProject dep = refdProjects[i];
if (!dep.exists()) continue;
if (addDeps) {
buffer.append("dependents:" + NEWLINE); //$NON-NLS-1
addDeps = false;
}
String buildDir = dep.getLocation().toString(); String buildDir = dep.getLocation().toString();
String depTargets = targets; String depTargets = targets;
if (ManagedBuildManager.manages(dep)) { if (ManagedBuildManager.manages(dep)) {

View file

@ -433,7 +433,7 @@ public class BuildToolSettingsPage extends BuildSettingsPage {
String enumVal = getPreferenceStore().getString(option.getId()); String enumVal = getPreferenceStore().getString(option.getId());
String enumId = option.getEnumeratedId(enumVal); String enumId = option.getEnumeratedId(enumVal);
ManagedBuildManager.setOption(configuration, option, ManagedBuildManager.setOption(configuration, option,
(enumId.length() > 0) ? enumId : enumVal); (enumId != null && enumId.length() > 0) ? enumId : enumVal);
break; break;
case IOption.STRING : case IOption.STRING :
String strVal = getPreferenceStore().getString(option.getId()); String strVal = getPreferenceStore().getString(option.getId());