From c718fb09dba2e3dc9617568a0c667747c998432f Mon Sep 17 00:00:00 2001 From: John Moule Date: Tue, 4 Feb 2025 16:25:23 +0000 Subject: [PATCH] The active Launch Target is now saved in the ICBuildConfiguration In addition to the active launch mode and toolchain, the active Launch Target is now used to determine the Core Build Configuration (ICBuildConfiguration). The build output folder name now ends with the name of the Launch Target (eg: cmake.debug.win32.x86_64.Local) Additionally, API added to allow the ISV to configure the build output folder name. The ICBuildConfigurationProvider implementations, shown below, have been tidied up to use common code. CMakeBuildConfigurationProvider AutotoolsBuildConfigurationProvider MakefileBuildConfigurationProvider MesonBuildConfigurationProvider Addresses Issue: CDT CMake Improvements #1000, IDE-82683-REQ-016 Launch Targets used in ICBuildConfiguration Addresses Issue: CDT CMake Improvements #1000, IDE-82683-REQ-018 Build output folder name --- NewAndNoteworthy/CHANGELOG-API.md | 142 ++++++++++++++++++ .../META-INF/MANIFEST.MF | 3 +- .../core/AutotoolsBuildConfiguration.java | 11 +- .../AutotoolsBuildConfigurationProvider.java | 68 +++------ .../META-INF/MANIFEST.MF | 5 +- .../MakefileBuildConfigurationProvider.java | 60 +++----- .../META-INF/MANIFEST.MF | 3 +- .../meson/core/MesonBuildConfiguration.java | 10 +- .../core/MesonBuildConfigurationProvider.java | 79 ++++------ .../core/CMakeBuildConfigurationTests.java | 26 ++-- .../cmake/core/CMakeBuildConfiguration.java | 9 +- .../core/CMakeBuildConfigurationProvider.java | 100 ++++++------ .../META-INF/MANIFEST.MF | 3 +- .../ExtendedCMakeBuildConfiguration.java | 9 +- ...tendedCMakeBuildConfigurationProvider.java | 12 +- .../META-INF/MANIFEST.MF | 3 +- .../CBuildConfigurationManagerTests.java | 118 +++++++++++++-- .../ICBuildConfigurationProviderTests.java | 130 ++++++++++++++++ ...ConfigurationProviderTestsCMakeNature.java | 21 +++ ...ildConfigurationProviderTestsProvider.java | 32 ++++ core/org.eclipse.cdt.core.tests/plugin.xml | 19 +++ .../org.eclipse.cdt.core/META-INF/MANIFEST.MF | 3 +- .../src/org/eclipse/cdt/core/CCorePlugin.java | 2 +- .../cdt/core/build/CBuildConfigUtils.java | 50 ++++++ .../cdt/core/build/CBuildConfiguration.java | 131 ++++++++++------ .../core/build/ErrorBuildConfiguration.java | 26 ++-- .../cdt/core/build/ICBuildConfiguration.java | 9 +- .../build/ICBuildConfigurationManager.java | 70 ++++----- .../build/ICBuildConfigurationProvider.java | 88 ++++++++--- .../build/StandardBuildConfiguration.java | 10 +- .../build/CBuildConfigurationManager.java | 75 ++++----- .../cdt/internal/core/build/Messages.java | 7 +- .../internal/core/build/messages.properties | 7 +- .../META-INF/MANIFEST.MF | 2 +- .../launch/CoreBuildLaunchBarTracker.java | 31 +++- .../launch/CoreBuildLaunchConfigDelegate.java | 27 +--- .../META-INF/MANIFEST.MF | 2 +- .../ContainerLaunchConfigurationDelegate.java | 5 +- .../META-INF/MANIFEST.MF | 2 +- .../launch/ui/corebuild/CommonBuildTab.java | 3 +- .../META-INF/MANIFEST.MF | 2 +- .../launchbar/core/internal/Messages.java | 1 - .../core/internal/messages.properties | 1 - .../target/LocalLaunchTargetProvider.java | 5 +- .../launchbar/core/target/ILaunchTarget.java | 13 +- .../core/target/ILaunchTargetManager.java | 11 ++ .../core/target/LaunchTargetUtils.java | 48 ++++++ 47 files changed, 1030 insertions(+), 464 deletions(-) create mode 100644 core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTests.java create mode 100644 core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTestsCMakeNature.java create mode 100644 core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTestsProvider.java create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfigUtils.java create mode 100644 launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/LaunchTargetUtils.java diff --git a/NewAndNoteworthy/CHANGELOG-API.md b/NewAndNoteworthy/CHANGELOG-API.md index 0a520f8d9f0..c25302153b7 100644 --- a/NewAndNoteworthy/CHANGELOG-API.md +++ b/NewAndNoteworthy/CHANGELOG-API.md @@ -10,6 +10,148 @@ Below is the detailed descriptions of API changes and mitigation efforts API con ## API Changes in CDT 12.0. +### org.eclipse.cdt.core.build.ICBuildConfigurationProvider + +Renamed method createBuildConfiguration to createCBuildConfiguration, which reflects it purpose of creating a new Core Build configuration. Also added the ILaunchTarget parameter. + +Added method: +* createCBuildConfiguration(IProject, IToolChain, String, ILaunchTarget, IProgressMonitor) + +Removed method: +* createBuildConfiguration(IProject, IToolChain, String, IProgressMonitor) + +Added method allowing extenders to customize the Core Build output directory name. +* getCBuildConfigName(IProject, String, IToolChain, String, ILaunchTarget) + +### org.eclipse.cdt.core.build +Removed method: + +* org.eclipse.cdt.core.build.CBuildConfiguration.setLaunchMode(String) + +### Simplified constructors in org.eclipse.cdt.core.build.CBuildConfiguration + +The following constructors have been removed from CBuildConfiguration: + +* org.eclipse.cdt.core.build.CBuildConfiguration.CBuildConfiguration(IBuildConfiguration, String, IToolChain) +* org.eclipse.cdt.core.build.CBuildConfiguration.CBuildConfiguration(IBuildConfiguration, String, IToolChain, String) +* org.eclipse.cdt.core.build.CBuildConfiguration.CBuildConfiguration(IBuildConfiguration, IToolChain) + +Removing them simplified the API as these constructors were unneeded. + +Instead use: + +* org.eclipse.cdt.core.build.CBuildConfiguration.CBuildConfiguration(IBuildConfiguration, String) +* org.eclipse.cdt.core.build.CBuildConfiguration.CBuildConfiguration(IBuildConfiguration, String, IToolChain, String, ILaunchTarget) + +The documentation on these constructors has been improved. + +### Simplified constructors in org.eclipse.cdt.cmake.core.CMakeBuildConfiguration + +The following constructors have been removed from CMakeBuildConfiguration: + +* org.eclipse.cdt.cmake.core.CMakeBuildConfiguration.CMakeBuildConfiguration(IBuildConfiguration, String, IToolChain) +* org.eclipse.cdt.cmake.core.CMakeBuildConfiguration.CMakeBuildConfiguration(IBuildConfiguration, String, IToolChain, ICMakeToolChainFile, String) + +Instead use: + +* org.eclipse.cdt.cmake.core.CMakeBuildConfiguration.CMakeBuildConfiguration(IBuildConfiguration, String, IToolChain, ICMakeToolChainFile, String, ILaunchTarget) + +### Simplified constructors in org.eclipse.cdt.core.autotools.core.AutotoolsBuildConfiguration + +The following constructors have been removed from AutotoolsBuildConfiguration: +* org.eclipse.cdt.core.autotools.core.AutotoolsBuildConfiguration.AutotoolsBuildConfiguration(IBuildConfiguration, String, IToolChain, String) +* org.eclipse.cdt.core.autotools.core.AutotoolsBuildConfiguration.AutotoolsBuildConfiguration(IBuildConfiguration, String, IToolChain) + +Instead use: + +* org.eclipse.cdt.core.autotools.core.AutotoolsBuildConfiguration.AutotoolsBuildConfiguration(IBuildConfiguration, String, IToolChain, String, ILaunchTarget) + +### Simplified constructors in org.eclipse.cdt.core.build.StandardBuildConfiguration + +The following constructors have been removed from StandardBuildConfiguration: + +* org.eclipse.cdt.core.build.StandardBuildConfiguration.StandardBuildConfiguration(IBuildConfiguration, String, IToolChain, String) + +Instead use: + +* org.eclipse.cdt.core.build.StandardBuildConfiguration.StandardBuildConfiguration(IBuildConfiguration, String, IToolChain, String, ILaunchTarget) + +### Simplified constructors in org.eclipse.cdt.internal.meson.core.MesonBuildConfiguration + +The following constructors have been removed from MesonBuildConfiguration: + +* org.eclipse.cdt.internal.meson.core.MesonBuildConfiguration.MesonBuildConfiguration(IBuildConfiguration, String, IToolChain) + +* org.eclipse.cdt.internal.meson.core.MesonBuildConfiguration.MesonBuildConfiguration(IBuildConfiguration, String, IToolChain, IMesonToolChainFile, String) + +Instead use: + +* org.eclipse.cdt.internal.meson.core.MesonBuildConfiguration.MesonBuildConfiguration(IBuildConfiguration, String, IToolChain, String, ILaunchTarget) + +* org.eclipse.cdt.internal.meson.core.MesonBuildConfiguration.MesonBuildConfiguration(IBuildConfiguration, String, IToolChain, IMesonToolChainFile, String, ILaunchTarget) + +### org.eclipse.cdt.core.build.ICBuildConfiguration + +Added method: + +* org.eclipse.cdt.core.build.ICBuildConfiguration.getLaunchTarget() + +### org.eclipse.cdt.core.build.ICBuildConfigurationManager + +The documentation has been improved. + +Added method: + +* org.eclipse.cdt.core.build.ICBuildConfigurationManager.getBuildConfiguration(IProject, IToolChain, String, ILaunchTarget, IProgressMonitor) + +Removed method: + +* org.eclipse.cdt.core.build.ICBuildConfigurationManager.getBuildConfiguration(IProject, IToolChain, String, IProgressMonitor) + +* org.eclipse.cdt.core.build.ICBuildConfigurationManager.getBuildConfiguration(IProject, Map, String, IProgressMonitor) + +### org.eclipse.cdt.debug.core.launch.CoreBuildLaunchConfigDelegate + +Removed deprecated method: + +* org.eclipse.cdt.debug.core.launch.CoreBuildLaunchConfigDelegate.getBuildConfiguration(IProject, String, ILaunchTarget, IProgressMonitor) + +### org.eclipse.launchbar.core.target.ILaunchTarget + +Removed deprecated method: + +* org.eclipse.launchbar.core.target.ILaunchTarget.getName() + +### org.eclipse.launchbar.core.target.ILaunchTargetManager + +Added method: + +* org.eclipse.launchbar.core.target.ILaunchTargetManager.getLocalLaunchTarget() + +Added field: + +* org.eclipse.launchbar.core.target.ILaunchTargetManager.localLaunchTargetId + +### org.eclipse.launchbar.core.target.LaunchTargetUtils + +Added methods that can be used to check/fix the Launch Target name: + +* org.eclipse.launchbar.core.target.LaunchTargetUtils.isInvalidName(String) +* org.eclipse.launchbar.core.target.LaunchTargetUtils.sanitizeName(String) + +### org.eclipse.cdt.debug.core +- Version bumped to 9.0.0 +- Removed method (already deprecated): + - org.eclipse.cdt.debug.core.launch.CoreBuildLaunchConfigDelegate.getBuildConfiguration(IProject, String, ILaunchTarget, IProgressMonitor) + +### org.eclipse.launchbar.core.target +- Added method: + - org.eclipse.launchbar.core.target.ILaunchTargetManager.getLocalLaunchTarget() +- Added field: + - org.eclipse.launchbar.core.target.ILaunchTargetManager.localLaunchTargetId +- Added class: + - org.eclipse.launchbar.core.target.LaunchTargetUtils + ### org.eclipse.cdt.cmake.core.properties refactored A significant simplification to the CMake build properties was completed, this included removing some API that was not used. diff --git a/build/org.eclipse.cdt.core.autotools.core/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.core.autotools.core/META-INF/MANIFEST.MF index e9558add533..6b880a93b36 100644 --- a/build/org.eclipse.cdt.core.autotools.core/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.core.autotools.core/META-INF/MANIFEST.MF @@ -8,7 +8,8 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.tools.templates.core;bundle-version="2.0.0", org.eclipse.tools.templates.freemarker;bundle-version="2.0.0", org.eclipse.cdt.core;bundle-version="6.3.1", - org.eclipse.core.resources;bundle-version="3.12.0" + org.eclipse.core.resources;bundle-version="3.12.0", + org.eclipse.launchbar.core;bundle-version="[3.0.0,4.0.0)" Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy Bundle-Vendor: %providerName diff --git a/build/org.eclipse.cdt.core.autotools.core/src/org/eclipse/cdt/core/autotools/core/AutotoolsBuildConfiguration.java b/build/org.eclipse.cdt.core.autotools.core/src/org/eclipse/cdt/core/autotools/core/AutotoolsBuildConfiguration.java index bdd6d920db3..fe0bda67873 100644 --- a/build/org.eclipse.cdt.core.autotools.core/src/org/eclipse/cdt/core/autotools/core/AutotoolsBuildConfiguration.java +++ b/build/org.eclipse.cdt.core.autotools.core/src/org/eclipse/cdt/core/autotools/core/AutotoolsBuildConfiguration.java @@ -34,6 +34,7 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Status; +import org.eclipse.launchbar.core.target.ILaunchTarget; public class AutotoolsBuildConfiguration extends CBuildConfiguration { @@ -46,13 +47,9 @@ public class AutotoolsBuildConfiguration extends CBuildConfiguration { super(config, name); } - public AutotoolsBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) { - super(config, name, toolChain, "run"); // TODO: why "run" //$NON-NLS-1$ - } - - public AutotoolsBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, - String launchMode) { - super(config, name, toolChain, launchMode); + public AutotoolsBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, String launchMode, + ILaunchTarget launchTarget) throws CoreException { + super(config, name, toolChain, launchMode, launchTarget); } @Override diff --git a/build/org.eclipse.cdt.core.autotools.core/src/org/eclipse/cdt/core/autotools/core/AutotoolsBuildConfigurationProvider.java b/build/org.eclipse.cdt.core.autotools.core/src/org/eclipse/cdt/core/autotools/core/AutotoolsBuildConfigurationProvider.java index ae2a48d7780..2d157d5f71e 100644 --- a/build/org.eclipse.cdt.core.autotools.core/src/org/eclipse/cdt/core/autotools/core/AutotoolsBuildConfigurationProvider.java +++ b/build/org.eclipse.cdt.core.autotools.core/src/org/eclipse/cdt/core/autotools/core/AutotoolsBuildConfigurationProvider.java @@ -18,6 +18,7 @@ import java.util.HashMap; import java.util.Map; import org.eclipse.cdt.core.autotools.core.internal.Activator; +import org.eclipse.cdt.core.build.CBuildConfigUtils; import org.eclipse.cdt.core.build.ICBuildConfiguration; import org.eclipse.cdt.core.build.ICBuildConfigurationManager; import org.eclipse.cdt.core.build.ICBuildConfigurationProvider; @@ -28,12 +29,14 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; +import org.eclipse.launchbar.core.target.ILaunchTarget; +import org.eclipse.launchbar.core.target.ILaunchTargetManager; public class AutotoolsBuildConfigurationProvider implements ICBuildConfigurationProvider { public static final String ID = Activator.PLUGIN_ID + ".provider"; //$NON-NLS-1$ - private ICBuildConfigurationManager configManager = Activator.getService(ICBuildConfigurationManager.class); + private final ILaunchTargetManager launchTargetManager = Activator.getService(ILaunchTargetManager.class); @Override public String getId() { @@ -64,7 +67,8 @@ public class AutotoolsBuildConfigurationProvider implements ICBuildConfiguration } if (toolChain != null) { - return new AutotoolsBuildConfiguration(config, name, toolChain); + return new AutotoolsBuildConfiguration(config, name, toolChain, "run", //$NON-NLS-1$ + launchTargetManager.getLocalLaunchTarget()); } // No valid combinations return null; @@ -79,53 +83,23 @@ public class AutotoolsBuildConfigurationProvider implements ICBuildConfiguration } @Override - public ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, - IProgressMonitor monitor) throws CoreException { - // get matching toolchain file if any - Map properties = new HashMap<>(); - String os = toolChain.getProperty(IToolChain.ATTR_OS); - if (os != null && !os.isEmpty()) { - properties.put(IToolChain.ATTR_OS, os); - } - String arch = toolChain.getProperty(IToolChain.ATTR_ARCH); - if (arch != null && !arch.isEmpty()) { - properties.put(IToolChain.ATTR_ARCH, arch); - } + public ICBuildConfiguration createCBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, + ILaunchTarget launchTarget, IProgressMonitor monitor) throws CoreException { + // Compute name to use for ICBuildConfiguration + String cBuildConfigName = getCBuildConfigName(project, "autotools", toolChain, launchMode, launchTarget); //$NON-NLS-1$ - // create config - StringBuilder configName = new StringBuilder("autotools."); //$NON-NLS-1$ - configName.append(launchMode); - if ("linux-container".equals(os)) { //$NON-NLS-1$ - String osConfigName = toolChain.getProperty("linux-container-id"); //$NON-NLS-1$ - osConfigName = osConfigName.replaceAll("/", "_"); //$NON-NLS-1$ //$NON-NLS-2$ - configName.append('.'); - configName.append(osConfigName); - } else { - if (os != null) { - configName.append('.'); - configName.append(os); - } - if (arch != null && !arch.isEmpty()) { - configName.append('.'); - configName.append(arch); - } - } - String name = configName.toString(); - IBuildConfiguration config = null; - // reuse any IBuildConfiguration with the same name for the project - // so adding the CBuildConfiguration will override the old one stored - // by the CBuildConfigurationManager - if (configManager.hasConfiguration(this, project, name)) { - config = project.getBuildConfig(this.getId() + '/' + name); - } - if (config == null) { - config = configManager.createBuildConfiguration(this, project, name, monitor); - } + // Create Platform Build configuration + ICBuildConfigurationManager cBuildConfigManager = Activator.getService(ICBuildConfigurationManager.class); + IBuildConfiguration buildConfig = CBuildConfigUtils.createBuildConfiguration(this, project, cBuildConfigName, + cBuildConfigManager, monitor); - AutotoolsBuildConfiguration autotoolsConfig = new AutotoolsBuildConfiguration(config, name, toolChain, - launchMode); - configManager.addBuildConfiguration(config, autotoolsConfig); - return autotoolsConfig; + // Create Core Build configuration + ICBuildConfiguration cBuildConfig = new AutotoolsBuildConfiguration(buildConfig, cBuildConfigName, toolChain, + launchMode, launchTarget); + + // Add the Platform Build/Core Build configuration combination + cBuildConfigManager.addBuildConfiguration(buildConfig, cBuildConfig); + return cBuildConfig; } } diff --git a/build/org.eclipse.cdt.make.core/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.make.core/META-INF/MANIFEST.MF index d853c0fd021..16720f50430 100644 --- a/build/org.eclipse.cdt.make.core/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.make.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.make.core; singleton:=true -Bundle-Version: 7.6.600.qualifier +Bundle-Version: 8.0.0.qualifier Bundle-Activator: org.eclipse.cdt.make.core.MakeCorePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin @@ -26,7 +26,8 @@ Require-Bundle: org.eclipse.cdt.core;bundle-version="[9.0.0,10.0.0)", org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)", org.eclipse.core.filesystem;bundle-version="1.2.0", org.eclipse.tools.templates.core;bundle-version="2.0.0", - org.eclipse.tools.templates.freemarker;bundle-version="2.0.0" + org.eclipse.tools.templates.freemarker;bundle-version="2.0.0", + org.eclipse.launchbar.core;bundle-version="[3.0.0,4.0.0)" Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-17 Automatic-Module-Name: org.eclipse.cdt.make.core diff --git a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakefileBuildConfigurationProvider.java b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakefileBuildConfigurationProvider.java index 64c34e34c2d..a05fbf7f107 100644 --- a/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakefileBuildConfigurationProvider.java +++ b/build/org.eclipse.cdt.make.core/src/org/eclipse/cdt/make/core/MakefileBuildConfigurationProvider.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.make.core; import java.util.HashMap; import java.util.Map; +import org.eclipse.cdt.core.build.CBuildConfigUtils; import org.eclipse.cdt.core.build.ICBuildConfiguration; import org.eclipse.cdt.core.build.ICBuildConfigurationManager; import org.eclipse.cdt.core.build.ICBuildConfigurationProvider; @@ -24,6 +25,8 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; +import org.eclipse.launchbar.core.target.ILaunchTarget; +import org.eclipse.launchbar.core.target.ILaunchTargetManager; /** * @since 7.4 @@ -31,6 +34,7 @@ import org.eclipse.core.runtime.Platform; public class MakefileBuildConfigurationProvider implements ICBuildConfigurationProvider { public static final String ID = "org.eclipse.cdt.make.core.provider"; //$NON-NLS-1$ + private final ILaunchTargetManager launchTargetManager = MakeCorePlugin.getService(ILaunchTargetManager.class); @Override public String getId() { @@ -61,7 +65,8 @@ public class MakefileBuildConfigurationProvider implements ICBuildConfigurationP } if (toolChain != null) { - return new StandardBuildConfiguration(config, name, toolChain, "run"); //$NON-NLS-1$ + return new StandardBuildConfiguration(config, name, toolChain, "run", //$NON-NLS-1$ + launchTargetManager.getLocalLaunchTarget()); } else { // No valid combinations return null; @@ -71,43 +76,22 @@ public class MakefileBuildConfigurationProvider implements ICBuildConfigurationP } @Override - public ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, - IProgressMonitor monitor) throws CoreException { - ICBuildConfigurationManager configManager = MakeCorePlugin.getService(ICBuildConfigurationManager.class); + public ICBuildConfiguration createCBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, + ILaunchTarget launchTarget, IProgressMonitor monitor) throws CoreException { + // Compute name to use for ICBuildConfiguration + String cBuildConfigName = getCBuildConfigName(project, "make", toolChain, launchMode, launchTarget); //$NON-NLS-1$ - StringBuilder configName = new StringBuilder("make."); //$NON-NLS-1$ - configName.append(launchMode); - String os = toolChain.getProperty(IToolChain.ATTR_OS); - if ("linux-container".equals(os)) { //$NON-NLS-1$ - String osConfigName = toolChain.getProperty("linux-container-id"); //$NON-NLS-1$ - osConfigName = osConfigName.replaceAll("/", "_"); //$NON-NLS-1$ //$NON-NLS-2$ - configName.append('.'); - configName.append(osConfigName); - } else { - if (os != null) { - configName.append('.'); - configName.append(os); - } - String arch = toolChain.getProperty(IToolChain.ATTR_ARCH); - if (arch != null && !arch.isEmpty()) { - configName.append('.'); - configName.append(arch); - } - } - String name = configName.toString(); - IBuildConfiguration config = null; - // reuse any IBuildConfiguration with the same name for the project - // so adding the CBuildConfiguration will override the old one stored - // by the CBuildConfigurationManager - if (configManager.hasConfiguration(this, project, name)) { - config = project.getBuildConfig(this.getId() + '/' + name); - } - if (config == null) { - config = configManager.createBuildConfiguration(this, project, name, monitor); - } - StandardBuildConfiguration makeConfig = new StandardBuildConfiguration(config, name, toolChain, launchMode); - configManager.addBuildConfiguration(config, makeConfig); - return makeConfig; + // Create Platform Build configuration + ICBuildConfigurationManager cBuildConfigManager = MakeCorePlugin.getService(ICBuildConfigurationManager.class); + IBuildConfiguration buildConfig = CBuildConfigUtils.createBuildConfiguration(this, project, cBuildConfigName, + cBuildConfigManager, monitor); + + // Create Core Build configuration + ICBuildConfiguration cBuildConfig = new StandardBuildConfiguration(buildConfig, cBuildConfigName, toolChain, + launchMode, launchTarget); + + // Add the Platform Build/Core Build configuration combination + cBuildConfigManager.addBuildConfiguration(buildConfig, cBuildConfig); + return cBuildConfig; } - } diff --git a/build/org.eclipse.cdt.meson.core/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.meson.core/META-INF/MANIFEST.MF index 8d0ff8b2f15..7ac50da975a 100644 --- a/build/org.eclipse.cdt.meson.core/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.meson.core/META-INF/MANIFEST.MF @@ -9,7 +9,8 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.core.resources, org.eclipse.cdt.core;bundle-version="6.4.0", org.eclipse.tools.templates.core;bundle-version="2.0.0", - org.eclipse.tools.templates.freemarker;bundle-version="2.0.0" + org.eclipse.tools.templates.freemarker;bundle-version="2.0.0", + org.eclipse.launchbar.core;bundle-version="[3.0.0,4.0.0)" Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy Bundle-Localization: plugin diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfiguration.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfiguration.java index d133cbd0456..c5890be4f7b 100644 --- a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfiguration.java +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfiguration.java @@ -43,6 +43,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; +import org.eclipse.launchbar.core.target.ILaunchTarget; import org.osgi.service.prefs.BackingStoreException; import org.osgi.service.prefs.Preferences; @@ -71,13 +72,14 @@ public class MesonBuildConfiguration extends CBuildConfiguration { } } - public MesonBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) { - this(config, name, toolChain, null, "run"); //$NON-NLS-1$ + public MesonBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, String launchMode, + ILaunchTarget launchTarget) throws CoreException { + this(config, name, toolChain, null, launchMode, launchTarget); } public MesonBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, - IMesonToolChainFile toolChainFile, String launchMode) { - super(config, name, toolChain, launchMode); + IMesonToolChainFile toolChainFile, String launchMode, ILaunchTarget launchTarget) throws CoreException { + super(config, name, toolChain, launchMode, launchTarget); this.toolChainFile = toolChainFile; if (toolChainFile != null) { diff --git a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfigurationProvider.java b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfigurationProvider.java index 87959aa19b3..e54025f3358 100644 --- a/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfigurationProvider.java +++ b/build/org.eclipse.cdt.meson.core/src/org/eclipse/cdt/internal/meson/core/MesonBuildConfigurationProvider.java @@ -17,6 +17,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; +import org.eclipse.cdt.core.build.CBuildConfigUtils; import org.eclipse.cdt.core.build.ICBuildConfiguration; import org.eclipse.cdt.core.build.ICBuildConfigurationManager; import org.eclipse.cdt.core.build.ICBuildConfigurationProvider; @@ -30,13 +31,14 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; +import org.eclipse.launchbar.core.target.ILaunchTarget; +import org.eclipse.launchbar.core.target.ILaunchTargetManager; public class MesonBuildConfigurationProvider implements ICBuildConfigurationProvider { public static final String ID = "org.eclipse.cdt.meson.core.provider"; //$NON-NLS-1$ - + private final static ILaunchTargetManager launchTargetManager = Activator.getService(ILaunchTargetManager.class); private IMesonToolChainManager manager = Activator.getService(IMesonToolChainManager.class); - private ICBuildConfigurationManager configManager = Activator.getService(ICBuildConfigurationManager.class); @Override public String getId() { @@ -68,7 +70,8 @@ public class MesonBuildConfigurationProvider implements ICBuildConfigurationProv } if (toolChain != null) { - return new MesonBuildConfiguration(config, name, toolChain); + return new MesonBuildConfiguration(config, name, toolChain, "run", //$NON-NLS-1$ + launchTargetManager.getLocalLaunchTarget()); } // No valid combinations return null; @@ -82,27 +85,27 @@ public class MesonBuildConfigurationProvider implements ICBuildConfigurationProv } if (tcFile != null && !toolChain.equals(tcFile.getToolChain())) { // toolchain changed - return new MesonBuildConfiguration(config, name, tcFile.getToolChain(), tcFile, - mesonConfig.getLaunchMode()); + return new MesonBuildConfiguration(config, name, tcFile.getToolChain(), tcFile, mesonConfig.getLaunchMode(), + launchTargetManager.getLocalLaunchTarget()); } return mesonConfig; } @Override - public ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, - IProgressMonitor monitor) throws CoreException { + public ICBuildConfiguration createCBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, + ILaunchTarget launchTarget, IProgressMonitor monitor) throws CoreException { // get matching toolchain file if any - Map properties = new HashMap<>(); - String os = toolChain.getProperty(IToolChain.ATTR_OS); - if (os != null && !os.isEmpty()) { - properties.put(IToolChain.ATTR_OS, os); - } - String arch = toolChain.getProperty(IToolChain.ATTR_ARCH); - if (arch != null && !arch.isEmpty()) { - properties.put(IToolChain.ATTR_ARCH, arch); - } IMesonToolChainFile file = manager.getToolChainFileFor(toolChain); if (file == null) { + Map properties = new HashMap<>(); + String os = toolChain.getProperty(IToolChain.ATTR_OS); + if (os != null && !os.isEmpty()) { + properties.put(IToolChain.ATTR_OS, os); + } + String arch = toolChain.getProperty(IToolChain.ATTR_ARCH); + if (arch != null && !arch.isEmpty()) { + properties.put(IToolChain.ATTR_ARCH, arch); + } Collection files = manager.getToolChainFilesMatching(properties); if (!files.isEmpty()) { file = files.iterator().next(); @@ -110,39 +113,19 @@ public class MesonBuildConfigurationProvider implements ICBuildConfigurationProv } } - // create config - StringBuilder configName = new StringBuilder("meson."); //$NON-NLS-1$ - configName.append(launchMode); - if ("linux-container".equals(os)) { //$NON-NLS-1$ - String osConfigName = toolChain.getProperty("linux-container-id"); //$NON-NLS-1$ - osConfigName = osConfigName.replaceAll("/", "_"); //$NON-NLS-1$ //$NON-NLS-2$ - configName.append('.'); - configName.append(osConfigName); - } else { - if (os != null) { - configName.append('.'); - configName.append(os); - } - if (arch != null && !arch.isEmpty()) { - configName.append('.'); - configName.append(arch); - } - } - String name = configName.toString(); - IBuildConfiguration config = null; - // reuse any IBuildConfiguration with the same name for the project - // so adding the CBuildConfiguration will override the old one stored - // by the CBuildConfigurationManager - if (configManager.hasConfiguration(this, project, name)) { - config = project.getBuildConfig(this.getId() + '/' + name); - } - if (config == null) { - config = configManager.createBuildConfiguration(this, project, name, monitor); - } + // Compute name to use for ICBuildConfiguration + String cBuildConfigName = getCBuildConfigName(project, "meson", toolChain, launchMode, launchTarget); //$NON-NLS-1$ - MesonBuildConfiguration mesonConfig = new MesonBuildConfiguration(config, name, toolChain, file, launchMode); - configManager.addBuildConfiguration(config, mesonConfig); - return mesonConfig; + // Create Platform Build configuration + ICBuildConfigurationManager cBuildConfigManager = Activator.getService(ICBuildConfigurationManager.class); + IBuildConfiguration buildConfig = CBuildConfigUtils.createBuildConfiguration(this, project, cBuildConfigName, + cBuildConfigManager, monitor); + + // Create Core Build configuration + ICBuildConfiguration cBuildConfig = new MesonBuildConfiguration(buildConfig, cBuildConfigName, toolChain, file, + launchMode, launchTarget); + cBuildConfigManager.addBuildConfiguration(buildConfig, cBuildConfig); + return cBuildConfig; } } diff --git a/cmake/org.eclipse.cdt.cmake.core.tests/src/org/eclipse/cdt/cmake/core/CMakeBuildConfigurationTests.java b/cmake/org.eclipse.cdt.cmake.core.tests/src/org/eclipse/cdt/cmake/core/CMakeBuildConfigurationTests.java index 7c949fb82e2..051c3762e5b 100644 --- a/cmake/org.eclipse.cdt.cmake.core.tests/src/org/eclipse/cdt/cmake/core/CMakeBuildConfigurationTests.java +++ b/cmake/org.eclipse.cdt.cmake.core.tests/src/org/eclipse/cdt/cmake/core/CMakeBuildConfigurationTests.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.eclipse.cdt.cmake.core.internal.Activator; import org.eclipse.cdt.cmake.core.properties.CMakeGenerator; import org.eclipse.cdt.cmake.core.properties.ICMakeGenerator; import org.eclipse.cdt.cmake.core.properties.ICMakeProperties; @@ -34,6 +35,8 @@ import org.eclipse.cdt.utils.CommandLineUtil; import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.launchbar.core.target.ILaunchTarget; +import org.eclipse.launchbar.core.target.ILaunchTargetManager; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -42,6 +45,10 @@ import org.junit.jupiter.api.Test; * See the new interface {@link ICMakeBuildConfiguration}. */ public class CMakeBuildConfigurationTests extends BaseTestCase5 { + private static final String LAUNCH_MODE = "run"; + private static final ILaunchTarget LOCAL_LAUNCH_TARGET = Activator.getService(ILaunchTargetManager.class) + .getLocalLaunchTarget(); + private IBuildConfiguration buildConfig; private IToolChain mockToolchain; @@ -68,7 +75,7 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 { @Test public void getCMakePropertiesTestSetGenerator() throws Exception { CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", - mockToolchain) { + mockToolchain, null, LAUNCH_MODE, LOCAL_LAUNCH_TARGET) { @Override public ICMakeProperties getCMakeProperties() { @@ -80,6 +87,7 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 { // Call the new method on ICMakeBuildConfiguration to get the default CMake properties. ICMakeProperties cMakeProperties = cmBuildConfig.getCMakeProperties(); + assertThat(cMakeProperties.getGenerator(), is(CMakeGenerator.WatcomWMake)); } @@ -92,7 +100,7 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 { public void getCMakePropertiesTestSetExtraArguments() throws Exception { // Create a C Build Configuration using the default build config and an arbitrary name CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", - mockToolchain) { + mockToolchain, null, LAUNCH_MODE, LOCAL_LAUNCH_TARGET) { @Override public ICMakeProperties getCMakeProperties() { @@ -115,7 +123,7 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 { public void getDefaultProperties() throws Exception { // Create a C Build Configuration using the default build config and an arbitrary name CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", - mockToolchain) { + mockToolchain, null, LAUNCH_MODE, LOCAL_LAUNCH_TARGET) { @Override public Map getDefaultProperties() { @@ -133,7 +141,7 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 { public void getDefaultPropertiesTestExtraArgs() throws Exception { // Create a C Build Configuration using the default build config and an arbitrary name CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", - mockToolchain) { + mockToolchain, null, LAUNCH_MODE, LOCAL_LAUNCH_TARGET) { @Override public Map getDefaultProperties() { var defs = new HashMap<>(super.getDefaultProperties()); @@ -154,7 +162,7 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 { public void customCMakeGeneratorEntryAuto() throws Exception { // Create a C Build Configuration using the default build config and an arbitrary name CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", - mockToolchain) { + mockToolchain, null, LAUNCH_MODE, LOCAL_LAUNCH_TARGET) { @Override public Map getDefaultProperties() { var defs = new HashMap<>(super.getDefaultProperties()); @@ -178,7 +186,7 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 { public void customCMakeGeneratorEntryManual() throws Exception { // Create a C Build Configuration using the default build config and an arbitrary name CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", - mockToolchain) { + mockToolchain, null, LAUNCH_MODE, LOCAL_LAUNCH_TARGET) { @Override public Map getDefaultProperties() { var defs = new HashMap<>(super.getDefaultProperties()); @@ -227,7 +235,7 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 { public void targetsAndCommandDefaults() throws Exception { // Create a C Build Configuration using the default build config and an arbitrary name CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", - mockToolchain); + mockToolchain, null, LAUNCH_MODE, LOCAL_LAUNCH_TARGET); // Call the new method on ICMakeBuildConfiguration to get the default CMake properties. ICMakeProperties cMakeProperties = cmBuildConfig.getCMakeProperties(); @@ -243,7 +251,7 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 { public void targetsAndCommand() throws Exception { // Create a C Build Configuration using the default build config and an arbitrary name CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", - mockToolchain) { + mockToolchain, null, LAUNCH_MODE, LOCAL_LAUNCH_TARGET) { @Override public Map getDefaultProperties() { var defs = new HashMap<>(super.getDefaultProperties()); @@ -271,7 +279,7 @@ public class CMakeBuildConfigurationTests extends BaseTestCase5 { public void extraArgumentsParseCorrectly() throws Exception { // Create a C Build Configuration using the default build config and an arbitrary name CMakeBuildConfiguration cmBuildConfig = new CMakeBuildConfiguration(buildConfig, "cmBuildConfigName", - mockToolchain) { + mockToolchain, null, LAUNCH_MODE, LOCAL_LAUNCH_TARGET) { @Override public Map getDefaultProperties() { var defs = new HashMap<>(super.getDefaultProperties()); diff --git a/cmake/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/CMakeBuildConfiguration.java b/cmake/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/CMakeBuildConfiguration.java index f25f5ad293b..7a4d63a5322 100644 --- a/cmake/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/CMakeBuildConfiguration.java +++ b/cmake/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/CMakeBuildConfiguration.java @@ -64,6 +64,7 @@ import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.launchbar.core.target.ILaunchTarget; /** * @since 2.0 @@ -91,13 +92,9 @@ public class CMakeBuildConfiguration extends CBuildConfiguration implements ICMa toolChainFile = manager.getToolChainFileFor(getToolChain()); } - public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) { - this(config, name, toolChain, null, "run"); //$NON-NLS-1$ - } - public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, - ICMakeToolChainFile toolChainFile, String launchMode) { - super(config, name, toolChain, launchMode); + ICMakeToolChainFile toolChainFile, String launchMode, ILaunchTarget launchTarget) { + super(config, name, toolChain, launchMode, launchTarget); this.toolChainFile = toolChainFile; } diff --git a/cmake/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/CMakeBuildConfigurationProvider.java b/cmake/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/CMakeBuildConfigurationProvider.java index 2ddb20cbe92..afcac256b9a 100644 --- a/cmake/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/CMakeBuildConfigurationProvider.java +++ b/cmake/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/CMakeBuildConfigurationProvider.java @@ -15,6 +15,8 @@ import java.util.HashMap; import java.util.Map; import org.eclipse.cdt.cmake.core.internal.Activator; +import org.eclipse.cdt.core.build.CBuildConfigUtils; +import org.eclipse.cdt.core.build.CBuildConfiguration; import org.eclipse.cdt.core.build.ICBuildConfiguration; import org.eclipse.cdt.core.build.ICBuildConfigurationManager; import org.eclipse.cdt.core.build.ICBuildConfigurationProvider; @@ -25,6 +27,8 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; +import org.eclipse.launchbar.core.target.ILaunchTarget; +import org.eclipse.launchbar.core.target.ILaunchTargetManager; /** * A ICBuildConfigurationProvider specialized for CMake @@ -40,9 +44,6 @@ public class CMakeBuildConfigurationProvider implements ICBuildConfigurationProv public static final String ID = "org.eclipse.cdt.cmake.core.provider"; //$NON-NLS-1$ - private ICMakeToolChainManager manager = Activator.getService(ICMakeToolChainManager.class); - private ICBuildConfigurationManager configManager = Activator.getService(ICBuildConfigurationManager.class); - @Override public String getId() { return ID; @@ -50,6 +51,9 @@ public class CMakeBuildConfigurationProvider implements ICBuildConfigurationProv /** * Extenders should override this method to construct their specialized build configuration. + * + * @see {@link CBuildConfiguration#CBuildConfiguration(IBuildConfiguration, String)} for common documentation on + * parameters. */ protected CMakeBuildConfiguration createCMakeBuildConfiguration(IBuildConfiguration config, String name) throws CoreException { @@ -58,23 +62,21 @@ public class CMakeBuildConfigurationProvider implements ICBuildConfigurationProv /** * Extenders should override this method to construct their specialized build configuration. + * + * @param toolChainFile CMake toolchain file to associate with this CMakeBuildConfiguration. May be null. + * + * @see {@link CBuildConfiguration#CBuildConfiguration(IBuildConfiguration, String, IToolChain, String, ILaunchTarget)} + * for common documentation on other parameters. */ protected CMakeBuildConfiguration createCMakeBuildConfiguration(IBuildConfiguration config, String name, - IToolChain toolChain) { - return new CMakeBuildConfiguration(config, name, toolChain); - } - - /** - * Extenders should override this method to construct their specialized build configuration. - */ - protected CMakeBuildConfiguration createCMakeBuildConfiguration(IBuildConfiguration config, String name, - IToolChain toolChain, ICMakeToolChainFile toolChainFile, String launchMode) { - return new CMakeBuildConfiguration(config, name, toolChain, toolChainFile, launchMode); + IToolChain toolChain, ICMakeToolChainFile toolChainFile, String launchMode, ILaunchTarget launchTarget) { + return new CMakeBuildConfiguration(config, name, toolChain, toolChainFile, launchMode, launchTarget); } @Override public synchronized ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name) throws CoreException { + ILaunchTargetManager launchTargetManager = Activator.getService(ILaunchTargetManager.class); if (config.getName().equals(IBuildConfiguration.DEFAULT_CONFIG_NAME)) { IToolChain toolChain = null; @@ -97,7 +99,8 @@ public class CMakeBuildConfigurationProvider implements ICBuildConfigurationProv } if (toolChain != null) { - return createCMakeBuildConfiguration(config, name, toolChain); + return createCMakeBuildConfiguration(config, name, toolChain, null, "run", //$NON-NLS-1$ + launchTargetManager.getLocalLaunchTarget()); } else { // No valid combinations return null; @@ -113,63 +116,48 @@ public class CMakeBuildConfigurationProvider implements ICBuildConfigurationProv if (tcFile != null && !toolChain.equals(tcFile.getToolChain())) { // toolchain changed return createCMakeBuildConfiguration(config, name, tcFile.getToolChain(), tcFile, - cmakeConfig.getLaunchMode()); + cmakeConfig.getLaunchMode(), launchTargetManager.getLocalLaunchTarget()); } else { return cmakeConfig; } } @Override - public ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, - IProgressMonitor monitor) throws CoreException { + public ICBuildConfiguration createCBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, + ILaunchTarget launchTarget, IProgressMonitor monitor) throws CoreException { // get matching toolchain file if any - Map properties = new HashMap<>(); - String os = toolChain.getProperty(IToolChain.ATTR_OS); - if (os != null && !os.isEmpty()) { - properties.put(IToolChain.ATTR_OS, os); - } - String arch = toolChain.getProperty(IToolChain.ATTR_ARCH); - if (arch != null && !arch.isEmpty()) { - properties.put(IToolChain.ATTR_ARCH, arch); - } + ICMakeToolChainManager manager = Activator.getService(ICMakeToolChainManager.class); ICMakeToolChainFile file = manager.getToolChainFileFor(toolChain); if (file == null) { + Map properties = new HashMap<>(); + String os = toolChain.getProperty(IToolChain.ATTR_OS); + if (os != null && !os.isEmpty()) { + properties.put(IToolChain.ATTR_OS, os); + } + String arch = toolChain.getProperty(IToolChain.ATTR_ARCH); + if (arch != null && !arch.isEmpty()) { + properties.put(IToolChain.ATTR_ARCH, arch); + } Collection files = manager.getToolChainFilesMatching(properties); if (!files.isEmpty()) { file = files.iterator().next(); } } - // create config - StringBuilder configName = new StringBuilder("cmake."); //$NON-NLS-1$ - configName.append(launchMode); - if ("linux-container".equals(os)) { //$NON-NLS-1$ - String osConfigName = toolChain.getProperty("linux-container-id"); //$NON-NLS-1$ - osConfigName = osConfigName.replaceAll("/", "_"); //$NON-NLS-1$ //$NON-NLS-2$ - configName.append('.'); - configName.append(osConfigName); - } else { - String fragment = toolChain.getBuildConfigNameFragment(); - if (fragment != null && !fragment.isEmpty()) { - configName.append('.'); - configName.append(fragment); - } - } - String name = configName.toString(); - IBuildConfiguration config = null; - // reuse any IBuildConfiguration with the same name for the project - // so adding the CBuildConfiguration will override the old one stored - // by the CBuildConfigurationManager - if (configManager.hasConfiguration(this, project, name)) { - config = project.getBuildConfig(this.getId() + '/' + name); - } - if (config == null) { - config = configManager.createBuildConfiguration(this, project, name, monitor); - } + // Compute name to use for ICBuildConfiguration + String cBuildConfigName = getCBuildConfigName(project, "cmake", toolChain, launchMode, launchTarget); //$NON-NLS-1$ - CMakeBuildConfiguration cmakeConfig = createCMakeBuildConfiguration(config, name, toolChain, file, launchMode); - configManager.addBuildConfiguration(config, cmakeConfig); - return cmakeConfig; + // Create Platform Build configuration + ICBuildConfigurationManager cBuildConfigManager = Activator.getService(ICBuildConfigurationManager.class); + IBuildConfiguration buildConfig = CBuildConfigUtils.createBuildConfiguration(this, project, cBuildConfigName, + cBuildConfigManager, monitor); + + // Create Core Build configuration + ICBuildConfiguration cBuildConfig = createCMakeBuildConfiguration(buildConfig, cBuildConfigName, toolChain, + file, launchMode, launchTarget); + + // Add the Platform Build/Core Build configuration combination + cBuildConfigManager.addBuildConfiguration(buildConfig, cBuildConfig); + return cBuildConfig; } - } diff --git a/cmake/org.eclipse.cdt.cmake.example/META-INF/MANIFEST.MF b/cmake/org.eclipse.cdt.cmake.example/META-INF/MANIFEST.MF index 330d818fb2b..8a8d68496a1 100644 --- a/cmake/org.eclipse.cdt.cmake.example/META-INF/MANIFEST.MF +++ b/cmake/org.eclipse.cdt.cmake.example/META-INF/MANIFEST.MF @@ -16,7 +16,8 @@ Require-Bundle: org.eclipse.cdt.cmake.core, org.eclipse.tools.templates.ui, org.eclipse.tools.templates.freemarker, org.eclipse.ui, - org.eclipse.ui.ide + org.eclipse.ui.ide, + org.eclipse.launchbar.core;bundle-version="[3.0.0,4.0.0)" Import-Package: freemarker.template;version="[2.3.22,3.0.0)" Automatic-Module-Name: org.eclipse.cdt.cmake.example Bundle-Localization: plugin diff --git a/cmake/org.eclipse.cdt.cmake.example/src/org/eclipse/cdt/cmake/example/ExtendedCMakeBuildConfiguration.java b/cmake/org.eclipse.cdt.cmake.example/src/org/eclipse/cdt/cmake/example/ExtendedCMakeBuildConfiguration.java index fccef89ddf7..4831bd8aaad 100644 --- a/cmake/org.eclipse.cdt.cmake.example/src/org/eclipse/cdt/cmake/example/ExtendedCMakeBuildConfiguration.java +++ b/cmake/org.eclipse.cdt.cmake.example/src/org/eclipse/cdt/cmake/example/ExtendedCMakeBuildConfiguration.java @@ -19,6 +19,7 @@ import org.eclipse.cdt.cmake.core.properties.CMakeGenerator; import org.eclipse.cdt.core.build.IToolChain; import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.runtime.CoreException; +import org.eclipse.launchbar.core.target.ILaunchTarget; /** * An example CMake build configuration that demonstrates how an ISV can provide their own customisations. @@ -30,12 +31,8 @@ public class ExtendedCMakeBuildConfiguration extends CMakeBuildConfiguration { } public ExtendedCMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, - ICMakeToolChainFile toolChainFile, String launchMode) { - super(config, name, toolChain, toolChainFile, launchMode); - } - - public ExtendedCMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) { - super(config, name, toolChain); + ICMakeToolChainFile toolChainFile, String launchMode, ILaunchTarget launchTarget) { + super(config, name, toolChain, toolChainFile, launchMode, launchTarget); } @Override diff --git a/cmake/org.eclipse.cdt.cmake.example/src/org/eclipse/cdt/cmake/example/ExtendedCMakeBuildConfigurationProvider.java b/cmake/org.eclipse.cdt.cmake.example/src/org/eclipse/cdt/cmake/example/ExtendedCMakeBuildConfigurationProvider.java index db46df571d9..76e46da7caf 100644 --- a/cmake/org.eclipse.cdt.cmake.example/src/org/eclipse/cdt/cmake/example/ExtendedCMakeBuildConfigurationProvider.java +++ b/cmake/org.eclipse.cdt.cmake.example/src/org/eclipse/cdt/cmake/example/ExtendedCMakeBuildConfigurationProvider.java @@ -16,6 +16,7 @@ import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; import org.eclipse.cdt.core.build.IToolChain; import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.runtime.CoreException; +import org.eclipse.launchbar.core.target.ILaunchTarget; public class ExtendedCMakeBuildConfigurationProvider extends CMakeBuildConfigurationProvider { @SuppressWarnings("hiding") @@ -34,14 +35,7 @@ public class ExtendedCMakeBuildConfigurationProvider extends CMakeBuildConfigura @Override protected CMakeBuildConfiguration createCMakeBuildConfiguration(IBuildConfiguration config, String name, - IToolChain toolChain) { - return new ExtendedCMakeBuildConfiguration(config, name, toolChain); + IToolChain toolChain, ICMakeToolChainFile toolChainFile, String launchMode, ILaunchTarget launchTarget) { + return new ExtendedCMakeBuildConfiguration(config, name, toolChain, toolChainFile, launchMode, launchTarget); } - - @Override - protected CMakeBuildConfiguration createCMakeBuildConfiguration(IBuildConfiguration config, String name, - IToolChain toolChain, ICMakeToolChainFile toolChainFile, String launchMode) { - return new ExtendedCMakeBuildConfiguration(config, name, toolChain, toolChainFile, launchMode); - } - } diff --git a/core/org.eclipse.cdt.core.tests/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core.tests/META-INF/MANIFEST.MF index 55e54c872ca..60c05e1e01b 100644 --- a/core/org.eclipse.cdt.core.tests/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.core.tests/META-INF/MANIFEST.MF @@ -46,7 +46,8 @@ Require-Bundle: org.eclipse.core.resources, com.google.gson;bundle-version="[2.8.6,3.0.0)", org.eclipse.cdt.debug.core, org.eclipse.cdt.cmake.core, - org.eclipse.debug.core + org.eclipse.debug.core, + org.eclipse.launchbar.core;bundle-version="[3.0.0,4.0.0)" Bundle-ActivationPolicy: lazy Bundle-Vendor: %providerName Bundle-RequiredExecutionEnvironment: JavaSE-17 diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/CBuildConfigurationManagerTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/CBuildConfigurationManagerTests.java index d897779d807..f30ab55cee5 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/CBuildConfigurationManagerTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/CBuildConfigurationManagerTests.java @@ -11,6 +11,8 @@ package org.eclipse.cdt.core.build; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -23,17 +25,41 @@ import org.eclipse.cdt.core.parser.IScannerInfoProvider; 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.language.settings.providers.LanguageSettingsScannerInfoProvider; import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.jobs.Job; import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.launchbar.core.ILaunchBarManager; +import org.eclipse.launchbar.core.target.ILaunchTarget; +import org.eclipse.launchbar.core.target.ILaunchTargetManager; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; public class CBuildConfigurationManagerTests extends BaseTestCase5 { - protected ICBuildConfigurationManager configManager = CDebugCorePlugin - .getService(ICBuildConfigurationManager.class); + private IProject project; + private IToolChain mockToolchain; + private ICBuildConfigurationManager configManager = CDebugCorePlugin.getService(ICBuildConfigurationManager.class); + private ILaunchBarManager launchBarManager = CDebugCorePlugin.getService(ILaunchBarManager.class); + private ILaunchTargetManager launchTargetManager = CDebugCorePlugin.getService(ILaunchTargetManager.class); + + @BeforeEach + public void setup() throws Exception { + // Create a CMake project + project = createCMakeProject(); + // Setup a toolchain ready to use for creating the ICBuildConfiguration + mockToolchain = mock(IToolChain.class); + when(mockToolchain.getProperty(IToolChain.ATTR_OS)).thenReturn("osDummy"); + when(mockToolchain.getProperty(IToolChain.ATTR_ARCH)).thenReturn("archDummy"); + when(mockToolchain.getTypeId()).thenReturn("tc_typeId"); + when(mockToolchain.getId()).thenReturn("tcId"); + when(mockToolchain.getBuildConfigNameFragment()).thenReturn("buildConfigName"); + } /** * Tests that CBuildConfigurationManager.getBuildConfiguration(IProject, IToolChain, String, IProgressMonitor) @@ -75,8 +101,7 @@ public class CBuildConfigurationManagerTests extends BaseTestCase5 { */ @Test public void testResetCachedScannerInfoProvider() throws Exception { - // (1) create a CMake project - IProject project = createCMakeProject(); + // (1) create a CMake project; performed in setup() CMakeBuildConfigurationProvider provider = new CMakeBuildConfigurationProvider(); String buildConfigBaseName = "notDefaultName"; @@ -96,17 +121,11 @@ public class CBuildConfigurationManagerTests extends BaseTestCase5 { assertThat("scannerInfoProvider expected to be LanguageSettingsScannerInfoProvider", scannerInfoProvider instanceof LanguageSettingsScannerInfoProvider); - // (3) Setup a toolchain ready to use for creating the valid ICBuildConfiguration - IToolChain mockToolchain = mock(IToolChain.class); - when(mockToolchain.getProperty(IToolChain.ATTR_OS)).thenReturn("osDummy"); - when(mockToolchain.getProperty(IToolChain.ATTR_ARCH)).thenReturn("archDummy"); - when(mockToolchain.getTypeId()).thenReturn("tc_typeId"); - when(mockToolchain.getId()).thenReturn("tcId"); - when(mockToolchain.getBuildConfigNameFragment()).thenReturn("buildConfigName"); - + // (3) Create the valid ICBuildConfiguration + ILaunchTarget launchTarget = launchTargetManager.getLocalLaunchTarget(); ICBuildConfiguration cBuildConfiguration = configManager.getBuildConfiguration(project, mockToolchain, - ILaunchManager.RUN_MODE, new NullProgressMonitor()); - assertThat("The cBuildConfiguration should of type CBuildConfiguration", + ILaunchManager.RUN_MODE, launchTarget, new NullProgressMonitor()); + assertThat("The cBuildConfiguration should be of type CBuildConfiguration", cBuildConfiguration instanceof CBuildConfiguration); CBuildConfiguration cbc = (CBuildConfiguration) cBuildConfiguration; // Set this ICBuildConfiguration as the active build configuration @@ -118,6 +137,73 @@ public class CBuildConfigurationManagerTests extends BaseTestCase5 { scannerInfoProvider instanceof ICBuildConfiguration); } + /** + * Test {@link ICBuildConfigurationManager#getBuildConfiguration(IProject, IToolChain, String, ILaunchTarget, IProgressMonitor)} + * + * The new parameter, ILaunchTarget, was added in 9.0 + */ + @Test + public void getBuildConfiguration0() throws Exception { + ILaunchTarget launchTarget = ILaunchTarget.NULL_TARGET; + ICBuildConfiguration cBuildConfiguration = configManager.getBuildConfiguration(project, mockToolchain, + ILaunchManager.DEBUG_MODE, launchTarget, new NullProgressMonitor()); + + assertThat(cBuildConfiguration.getToolChain().getTypeId(), is("tc_typeId")); + assertThat(cBuildConfiguration.getToolChain().getId(), is("tcId")); + assertThat(cBuildConfiguration.getLaunchMode(), is(ILaunchManager.DEBUG_MODE)); + assertThat(cBuildConfiguration.getLaunchTarget(), is(launchTarget)); + } + + /** + * Test {@link ICBuildConfigurationManager#getBuildConfiguration(IProject, IToolChain, String, ILaunchTarget, IProgressMonitor)} + * is used correctly by CoreBuildLaunchBarTracker and that when the active launch target is changed, the active build + * configuration is set correctly containing the new launch target. + */ + @Test + public void getBuildConfiguration1() throws Exception { + /* + * After the project has been created, wait for the CoreBuildLaunchBarTracker to settle and finish processing. + */ + waitForLaunchBarTracker(); + + // Currently active launch target before we change anything is expected to be "Local" + assertThat(launchBarManager.getActiveLaunchTarget().getId(), is("Local")); + System.out.println("Active launch target id before=" + launchBarManager.getActiveLaunchTarget().getId()); + + /* + * Add a new Launch Target, which also sets it as the active launch target, thereby triggering the + * CoreBuildLaunchBarTracker which ends up calling ICBuildConfiguration2.setActive() to set the active Build Configuration. + */ + ILaunchTarget launchTarget = launchTargetManager.addLaunchTarget(ILaunchTargetManager.localLaunchTargetTypeId, + "id0"); + assertThat(launchTarget.getId(), is("id0")); + + /* + * After the launch target has been added, wait for the CoreBuildLaunchBarTracker to settle and finish processing. + */ + waitForLaunchBarTracker(); + + /* + * Active launch target now is expected to be "id0" + */ + assertThat(launchBarManager.getActiveLaunchTarget(), is(notNullValue())); + assertThat(launchBarManager.getActiveLaunchTarget().getId(), is("id0")); + + /* + * By now, the active Build Configuration should have been set using our new Launch Target. + * So test by getting the active Build Configuration and inspect it's launch target. Expected to be the new "id0" value. + */ + IBuildConfiguration buildConfig = project.getActiveBuildConfig(); + ICBuildConfiguration cBuildConfig = buildConfig.getAdapter(ICBuildConfiguration.class); + assertThat(cBuildConfig, is(notNullValue())); + // Check the active ICBuildConfiguration has the same launch target we set active previously + ILaunchTarget actualLaunchTarget = cBuildConfig.getLaunchTarget(); + assertThat(actualLaunchTarget, is(notNullValue())); + assertThat(actualLaunchTarget.getId(), is(launchTarget.getId())); + assertThat(actualLaunchTarget.getTypeId(), is(launchTarget.getTypeId())); + System.out.println("Active launch target id after=" + launchBarManager.getActiveLaunchTarget().getId()); + } + private IProject createCMakeProject() throws Exception { // Create a plain Eclipse project IProject project = ResourceHelper.createProject(this.getName()); @@ -128,4 +214,8 @@ public class CBuildConfigurationManagerTests extends BaseTestCase5 { project.setDescription(description, null); return project; } + + private void waitForLaunchBarTracker() throws OperationCanceledException, InterruptedException { + Job.getJobManager().join(CoreBuildLaunchBarTracker.JOB_FAMILY_CORE_BUILD_LAUNCH_BAR_TRACKER, null); + } } diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTests.java new file mode 100644 index 00000000000..44ab927bd1a --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTests.java @@ -0,0 +1,130 @@ +/******************************************************************************* + * Copyright (c) 2025 Renesas Electronics Europe. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.cdt.core.build; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.net.URI; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.eclipse.cdt.core.CCProjectNature; +import org.eclipse.cdt.core.CProjectNature; +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.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.debug.core.ILaunchManager; +import org.eclipse.launchbar.core.target.ILaunchTargetManager; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +/** + * Tests org.eclipse.cdt.core.build.ICBuildConfigurationProvider. + * + * Relies on manifest declarations in /org.eclipse.cdt.core.tests/plugin.xml. + * See "org.eclipse.cdt.core.build.ICBuildConfigurationProviderTests.providerId" and + * "extendedCmakeNature2" + */ +public class ICBuildConfigurationProviderTests extends BaseTestCase5 { + private IProject project; + private IToolChain mockToolchain; + private ICBuildConfigurationManager configManager = CDebugCorePlugin.getService(ICBuildConfigurationManager.class); + private ILaunchTargetManager launchTargetManager = CDebugCorePlugin.getService(ILaunchTargetManager.class); + + @BeforeEach + public void setup() throws Exception { + // Create a customized CMake project + project = createCustomizedCMakeProject(); + // Setup a toolchain ready to use for creating the ICBuildConfiguration + mockToolchain = mock(IToolChain.class); + when(mockToolchain.getProperty(IToolChain.ATTR_OS)).thenReturn("osDummy"); + when(mockToolchain.getProperty(IToolChain.ATTR_ARCH)).thenReturn("archDummy"); + when(mockToolchain.getTypeId()).thenReturn("tc_typeId"); + when(mockToolchain.getId()).thenReturn("tcId"); + when(mockToolchain.getBuildConfigNameFragment()).thenReturn("buildConfigName"); + } + + /** + * Tests org.eclipse.cdt.core.build.ICBuildConfigurationProvider.getCBuildConfigName(IProject, String, IToolChain, String, ILaunchTarget) + * can be extended to provide a customized ICBuildConfiguration name and thereby a customized build output directory name. + * + * @see {@link ICBuildConfigurationProviderTestsProvider#getCBuildConfigName(IProject, String, IToolChain, String, org.eclipse.launchbar.core.target.ILaunchTarget)} + */ + @Test + public void getCBuildConfigName() throws Exception { + /* + * Test summary: + * 1) A ICBuildConfiguration is created using the provided toolchain, launch mode and launch target. + * Note, the key principle to the ICBuildConfigurationProvider being overriden successfully is the project nature. + * It uses a customized nature, declared in plugin.xml. + * When the project provider is accessed, the declaration of extension point="org.eclipse.cdt.core.buildConfigProvider" relates + * the customized nature, so the correct (ICBuildConfigurationProviderTestsProvider) provider is used. + * + * 2) ICBuildConfiguration2.getBuildDirectoryURI() queries the build output directory name. The correct value is specified + * by ICBuildConfigurationProviderTestsProvider.getCBuildConfigName. + */ + + /* + * cmake because we extend CMakeBuildConfigurationProvider. + * run because ILaunchManager.RUN_MODE. + * buildConfigName because mockToolchain returns this from getBuildConfigNameFragment. + * Local because using Local launch target. + * customizedTest because ICBuildConfigurationProviderTestsProvider.getCBuildConfigName specifies this. + */ + final String expectedName = "cmake.run.buildConfigName.Local.customizedTest"; + + /* + * (1) Create ICBuildConfiguration, using our customized ICBuildConfigurationProviderTestsProvider + */ + ICBuildConfiguration cBuildConfiguration = configManager.getBuildConfiguration(project, mockToolchain, + ILaunchManager.RUN_MODE, launchTargetManager.getLocalLaunchTarget(), new NullProgressMonitor()); + assertThat(cBuildConfiguration, is(notNullValue())); + + assertThat(cBuildConfiguration, instanceOf(CBuildConfiguration.class)); + if (cBuildConfiguration instanceof CBuildConfiguration cbc) { + /* + * Note, this extra test uses getName on CBuildConfiguration rather than the API ICBuildConfiguration + */ + String name = cbc.getName(); + assertThat(name, is(expectedName)); + } + + assertThat(cBuildConfiguration, instanceOf(ICBuildConfiguration2.class)); + if (cBuildConfiguration instanceof ICBuildConfiguration2 cbc2) { + /* + * (2) Check last segment of build output directory name is expected. + */ + URI buildDirectoryURI = cbc2.getBuildDirectoryURI(); + Path path = Paths.get(buildDirectoryURI); + String lastSegment = path.getFileName().toString(); + assertThat(lastSegment, is(expectedName)); + } + } + + private IProject createCustomizedCMakeProject() throws Exception { + // Create a plain Eclipse project + IProject project = ResourceHelper.createProject(this.getName()); + // Add our customized CMake nature to the project + IProjectDescription description = project.getDescription(); + description.setNatureIds(new String[] { CProjectNature.C_NATURE_ID, CCProjectNature.CC_NATURE_ID, + ICBuildConfigurationProviderTestsCMakeNature.ID }); + project.setDescription(description, null); + return project; + } +} diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTestsCMakeNature.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTestsCMakeNature.java new file mode 100644 index 00000000000..7829942511d --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTestsCMakeNature.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2025 Renesas Electronics Europe. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.cdt.core.build; + +import org.eclipse.cdt.cmake.core.CMakeNature; + +/** + * Supporting class for test {@link ICBuildConfigurationProviderTests} + */ +public class ICBuildConfigurationProviderTestsCMakeNature extends CMakeNature { + + public static final String ID = "org.eclipse.cdt.core.tests.extendedCmakeNature2"; //$NON-NLS-1$ +} diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTestsProvider.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTestsProvider.java new file mode 100644 index 00000000000..ff547636899 --- /dev/null +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/build/ICBuildConfigurationProviderTestsProvider.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2025 Renesas Electronics Europe. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.cdt.core.build; + +import org.eclipse.cdt.cmake.core.CMakeBuildConfigurationProvider; +import org.eclipse.core.resources.IProject; +import org.eclipse.launchbar.core.target.ILaunchTarget; + +/** + * Supporting class for test {@link ICBuildConfigurationProviderTests} + */ +public class ICBuildConfigurationProviderTestsProvider extends CMakeBuildConfigurationProvider { + + @Override + public String getId() { + return "org.eclipse.cdt.core.build.ICBuildConfigurationProviderTests.providerId"; + } + + @Override + public String getCBuildConfigName(IProject project, String toolName, IToolChain toolchain, String launchMode, + ILaunchTarget launchTarget) { + return super.getCBuildConfigName(project, toolName, toolchain, launchMode, launchTarget) + ".customizedTest"; + } +} \ No newline at end of file diff --git a/core/org.eclipse.cdt.core.tests/plugin.xml b/core/org.eclipse.cdt.core.tests/plugin.xml index 4dfd381c248..9a8372ed621 100644 --- a/core/org.eclipse.cdt.core.tests/plugin.xml +++ b/core/org.eclipse.cdt.core.tests/plugin.xml @@ -447,4 +447,23 @@ factoryClass="org.eclipse.cdt.core.resources.tests.TestExclusionFactory"> + + + + + + + + + + + diff --git a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF index 891da136dd8..4b5e7adaa94 100644 --- a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF @@ -143,7 +143,8 @@ Require-Bundle: org.eclipse.cdt.core.native;bundle-version="[6.3.0,7.0.0)";visib org.eclipse.ltk.core.refactoring;bundle-version="[3.13.0,4.0.0)", org.eclipse.text;bundle-version="[3.12.300,4.0.0)", com.google.gson;bundle-version="[2.8.6,3.0.0)", - org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional + org.eclipse.jdt.annotation;bundle-version="[2.0.0,3.0.0)";resolution:=optional, + org.eclipse.launchbar.core;bundle-version="[3.0.0,4.0.0)" Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-17 Automatic-Module-Name: org.eclipse.cdt.core diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java index cdf0d2f204f..099e6012300 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java @@ -125,7 +125,7 @@ public class CCorePlugin extends Plugin { public static final int STATUS_PDOM_TOO_LARGE = 4; /** - * Toolchain not found when inflating a build configuration. + * Toolchain, launch mode or launch target not found when inflating a build configuration. * * @since 6.4 */ diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfigUtils.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfigUtils.java new file mode 100644 index 00000000000..c9ae49c9011 --- /dev/null +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfigUtils.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2025 Renesas Electronics Europe. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.cdt.core.build; + +import org.eclipse.core.resources.IBuildConfiguration; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * @since 9.0 + */ +public class CBuildConfigUtils { + + private CBuildConfigUtils() { + // empty + } + + /** + * @param provider Core Build configuration provider. Must not be null. + * @param project Project in which the Platform Build configuration is created. Must not be null. + * @param cBuildConfigName The Core Build config name to be used as part of the the Platform Build configuration + * name. See {@link ICBuildConfigurationProvider#getCBuildConfigName}. Must not be null. + * @param cBuildConfigManager Core Build configuration manager. Must not be null. + * @param monitor + * @return a Platform Build Configuration. + * @throws CoreException + */ + public static IBuildConfiguration createBuildConfiguration(ICBuildConfigurationProvider provider, IProject project, + String cBuildConfigName, ICBuildConfigurationManager cBuildConfigManager, IProgressMonitor monitor) + throws CoreException { + IBuildConfiguration retVal = null; + // Try to reuse any IBuildConfiguration with the same name for the project + if (cBuildConfigManager.hasConfiguration(provider, project, cBuildConfigName)) { + retVal = project.getBuildConfig(provider.getId() + '/' + cBuildConfigName); + } + if (retVal == null) { + retVal = cBuildConfigManager.createBuildConfiguration(provider, project, cBuildConfigName, monitor); + } + return retVal; + } +} diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfiguration.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfiguration.java index 448783dc020..3dae69dab05 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfiguration.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/CBuildConfiguration.java @@ -26,6 +26,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; import java.util.Properties; import java.util.Set; import java.util.stream.Collectors; @@ -85,6 +86,8 @@ import org.eclipse.core.runtime.PlatformObject; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.launchbar.core.target.ILaunchTarget; +import org.eclipse.launchbar.core.target.ILaunchTargetManager; import org.osgi.service.prefs.BackingStoreException; import org.osgi.service.prefs.Preferences; @@ -114,6 +117,14 @@ public abstract class CBuildConfiguration extends PlatformObject implements ICBu IMarkerGenerator, IConsoleParser2, IElementChangedListener { private static final String LAUNCH_MODE = "cdt.launchMode"; //$NON-NLS-1$ + /** + * Property name used to store the {@link ILaunchTarget#getTypeId()} in the ICBuildConfiguration properties. + */ + private static final String LAUNCH_TARGET_TYPE_ID = "cdt.launchTarget.typeId"; //$NON-NLS-1$ + /** + * Property name used to store the {@link ILaunchTarget#getId()} in the ICBuildConfiguration properties. + */ + private static final String LAUNCH_TARGET_ID = "cdt.launchTarget.id"; //$NON-NLS-1$ private static final String NEED_REFRESH = "cdt.needScannerRefresh"; //$NON-NLS-1$ @@ -124,7 +135,8 @@ public abstract class CBuildConfiguration extends PlatformObject implements ICBu private final String name; private final IBuildConfiguration config; private final IToolChain toolChain; - private String launchMode; + private final String launchMode; + private final ILaunchTarget launchTarget; private Object scannerInfoLock = new Object(); @@ -133,51 +145,95 @@ public abstract class CBuildConfiguration extends PlatformObject implements ICBu private ICommandLauncher launcher; - protected CBuildConfiguration(IBuildConfiguration config, String name) throws CoreException { - this.config = config; - this.name = name; + /** + * Use when a Core Build configuration already exists (eg was created using + * {@link #CBuildConfiguration(IBuildConfiguration, String, IToolChain, String, ILaunchTarget)}. + * The toolchain, launch mode and launch target are loaded from preferences. + * + * @param buildConfig Platform Build Configuration. Must not be null. + * @param cBuildConfigName Name to give the CMakeBuildConfiguration. Must not be null. + * @throws CoreException if this method fails. Reasons include: + *
    + *
  • Toolchain is missing,
  • + *
  • Launch mode missing,
  • + *
  • Launch Target is missing.
  • + *
