mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-02 05:45:58 +02:00
CMake and build architecture changes to improve launching
Right now launch configuration delegates need to know too much about the specific build system for a project (cmake versus qt, for example) Start decoupling this and test out the theory with CMake. Change-Id: I8a362f16cddca77b37a5ab5920ee19318035d478
This commit is contained in:
parent
a90d9dfbf8
commit
5426847cbb
8 changed files with 88 additions and 24 deletions
|
@ -26,7 +26,7 @@ public interface ICMakeToolChainManager {
|
||||||
|
|
||||||
ICMakeToolChainFile getToolChainFile(Path path);
|
ICMakeToolChainFile getToolChainFile(Path path);
|
||||||
|
|
||||||
Collection<ICMakeToolChainFile> getToolChainsFileMatching(Map<String, String> properties);
|
Collection<ICMakeToolChainFile> getToolChainFilesMatching(Map<String, String> properties);
|
||||||
|
|
||||||
Collection<ICMakeToolChainFile> getToolChainFiles();
|
Collection<ICMakeToolChainFile> getToolChainFiles();
|
||||||
|
|
||||||
|
|
|
@ -71,31 +71,38 @@ public class CMakeBuildConfigurationProvider implements ICBuildConfigurationProv
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public CMakeBuildConfiguration getCBuildConfiguration(IProject project, Map<String, String> properties,
|
@Override
|
||||||
String launchMode, IProgressMonitor monitor) throws CoreException {
|
public ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain, String launchMode,
|
||||||
|
IProgressMonitor monitor) throws CoreException {
|
||||||
|
// See if there is one already
|
||||||
for (IBuildConfiguration config : project.getBuildConfigs()) {
|
for (IBuildConfiguration config : project.getBuildConfigs()) {
|
||||||
ICBuildConfiguration cconfig = config.getAdapter(ICBuildConfiguration.class);
|
ICBuildConfiguration cconfig = config.getAdapter(ICBuildConfiguration.class);
|
||||||
if (cconfig != null) {
|
if (cconfig != null) {
|
||||||
CMakeBuildConfiguration cmakeConfig = cconfig.getAdapter(CMakeBuildConfiguration.class);
|
CMakeBuildConfiguration cmakeConfig = cconfig.getAdapter(CMakeBuildConfiguration.class);
|
||||||
if (cmakeConfig != null && cmakeConfig.getToolChain().matches(properties)) {
|
if (cmakeConfig != null && cmakeConfig.getToolChain().equals(toolChain)) {
|
||||||
return cmakeConfig;
|
return cconfig;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection<IToolChain> tcs = tcManager.getToolChainsMatching(properties);
|
// get matching toolchain file if any
|
||||||
if (tcs.isEmpty()) {
|
Map<String, String> properties = new HashMap<>();
|
||||||
return null;
|
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.isEmpty()) {
|
||||||
|
properties.put(IToolChain.ATTR_ARCH, arch);
|
||||||
}
|
}
|
||||||
IToolChain toolChain = tcs.iterator().next();
|
|
||||||
|
|
||||||
ICMakeToolChainFile file = null;
|
ICMakeToolChainFile file = null;
|
||||||
Collection<ICMakeToolChainFile> files = manager.getToolChainsFileMatching(properties);
|
Collection<ICMakeToolChainFile> files = manager.getToolChainFilesMatching(properties);
|
||||||
if (!files.isEmpty()) {
|
if (!files.isEmpty()) {
|
||||||
file = files.iterator().next();
|
file = files.iterator().next();
|
||||||
}
|
}
|
||||||
|
|
||||||
String configName = "cmake." + toolChain.getId(); //$NON-NLS-1$
|
// create config
|
||||||
|
String configName = "cmake." + launchMode + '.' + toolChain.getId(); //$NON-NLS-1$
|
||||||
IBuildConfiguration config = configManager.createBuildConfiguration(this, project, configName, monitor);
|
IBuildConfiguration config = configManager.createBuildConfiguration(this, project, configName, monitor);
|
||||||
CMakeBuildConfiguration cmakeConfig = new CMakeBuildConfiguration(config, configName, toolChain, file);
|
CMakeBuildConfiguration cmakeConfig = new CMakeBuildConfiguration(config, configName, toolChain, file);
|
||||||
configManager.addBuildConfiguration(config, cmakeConfig);
|
configManager.addBuildConfiguration(config, cmakeConfig);
|
||||||
|
|
|
@ -7,11 +7,14 @@
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
package org.eclipse.cdt.cmake.core.internal;
|
package org.eclipse.cdt.cmake.core.internal;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.eclipse.cdt.core.build.ICBuildConfiguration;
|
||||||
import org.eclipse.cdt.core.build.ICBuildConfigurationManager;
|
import org.eclipse.cdt.core.build.ICBuildConfigurationManager;
|
||||||
import org.eclipse.cdt.core.build.IToolChain;
|
import org.eclipse.cdt.core.build.IToolChain;
|
||||||
|
import org.eclipse.cdt.core.build.IToolChainManager;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.resources.IProjectDescription;
|
import org.eclipse.core.resources.IProjectDescription;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
@ -28,6 +31,7 @@ public class CMakeLaunchConfigurationDelegate extends LaunchConfigurationTargete
|
||||||
public static final String TYPE_ID = "org.eclipse.cdt.cmake.core.launchConfigurationType"; //$NON-NLS-1$
|
public static final String TYPE_ID = "org.eclipse.cdt.cmake.core.launchConfigurationType"; //$NON-NLS-1$
|
||||||
|
|
||||||
private ICBuildConfigurationManager configManager = Activator.getService(ICBuildConfigurationManager.class);
|
private ICBuildConfigurationManager configManager = Activator.getService(ICBuildConfigurationManager.class);
|
||||||
|
private IToolChainManager tcManager = Activator.getService(IToolChainManager.class);
|
||||||
|
|
||||||
private IProject getProject(ILaunchConfiguration configuration) throws CoreException {
|
private IProject getProject(ILaunchConfiguration configuration) throws CoreException {
|
||||||
return configuration.getMappedResources()[0].getProject();
|
return configuration.getMappedResources()[0].getProject();
|
||||||
|
@ -36,10 +40,7 @@ public class CMakeLaunchConfigurationDelegate extends LaunchConfigurationTargete
|
||||||
@Override
|
@Override
|
||||||
public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, ILaunchTarget target,
|
public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, ILaunchTarget target,
|
||||||
IProgressMonitor monitor) throws CoreException {
|
IProgressMonitor monitor) throws CoreException {
|
||||||
// Set active build config based on target
|
// Set active build config based on toolchain for target
|
||||||
CMakeBuildConfigurationProvider provider = (CMakeBuildConfigurationProvider) configManager
|
|
||||||
.getProvider(CMakeBuildConfigurationProvider.ID);
|
|
||||||
|
|
||||||
Map<String, String> properties = new HashMap<>();
|
Map<String, String> properties = new HashMap<>();
|
||||||
String os = target.getAttribute(ILaunchTarget.ATTR_OS, ""); //$NON-NLS-1$
|
String os = target.getAttribute(ILaunchTarget.ATTR_OS, ""); //$NON-NLS-1$
|
||||||
if (!os.isEmpty()) {
|
if (!os.isEmpty()) {
|
||||||
|
@ -49,15 +50,21 @@ public class CMakeLaunchConfigurationDelegate extends LaunchConfigurationTargete
|
||||||
if (!arch.isEmpty()) {
|
if (!arch.isEmpty()) {
|
||||||
properties.put(IToolChain.ATTR_ARCH, arch);
|
properties.put(IToolChain.ATTR_ARCH, arch);
|
||||||
}
|
}
|
||||||
|
Collection<IToolChain> tcs = tcManager.getToolChainsMatching(properties);
|
||||||
|
if (!tcs.isEmpty()) {
|
||||||
|
IToolChain toolChain = tcs.iterator().next();
|
||||||
|
|
||||||
IProject project = getProject(configuration);
|
IProject project = getProject(configuration);
|
||||||
CMakeBuildConfiguration config = provider.getCBuildConfiguration(project, properties, mode, monitor);
|
ICBuildConfiguration config = configManager.createBuildConfiguration(project, toolChain, "run", monitor); //$NON-NLS-1$
|
||||||
if (config != null) {
|
|
||||||
IProjectDescription desc = project.getDescription();
|
if (config != null) {
|
||||||
desc.setActiveBuildConfig(config.getBuildConfiguration().getName());
|
IProjectDescription desc = project.getDescription();
|
||||||
project.setDescription(desc, monitor);
|
desc.setActiveBuildConfig(config.getBuildConfiguration().getName());
|
||||||
|
project.setDescription(desc, monitor);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// proceed with the build
|
||||||
return superBuildForLaunch(configuration, mode, monitor);
|
return superBuildForLaunch(configuration, mode, monitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ public class CMakeLaunchConfigurationProvider extends AbstractLaunchConfigProvid
|
||||||
Map<String, String> properties = new HashMap<>();
|
Map<String, String> properties = new HashMap<>();
|
||||||
properties.put(IToolChain.ATTR_OS, os);
|
properties.put(IToolChain.ATTR_OS, os);
|
||||||
properties.put(IToolChain.ATTR_ARCH, arch);
|
properties.put(IToolChain.ATTR_ARCH, arch);
|
||||||
if (manager.getToolChainsFileMatching(properties).isEmpty()) {
|
if (manager.getToolChainFilesMatching(properties).isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -125,7 +125,7 @@ public class CMakeToolChainManager implements ICMakeToolChainManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<ICMakeToolChainFile> getToolChainsFileMatching(Map<String, String> properties) {
|
public Collection<ICMakeToolChainFile> getToolChainFilesMatching(Map<String, String> properties) {
|
||||||
List<ICMakeToolChainFile> matches = new ArrayList<>();
|
List<ICMakeToolChainFile> matches = new ArrayList<>();
|
||||||
for (ICMakeToolChainFile file : getToolChainFiles()) {
|
for (ICMakeToolChainFile file : getToolChainFiles()) {
|
||||||
boolean match = true;
|
boolean match = true;
|
||||||
|
|
|
@ -42,6 +42,23 @@ public interface ICBuildConfigurationManager {
|
||||||
IBuildConfiguration createBuildConfiguration(ICBuildConfigurationProvider provider, IProject project,
|
IBuildConfiguration createBuildConfiguration(ICBuildConfigurationProvider provider, IProject project,
|
||||||
String configName, IProgressMonitor monitor) throws CoreException;
|
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.
|
||||||
|
*
|
||||||
|
* @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
|
||||||
|
*/
|
||||||
|
ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain, String launchMode,
|
||||||
|
IProgressMonitor monitor) throws CoreException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called by providers to add new build configurations as they are created.
|
* Called by providers to add new build configurations as they are created.
|
||||||
*
|
*
|
||||||
|
|
|
@ -8,7 +8,9 @@
|
||||||
package org.eclipse.cdt.core.build;
|
package org.eclipse.cdt.core.build;
|
||||||
|
|
||||||
import org.eclipse.core.resources.IBuildConfiguration;
|
import org.eclipse.core.resources.IBuildConfiguration;
|
||||||
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A CBuildConfigurationProvider provides C build configurations.
|
* A CBuildConfigurationProvider provides C build configurations.
|
||||||
|
@ -32,4 +34,23 @@ public interface ICBuildConfigurationProvider {
|
||||||
*/
|
*/
|
||||||
ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name) throws CoreException;
|
ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name) throws CoreException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new build configuration for a given project using a given
|
||||||
|
* toolchain and builds for a given launch mode.
|
||||||
|
*
|
||||||
|
* @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
|
||||||
|
*/
|
||||||
|
default ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain,
|
||||||
|
String launchMode, IProgressMonitor monitor) throws CoreException {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import org.eclipse.cdt.core.CProjectNature;
|
||||||
import org.eclipse.cdt.core.build.ICBuildConfiguration;
|
import org.eclipse.cdt.core.build.ICBuildConfiguration;
|
||||||
import org.eclipse.cdt.core.build.ICBuildConfigurationManager;
|
import org.eclipse.cdt.core.build.ICBuildConfigurationManager;
|
||||||
import org.eclipse.cdt.core.build.ICBuildConfigurationProvider;
|
import org.eclipse.cdt.core.build.ICBuildConfigurationProvider;
|
||||||
|
import org.eclipse.cdt.core.build.IToolChain;
|
||||||
import org.eclipse.cdt.internal.core.model.CModelManager;
|
import org.eclipse.cdt.internal.core.model.CModelManager;
|
||||||
import org.eclipse.core.resources.IBuildConfiguration;
|
import org.eclipse.core.resources.IBuildConfiguration;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
|
@ -213,6 +214,17 @@ public class CBuildConfigurationManager implements ICBuildConfigurationManager,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain,
|
||||||
|
String launchMode, IProgressMonitor monitor) throws CoreException {
|
||||||
|
ICBuildConfigurationProvider provider = getProvider(project);
|
||||||
|
if (provider != null) {
|
||||||
|
return provider.createBuildConfiguration(project, toolChain, launchMode, monitor);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resourceChanged(IResourceChangeEvent event) {
|
public void resourceChanged(IResourceChangeEvent event) {
|
||||||
if (event.getType() == IResourceChangeEvent.PRE_CLOSE
|
if (event.getType() == IResourceChangeEvent.PRE_CLOSE
|
||||||
|
|
Loading…
Add table
Reference in a new issue