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:
parent
cf466da37f
commit
ae5b03a319
6 changed files with 86 additions and 62 deletions
|
@ -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.
|
||||||
*
|
*
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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) {
|
||||||
IWorkspace workspace = project.getWorkspace();
|
if (project == null || !project.exists()) return;
|
||||||
|
|
||||||
// remove all markers
|
// Clear out the problem markers
|
||||||
IMarker[] markers = project.findMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
|
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) {
|
if (markers != null) {
|
||||||
workspace.deleteMarkers(markers);
|
try {
|
||||||
|
workspace.deleteMarkers(markers);
|
||||||
|
} catch (CoreException e) {
|
||||||
|
ManagedBuilderCorePlugin.log(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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());
|
||||||
|
|
Loading…
Add table
Reference in a new issue