Skip to content

Commit cf359d5

Browse files
Stops CMake build output folders being named "default" (#1084)
The default IBuildConfiguration is no longer used by projects that use ICBuildConfigurationProvider. For CMake, Makefile and other Core Build projects the build output folder is sometimes named "default" rather than the pattern toolName.launchMode.toolchain OS.toolchain Arch.launchTarget Id (eg: cmake.debug.win32.x86_64.Local). PR #1076 exposes new API (ICBuildConfigurationProvider.getCBuildConfigName) to encourage this naming pattern. The "sometimes" is variable and often happens when a project is first created when the active launch target is Local and the launch mode is "run", but not always. This gives a random, inconsistent impression to CDT. The Platform project always contains a IBuildConfiguration with the name IBuildConfiguration.DEFAULT_CONFIG_NAME. It seems the original Core Build system design went to some length to fit in with this and always make use of this IBuildConfiguration when pairing it with a new ICBuildConfiguration. With this PR, this no longer happens, allowing CDT code to be simplified and the build folder naming made consistent, always adhering to ICBuildConfigurationProvider.getCBuildConfigName. Addresses Issue: CDT CMake Improvements #1000, IDE-82683-REQ-024 Default CMake build folder
1 parent e819f8a commit cf359d5

File tree

15 files changed

+634
-164
lines changed

15 files changed

+634
-164
lines changed

NewAndNoteworthy/CHANGELOG-API.md

+6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ Added method allowing extenders to customize the Core Build output directory nam
3131

3232
#### org.eclipse.cdt.core.build.CBuildConfiguration
3333

34+
Removed field:
35+
36+
* org.eclipse.cdt.core.build.ICBuildConfiguration.DEFAULT_NAME
37+
38+
This constant was removed because the name "default" is no longer used to name Core Build configurations. Naming now follows the pattern in getCBuildConfigName, described above.
39+
3440
Removed method:
3541

3642
* org.eclipse.cdt.core.build.CBuildConfiguration.setLaunchMode(String)

build/org.eclipse.cdt.core.autotools.core/src/org/eclipse/cdt/core/autotools/core/AutotoolsBuildConfigurationProvider.java

+4-34
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,21 @@
1414

1515
package org.eclipse.cdt.core.autotools.core;
1616

17-
import java.util.HashMap;
18-
import java.util.Map;
19-
2017
import org.eclipse.cdt.core.autotools.core.internal.Activator;
2118
import org.eclipse.cdt.core.build.CBuildConfigUtils;
2219
import org.eclipse.cdt.core.build.ICBuildConfiguration;
2320
import org.eclipse.cdt.core.build.ICBuildConfigurationManager;
2421
import org.eclipse.cdt.core.build.ICBuildConfigurationProvider;
2522
import org.eclipse.cdt.core.build.IToolChain;
26-
import org.eclipse.cdt.core.build.IToolChainManager;
2723
import org.eclipse.core.resources.IBuildConfiguration;
2824
import org.eclipse.core.resources.IProject;
2925
import org.eclipse.core.runtime.CoreException;
3026
import org.eclipse.core.runtime.IProgressMonitor;
31-
import org.eclipse.core.runtime.Platform;
3227
import org.eclipse.launchbar.core.target.ILaunchTarget;
33-
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
3428

3529
public class AutotoolsBuildConfigurationProvider implements ICBuildConfigurationProvider {
36-
3730
public static final String ID = Activator.PLUGIN_ID + ".provider"; //$NON-NLS-1$
3831

39-
private final ILaunchTargetManager launchTargetManager = Activator.getService(ILaunchTargetManager.class);
40-
4132
@Override
4233
public String getId() {
4334
return ID;
@@ -46,31 +37,10 @@ public String getId() {
4637
@Override
4738
public ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name) throws CoreException {
4839
if (config.getName().equals(IBuildConfiguration.DEFAULT_CONFIG_NAME)) {
49-
IToolChain toolChain = null;
50-
51-
// try the toolchain for the local target
52-
Map<String, String> properties = new HashMap<>();
53-
properties.put(IToolChain.ATTR_OS, Platform.getOS());
54-
properties.put(IToolChain.ATTR_ARCH, Platform.getOSArch());
55-
IToolChainManager toolChainManager = Activator.getService(IToolChainManager.class);
56-
for (IToolChain tc : toolChainManager.getToolChainsMatching(properties)) {
57-
toolChain = tc;
58-
break;
59-
}
60-
61-
// local didn't work, try and find one that does
62-
if (toolChain == null) {
63-
for (IToolChain tc : toolChainManager.getToolChainsMatching(new HashMap<>())) {
64-
toolChain = tc;
65-
break;
66-
}
67-
}
68-
69-
if (toolChain != null) {
70-
return new AutotoolsBuildConfiguration(config, name, toolChain, "run", //$NON-NLS-1$
71-
launchTargetManager.getLocalLaunchTarget());
72-
}
73-
// No valid combinations
40+
/*
41+
* IBuildConfiguration configs with name IBuildConfiguration.DEFAULT_CONFIG_NAME
42+
* are not supported to avoid build output directory being named "default".
43+
*/
7444
return null;
7545
}
7646
AutotoolsBuildConfiguration autotoolsConfig = new AutotoolsBuildConfiguration(config, name);

build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakefileBuildConfigurationProvider.java

+5-35
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,23 @@
1010
*******************************************************************************/
1111
package org.eclipse.cdt.make.core;
1212

13-
import java.util.HashMap;
14-
import java.util.Map;
15-
1613
import org.eclipse.cdt.core.build.CBuildConfigUtils;
1714
import org.eclipse.cdt.core.build.ICBuildConfiguration;
1815
import org.eclipse.cdt.core.build.ICBuildConfigurationManager;
1916
import org.eclipse.cdt.core.build.ICBuildConfigurationProvider;
2017
import org.eclipse.cdt.core.build.IToolChain;
21-
import org.eclipse.cdt.core.build.IToolChainManager;
2218
import org.eclipse.cdt.core.build.StandardBuildConfiguration;
2319
import org.eclipse.core.resources.IBuildConfiguration;
2420
import org.eclipse.core.resources.IProject;
2521
import org.eclipse.core.runtime.CoreException;
2622
import org.eclipse.core.runtime.IProgressMonitor;
27-
import org.eclipse.core.runtime.Platform;
2823
import org.eclipse.launchbar.core.target.ILaunchTarget;
29-
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
3024

3125
/**
3226
* @since 7.4
3327
*/
3428
public class MakefileBuildConfigurationProvider implements ICBuildConfigurationProvider {
35-
3629
public static final String ID = "org.eclipse.cdt.make.core.provider"; //$NON-NLS-1$
37-
private final ILaunchTargetManager launchTargetManager = MakeCorePlugin.getService(ILaunchTargetManager.class);
3830

3931
@Override
4032
public String getId() {
@@ -44,33 +36,11 @@ public String getId() {
4436
@Override
4537
public ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name) throws CoreException {
4638
if (config.getName().equals(IBuildConfiguration.DEFAULT_CONFIG_NAME)) {
47-
IToolChain toolChain = null;
48-
49-
// try the toolchain for the local target
50-
Map<String, String> properties = new HashMap<>();
51-
properties.put(IToolChain.ATTR_OS, Platform.getOS());
52-
properties.put(IToolChain.ATTR_ARCH, Platform.getOSArch());
53-
IToolChainManager toolChainManager = MakeCorePlugin.getService(IToolChainManager.class);
54-
for (IToolChain tc : toolChainManager.getToolChainsMatching(properties)) {
55-
toolChain = tc;
56-
break;
57-
}
58-
59-
// local didn't work, try and find one that does
60-
if (toolChain == null) {
61-
for (IToolChain tc : toolChainManager.getToolChainsMatching(new HashMap<>())) {
62-
toolChain = tc;
63-
break;
64-
}
65-
}
66-
67-
if (toolChain != null) {
68-
return new StandardBuildConfiguration(config, name, toolChain, "run", //$NON-NLS-1$
69-
launchTargetManager.getLocalLaunchTarget());
70-
} else {
71-
// No valid combinations
72-
return null;
73-
}
39+
/*
40+
* IBuildConfiguration configs with name IBuildConfiguration.DEFAULT_CONFIG_NAME
41+
* are not supported to avoid build output directory being named "default".
42+
*/
43+
return null;
7444
}
7545
return new StandardBuildConfiguration(config, name);
7646
}

build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfigurationProvider.java

+6-29
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,19 @@
2222
import org.eclipse.cdt.core.build.ICBuildConfigurationManager;
2323
import org.eclipse.cdt.core.build.ICBuildConfigurationProvider;
2424
import org.eclipse.cdt.core.build.IToolChain;
25-
import org.eclipse.cdt.core.build.IToolChainManager;
2625
import org.eclipse.cdt.meson.core.Activator;
2726
import org.eclipse.cdt.meson.core.IMesonToolChainFile;
2827
import org.eclipse.cdt.meson.core.IMesonToolChainManager;
2928
import org.eclipse.core.resources.IBuildConfiguration;
3029
import org.eclipse.core.resources.IProject;
3130
import org.eclipse.core.runtime.CoreException;
3231
import org.eclipse.core.runtime.IProgressMonitor;
33-
import org.eclipse.core.runtime.Platform;
3432
import org.eclipse.launchbar.core.target.ILaunchTarget;
3533
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
3634

3735
public class MesonBuildConfigurationProvider implements ICBuildConfigurationProvider {
3836

3937
public static final String ID = "org.eclipse.cdt.meson.core.provider"; //$NON-NLS-1$
40-
private final static ILaunchTargetManager launchTargetManager = Activator.getService(ILaunchTargetManager.class);
41-
private IMesonToolChainManager manager = Activator.getService(IMesonToolChainManager.class);
4238

4339
@Override
4440
public String getId() {
@@ -49,31 +45,10 @@ public String getId() {
4945
public synchronized ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name)
5046
throws CoreException {
5147
if (config.getName().equals(IBuildConfiguration.DEFAULT_CONFIG_NAME)) {
52-
IToolChain toolChain = null;
53-
54-
// try the toolchain for the local target
55-
Map<String, String> properties = new HashMap<>();
56-
properties.put(IToolChain.ATTR_OS, Platform.getOS());
57-
properties.put(IToolChain.ATTR_ARCH, Platform.getOSArch());
58-
IToolChainManager toolChainManager = Activator.getService(IToolChainManager.class);
59-
for (IToolChain tc : toolChainManager.getToolChainsMatching(properties)) {
60-
toolChain = tc;
61-
break;
62-
}
63-
64-
// local didn't work, try and find one that does
65-
if (toolChain == null) {
66-
for (IToolChain tc : toolChainManager.getToolChainsMatching(new HashMap<>())) {
67-
toolChain = tc;
68-
break;
69-
}
70-
}
71-
72-
if (toolChain != null) {
73-
return new MesonBuildConfiguration(config, name, toolChain, "run", //$NON-NLS-1$
74-
launchTargetManager.getLocalLaunchTarget());
75-
}
76-
// No valid combinations
48+
/*
49+
* IBuildConfiguration configs with name IBuildConfiguration.DEFAULT_CONFIG_NAME
50+
* are not supported to avoid build output directory being named "default".
51+
*/
7752
return null;
7853
}
7954
MesonBuildConfiguration mesonConfig = new MesonBuildConfiguration(config, name);
@@ -85,6 +60,7 @@ public synchronized ICBuildConfiguration getCBuildConfiguration(IBuildConfigurat
8560
}
8661
if (tcFile != null && !toolChain.equals(tcFile.getToolChain())) {
8762
// toolchain changed
63+
ILaunchTargetManager launchTargetManager = Activator.getService(ILaunchTargetManager.class);
8864
return new MesonBuildConfiguration(config, name, tcFile.getToolChain(), tcFile, mesonConfig.getLaunchMode(),
8965
launchTargetManager.getLocalLaunchTarget());
9066
}
@@ -95,6 +71,7 @@ public synchronized ICBuildConfiguration getCBuildConfiguration(IBuildConfigurat
9571
public ICBuildConfiguration createCBuildConfiguration(IProject project, IToolChain toolChain, String launchMode,
9672
ILaunchTarget launchTarget, IProgressMonitor monitor) throws CoreException {
9773
// get matching toolchain file if any
74+
IMesonToolChainManager manager = Activator.getService(IMesonToolChainManager.class);
9875
IMesonToolChainFile file = manager.getToolChainFileFor(toolChain);
9976
if (file == null) {
10077
Map<String, String> properties = new HashMap<>();

cmake/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/CMakeBuildConfigurationProvider.java

+6-30
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,10 @@
2121
import org.eclipse.cdt.core.build.ICBuildConfigurationManager;
2222
import org.eclipse.cdt.core.build.ICBuildConfigurationProvider;
2323
import org.eclipse.cdt.core.build.IToolChain;
24-
import org.eclipse.cdt.core.build.IToolChainManager;
2524
import org.eclipse.core.resources.IBuildConfiguration;
2625
import org.eclipse.core.resources.IProject;
2726
import org.eclipse.core.runtime.CoreException;
2827
import org.eclipse.core.runtime.IProgressMonitor;
29-
import org.eclipse.core.runtime.Platform;
3028
import org.eclipse.launchbar.core.target.ILaunchTarget;
3129
import org.eclipse.launchbar.core.target.ILaunchTargetManager;
3230

@@ -76,35 +74,12 @@ protected CMakeBuildConfiguration createCMakeBuildConfiguration(IBuildConfigurat
7674
@Override
7775
public synchronized ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name)
7876
throws CoreException {
79-
ILaunchTargetManager launchTargetManager = Activator.getService(ILaunchTargetManager.class);
8077
if (config.getName().equals(IBuildConfiguration.DEFAULT_CONFIG_NAME)) {
81-
IToolChain toolChain = null;
82-
83-
// try the toolchain for the local target
84-
Map<String, String> properties = new HashMap<>();
85-
properties.put(IToolChain.ATTR_OS, Platform.getOS());
86-
properties.put(IToolChain.ATTR_ARCH, Platform.getOSArch());
87-
IToolChainManager toolChainManager = Activator.getService(IToolChainManager.class);
88-
for (IToolChain tc : toolChainManager.getToolChainsMatching(properties)) {
89-
toolChain = tc;
90-
break;
91-
}
92-
93-
// local didn't work, try and find one that does
94-
if (toolChain == null) {
95-
for (IToolChain tc : toolChainManager.getToolChainsMatching(new HashMap<>())) {
96-
toolChain = tc;
97-
break;
98-
}
99-
}
100-
101-
if (toolChain != null) {
102-
return createCMakeBuildConfiguration(config, name, toolChain, null, "run", //$NON-NLS-1$
103-
launchTargetManager.getLocalLaunchTarget());
104-
} else {
105-
// No valid combinations
106-
return null;
107-
}
78+
/*
79+
* IBuildConfiguration configs with name IBuildConfiguration.DEFAULT_CONFIG_NAME
80+
* are not supported to avoid build output directory being named "default".
81+
*/
82+
return null;
10883
}
10984
CMakeBuildConfiguration cmakeConfig = createCMakeBuildConfiguration(config, name);
11085
ICMakeToolChainFile tcFile = cmakeConfig.getToolChainFile();
@@ -115,6 +90,7 @@ public synchronized ICBuildConfiguration getCBuildConfiguration(IBuildConfigurat
11590
}
11691
if (tcFile != null && !toolChain.equals(tcFile.getToolChain())) {
11792
// toolchain changed
93+
ILaunchTargetManager launchTargetManager = Activator.getService(ILaunchTargetManager.class);
11894
return createCMakeBuildConfiguration(config, name, tcFile.getToolChain(), tcFile,
11995
cmakeConfig.getLaunchMode(), launchTargetManager.getLocalLaunchTarget());
12096
} else {

core/org.eclipse.cdt.core.tests/META-INF/MANIFEST.MF

+5-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ Require-Bundle: org.eclipse.core.resources,
4747
org.eclipse.cdt.debug.core,
4848
org.eclipse.cdt.cmake.core,
4949
org.eclipse.debug.core,
50-
org.eclipse.launchbar.core;bundle-version="[3.0.0,4.0.0)"
50+
org.eclipse.launchbar.core;bundle-version="[3.0.0,4.0.0)",
51+
org.eclipse.cdt.make.core,
52+
org.eclipse.cdt.meson.core,
53+
org.eclipse.cdt.core.autotools.core,
54+
org.mockito.mockito-core
5155
Bundle-ActivationPolicy: lazy
5256
Bundle-Vendor: %providerName
5357
Bundle-RequiredExecutionEnvironment: JavaSE-17

0 commit comments

Comments
 (0)