mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-01 22:25:25 +02:00
Build not configured correctly (#1201)
Under some circumstances it can happen that a BuildConfiguration is registered in the CBuildConfigurationManger as both a valid and invalid ICBuildConfiguration counterpart. This results in a "Build not configured correctly" error when trying to build a CoreBuild project. This change removes valid build configurations from the invalid list before looking for the counterpart. Fixes #1193
This commit is contained in:
parent
74fb09c6e1
commit
591e99e68b
3 changed files with 46 additions and 1 deletions
|
@ -11,11 +11,14 @@
|
||||||
package org.eclipse.cdt.core.build;
|
package org.eclipse.cdt.core.build;
|
||||||
|
|
||||||
import static org.hamcrest.MatcherAssert.assertThat;
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
import static org.hamcrest.Matchers.is;
|
import static org.hamcrest.Matchers.is;
|
||||||
import static org.hamcrest.Matchers.notNullValue;
|
import static org.hamcrest.Matchers.notNullValue;
|
||||||
|
import static org.hamcrest.Matchers.nullValue;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.cmake.core.CMakeBuildConfiguration;
|
||||||
import org.eclipse.cdt.cmake.core.CMakeBuildConfigurationProvider;
|
import org.eclipse.cdt.cmake.core.CMakeBuildConfigurationProvider;
|
||||||
import org.eclipse.cdt.cmake.core.CMakeNature;
|
import org.eclipse.cdt.cmake.core.CMakeNature;
|
||||||
import org.eclipse.cdt.core.CCProjectNature;
|
import org.eclipse.cdt.core.CCProjectNature;
|
||||||
|
@ -26,6 +29,7 @@ import org.eclipse.cdt.core.testplugin.ResourceHelper;
|
||||||
import org.eclipse.cdt.core.testplugin.util.BaseTestCase5;
|
import org.eclipse.cdt.core.testplugin.util.BaseTestCase5;
|
||||||
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
import org.eclipse.cdt.debug.core.CDebugCorePlugin;
|
||||||
import org.eclipse.cdt.debug.core.launch.CoreBuildLaunchBarTracker;
|
import org.eclipse.cdt.debug.core.launch.CoreBuildLaunchBarTracker;
|
||||||
|
import org.eclipse.cdt.internal.core.build.CBuildConfigurationManager;
|
||||||
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsScannerInfoProvider;
|
import org.eclipse.cdt.internal.core.language.settings.providers.LanguageSettingsScannerInfoProvider;
|
||||||
import org.eclipse.core.resources.IBuildConfiguration;
|
import org.eclipse.core.resources.IBuildConfiguration;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
|
@ -139,6 +143,41 @@ public class CBuildConfigurationManagerTests extends BaseTestCase5 {
|
||||||
scannerInfoProvider instanceof ICBuildConfiguration);
|
scannerInfoProvider instanceof ICBuildConfiguration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test {@link CBuildConfigurationManager#getBuildConfiguration(IBuildConfiguration buildConfig)}
|
||||||
|
* IBuildConfigurations with a valid ICBuildConfiguration counterpart will be removed from
|
||||||
|
* the CBuildConfigurationManager.noConfigs Set.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testNoConfigs() throws Exception {
|
||||||
|
// create a CMake project; performed in setup()
|
||||||
|
|
||||||
|
// Create a new IBuildConfiguration.
|
||||||
|
CMakeBuildConfigurationProvider provider = new CMakeBuildConfigurationProvider();
|
||||||
|
String buildConfigBaseName = "testNoConfigs";
|
||||||
|
IBuildConfiguration buildConfiguration = configManager.createBuildConfiguration(provider, project,
|
||||||
|
buildConfigBaseName, new NullProgressMonitor());
|
||||||
|
|
||||||
|
// Create a new ICBuildConfiguration.
|
||||||
|
String buildConfigName = provider.getId() + "/" + buildConfigBaseName;
|
||||||
|
ILaunchTarget launchTarget = launchTargetManager.getLocalLaunchTarget();
|
||||||
|
ICBuildConfiguration cBuildConfig = new CMakeBuildConfiguration(buildConfiguration, buildConfigName,
|
||||||
|
mockToolchain, null, ILaunchManager.RUN_MODE, launchTarget);
|
||||||
|
|
||||||
|
// Try to get ICBuildConfiguration, before the IBuildConfiguration/ICBuildConfiguration pair was
|
||||||
|
// added to the build configuration manager. Such a getAdapter() call could happen in a parallel
|
||||||
|
// process. It will fail and buildConfiguration will be placed in configManager.noConfigs
|
||||||
|
ICBuildConfiguration cbConfig = buildConfiguration.getAdapter(ICBuildConfiguration.class);
|
||||||
|
assertThat(cbConfig, is(nullValue()));
|
||||||
|
|
||||||
|
// Register the IBuildConfiguration/ICBuildConfiguration pair.
|
||||||
|
configManager.addBuildConfiguration(buildConfiguration, cBuildConfig);
|
||||||
|
|
||||||
|
// Get the ICBuildconfiguration counterpart
|
||||||
|
cbConfig = buildConfiguration.getAdapter(ICBuildConfiguration.class);
|
||||||
|
assertThat(cbConfig, equalTo(cBuildConfig));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test {@link ICBuildConfigurationManager#getBuildConfiguration(IProject, IToolChain, String, ILaunchTarget, IProgressMonitor)}
|
* Test {@link ICBuildConfigurationManager#getBuildConfiguration(IProject, IToolChain, String, ILaunchTarget, IProgressMonitor)}
|
||||||
*
|
*
|
||||||
|
|
|
@ -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.core; singleton:=true
|
Bundle-SymbolicName: org.eclipse.cdt.core; singleton:=true
|
||||||
Bundle-Version: 9.2.0.qualifier
|
Bundle-Version: 9.2.100.qualifier
|
||||||
Bundle-Activator: org.eclipse.cdt.core.CCorePlugin
|
Bundle-Activator: org.eclipse.cdt.core.CCorePlugin
|
||||||
Bundle-Vendor: %providerName
|
Bundle-Vendor: %providerName
|
||||||
Bundle-Localization: plugin
|
Bundle-Localization: plugin
|
||||||
|
|
|
@ -247,6 +247,12 @@ public class CBuildConfigurationManager
|
||||||
ICBuildConfiguration config = null;
|
ICBuildConfiguration config = null;
|
||||||
boolean resetBinaryParser = false;
|
boolean resetBinaryParser = false;
|
||||||
synchronized (configs) {
|
synchronized (configs) {
|
||||||
|
// Due to an unlucky order of events, by a call of BuildConfiguration.getAdapter(ICBuildConfiguration.class)
|
||||||
|
// in a parallel process, buildConfig could have been added to "noConfigs, just before it was added to
|
||||||
|
// "configs". E.g. by CCorePlugin.getScannerInfoProvider() in the Indexer job.
|
||||||
|
if (noConfigs.contains(buildConfig) && configs.containsKey(buildConfig)) {
|
||||||
|
noConfigs.remove(buildConfig);
|
||||||
|
}
|
||||||
if (!noConfigs.contains(buildConfig)) {
|
if (!noConfigs.contains(buildConfig)) {
|
||||||
config = configs.get(buildConfig);
|
config = configs.get(buildConfig);
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue