Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfigurationFactory.java')
-rw-r--r--qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfigurationFactory.java171
1 files changed, 171 insertions, 0 deletions
diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfigurationFactory.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfigurationFactory.java
new file mode 100644
index 00000000000..5fdafd47a5f
--- /dev/null
+++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfigurationFactory.java
@@ -0,0 +1,171 @@
+/*******************************************************************************
+ * Copyright (c) 2015 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.internal.qt.core.build;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.cdt.build.core.IToolChain;
+import org.eclipse.cdt.build.core.IToolChainManager;
+import org.eclipse.cdt.internal.qt.core.Activator;
+import org.eclipse.cdt.internal.qt.core.QtNature;
+import org.eclipse.cdt.qt.core.IQtInstall;
+import org.eclipse.cdt.qt.core.IQtInstallManager;
+import org.eclipse.core.resources.IBuildConfiguration;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.launchbar.core.target.ILaunchTarget;
+import org.eclipse.launchbar.core.target.ILaunchTargetManager;
+
+public class QtBuildConfigurationFactory implements IAdapterFactory {
+
+ private static IQtInstallManager qtInstallManager = Activator.getService(IQtInstallManager.class);
+ private static IToolChainManager toolChainManager = Activator.getService(IToolChainManager.class);
+
+ private static Map<IBuildConfiguration, QtBuildConfiguration> cache = new HashMap<>();
+
+ @Override
+ public Class<?>[] getAdapterList() {
+ return new Class<?>[] { QtBuildConfiguration.class };
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
+ if (adapterType.equals(QtBuildConfiguration.class) && adaptableObject instanceof IBuildConfiguration) {
+ IBuildConfiguration config = (IBuildConfiguration) adaptableObject;
+ synchronized (cache) {
+ QtBuildConfiguration qtConfig = cache.get(config);
+ if (qtConfig == null) {
+ if (!config.getName().equals(IBuildConfiguration.DEFAULT_CONFIG_NAME)) {
+ qtConfig = new QtBuildConfiguration(config);
+ cache.put(config, qtConfig);
+ return (T) qtConfig;
+ } else {
+ // Default to local
+ ILaunchTargetManager targetManager = Activator.getService(ILaunchTargetManager.class);
+ ILaunchTarget localTarget = targetManager
+ .getLaunchTargetsOfType(ILaunchTargetManager.localLaunchTargetTypeId)[0];
+ qtConfig = createDefaultConfig(config, localTarget);
+ if (qtConfig != null) {
+ cache.put(config, qtConfig);
+ return (T) qtConfig;
+ }
+
+ // Just find a combination that works
+ for (ILaunchTarget target : targetManager.getLaunchTargets()) {
+ if (!target.equals(localTarget)) {
+ qtConfig = createDefaultConfig(config, localTarget);
+ if (qtConfig != null) {
+ cache.put(config, qtConfig);
+ return (T) qtConfig;
+ }
+ }
+ }
+
+ // TODO if we don't have a target, need another way to
+ // match whatever qtInstalls we have with matching
+ // toolchains
+ }
+ }
+ return (T) qtConfig;
+ }
+ }
+ return null;
+ }
+
+ private static QtBuildConfiguration createDefaultConfig(IBuildConfiguration config, ILaunchTarget target) {
+ for (IQtInstall qtInstall : qtInstallManager.getInstalls()) {
+ if (qtInstallManager.supports(qtInstall, target)) {
+ // Find the toolchain
+ for (IToolChain toolChain : toolChainManager.getToolChainsSupporting(target)) {
+ if (qtInstallManager.supports(qtInstall, toolChain)) {
+ return new QtBuildConfiguration(config, toolChain, qtInstall, "run"); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ public static QtBuildConfiguration getConfig(IProject project, String launchMode, ILaunchTarget target,
+ IProgressMonitor monitor) throws CoreException {
+ // return it if it exists already
+ for (IBuildConfiguration config : project.getBuildConfigs()) {
+ QtBuildConfiguration qtConfig = config.getAdapter(QtBuildConfiguration.class);
+ IQtInstall qtInstall = qtConfig.getQtInstall();
+ if (qtInstall != null && qtInstallManager.supports(qtInstall, target)
+ && launchMode.equals(qtConfig.getLaunchMode())) {
+ return qtConfig;
+ }
+ }
+
+ // Nope, create it
+ for (IQtInstall qtInstall : qtInstallManager.getInstalls()) {
+ if (qtInstallManager.supports(qtInstall, target)) {
+ // Create the build config
+ Set<String> configNames = new HashSet<>();
+ for (IBuildConfiguration config : project.getBuildConfigs()) {
+ configNames.add(config.getName());
+ }
+ String baseName = qtInstall.getSpec() + ":" + launchMode; //$NON-NLS-1$
+ String newName = baseName;
+ int n = 0;
+ while (configNames.contains(newName)) {
+ newName = baseName + (++n);
+ }
+ configNames.add(newName);
+ IProjectDescription projectDesc = project.getDescription();
+ projectDesc.setBuildConfigs(configNames.toArray(new String[configNames.size()]));
+ project.setDescription(projectDesc, monitor);
+
+ // Find the toolchain
+ IToolChainManager toolChainManager = Activator.getService(IToolChainManager.class);
+ for (IToolChain toolChain : toolChainManager.getToolChainsSupporting(target)) {
+ if (qtInstallManager.supports(qtInstall, toolChain)) {
+ QtBuildConfiguration qtConfig = new QtBuildConfiguration(project.getBuildConfig(newName),
+ toolChain, qtInstall, launchMode);
+ return qtConfig;
+ // TODO what if there's more than toolChain supported?
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ public static class Cleanup implements IResourceChangeListener {
+ @Override
+ public void resourceChanged(IResourceChangeEvent event) {
+ if (event.getType() == IResourceChangeEvent.PRE_CLOSE
+ || event.getType() == IResourceChangeEvent.PRE_DELETE) {
+ if (event.getResource().getType() == IResource.PROJECT) {
+ IProject project = event.getResource().getProject();
+ if (QtNature.hasNature(project)) {
+ try {
+ for (IBuildConfiguration config : project.getBuildConfigs()) {
+ cache.remove(config);
+ }
+ } catch (CoreException e) {
+ Activator.log(e);
+ }
+ }
+ }
+ }
+ }
+ }
+
+} \ No newline at end of file

Back to the top