1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 14:42:11 +02:00

Bug 546407 Project dependencies are not built in the correct order

Problem:
========
filterConfigsToBuild(..) always filters the configs that are once added
to set irrespective if it has been built or not. Consider scenario where
there are three project a, b, c and a depends on b & c and b depends on
c. When a is built, filterConfigsToBuild(..) returns configs of b and c.
Then b starts building and filterConfigsToBuild(..) doesn't return
config of c because its already in set. This is wrong and it should
return config of c because it is not yet built and b depends on it.

Fix:
====
If a referenced config by any project/config is not yet built,
filterConfigsToBuild(..) shouldn't filter it.

Change-Id: I5fbe77789f14ce3114200998070a7461069c98ab
Signed-off-by: Umair Sair <umair_sair@hotmail.com>
This commit is contained in:
Umair Sair 2019-04-14 17:56:24 +05:00 committed by Jonah Graham
parent 0ee3822b04
commit 15cf760405
2 changed files with 14 additions and 4 deletions

View file

@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2 Bundle-ManifestVersion: 2
Bundle-Name: %pluginName Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.cdt.managedbuilder.core; singleton:=true Bundle-SymbolicName: org.eclipse.cdt.managedbuilder.core; singleton:=true
Bundle-Version: 8.7.0.qualifier Bundle-Version: 8.7.100.qualifier
Bundle-Activator: org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin Bundle-Activator: org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin
Bundle-Vendor: %providerName Bundle-Vendor: %providerName
Bundle-Localization: plugin Bundle-Localization: plugin

View file

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (c) 2007, 2016 Intel Corporation and others. * Copyright (c) 2007, 2019 Intel Corporation and others.
* *
* This program and the accompanying materials * This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0 * are made available under the terms of the Eclipse Public License 2.0
@ -14,6 +14,7 @@
* Dmitry Kozlov (CodeSourcery) - Build error highlighting and navigation * Dmitry Kozlov (CodeSourcery) - Build error highlighting and navigation
* Save build output (bug 294106) * Save build output (bug 294106)
* Andrew Gvozdev (Quoin Inc) - Saving build output implemented in different way (bug 306222) * Andrew Gvozdev (Quoin Inc) - Saving build output implemented in different way (bug 306222)
* Umair Sair (Mentor Graphics) - Project dependencies are not built in the correct order (bug 546407)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.managedbuilder.internal.core; package org.eclipse.cdt.managedbuilder.internal.core;
@ -99,6 +100,7 @@ public class CommonBuilder extends ACBuilder {
private static CfgBuildSet fBuildSet = new CfgBuildSet(); private static CfgBuildSet fBuildSet = new CfgBuildSet();
private boolean fBuildErrOccured; private boolean fBuildErrOccured;
private Set<String> builtRefConfigIds = new HashSet<>();
public CommonBuilder() { public CommonBuilder() {
} }
@ -432,6 +434,7 @@ public class CommonBuilder extends ACBuilder {
printEvent(kind, args); printEvent(kind, args);
fBuildSet.start(this); fBuildSet.start(this);
builtRefConfigIds.clear();
IProject project = getProject(); IProject project = getProject();
@ -533,6 +536,11 @@ public class CommonBuilder extends ACBuilder {
monitor.beginTask(ManagedMakeMessages.getResourceString("CommonBuilder.22"), cfgs.length); //$NON-NLS-1$ monitor.beginTask(ManagedMakeMessages.getResourceString("CommonBuilder.22"), cfgs.length); //$NON-NLS-1$
for (IConfiguration cfg : cfgs) { for (IConfiguration cfg : cfgs) {
IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1); IProgressMonitor subMonitor = new SubProgressMonitor(monitor, 1);
if (builtRefConfigIds.contains(cfg.getId())) {
subMonitor.done();
continue;
}
nextConfigChanged.setValue(false); nextConfigChanged.setValue(false);
try { try {
IBuilder builder = cfg.getEditableBuilder(); IBuilder builder = cfg.getEditableBuilder();
@ -553,6 +561,7 @@ public class CommonBuilder extends ACBuilder {
} catch (CoreException e) { } catch (CoreException e) {
ManagedBuilderCorePlugin.log(e); ManagedBuilderCorePlugin.log(e);
} finally { } finally {
builtRefConfigIds.add(cfg.getId());
subMonitor.done(); subMonitor.done();
} }
refConfigChanged.setValue(refConfigChanged.getValue() || nextConfigChanged.getValue()); refConfigChanged.setValue(refConfigChanged.getValue() || nextConfigChanged.getValue());
@ -568,8 +577,9 @@ public class CommonBuilder extends ACBuilder {
List<IConfiguration> cfgList = new ArrayList<>(cfgs.length); List<IConfiguration> cfgList = new ArrayList<>(cfgs.length);
for (IConfiguration cfg : cfgs) { for (IConfiguration cfg : cfgs) {
IProject project = cfg.getOwner().getProject(); IProject project = cfg.getOwner().getProject();
Set<String> set = fBuildSet.getCfgIdSet(project, true); fBuildSet.getCfgIdSet(project, true).add(cfg.getId());
if (set.add(cfg.getId())) {
if (!builtRefConfigIds.contains(cfg.getId())) {
if (VERBOSE) { if (VERBOSE) {
outputTrace(cfg.getOwner().getProject().getName(), outputTrace(cfg.getOwner().getProject().getName(),
"set: adding cfg " + cfg.getName() + " ( id=" + cfg.getId() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ "set: adding cfg " + cfg.getName() + " ( id=" + cfg.getId() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$