1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 14:12:10 +02:00

Bug 579138 - Project dependencies are not built in the correct order

Fixing the issue where circular dependencies cause stack overflow.

Change-Id: I4ca87eb4e8ccb82b25f85d1cea04fc0d4ddd60c0
Signed-off-by: Umair Sair <umair_sair@hotmail.com>
This commit is contained in:
Jonah Graham 2022-03-08 11:05:14 -05:00
parent 968c6937e7
commit 96f928152f
2 changed files with 14 additions and 0 deletions

View file

@ -23,6 +23,7 @@ package org.eclipse.cdt.managedbuilder.internal.core;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@ -104,6 +105,7 @@ public class CommonBuilder extends ACBuilder implements IIncrementalProjectBuild
private boolean fBuildErrOccured;
private Set<String> builtRefConfigIds = new HashSet<>();
private Set<String> scheduledConfigIds = new HashSet<>();
public CommonBuilder() {
}
@ -438,6 +440,7 @@ public class CommonBuilder extends ACBuilder implements IIncrementalProjectBuild
fBuildSet.start(this);
builtRefConfigIds.clear();
scheduledConfigIds.clear();
IProject project = getProject();
@ -488,6 +491,7 @@ public class CommonBuilder extends ACBuilder implements IIncrementalProjectBuild
if (status.getSeverity() != IStatus.OK)
throw new CoreException(status);
scheduledConfigIds.add(activeCfg.getId());
IConfiguration rcfgs[] = getReferencedConfigs(builders);
monitor.beginTask("", num + rcfgs.length); //$NON-NLS-1$
@ -520,6 +524,8 @@ public class CommonBuilder extends ACBuilder implements IIncrementalProjectBuild
build(kind, new CfgBuildInfo(builders[i], isForeground), new SubProgressMonitor(monitor, 1));
}
}
scheduledConfigIds.remove(activeCfg.getId());
}
if (isForeground)
@ -582,6 +588,13 @@ public class CommonBuilder extends ACBuilder implements IIncrementalProjectBuild
IProject project = cfg.getOwner().getProject();
fBuildSet.getCfgIdSet(project, true).add(cfg.getId());
if (scheduledConfigIds.contains(cfg.getId())) {
ManagedBuilderCorePlugin.log(new Status(IStatus.WARNING, ManagedBuilderCorePlugin.getUniqueIdentifier(),
MessageFormat.format(ManagedMakeMessages.getString("CommonBuilder.circular_dependency"), //$NON-NLS-1$
project.getName(), cfg.getName())));
continue;
}
if (!builtRefConfigIds.contains(cfg.getId())) {
if (VERBOSE) {
outputTrace(cfg.getOwner().getProject().getName(),

View file

@ -164,6 +164,7 @@ CommonBuilder.13=can not clean programmatically: build folder is not accessible
CommonBuilder.22=Building referenced configurations..
CommonBuilder.23=Buildfile generation error occurred..
CommonBuilder.24=Build stopped..
CommonBuilder.circular_dependency=Circular dependency detected in "Project Properties -> C/C++ General -> Path and Symbols -> References tab" for project {0} <{1}>. Build of dependency aborted to prevent infinite cyclic build.
ParallelBuilder.missingOutDir=Failed to create output directory {0}
MakeBuilder.buildError=