diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java index da7db25e1e3..2d6c149f7ce 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/CommonBuilder.java @@ -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 builtRefConfigIds = new HashSet<>(); + private Set 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(), diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties index f56b381c147..92cd9a7fe09 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties @@ -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=