mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-01 14:15:23 +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;
|
||||
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.hamcrest.Matchers.is;
|
||||
import static org.hamcrest.Matchers.notNullValue;
|
||||
import static org.hamcrest.Matchers.nullValue;
|
||||
import static org.mockito.Mockito.mock;
|
||||
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.CMakeNature;
|
||||
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.debug.core.CDebugCorePlugin;
|
||||
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.core.resources.IBuildConfiguration;
|
||||
import org.eclipse.core.resources.IProject;
|
||||
|
@ -139,6 +143,41 @@ public class CBuildConfigurationManagerTests extends BaseTestCase5 {
|
|||
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)}
|
||||
*
|
||||
|
|
|
@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
|||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: %pluginName
|
||||
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-Vendor: %providerName
|
||||
Bundle-Localization: plugin
|
||||
|
|
|
@ -247,6 +247,12 @@ public class CBuildConfigurationManager
|
|||
ICBuildConfiguration config = null;
|
||||
boolean resetBinaryParser = false;
|
||||
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)) {
|
||||
config = configs.get(buildConfig);
|
||||
if (config == null) {
|
||||
|
|
Loading…
Add table
Reference in a new issue