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);
/**
* @param configuration
* @return
*/
public boolean setDefaultConfiguration(String configName);
/**
* Set the primary target for the receiver.
*

View file

@ -774,7 +774,10 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI
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
try {
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.makegen.IManagedBuilderDependencyCalculator;
import org.eclipse.cdt.managedbuilder.makegen.IManagedBuilderMakefileGenerator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
@ -77,6 +78,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
protected List resourcesToBuild;
protected List ruleList;
protected IManagedBuilderMakefileGenerator generator;
protected IProject[] referencedProjects;
public class ResourceDeltaVisitor implements IResourceDeltaVisitor {
private boolean buildNeeded = true;
@ -162,12 +164,13 @@ public class GeneratedMakefileBuilder extends ACBuilder {
*/
protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
// We should always tell the build system what projects we reference
IProject[] refdProjects = getProject().getReferencedProjects();
referencedProjects = getProject().getReferencedProjects();
checkCancel(monitor);
// Get the build information
IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(getProject());
if (info == null) {
return refdProjects;
return referencedProjects;
}
// 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
info.setRebuildState(false);
for (int i = 0; i < refdProjects.length; i++) {
IProject project = refdProjects[i];
for (int i = 0; i < referencedProjects.length; i++) {
IProject project = referencedProjects[i];
IManagedBuildInfo depInfo = ManagedBuildManager.getBuildInfo(project);
// May not be a managed project
if (depInfo != null) {
@ -207,7 +210,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
}
// 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) {
// 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);
// invoke make with the clean argument
if (buildDir != null && makefile != null && makefile.exists()) {
// 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();
}
// 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
String statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.rebuild.makefiles", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg);
checkCancel(monitor);
String targetID = info.getDefaultTarget().getParent().getId();
generator = ManagedBuildManager.getMakefileGenerator(targetID);
generator.initialize(getProject(), info, monitor);
@ -279,6 +275,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Now call make
statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.starting", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg);
checkCancel(monitor);
IPath topBuildDir = generator.getBuildWorkingDir();
if (topBuildDir != null) {
invokeMake(FULL_BUILD, topBuildDir, info, monitor);
@ -292,6 +289,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Now regenerate the dependencies
statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.regen.deps", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg);
checkCancel(monitor);
try {
generator.regenerateDependencies(false);
} catch (CoreException e) {
@ -398,28 +396,10 @@ public class GeneratedMakefileBuilder extends ACBuilder {
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
String statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.update.makefiles", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg);
checkCancel(monitor);
String targetID = info.getDefaultTarget().getParent().getId();
generator = ManagedBuildManager.getMakefileGenerator(targetID);
generator.initialize(getProject(), info, monitor);
@ -435,6 +415,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Run the build
statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.starting", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg);
checkCancel(monitor);
IPath buildDir = new Path(info.getConfigurationName());
if (buildDir != null) {
invokeMake(INCREMENTAL_BUILD, buildDir, info, monitor);
@ -448,6 +429,7 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Generate the dependencies for all changes
statusMsg = ManagedMakeMessages.getFormattedString("ManagedMakeBuilder.message.updating.deps", getProject().getName()); //$NON-NLS-1$
monitor.subTask(statusMsg);
checkCancel(monitor);
try {
generator.generateDependencies();
} catch (CoreException e) {
@ -527,9 +509,8 @@ public class GeneratedMakefileBuilder extends ACBuilder {
// Remove all markers for this project
removeAllMarkers(currentProject);
IProject[] deps = currentProject.getReferencedProjects();
for (int i = 0; i < deps.length; i++) {
IProject project = deps[i];
for (int i = 0; i < referencedProjects.length; i++) {
IProject project = referencedProjects[i];
removeAllMarkers(project);
}
@ -591,8 +572,8 @@ public class GeneratedMakefileBuilder extends ACBuilder {
monitor.subTask(ManagedMakeMessages.getResourceString(REFRESH));
try {
currentProject.refreshLocal(IResource.DEPTH_INFINITE, null);
for (int j = 0; j < deps.length; ++j) {
IProject project = deps[j];
for (int j = 0; j < referencedProjects.length; ++j) {
IProject project = referencedProjects[j];
project.refreshLocal(IResource.DEPTH_INFINITE, null);
}
} catch (CoreException e) {
@ -633,14 +614,24 @@ public class GeneratedMakefileBuilder extends ACBuilder {
}
}
private void removeAllMarkers(IProject project) throws CoreException {
IWorkspace workspace = project.getWorkspace();
private void removeAllMarkers(IProject project) {
if (project == null || !project.exists()) return;
// remove all markers
IMarker[] markers = project.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
// Clear out the problem markers
IWorkspace workspace = project.getWorkspace();
IMarker[] markers;
try {
markers = project.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
} catch (CoreException e) {
ManagedBuilderCorePlugin.log(e);
return;
}
if (markers != null) {
workspace.deleteMarkers(markers);
try {
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)
* @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

@ -518,7 +518,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
// There are 2 exceptions; the project does not exist or it is not open
// and neither conditions apply if we are building for it ....
}
// Write out the all target first in case someone just runs make
// all: targ_<target_name>
String defaultTarget = "all:"; //$NON-NLS-1$
@ -534,12 +534,17 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator {
* deps:
* <cd <Proj_Dep_1/build_dir>; $(MAKE) [clean all | all]>
*/
Vector managedProjectOutputs = new Vector();
if (refdProjects.length > 0) {
buffer.append("dependents:" + NEWLINE); //$NON-NLS-1$
Vector managedProjectOutputs = new Vector(refdProjects.length);
if (refdProjects.length > 0) {
boolean addDeps = true;
if (refdProjects != null) {
for (int i = 0; i < refdProjects.length; 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 depTargets = targets;
if (ManagedBuildManager.manages(dep)) {

View file

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