+ */ + protected CBuildConfiguration(IBuildConfiguration buildConfig, String cBuildConfigName) throws CoreException { + this.config = Objects.requireNonNull(buildConfig, "buildConfig must not be null"); //$NON-NLS-1$ + this.name = Objects.requireNonNull(cBuildConfigName, "cBuildConfigName must not be null"); //$NON-NLS-1$ + /* + * Retrieve previously saved toolchain, launch mode and launch target from preferences. + * The STATUS_BUILD_CONFIG_NOT_VALID is used which causes CBuildConfigurationManager to quarantine this Build Configuration. + */ Preferences settings = getSettings(); - String typeId = settings.get(TOOLCHAIN_TYPE, ""); //$NON-NLS-1$ - String id = settings.get(TOOLCHAIN_ID, ""); //$NON-NLS-1$ + String typeId = settings.get(TOOLCHAIN_TYPE, null); + String id = settings.get(TOOLCHAIN_ID, null); IToolChainManager toolChainManager = CCorePlugin.getService(IToolChainManager.class); IToolChain tc = toolChainManager.getToolChain(typeId, id); - if (tc == null) { - // check for other versions - tc = toolChainManager.getToolChain(typeId, id); - if (tc == null) { - throw new CoreException( - new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, CCorePlugin.STATUS_BUILD_CONFIG_NOT_VALID, - String.format(Messages.CBuildConfiguration_ToolchainMissing, config.getName()), null)); - } + throw new CoreException( + new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, CCorePlugin.STATUS_BUILD_CONFIG_NOT_VALID, + String.format(Messages.CBuildConfiguration_CBuildConfiguration_ToolchainMissing, + buildConfig.getName(), typeId, id), + null)); } this.toolChain = tc; - this.launchMode = settings.get(LAUNCH_MODE, "run"); //$NON-NLS-1$ + String launchMode = settings.get(LAUNCH_MODE, null); + if (launchMode == null || launchMode.isBlank()) { + throw new CoreException( + new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, CCorePlugin.STATUS_BUILD_CONFIG_NOT_VALID, + String.format(Messages.CBuildConfiguration_CBuildConfiguration_LaunchModeMissing, + buildConfig.getName(), launchMode), + null)); + } + this.launchMode = launchMode; + + String launchTargetTypeId = settings.get(LAUNCH_TARGET_TYPE_ID, null); + String launchTargetId = settings.get(LAUNCH_TARGET_ID, null); + ILaunchTargetManager launchTargetManager = CCorePlugin.getService(ILaunchTargetManager.class); + ILaunchTarget target = launchTargetManager.getLaunchTarget(launchTargetTypeId, launchTargetId); + if (target == null) { + throw new CoreException( + new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, CCorePlugin.STATUS_BUILD_CONFIG_NOT_VALID, + String.format(Messages.CBuildConfiguration_CBuildConfiguration_LaunchTargetMissing, + buildConfig.getName(), launchTargetTypeId, launchTargetId), + null)); + } + this.launchTarget = target; CoreModel.getDefault().addElementChangedListener(this); } - protected CBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) { - this(config, name, toolChain, "run"); //$NON-NLS-1$ - } - /** - * @since 6.2 + * Use when a Core Build configuration is created for the first time. The toolchain, launch mode and launch target + * are saved to preferences. This allows the Core Build configuration to retrieved later (maybe another workbench + * session), using {@link #CBuildConfiguration(IBuildConfiguration, String)} + * + * @param buildConfig Platform Build Configuration. Must not be null. + * @param cBuildConfigName Name to give the CMakeBuildConfiguration. Must not be null. + * @param toolChain Toolchain to associate with this CMakeBuildConfiguration. Must not be null. + * @param launchMode Launch mode (eg "debug") to associate with this CMakeBuildConfiguration. Must not be null. + * @param launchTarget Launch target to associate with this CMakeBuildConfiguration. Must not be null. + * @since 9.0 */ - protected CBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, String launchMode) { - this.config = config; - this.name = name; - this.toolChain = toolChain; - this.launchMode = launchMode; + protected CBuildConfiguration(IBuildConfiguration buildConfig, String cBuildConfigName, IToolChain toolChain, + String launchMode, ILaunchTarget launchTarget) { + this.config = Objects.requireNonNull(buildConfig, "buildConfig must not be null"); //$NON-NLS-1$ + this.name = Objects.requireNonNull(cBuildConfigName, "cBuildConfigName must not be null"); //$NON-NLS-1$ + this.toolChain = Objects.requireNonNull(toolChain, "toolChain must not be null"); //$NON-NLS-1$ + this.launchMode = Objects.requireNonNull(launchMode, "launchMode must not be null"); //$NON-NLS-1$ + this.launchTarget = Objects.requireNonNull(launchTarget, "launchTarget must not be null"); //$NON-NLS-1$ Preferences settings = getSettings(); settings.put(TOOLCHAIN_TYPE, toolChain.getTypeId()); settings.put(TOOLCHAIN_ID, toolChain.getId()); - if (launchMode != null) { - settings.put(LAUNCH_MODE, launchMode); - } + settings.put(LAUNCH_MODE, launchMode); + settings.put(LAUNCH_TARGET_TYPE_ID, launchTarget.getTypeId()); + settings.put(LAUNCH_TARGET_ID, launchTarget.getId()); + try { settings.flush(); } catch (BackingStoreException e) { @@ -187,10 +243,6 @@ public abstract class CBuildConfiguration extends PlatformObject implements ICBu CoreModel.getDefault().addElementChangedListener(this); } - protected CBuildConfiguration(IBuildConfiguration config, IToolChain toolChain) { - this(config, DEFAULT_NAME, toolChain); - } - @Override public IBuildConfiguration getBuildConfiguration() { return config; @@ -208,18 +260,9 @@ public abstract class CBuildConfiguration extends PlatformObject implements ICBu return launchMode; } - /** - * @since 6.2 - */ - protected void setLaunchMode(String launchMode) { - this.launchMode = launchMode; - Preferences settings = getSettings(); - settings.put(LAUNCH_MODE, launchMode); - try { - settings.flush(); - } catch (BackingStoreException e) { - CCorePlugin.log(e); - } + @Override + public ILaunchTarget getLaunchTarget() { + return launchTarget; } public IProject getProject() { diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ErrorBuildConfiguration.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ErrorBuildConfiguration.java index cbaefb816d8..e38cf7033a9 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ErrorBuildConfiguration.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ErrorBuildConfiguration.java @@ -28,6 +28,7 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.PlatformObject; +import org.eclipse.launchbar.core.target.ILaunchTarget; /** * A Build configuration that simply spits out an error message on the console at build and clean time. @@ -42,6 +43,8 @@ public class ErrorBuildConfiguration extends PlatformObject implements ICBuildCo private final IBuildConfiguration config; private String errorMessage; + private static ICBuildConfigurationManager configManager = CCorePlugin + .getService(ICBuildConfigurationManager.class); public static final String NAME = "!"; //$NON-NLS-1$ @@ -56,6 +59,17 @@ public class ErrorBuildConfiguration extends PlatformObject implements ICBuildCo throws CoreException { return new ErrorBuildConfiguration(config, Messages.ErrorBuildConfiguration_What); } + + @Override + public ICBuildConfiguration createCBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, + ILaunchTarget launchTarget, IProgressMonitor monitor) throws CoreException { + IBuildConfiguration errorBuildConfig = configManager.createBuildConfiguration(this, project, + "ErrorBuildConfiguration", monitor); //$NON-NLS-1$ + ErrorBuildConfiguration errorCBuildConfiguration = new ErrorBuildConfiguration(errorBuildConfig, + Messages.ErrorBuildConfiguration_What); + configManager.addBuildConfiguration(errorBuildConfig, errorCBuildConfiguration); + return errorCBuildConfiguration; + } } public static final Provider PROVIDER = new Provider(); @@ -93,31 +107,23 @@ public class ErrorBuildConfiguration extends PlatformObject implements ICBuildCo @Override public IScannerInfo getScannerInformation(IResource resource) { - // TODO Auto-generated method stub return null; } @Override public void subscribe(IResource resource, IScannerInfoChangeListener listener) { - // TODO Auto-generated method stub - } @Override public void unsubscribe(IResource resource, IScannerInfoChangeListener listener) { - // TODO Auto-generated method stub - } @Override public void setActive() { - // TODO Auto-generated method stub - } @Override public URI getBuildDirectoryURI() throws CoreException { - // TODO Auto-generated method stub return null; } @@ -128,19 +134,16 @@ public class ErrorBuildConfiguration extends PlatformObject implements ICBuildCo @Override public IToolChain getToolChain() throws CoreException { - // TODO Auto-generated method stub return null; } @Override public IEnvironmentVariable getVariable(String name) throws CoreException { - // TODO Auto-generated method stub return null; } @Override public IEnvironmentVariable[] getVariables() throws CoreException { - // TODO Auto-generated method stub return null; } @@ -149,5 +152,4 @@ public class ErrorBuildConfiguration extends PlatformObject implements ICBuildCo // Return empty list to prevent possible NPE return Collections.emptyList(); } - } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfiguration.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfiguration.java index 431d777aa31..4c9f44ecb49 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfiguration.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfiguration.java @@ -23,6 +23,7 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.launchbar.core.target.ILaunchTarget; /** * This is the root interface for "new style" CDT build configurations. Adapting @@ -74,6 +75,13 @@ public interface ICBuildConfiguration extends IAdaptable, IScannerInfoProvider { return null; } + /** + * @since 9.0 + */ + default ILaunchTarget getLaunchTarget() { + return null; + } + /** * Ids for the Binary Parsers to use when checking whether a file is a * binary that can be launched. @@ -236,5 +244,4 @@ public interface ICBuildConfiguration extends IAdaptable, IScannerInfoProvider { default boolean supportsProperties(Map properties) { return false; } - } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationManager.java index 0fc9f0473da..0a990eb1966 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationManager.java @@ -10,12 +10,11 @@ *******************************************************************************/ package org.eclipse.cdt.core.build; -import java.util.Map; - import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.launchbar.core.target.ILaunchTarget; /** * The OSGi service that manages the mapping from platform build configuration @@ -49,54 +48,45 @@ public interface ICBuildConfigurationManager { throws CoreException; /** - * Create a new build configuration to be owned by a provider. + * Create a new Platform Build configuration to be owned by a Core Build config provider. * - * @param provider - * @param project - * @param configName + * @param provider The project's Core Build config provider. Must not be null. + * @param project Project in which the Platform Build configuration is created. Must not be null. + * @param configName The Core Build config name to be used as part of the the Platform Build configuration + * name. Must not be null. * @param monitor - * @return new build configuration - * @throws CoreException + * @return new Platform Build configuration. Not null. + * @throws CoreException Reasons include the reasons given in + * {@link IProject#setDescription(org.eclipse.core.resources.IProjectDescription, IProgressMonitor)} + */ IBuildConfiguration createBuildConfiguration(ICBuildConfigurationProvider provider, IProject project, String configName, IProgressMonitor monitor) throws CoreException; /** - * Create a new build configuration for a given project using a given - * toolchain and builds for a given launch mode. + * Finds an existing Core Build configuration or creates a new one if one does not exist. * - * @param project - * project for the config - * @param toolChain - * toolchain the build config will use - * @param launchMode - * launch mode the buld config will build for - * @return new build configuration - * @throws CoreException - * @since 6.1 + * The project's ICBuildConfigurationProvider is used to attempt to get an existing configuration or create a new one. + * + * @param project Project to associate this Core Build Configuration to. Must not be null. + * @param toolChain Toolchain to associate with this ICBuildConfiguration. Must not be null. + * @param launchMode Launch mode (eg "debug") to associate with this ICBuildConfiguration. Must not be null. + * @param launchTarget Launch target to associate with this ICBuildConfiguration. Must not be null. + * @param monitor + * @return a Core Build configuration matching the supplied parameters. Not null. + * @throws CoreException Reasons include: + *
    + *
  • The project does not exist.
  • + *
  • The project is not open.
  • + *
  • The project's {@link ICBuildConfigurationProvider#getCBuildConfiguration(IBuildConfiguration, String)} fails.
  • + *
  • The project's {@link ICBuildConfigurationProvider} is not found.
  • + *
  • There is a problem accessing the toolchain.
  • + *
+ * @since 9.0 + * @apiNote This should be renamed to getCBuildConfiguration as it returns a Core Build config. */ ICBuildConfiguration getBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, - IProgressMonitor monitor) throws CoreException; - - /** - * Create a new build configuration for a given project using a toolchain with - * the given properties and that builds for a given launch mode. - * - * @deprecated clients really need to pick which toolchain they want a build - * config for. This method pretty much picks one at random. - * @param project - * project for the config - * @param properties - * properties for the toolchain to be selected - * @param launchMode - * launch mode the buld config will build for - * @return new build configuration - * @throws CoreException - * @since 6.2 - */ - @Deprecated - ICBuildConfiguration getBuildConfiguration(IProject project, Map properties, String launchMode, - IProgressMonitor monitor) throws CoreException; + ILaunchTarget launchTarget, IProgressMonitor monitor) throws CoreException; /** * Called by providers to add new build configurations as they are created. diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationProvider.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationProvider.java index 3c1fb9bfcca..5d30d3f1f65 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationProvider.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationProvider.java @@ -11,14 +11,17 @@ package org.eclipse.cdt.core.build; import java.util.Collection; +import java.util.StringJoiner; import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.launchbar.core.target.ILaunchTarget; +import org.eclipse.launchbar.core.target.LaunchTargetUtils; /** - * A CBuildConfigurationProvider provides C build configurations. + * A CBuildConfigurationProvider provides Core Build configurations. * * @since 6.0 */ @@ -32,30 +35,77 @@ public interface ICBuildConfigurationProvider { String getId(); /** - * Returns the ICBuildConfiguration that owns this build configuration. + * Returns the Core Build configuration that owns this Platform Build configuration. * - * @param config - * @return CDT build configuration for the Platform build configuration + * @param buildConfig Platform Build Configuration. Must not be null. + * @param cBuildConfigName Name to give the ICBuildConfiguration. Must not be null. + * @return a Core Build configuration. + * @throws CoreException if this method fails. Reasons include: + *
    + *
  • Toolchain is missing,
  • + *
  • Launch mode missing,
  • + *
  • Launch Target is missing.
  • + *
*/ - ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name) throws CoreException; + ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration buildConfig, String cBuildConfigName) + throws CoreException; /** - * Create a new build configuration for a given project using a given - * toolchain and builds for a given launch mode. + * Create a new Platform Build/Core Build configuration combination. * - * @param project - * project for the config - * @param toolChain - * toolchain the build config will use - * @param launchMode - * launch mode the buld config will build for - * @return new build configuration or null combination not supported - * @throws CoreException - * @since 6.1 + * @param project Project to associate this Core Build configuration to. Must not be null. + * @param toolChain Toolchain to associate with this ICBuildConfiguration. Must not be null. + * @param launchMode Launch mode (eg "debug") to associate with this ICBuildConfiguration. Must not be null. + * @param launchTarget Launch target to associate with this ICBuildConfiguration. Must not be null. + * @param monitor + * @return a Core Build configuration. + * @throws CoreException if this method fails. Reasons include: + *
    + *
  • This project does not exist.
  • + *
  • This project is not open.
  • + *
  • The reasons given in {@link IProject#setDescription(org.eclipse.core.resources.IProjectDescription, IProgressMonitor)}.
  • + *
+ * + * @since 9.0 */ - default ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, - IProgressMonitor monitor) throws CoreException { - return null; + ICBuildConfiguration createCBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, + ILaunchTarget launchTarget, IProgressMonitor monitor) throws CoreException; + + /** + * Name used when creating a Core Build configuration, used by {@link #createCBuildConfiguration}. + * This is the name used when the build output directory is created. + * @param project Project associated with this ICBuildConfiguration. Must not be null. + * @param toolName Name of the build tool (eg: "cmake", "make"). Must not be null. + * @param toolchain Toolchain associated with this ICBuildConfiguration. Must not be null. + * @param launchMode Launch mode (eg "debug") associated with this ICBuildConfiguration. Must not be null. + * @param launchTarget Launch target associated with this ICBuildConfiguration. Must not be null. + * @see {@link ICBuildConfiguration2#getBuildDirectoryURI()} + * + * @return Name used when a Core Build configuration is created. Default implementation uses the following pattern
+ * toolName.launchMode.toolchain OS.toolchain Arch.launchTarget Id + *

For example, a cmake build, in debug mode, using a GCC windows toolchain with the Local launch target:
+ * "cmake.debug.win32.x86_64.Local" + *

A different pattern is used when running in a Docker container. + * @since 9.0 + */ + default String getCBuildConfigName(IProject project, String toolName, IToolChain toolchain, String launchMode, + ILaunchTarget launchTarget) { + StringJoiner configName = new StringJoiner("."); //$NON-NLS-1$ + configName.add(toolName); + configName.add(launchMode); + + String os = toolchain.getProperty(IToolChain.ATTR_OS); + if ("linux-container".equals(os)) { //$NON-NLS-1$ + String osConfigName = toolchain.getProperty("linux-container-id").replaceAll("/", "_"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + configName.add(osConfigName); + } else { + String fragment = toolchain.getBuildConfigNameFragment(); + if (fragment != null && !fragment.isEmpty()) { + configName.add(fragment); + } + configName.add(LaunchTargetUtils.sanitizeName(launchTarget.getId())); + } + return configName.toString(); } /** diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/StandardBuildConfiguration.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/StandardBuildConfiguration.java index 179cbdda0a4..d6abf82f45f 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/StandardBuildConfiguration.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/StandardBuildConfiguration.java @@ -39,6 +39,7 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; +import org.eclipse.launchbar.core.target.ILaunchTarget; /** * A Standard Build Configuration that simply calls a specified command for @@ -75,9 +76,12 @@ public class StandardBuildConfiguration extends CBuildConfiguration { setupEnvVars(); } - public StandardBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, String launchMode) - throws CoreException { - super(config, name, toolChain, launchMode); + /** + * @since 9.0 + */ + public StandardBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, String launchMode, + ILaunchTarget launchTarget) throws CoreException { + super(config, name, toolChain, launchMode, launchTarget); applyProperties(); setupEnvVars(); } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java index 40504459e6d..fddb838df65 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java @@ -16,7 +16,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -30,7 +29,6 @@ import org.eclipse.cdt.core.build.ICBuildConfigurationManager; import org.eclipse.cdt.core.build.ICBuildConfigurationManager2; import org.eclipse.cdt.core.build.ICBuildConfigurationProvider; import org.eclipse.cdt.core.build.IToolChain; -import org.eclipse.cdt.core.build.IToolChainManager; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.internal.core.model.CModelManager; import org.eclipse.core.resources.IBuildConfiguration; @@ -48,6 +46,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.launchbar.core.target.ILaunchTarget; import org.osgi.service.prefs.BackingStoreException; import org.osgi.service.prefs.Preferences; @@ -138,7 +137,7 @@ public class CBuildConfigurationManager return null; } - public ICBuildConfigurationProvider getProvider(IProject project) throws CoreException { + public ICBuildConfigurationProvider getProvider(IProject project) { initProviders(); for (Provider provider : providers.values()) { if (provider.supports(project)) { @@ -202,11 +201,7 @@ public class CBuildConfigurationManager ICBuildConfigurationProvider provider = null; if (IBuildConfiguration.DEFAULT_CONFIG_NAME.equals(buildConfig.getName())) { configName = ICBuildConfiguration.DEFAULT_NAME; - try { - provider = getProvider(buildConfig.getProject()); - } catch (CoreException e) { - continue; - } + provider = getProvider(buildConfig.getProject()); } else { String[] segments = buildConfig.getName().split("/"); //$NON-NLS-1$ if (segments.length == 2) { @@ -304,48 +299,58 @@ public class CBuildConfigurationManager @Override public ICBuildConfiguration getBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, - IProgressMonitor monitor) throws CoreException { - // First see if we have one - for (IBuildConfiguration config : project.getBuildConfigs()) { - ICBuildConfiguration cconfig = getBuildConfiguration(config); - if (cconfig != null) { - IToolChain tc = cconfig.getToolChain(); - if (tc != null && tc.equals(toolChain) && launchMode.equals(cconfig.getLaunchMode())) { - return cconfig; + ILaunchTarget launchTarget, IProgressMonitor monitor) throws CoreException { + + // First check if a matching ICBuildConfiguration exists already + ICBuildConfiguration retVal = findCBuildConfiguration(project, toolChain, launchTarget, launchMode, monitor); + + if (retVal == null) { + // No existing ICBuildConfiguration, so get ICBuildConfigurationProvider to create one + retVal = createCBuildConfig(project, toolChain, launchTarget, launchMode, monitor); + } + return retVal; + } + + private ICBuildConfiguration findCBuildConfiguration(IProject project, IToolChain toolChain, + ILaunchTarget launchTarget, String launchMode, IProgressMonitor monitor) throws CoreException { + for (IBuildConfiguration buildConfig : project.getBuildConfigs()) { + ICBuildConfiguration cBuildConfig = getBuildConfiguration(buildConfig); + if (cBuildConfig != null) { + IToolChain tc = cBuildConfig.getToolChain(); + ILaunchTarget lt = cBuildConfig.getLaunchTarget(); + String lm = cBuildConfig.getLaunchMode(); + if (tc != null && tc.equals(toolChain) && lt != null && lt.equals(launchTarget) && lm != null + && lm.equals(launchMode)) { + return cBuildConfig; } } } + return null; + } - // Nope, ask the provider to create one + private ICBuildConfiguration createCBuildConfig(IProject project, IToolChain toolChain, ILaunchTarget launchTarget, + String launchMode, IProgressMonitor monitor) throws CoreException { + ICBuildConfiguration retVal = null; ICBuildConfigurationProvider provider = getProvider(project); if (provider != null) { // The provider will call us back to add in the new one - ICBuildConfiguration cconfig = provider.createBuildConfiguration(project, toolChain, launchMode, monitor); - if (cconfig != null) { + retVal = provider.createCBuildConfiguration(project, toolChain, launchMode, launchTarget, monitor); + if (retVal != null) { /* * The IScannerInfoProvider may be cached with an incorrect value if the ICBuildConfiguration is not * available at the time it is checked. Now that one has been created, the previous value should be * forgotten so the new cconfig can be used. */ CCorePlugin.getDefault().resetCachedScannerInfoProvider(project); + return retVal; } - return cconfig; - } else { - return null; + throw new CoreException( + CCorePlugin.createStatus(String.format(Messages.CBuildConfigurationManager_CBuildConfigCreateFail, + project.getName(), toolChain.getName(), launchTarget.getId(), launchMode), null)); } - } - - @Override - public ICBuildConfiguration getBuildConfiguration(IProject project, Map properties, - String launchMode, IProgressMonitor monitor) throws CoreException { - IToolChainManager tcManager = CCorePlugin.getService(IToolChainManager.class); - Collection toolchains = tcManager.getToolChainsMatching(properties); - if (toolchains.isEmpty()) { - return null; - } - - IToolChain toolChain = toolchains.iterator().next(); - return getBuildConfiguration(project, toolChain, launchMode, monitor); + throw new CoreException( + CCorePlugin.createStatus(String.format(Messages.CBuildConfigurationManager_CBuildConfigProviderNotFound, + project.getName(), toolChain.getName(), launchTarget.getId(), launchMode), null)); } @Override diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.java index 5378540f548..c89a050420a 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.java @@ -14,16 +14,19 @@ import org.eclipse.osgi.util.NLS; public class Messages extends NLS { private static final String BUNDLE_NAME = "org.eclipse.cdt.internal.core.build.messages"; //$NON-NLS-1$ - public static String CBuildConfiguration_CreateJob; - public static String CBuildConfiguration_ToolchainMissing; public static String CBuildConfiguration_Location; public static String CBuildConfiguration_RunningScannerInfo; public static String CBuilder_ExceptionWhileBuilding; public static String CBuilder_ExceptionWhileBuilding2; public static String CBuilder_NotConfiguredCorrectly; public static String CBuilder_NotConfiguredCorrectly2; + public static String CBuildConfiguration_CBuildConfiguration_LaunchModeMissing; + public static String CBuildConfiguration_CBuildConfiguration_LaunchTargetMissing; + public static String CBuildConfiguration_CBuildConfiguration_ToolchainMissing; public static String CBuildConfiguration_CommandNotFound; public static String CBuildConfiguration_BuildComplete; + public static String CBuildConfigurationManager_CBuildConfigCreateFail; + public static String CBuildConfigurationManager_CBuildConfigProviderNotFound; public static String ErrorBuildConfiguration_What; public static String ErrorBuildConfiguration_ErrorWritingToConsole; public static String StandardBuildConfiguration_0; diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/messages.properties b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/messages.properties index 7f3ba52f955..d533ca134c9 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/messages.properties +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/messages.properties @@ -16,10 +16,13 @@ StandardBuildConfiguration_0=Building in: %s\n StandardBuildConfiguration_1=Build complete (%d errors, %d warnings): %s\n StandardBuildConfiguration_Failure=Error: %s CBuildConfiguration_BuildComplete=Build complete\n +CBuildConfiguration_CBuildConfiguration_LaunchModeMissing=Launch mode missing for build configuration=%s, launchMode=$s +CBuildConfiguration_CBuildConfiguration_LaunchTargetMissing=Launch Target is missing for build configuration=%s, typeId=%s, id=%s +CBuildConfiguration_CBuildConfiguration_ToolchainMissing=Toolchain is missing for build configuration=%s, typeId=%s, id=%s CBuildConfiguration_CommandNotFound=Error: build command '%s' not found\n -CBuildConfiguration_CreateJob=Create Build Folder CBuildConfiguration_Location=line %d, external location: %s -CBuildConfiguration_ToolchainMissing=Toolchain is missing for build configuration CBuildConfiguration_RunningScannerInfo=Calculating scanner info for %s +CBuildConfigurationManager_CBuildConfigCreateFail=Project, %s, Core Build config provider failed to create a config, for toolchain=%s, launch target=%s, launch mode=%s +CBuildConfigurationManager_CBuildConfigProviderNotFound=Project %s Core Build config provider not found, for toolchain=%s, launch target=%s, launch mode=%s ErrorBuildConfiguration_What=Unknown initialization error ErrorBuildConfiguration_ErrorWritingToConsole=Error writing to console diff --git a/debug/org.eclipse.cdt.debug.core/META-INF/MANIFEST.MF b/debug/org.eclipse.cdt.debug.core/META-INF/MANIFEST.MF index c6906caf10c..cddace2f56a 100644 --- a/debug/org.eclipse.cdt.debug.core/META-INF/MANIFEST.MF +++ b/debug/org.eclipse.cdt.debug.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.debug.core; singleton:=true -Bundle-Version: 8.8.900.qualifier +Bundle-Version: 9.0.0.qualifier Bundle-Activator: org.eclipse.cdt.debug.core.CDebugCorePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchBarTracker.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchBarTracker.java index d4aa5fc2f58..efbb295485b 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchBarTracker.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchBarTracker.java @@ -53,7 +53,15 @@ import org.eclipse.launchbar.core.target.TargetStatus; * @since 8.3 */ public class CoreBuildLaunchBarTracker implements ILaunchBarListener, ILaunchTargetListener { - + /** + * Useful for testing. Allows tests to wait for LaunchBarTracker to finish processing. + *

+	 * Job.getJobManager().join(CoreBuildLaunchBarTracker.JOB_FAMILY_CORE_BUILD_LAUNCH_BAR_TRACKER, null);
+	 * 
+ * + * @since 9.0 + */ + public static final Object JOB_FAMILY_CORE_BUILD_LAUNCH_BAR_TRACKER = new Object(); private final ILaunchBarManager launchBarManager = CDebugCorePlugin.getService(ILaunchBarManager.class); private final ICBuildConfigurationManager configManager = CDebugCorePlugin .getService(ICBuildConfigurationManager.class); @@ -130,6 +138,12 @@ public class CoreBuildLaunchBarTracker implements ILaunchBarListener, ILaunchTar // Pick core build config based on launch mode and toolchain for target // Since this may create a new config, need to run it in a Job Job job = new Job(InternalDebugCoreMessages.CoreBuildLaunchBarTracker_Job) { + + @Override + public boolean belongsTo(Object family) { + return JOB_FAMILY_CORE_BUILD_LAUNCH_BAR_TRACKER == family; + } + @Override protected IStatus run(IProgressMonitor monitor) { try { @@ -143,11 +157,14 @@ public class CoreBuildLaunchBarTracker implements ILaunchBarListener, ILaunchTar if (testConfig != null && !(testConfig instanceof ErrorBuildConfiguration)) { // Match launch mode run/debug. if (testConfig.getLaunchMode().equals(lastMode.getIdentifier())) { - // Match toolchain. - for (IToolChain tc : tcs) { - if (testConfig.getToolChain().equals(tc)) { - buildConfig = testConfig; - break configs; + // Match launch target + if (testConfig.getLaunchTarget().equals(lastTarget)) { + // Match toolchain. + for (IToolChain tc : tcs) { + if (testConfig.getToolChain().equals(tc)) { + buildConfig = testConfig; + break configs; + } } } } @@ -157,7 +174,7 @@ public class CoreBuildLaunchBarTracker implements ILaunchBarListener, ILaunchTar if (buildConfig == null) { for (IToolChain toolChain : tcs) { buildConfig = configManager.getBuildConfiguration(finalProject, toolChain, - mode.getIdentifier(), monitor); + mode.getIdentifier(), lastTarget, monitor); if (buildConfig != null) { break; } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java index 723c0f976ff..abe8a31c4a1 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java @@ -11,7 +11,6 @@ package org.eclipse.cdt.debug.core.launch; import java.nio.file.Paths; -import java.util.Collection; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; @@ -63,25 +62,6 @@ public abstract class CoreBuildLaunchConfigDelegate extends LaunchConfigurationT return project != null ? new IProject[] { project } : new IProject[0]; } - /** - * @deprecated Use the version that takes the launch config so we can see if it - * know what toolchain to use. - */ - @Deprecated - protected ICBuildConfiguration getBuildConfiguration(IProject project, String mode, ILaunchTarget target, - IProgressMonitor monitor) throws CoreException { - // Pick build config based on toolchain for target - Map properties = new HashMap<>(); - properties.putAll(target.getAttributes()); - Collection tcs = toolChainManager.getToolChainsMatching(properties); - if (!tcs.isEmpty()) { - IToolChain toolChain = tcs.iterator().next(); - return configManager.getBuildConfiguration(project, toolChain, mode, monitor); - } else { - return null; - } - } - /** * @since 8.3 */ @@ -93,7 +73,7 @@ public abstract class CoreBuildLaunchConfigDelegate extends LaunchConfigurationT String providerId = configuration.getAttribute(ICBuildConfiguration.TOOLCHAIN_TYPE, ""); //$NON-NLS-1$ IToolChain toolchain = toolChainManager.getToolChain(providerId, toolchainId); if (toolchain != null) { - return configManager.getBuildConfiguration(project, toolchain, mode, monitor); + return configManager.getBuildConfiguration(project, toolchain, mode, target, monitor); } } @@ -101,7 +81,8 @@ public abstract class CoreBuildLaunchConfigDelegate extends LaunchConfigurationT Map properties = new HashMap<>(); properties.putAll(target.getAttributes()); for (IToolChain toolChain : toolChainManager.getToolChainsMatching(properties)) { - ICBuildConfiguration buildConfig = configManager.getBuildConfiguration(project, toolChain, mode, monitor); + ICBuildConfiguration buildConfig = configManager.getBuildConfiguration(project, toolChain, mode, target, + monitor); if (buildConfig != null) { return buildConfig; } @@ -129,7 +110,7 @@ public abstract class CoreBuildLaunchConfigDelegate extends LaunchConfigurationT /** * Returns the full path to the binary. * - * @since 8.8 + * @since 9.0 * @param configuration * @param buildConfig * @return diff --git a/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF b/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF index d2935f81563..aed7d6bd236 100644 --- a/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF +++ b/debug/org.eclipse.cdt.debug.ui/META-INF/MANIFEST.MF @@ -49,7 +49,7 @@ Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.16.0,4.0.0)", org.eclipse.ui;bundle-version="[3.2.0,4.0.0)", org.eclipse.debug.ui;bundle-version="[3.7.0,4.0.0)", org.eclipse.debug.core;bundle-version="[3.7.0,4.0.0)", - org.eclipse.cdt.debug.core;bundle-version="[7.0.0,9.0.0)", + org.eclipse.cdt.debug.core;bundle-version="[9.0.0,10.0.0)", org.eclipse.cdt.ui;bundle-version="[9.0.0,10.0.0)", org.eclipse.cdt.core;bundle-version="[9.0.0,10.0.0)", org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)", diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerLaunchConfigurationDelegate.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerLaunchConfigurationDelegate.java index 15ba069db6e..1d223d58614 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerLaunchConfigurationDelegate.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerLaunchConfigurationDelegate.java @@ -531,7 +531,7 @@ public class ContainerLaunchConfigurationDelegate extends GdbLaunchDelegate { String providerId = configuration.getAttribute(ICBuildConfiguration.TOOLCHAIN_TYPE, ""); //$NON-NLS-1$ IToolChain toolchain = toolChainManager.getToolChain(providerId, toolchainId); if (toolchain != null) { - return configManager.getBuildConfiguration(project, toolchain, mode, monitor); + return configManager.getBuildConfiguration(project, toolchain, mode, target, monitor); } } @@ -539,7 +539,8 @@ public class ContainerLaunchConfigurationDelegate extends GdbLaunchDelegate { Map properties = new HashMap<>(); properties.putAll(target.getAttributes()); for (IToolChain toolChain : toolChainManager.getToolChainsMatching(properties)) { - ICBuildConfiguration buildConfig = configManager.getBuildConfiguration(project, toolChain, mode, monitor); + ICBuildConfiguration buildConfig = configManager.getBuildConfiguration(project, toolChain, mode, target, + monitor); if (buildConfig != null) { return buildConfig; } diff --git a/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF b/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF index caa98885a3c..9bb851ba37c 100644 --- a/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF +++ b/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF @@ -21,7 +21,7 @@ Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)", org.eclipse.ui;bundle-version="[3.2.0,4.0.0)", org.eclipse.cdt.core;bundle-version="[9.0.0,10.0.0)", org.eclipse.cdt.ui;bundle-version="[9.0.0,10.0.0)", - org.eclipse.cdt.debug.core;bundle-version="[7.0.0,9.0.0)", + org.eclipse.cdt.debug.core;bundle-version="[9.0.0,10.0.0)", org.eclipse.cdt.debug.ui;bundle-version="[7.0.0,9.0.0)", org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)", org.eclipse.core.variables;bundle-version="[3.1.100,4.0.0)", diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/corebuild/CommonBuildTab.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/corebuild/CommonBuildTab.java index fafcfc3c4b9..0e78f43a1f3 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/corebuild/CommonBuildTab.java +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/corebuild/CommonBuildTab.java @@ -196,7 +196,8 @@ public abstract class CommonBuildTab extends AbstractLaunchConfigurationTab { String mode = getLaunchConfigurationDialog().getMode(); try { - buildConfig = bcManager.getBuildConfiguration(project, newToolchain, mode, new NullProgressMonitor()); + buildConfig = bcManager.getBuildConfiguration(project, newToolchain, mode, getLaunchTarget(), + new NullProgressMonitor()); } catch (CoreException e) { LaunchUIPlugin.log(e.getStatus()); } diff --git a/launchbar/org.eclipse.launchbar.core/META-INF/MANIFEST.MF b/launchbar/org.eclipse.launchbar.core/META-INF/MANIFEST.MF index a0c42f81ce8..c4252912e88 100644 --- a/launchbar/org.eclipse.launchbar.core/META-INF/MANIFEST.MF +++ b/launchbar/org.eclipse.launchbar.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.launchbar.core;singleton:=true -Bundle-Version: 2.5.300.qualifier +Bundle-Version: 3.0.0 Bundle-Activator: org.eclipse.launchbar.core.internal.Activator Bundle-Vendor: %providerName Require-Bundle: org.eclipse.core.runtime, diff --git a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/Messages.java b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/Messages.java index 3e0163cb8f4..df089b69037 100644 --- a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/Messages.java +++ b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/Messages.java @@ -21,7 +21,6 @@ public class Messages extends NLS { public static String LaunchBarManager_0; public static String LaunchBarManager_1; public static String LaunchBarManager_2; - public static String LocalTarget_name; public static String OK; static { diff --git a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/messages.properties b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/messages.properties index 52f961bd86f..3a056dbce40 100644 --- a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/messages.properties +++ b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/messages.properties @@ -15,5 +15,4 @@ ILaunchTarget_notSupported=getWorkingCopy is not supported for NULL_TARGET LaunchBarManager_0=Launch Bar Initialization LaunchBarManager_1=Active descriptor must be in the map of descriptors LaunchBarManager_2=Mode is not supported by descriptor -LocalTarget_name=Local OK=OK diff --git a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LocalLaunchTargetProvider.java b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LocalLaunchTargetProvider.java index b010d43881f..0c8140f822b 100644 --- a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LocalLaunchTargetProvider.java +++ b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/internal/target/LocalLaunchTargetProvider.java @@ -11,7 +11,6 @@ package org.eclipse.launchbar.core.internal.target; import org.eclipse.core.runtime.Platform; -import org.eclipse.launchbar.core.internal.Messages; import org.eclipse.launchbar.core.target.ILaunchTarget; import org.eclipse.launchbar.core.target.ILaunchTargetManager; import org.eclipse.launchbar.core.target.ILaunchTargetProvider; @@ -23,9 +22,9 @@ public class LocalLaunchTargetProvider implements ILaunchTargetProvider { @Override public void init(ILaunchTargetManager targetManager) { if (targetManager.getLaunchTarget(ILaunchTargetManager.localLaunchTargetTypeId, - Messages.LocalTarget_name) == null) { + ILaunchTargetManager.localLaunchTargetId) == null) { ILaunchTarget target = targetManager.addLaunchTarget(ILaunchTargetManager.localLaunchTargetTypeId, - Messages.LocalTarget_name); + ILaunchTargetManager.localLaunchTargetId); ILaunchTargetWorkingCopy wc = target.getWorkingCopy(); wc.setAttribute(ILaunchTarget.ATTR_OS, Platform.getOS()); wc.setAttribute(ILaunchTarget.ATTR_ARCH, Platform.getOSArch()); diff --git a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTarget.java b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTarget.java index d45b44a06fe..9971844e523 100644 --- a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTarget.java +++ b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTarget.java @@ -42,21 +42,10 @@ public interface ILaunchTarget extends IAdaptable { /** * The id for the target. It is unique for each type. * - * @return id for the target. + * @return id (name) for the target. */ String getId(); - /** - * The user consumable name of the target. - * - * @deprecated this will be the same as the id - * @return name of the target - */ - @Deprecated - default String getName() { - return getId(); - } - /** * The type of the target. * diff --git a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTargetManager.java b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTargetManager.java index ebb83bef2eb..c5c252f4c79 100644 --- a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTargetManager.java +++ b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/ILaunchTargetManager.java @@ -26,6 +26,17 @@ public interface ILaunchTargetManager { * represents that machine. */ final String localLaunchTargetTypeId = "org.eclipse.launchbar.core.launchTargetType.local"; //$NON-NLS-1$ + /** + * @since 3.0 + */ + final String localLaunchTargetId = "Local"; //$NON-NLS-1$ + + /** + * @since 3.0 + */ + default ILaunchTarget getLocalLaunchTarget() { + return getLaunchTarget(localLaunchTargetTypeId, localLaunchTargetId); + } /** * The list of all launch targets. diff --git a/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/LaunchTargetUtils.java b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/LaunchTargetUtils.java new file mode 100644 index 00000000000..289061acf03 --- /dev/null +++ b/launchbar/org.eclipse.launchbar.core/src/org/eclipse/launchbar/core/target/LaunchTargetUtils.java @@ -0,0 +1,48 @@ +/******************************************************************************* + * Copyright (c) 2025 Renesas Electronics Europe. + * + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + *******************************************************************************/ +package org.eclipse.launchbar.core.target; + +import java.util.regex.Pattern; + +/** + * @since 3.0 + */ +public class LaunchTargetUtils { + /** + * Used to detect names with invalid characters. _ is allowed. + * Invalid characters include: + * spaces, tabs, newlines, most punctuation (eg +-,.), control chars (eg \n, \t, \r) + */ + private static final Pattern INVALID_NAME_PATTERN = Pattern + .compile("[^\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]"); //$NON-NLS-1$ + + private LaunchTargetUtils() { + // empty + } + + /** + * Check for invalid characters. + * @param name The name to check. + * @return true if name contains characters in {@link #INVALID_NAME_PATTERN}. + */ + public static boolean isInvalidName(String name) { + return INVALID_NAME_PATTERN.matcher(name).find(); + } + + /** + * Replace any invalid characters with a safe value. + * @param name The name to check. + * @return name with any character in the {@link #INVALID_NAME_PATTERN} replaced with "_" + */ + public static String sanitizeName(String name) { + return INVALID_NAME_PATTERN.matcher(name).replaceAll("_"); //$NON-NLS-1$ + } +}