1
0
Fork 0
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:
Doug Schaefer 2016-08-29 17:53:41 -04:00
parent a90d9dfbf8
commit 5426847cbb
8 changed files with 88 additions and 24 deletions

View file

@ -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();

View file

@ -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);

View file

@ -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);
} }

View file

@ -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;
} }

View file

@ -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;

View file

@ -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.
* *

View file

@ -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;
}
} }

View file

@ -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