| /******************************************************************************* |
| * Copyright (c) 2016 QNX Software Systems and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| *******************************************************************************/ |
| package org.eclipse.cdt.cmake.core.internal; |
| |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; |
| import org.eclipse.cdt.cmake.core.ICMakeToolChainManager; |
| import org.eclipse.cdt.core.build.ICBuildConfiguration; |
| import org.eclipse.cdt.core.build.ICBuildConfigurationManager; |
| import org.eclipse.cdt.core.build.ICBuildConfigurationProvider; |
| import org.eclipse.cdt.core.build.IToolChain; |
| import org.eclipse.cdt.core.build.IToolChainManager; |
| 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.core.runtime.Platform; |
| |
| public class CMakeBuildConfigurationProvider implements ICBuildConfigurationProvider { |
| |
| 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; |
| } |
| |
| @Override |
| public ICBuildConfiguration getCBuildConfiguration(IBuildConfiguration config, String name) throws CoreException { |
| if (config.getName().equals(IBuildConfiguration.DEFAULT_CONFIG_NAME)) { |
| IToolChain toolChain = null; |
| |
| // try the toolchain for the local target |
| Map<String, String> properties = new HashMap<>(); |
| properties.put(IToolChain.ATTR_OS, Platform.getOS()); |
| properties.put(IToolChain.ATTR_ARCH, Platform.getOSArch()); |
| IToolChainManager toolChainManager = Activator.getService(IToolChainManager.class); |
| for (IToolChain tc : toolChainManager.getToolChainsMatching(properties)) { |
| toolChain = tc; |
| break; |
| } |
| |
| // local didn't work, try and find one that does |
| if (toolChain == null) { |
| for (IToolChain tc : toolChainManager.getToolChainsMatching(new HashMap<>())) { |
| toolChain = tc; |
| break; |
| } |
| } |
| |
| if (toolChain != null) { |
| return new CMakeBuildConfiguration(config, name, toolChain); |
| } else { |
| // No valid combinations |
| return null; |
| } |
| } else { |
| return new CMakeBuildConfiguration(config, name); |
| } |
| } |
| |
| @Override |
| public ICBuildConfiguration createBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, |
| IProgressMonitor monitor) throws CoreException { |
| // See if there is one already |
| for (IBuildConfiguration config : project.getBuildConfigs()) { |
| ICBuildConfiguration cconfig = config.getAdapter(ICBuildConfiguration.class); |
| if (cconfig != null) { |
| CMakeBuildConfiguration cmakeConfig = cconfig.getAdapter(CMakeBuildConfiguration.class); |
| if (cmakeConfig != null && cmakeConfig.getToolChain().equals(toolChain) |
| && launchMode.equals(cmakeConfig.getLaunchMode())) { |
| return cconfig; |
| } |
| } |
| } |
| |
| // get matching toolchain file if any |
| Map<String, String> 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.isEmpty()) { |
| properties.put(IToolChain.ATTR_ARCH, arch); |
| } |
| ICMakeToolChainFile file = null; |
| Collection<ICMakeToolChainFile> files = manager.getToolChainFilesMatching(properties); |
| if (!files.isEmpty()) { |
| file = files.iterator().next(); |
| } |
| |
| // create config |
| String configName = "cmake." + launchMode + '.' + toolChain.getId(); //$NON-NLS-1$ |
| IBuildConfiguration config = configManager.createBuildConfiguration(this, project, configName, monitor); |
| CMakeBuildConfiguration cmakeConfig = new CMakeBuildConfiguration(config, configName, toolChain, file, |
| launchMode); |
| configManager.addBuildConfiguration(config, cmakeConfig); |
| return cmakeConfig; |
| } |
| |
| } |