From 03051c91ab83ac8f532fb0cbea256449b76a6f1b Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Fri, 11 Nov 2016 13:10:16 -0500 Subject: [PATCH] Implement Qt build tab for the launch config dialog. Make sure Core Build handles the properties set by these tabs correctly. A bunch of string externalization too. Change-Id: I54a61b4d2520a0952c43608169747e792826062e --- .../META-INF/MANIFEST.MF | 3 +- .../cdt/cmake/ui/internal/CMakeBuildTab.java | 22 +-- .../cdt/cmake/ui/internal/Messages.java | 7 + .../cdt/cmake/ui/internal/messages.properties | 7 + .../cdt/core/build/CBuildConfiguration.java | 26 ++- .../cdt/core/build/ICBuildConfiguration.java | 15 +- .../build/ICBuildConfigurationManager.java | 19 +++ .../build/CBuildConfigurationManager.java | 15 ++ .../cdt/internal/core/build/Messages.java | 15 ++ .../internal/core/build/Messages.properties | 1 + ...ava => CoreBuildLaunchConfigDelegate.java} | 22 +-- .../core/InternalDebugCoreMessages.java | 2 + .../core/InternalDebugCoreMessages.properties | 2 + .../CoreBuildLocalRunLaunchDelegate.java | 7 +- .../cdt/dsf/gdb/internal/Messages.java | 4 + .../cdt/dsf/gdb/internal/Messages.properties | 3 +- .../CoreBuildLocalDebugLaunchDelegate.java | 12 +- .../META-INF/MANIFEST.MF | 8 +- launch/org.eclipse.cdt.launch/plugin.xml | 2 +- .../launch/internal/ui/LaunchMessages.java | 2 + .../internal/ui/LaunchMessages.properties | 2 + .../launch/internal/ui/LaunchUIPlugin.java | 8 + .../launch/ui/corebuild/CommonBuildTab.java | 55 +++++++ .../cdt/launch/ui/corebuild/CoreBuildTab.java | 11 +- .../META-INF/MANIFEST.MF | 2 +- qt/org.eclipse.cdt.qt.core/pom.xml | 2 +- .../cdt/internal/qt/core/Messages.java | 3 + .../qt/core/build/QtBuildConfiguration.java | 155 ++++++++++++++---- .../build/QtBuildConfigurationProvider.java | 38 ----- .../QtLocalDebugLaunchConfigDelegate.java | 119 -------------- .../cdt/internal/qt/core/messages.properties | 3 + .../cdt/qt/core/IQtBuildConfiguration.java | 7 + .../core/QtLaunchConfigurationDelegate.java | 86 ---------- qt/org.eclipse.cdt.qt.ui/META-INF/MANIFEST.MF | 4 +- qt/org.eclipse.cdt.qt.ui/plugin.xml | 7 + .../eclipse/cdt/internal/qt/ui/Messages.java | 4 + .../cdt/internal/qt/ui/launch/QtBuildTab.java | 154 +++++++++++++++++ .../cdt/internal/qt/ui/messages.properties | 4 + 38 files changed, 543 insertions(+), 315 deletions(-) create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.java create mode 100644 core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.properties rename debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/{CoreBuildLocalLaunchConfigDelegate.java => CoreBuildLaunchConfigDelegate.java} (82%) create mode 100644 launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/corebuild/CommonBuildTab.java delete mode 100644 qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/launch/QtLocalDebugLaunchConfigDelegate.java delete mode 100644 qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtLaunchConfigurationDelegate.java create mode 100644 qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/launch/QtBuildTab.java diff --git a/build/org.eclipse.cdt.cmake.ui/META-INF/MANIFEST.MF b/build/org.eclipse.cdt.cmake.ui/META-INF/MANIFEST.MF index 1b5caf16d01..2d8ec068d1b 100644 --- a/build/org.eclipse.cdt.cmake.ui/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.cmake.ui/META-INF/MANIFEST.MF @@ -13,7 +13,8 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.tools.templates.ui;bundle-version="1.1.0", org.eclipse.cdt.core;bundle-version="6.1.0", org.eclipse.debug.ui;bundle-version="3.11.200", - org.eclipse.cdt.launch;bundle-version="9.1.0" + org.eclipse.cdt.launch;bundle-version="9.1.0", + org.eclipse.cdt.debug.core;bundle-version="8.1.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-Localization: plugin diff --git a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/CMakeBuildTab.java b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/CMakeBuildTab.java index 200550cb617..b5abc40765c 100644 --- a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/CMakeBuildTab.java +++ b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/CMakeBuildTab.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.Map; import org.eclipse.cdt.cmake.core.internal.CMakeBuildConfiguration; +import org.eclipse.cdt.debug.core.launch.CoreBuildLaunchConfigDelegate; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; @@ -33,13 +34,13 @@ public class CMakeBuildTab extends AbstractLaunchConfigurationTab { setControl(comp); Label label = new Label(comp, SWT.NONE); - label.setText("Generator"); + label.setText(Messages.CMakeBuildTab_Generator); Composite genComp = new Composite(comp, SWT.BORDER); genComp.setLayout(new GridLayout(2, true)); unixGenButton = new Button(genComp, SWT.RADIO); - unixGenButton.setText("Unix Makefiles"); + unixGenButton.setText(Messages.CMakeBuildTab_UnixMakefiles); unixGenButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { @@ -48,7 +49,7 @@ public class CMakeBuildTab extends AbstractLaunchConfigurationTab { }); ninjaGenButton = new Button(genComp, SWT.RADIO); - ninjaGenButton.setText("Ninja"); + ninjaGenButton.setText(Messages.CMakeBuildTab_Ninja); ninjaGenButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { @@ -57,21 +58,21 @@ public class CMakeBuildTab extends AbstractLaunchConfigurationTab { }); label = new Label(comp, SWT.NONE); - label.setText("Additional CMake arguments:"); + label.setText(Messages.CMakeBuildTab_CMakeArgs); cmakeArgsText = new Text(comp, SWT.BORDER); cmakeArgsText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); cmakeArgsText.addModifyListener(e -> updateLaunchConfigurationDialog()); label = new Label(comp, SWT.NONE); - label.setText("Build command"); + label.setText(Messages.CMakeBuildTab_BuildCommand); buildCommandText = new Text(comp, SWT.BORDER); buildCommandText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); buildCommandText.addModifyListener(e -> updateLaunchConfigurationDialog()); label = new Label(comp, SWT.NONE); - label.setText("Clean command"); + label.setText(Messages.CMakeBuildTab_CleanCommand); cleanCommandText = new Text(comp, SWT.BORDER); cleanCommandText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); @@ -151,17 +152,18 @@ public class CMakeBuildTab extends AbstractLaunchConfigurationTab { properties.put(CMakeBuildConfiguration.CLEAN_COMMAND, cleanCommand); } - String mode = getLaunchConfigurationDialog().getMode(); + String buildAttribute = CoreBuildLaunchConfigDelegate + .getBuildAttributeName(getLaunchConfigurationDialog().getMode()); if (!properties.isEmpty()) { - configuration.setAttribute("COREBUILD_" + mode, properties); //$NON-NLS-1$ + configuration.setAttribute(buildAttribute, properties); } else { - configuration.removeAttribute("COREBUILD_" + mode); //$NON-NLS-1$ + configuration.removeAttribute(buildAttribute); } } @Override public String getName() { - return "CMake"; + return Messages.CMakeBuildTab_Cmake; } } diff --git a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/Messages.java b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/Messages.java index 172957a1a42..235e191c863 100644 --- a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/Messages.java +++ b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/Messages.java @@ -4,6 +4,13 @@ import org.eclipse.osgi.util.NLS; public class Messages extends NLS { private static final String BUNDLE_NAME = "org.eclipse.cdt.cmake.ui.properties.messages"; //$NON-NLS-1$ + public static String CMakeBuildTab_BuildCommand; + public static String CMakeBuildTab_CleanCommand; + public static String CMakeBuildTab_Cmake; + public static String CMakeBuildTab_CMakeArgs; + public static String CMakeBuildTab_Generator; + public static String CMakeBuildTab_Ninja; + public static String CMakeBuildTab_UnixMakefiles; public static String CMakePropertyPage_FailedToStartCMakeGui_Body; public static String CMakePropertyPage_FailedToStartCMakeGui_Title; public static String CMakePropertyPage_LaunchCMakeGui; diff --git a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/messages.properties b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/messages.properties index ebbe62ef2b5..e0e45fd3d9b 100644 --- a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/messages.properties +++ b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/messages.properties @@ -1,3 +1,10 @@ +CMakeBuildTab_BuildCommand=Build command +CMakeBuildTab_CleanCommand=Clean command +CMakeBuildTab_Cmake=CMake +CMakeBuildTab_CMakeArgs=Additional CMake arguments: +CMakeBuildTab_Generator=Generator +CMakeBuildTab_Ninja=Ninja +CMakeBuildTab_UnixMakefiles=Unix Makefiles CMakePropertyPage_FailedToStartCMakeGui_Body=Failed to run the CMake GUI: CMakePropertyPage_FailedToStartCMakeGui_Title=Failed to run CMake GUI CMakePropertyPage_LaunchCMakeGui=Launch CMake GUI... 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 148f4d5bac6..c3daf8b8fb2 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 @@ -24,6 +24,7 @@ import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -48,6 +49,7 @@ import org.eclipse.cdt.core.parser.IScannerInfo; import org.eclipse.cdt.core.parser.IScannerInfoChangeListener; import org.eclipse.cdt.core.parser.IncludeExportPatterns; import org.eclipse.cdt.core.resources.IConsole; +import org.eclipse.cdt.internal.core.build.Messages; import org.eclipse.cdt.internal.core.model.BinaryRunner; import org.eclipse.cdt.internal.core.model.CModelManager; import org.eclipse.cdt.internal.core.parser.ParserSettings2; @@ -127,7 +129,7 @@ public abstract class CBuildConfiguration extends PlatformObject tc = tcs.iterator().next(); } else { throw new CoreException(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, - String.format("Toolchain missing for config: %s", config.getName()))); + String.format(Messages.CBuildConfigurationtoolchainMissing, config.getName()))); } } toolChain = tc; @@ -720,8 +722,13 @@ public abstract class CBuildConfiguration extends PlatformObject * @since 6.2 */ @Override - public void setProperties(Map properties) { - this.properties = properties; + public boolean setProperties(Map properties) { + if (this.properties == null || !this.properties.equals(properties)) { + this.properties = properties; + return true; + } else { + return false; + } } /** @@ -729,7 +736,18 @@ public abstract class CBuildConfiguration extends PlatformObject */ @Override public Map getProperties() { - return properties != null ? properties : new HashMap<>(); + if (properties == null) { + properties = getDefaultProperties(); + } + return Collections.unmodifiableMap(properties); + } + + /** + * @since 6.2 + */ + @Override + public Map getDefaultProperties() { + return new HashMap<>(); } } 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 a48143fac1c..0794d4f054f 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 @@ -34,7 +34,7 @@ public interface ICBuildConfiguration extends IAdaptable, IScannerInfoProvider { * CDT doesn't like that the Platform default config name is an empty string. * It needs a real name for the name of the build directory, for example. */ - public static String DEFAULT_NAME = "default"; + public static String DEFAULT_NAME = "default"; //$NON-NLS-1$ /** * Returns the resources build configuration that this CDT build @@ -134,9 +134,11 @@ public interface ICBuildConfiguration extends IAdaptable, IScannerInfoProvider { * * @param properties * build properties + * @return whether the properties have changed * @since 6.2 */ - default void setProperties(Map properties) { + default boolean setProperties(Map properties) { + return false; } /** @@ -146,6 +148,15 @@ public interface ICBuildConfiguration extends IAdaptable, IScannerInfoProvider { * @since 6.2 */ default Map getProperties() { + return getDefaultProperties(); + } + + /** + * Returns the default values for the properties. + * + * @since 6.2 + */ + default Map getDefaultProperties() { return new HashMap<>(); } 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 44532edd952..91efa47a7e5 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 @@ -7,6 +7,8 @@ *******************************************************************************/ 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; @@ -59,6 +61,23 @@ public interface ICBuildConfigurationManager { 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. + * + * @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 + */ + ICBuildConfiguration getBuildConfiguration(IProject project, Map properties, + String launchMode, 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/internal/core/build/CBuildConfigurationManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/CBuildConfigurationManager.java index 3a492c7b870..1045a84196d 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 @@ -13,6 +13,7 @@ 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.Map; @@ -24,6 +25,7 @@ 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.cdt.internal.core.model.CModelManager; import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.resources.IProject; @@ -229,6 +231,19 @@ public class CBuildConfigurationManager implements ICBuildConfigurationManager, } } + @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); + } + @Override public void resourceChanged(IResourceChangeEvent event) { if (event.getType() == IResourceChangeEvent.PRE_CLOSE 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 new file mode 100644 index 00000000000..34174d410fc --- /dev/null +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.java @@ -0,0 +1,15 @@ +package org.eclipse.cdt.internal.core.build; + +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 CBuildConfigurationtoolchainMissing; + static { + // initialize resource bundle + NLS.initializeMessages(BUNDLE_NAME, Messages.class); + } + + private Messages() { + } +} 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 new file mode 100644 index 00000000000..d1a49530f37 --- /dev/null +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/Messages.properties @@ -0,0 +1 @@ +CBuildConfigurationtoolchainMissing=Toolchain missing for config: %s diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLocalLaunchConfigDelegate.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java similarity index 82% rename from debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLocalLaunchConfigDelegate.java rename to debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java index d66bcb7844f..cf8e12788ca 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLocalLaunchConfigDelegate.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java @@ -17,7 +17,7 @@ import org.eclipse.cdt.core.build.IToolChain; import org.eclipse.cdt.core.build.IToolChainManager; import org.eclipse.cdt.core.model.IBinary; import org.eclipse.cdt.debug.core.CDebugCorePlugin; -import org.eclipse.cdt.utils.Platform; +import org.eclipse.cdt.debug.internal.core.InternalDebugCoreMessages; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.runtime.CoreException; @@ -33,13 +33,13 @@ import org.eclipse.launchbar.core.target.launch.LaunchConfigurationTargetedDeleg * * @since 8.1 */ -public abstract class CoreBuildLocalLaunchConfigDelegate extends LaunchConfigurationTargetedDelegate { +public abstract class CoreBuildLaunchConfigDelegate extends LaunchConfigurationTargetedDelegate { protected ICBuildConfigurationManager configManager = CDebugCorePlugin .getService(ICBuildConfigurationManager.class); protected IToolChainManager toolChainManager = CDebugCorePlugin.getService(IToolChainManager.class); - protected IProject getProject(ILaunchConfiguration configuration) throws CoreException { + public static IProject getProject(ILaunchConfiguration configuration) throws CoreException { // TODO - make sure this is really the correct project return configuration.getMappedResources()[0].getProject(); } @@ -48,8 +48,7 @@ public abstract class CoreBuildLocalLaunchConfigDelegate extends LaunchConfigura IProgressMonitor monitor) throws CoreException { // Pick build config based on toolchain for target Map properties = new HashMap<>(); - properties.put(IToolChain.ATTR_OS, Platform.getOS()); - properties.put(IToolChain.ATTR_ARCH, Platform.getOSArch()); + properties.putAll(target.getAttributes()); Collection tcs = toolChainManager.getToolChainsMatching(properties); if (!tcs.isEmpty()) { IToolChain toolChain = tcs.iterator().next(); @@ -69,7 +68,7 @@ public abstract class CoreBuildLocalLaunchConfigDelegate extends LaunchConfigura } } if (exeFile == null) { - throw new CoreException(new Status(IStatus.ERROR, CDebugCorePlugin.PLUGIN_ID, "No binaries")); + throw new CoreException(new Status(IStatus.ERROR, CDebugCorePlugin.PLUGIN_ID, InternalDebugCoreMessages.CoreBuildLaunchConfigDelegate_noBinaries)); } return exeFile; } @@ -82,6 +81,10 @@ public abstract class CoreBuildLocalLaunchConfigDelegate extends LaunchConfigura return new IProject[] { project }; } + public static String getBuildAttributeName(String mode) { + return "COREBUILD_" + mode; //$NON-NLS-1$ + } + @Override public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, ILaunchTarget target, IProgressMonitor monitor) throws CoreException { @@ -92,10 +95,9 @@ public abstract class CoreBuildLocalLaunchConfigDelegate extends LaunchConfigura desc.setActiveBuildConfig(buildConfig.getBuildConfiguration().getName()); project.setDescription(desc, monitor); - Map buildProps = configuration.getAttribute("COREBUILD_" + mode, new HashMap<>()); //$NON-NLS-1$ - if (!buildProps.isEmpty()) { - buildConfig.setProperties(buildProps); - } + Map buildProps = configuration.getAttribute(getBuildAttributeName(mode), + buildConfig.getDefaultProperties()); + buildConfig.setProperties(buildProps); } // proceed with the build diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.java index 3545d42091b..c5494d95df6 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.java @@ -27,6 +27,8 @@ public class InternalDebugCoreMessages extends NLS { public static String CDebugAdapter_0; public static String CDebugAdapter_1; public static String CDebugAdapter_Program_file_not_specified; + public static String CoreBuildLaunchConfigDelegate_noBinaries; + public static String CoreBuildLocalRunLaunchDelegate_ErrorLaunching; public static String CRegisterManager_0; public static String CRegisterManager_1; public static String StringSubstitutionEngine_undefined_variable; diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.properties b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.properties index 959c2572886..8c0130ab937 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.properties +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/InternalDebugCoreMessages.properties @@ -21,6 +21,8 @@ DebugConfiguration_0=This debugger no longer supports this operation CDebugAdapter_0=This debugger does not support debugging external files CDebugAdapter_1=Debugger Process CDebugAdapter_Program_file_not_specified=Program file not specified +CoreBuildLaunchConfigDelegate_noBinaries=No binaries +CoreBuildLocalRunLaunchDelegate_ErrorLaunching=Error launching CRegisterManager_0=Unable to restore register groups - invalid memento. CRegisterManager_1=Unable to restore register groups - expecting register group list element. StringSubstitutionEngine_undefined_variable=Reference to undefined variable {0} diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/launch/CoreBuildLocalRunLaunchDelegate.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/launch/CoreBuildLocalRunLaunchDelegate.java index e67fa6d96a9..4ff8b3921c0 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/launch/CoreBuildLocalRunLaunchDelegate.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/launch/CoreBuildLocalRunLaunchDelegate.java @@ -13,7 +13,8 @@ import java.nio.file.Paths; import org.eclipse.cdt.core.build.ICBuildConfiguration; import org.eclipse.cdt.core.model.IBinary; import org.eclipse.cdt.debug.core.CDebugCorePlugin; -import org.eclipse.cdt.debug.core.launch.CoreBuildLocalLaunchConfigDelegate; +import org.eclipse.cdt.debug.core.launch.CoreBuildLaunchConfigDelegate; +import org.eclipse.cdt.debug.internal.core.InternalDebugCoreMessages; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -25,7 +26,7 @@ import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.launchbar.core.target.ILaunchTarget; import org.eclipse.launchbar.core.target.launch.ITargetedLaunch; -public class CoreBuildLocalRunLaunchDelegate extends CoreBuildLocalLaunchConfigDelegate { +public class CoreBuildLocalRunLaunchDelegate extends CoreBuildLaunchConfigDelegate { @Override public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) @@ -42,7 +43,7 @@ public class CoreBuildLocalRunLaunchDelegate extends CoreBuildLocalLaunchConfigD Process process = builder.start(); DebugPlugin.newProcess(launch, process, exeFile.getPath().lastSegment()); } catch (IOException e) { - throw new CoreException(new Status(IStatus.ERROR, CDebugCorePlugin.PLUGIN_ID, "Error launching", e)); + throw new CoreException(new Status(IStatus.ERROR, CDebugCorePlugin.PLUGIN_ID, InternalDebugCoreMessages.CoreBuildLocalRunLaunchDelegate_ErrorLaunching, e)); } } diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/Messages.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/Messages.java index 60fd44bb351..d54ddaeab50 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/Messages.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/Messages.java @@ -16,6 +16,10 @@ import org.eclipse.osgi.util.NLS; public class Messages extends NLS { + public static String CoreBuildLocalDebugLaunchDelegate_FailureLaunching; + + public static String CoreBuildLocalDebugLaunchDelegate_FailureStart; + public static String CustomTimeoutsMap_Error_initializing_custom_timeouts; public static String CustomTimeoutsMap_Invalid_custom_timeout_data; diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/Messages.properties b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/Messages.properties index 978adaa94e6..99861d83df0 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/Messages.properties +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/Messages.properties @@ -9,7 +9,8 @@ # Mentor Graphics - Initial API and implementation # Alvaro Sanchez-Leon (Ericsson AB) - Support for Step into selection ####################################################################################### - +CoreBuildLocalDebugLaunchDelegate_FailureStart=Failure to start debug session +CoreBuildLocalDebugLaunchDelegate_FailureLaunching=Failure launching with gdb CustomTimeoutsMap_Error_initializing_custom_timeouts=Error initializing custom timeouts CustomTimeoutsMap_Invalid_custom_timeout_data=Invalid custom timeout data. CustomTimeoutsMap_Invalid_custom_timeout_value=Invalid custom timeout value for '%s'. diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/launching/CoreBuildLocalDebugLaunchDelegate.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/launching/CoreBuildLocalDebugLaunchDelegate.java index 4ccc09812cf..e962a55e4c7 100644 --- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/launching/CoreBuildLocalDebugLaunchDelegate.java +++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/internal/launching/CoreBuildLocalDebugLaunchDelegate.java @@ -16,13 +16,14 @@ import java.util.concurrent.ExecutionException; import org.eclipse.cdt.core.build.ICBuildConfiguration; import org.eclipse.cdt.core.build.IToolChain; -import org.eclipse.cdt.debug.core.launch.CoreBuildLocalLaunchConfigDelegate; +import org.eclipse.cdt.debug.core.launch.CoreBuildLaunchConfigDelegate; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor; import org.eclipse.cdt.dsf.concurrent.Query; import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress; import org.eclipse.cdt.dsf.concurrent.Sequence; import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; +import org.eclipse.cdt.dsf.gdb.internal.Messages; import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch; import org.eclipse.cdt.dsf.gdb.launching.GdbSourceLookupDirector; import org.eclipse.cdt.dsf.gdb.launching.ServicesLaunchSequence; @@ -40,7 +41,7 @@ import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.launchbar.core.target.ILaunchTarget; import org.eclipse.launchbar.core.target.launch.ITargetedLaunch; -public class CoreBuildLocalDebugLaunchDelegate extends CoreBuildLocalLaunchConfigDelegate { +public class CoreBuildLocalDebugLaunchDelegate extends CoreBuildLaunchConfigDelegate { @Override public ITargetedLaunch getLaunch(ILaunchConfiguration configuration, String mode, ILaunchTarget target) @@ -76,7 +77,8 @@ public class CoreBuildLocalDebugLaunchDelegate extends CoreBuildLocalLaunchConfi gdbLaunch.setInitialEnvironment(envProps); IToolChain toolChain = buildConfig.getToolChain(); - gdbLaunch.setGDBPath(toolChain.getCommandPath(Paths.get("gdb")).toString()); //$NON-NLS-1$ + Path gdbPath = toolChain.getCommandPath(Paths.get("gdb")); //$NON-NLS-1$ + gdbLaunch.setGDBPath(gdbPath != null ? gdbPath.toString() : "gdb"); //$NON-NLS-1$ String gdbVersion = gdbLaunch.getGDBVersion(); Path exeFile = Paths.get(getBinary(buildConfig).getLocationURI()); @@ -89,7 +91,7 @@ public class CoreBuildLocalDebugLaunchDelegate extends CoreBuildLocalLaunchConfi try { servicesLaunchSequence.get(); } catch (InterruptedException | ExecutionException e) { - throw new DebugException(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, "Failure launching with gdb", e)); + throw new DebugException(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, Messages.CoreBuildLocalDebugLaunchDelegate_FailureLaunching, e)); } gdbLaunch.initializeControl(); @@ -123,7 +125,7 @@ public class CoreBuildLocalDebugLaunchDelegate extends CoreBuildLocalLaunchConfi try { ready.get(); } catch (ExecutionException | InterruptedException e) { - throw new DebugException(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, "Failure to start debug session", e)); + throw new DebugException(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, Messages.CoreBuildLocalDebugLaunchDelegate_FailureStart, e)); } } diff --git a/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF b/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF index a3661afac97..731ca773c56 100644 --- a/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF +++ b/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF @@ -8,9 +8,11 @@ Bundle-Vendor: %providerName Bundle-Localization: plugin Export-Package: org.eclipse.cdt.launch, org.eclipse.cdt.launch.internal;x-internal:=true, + org.eclipse.cdt.launch.internal.corebuild;x-internal:=true, org.eclipse.cdt.launch.internal.refactoring;x-internal:=true, org.eclipse.cdt.launch.internal.ui;x-friends:="org.eclipse.cdt.debug.edc.ui", - org.eclipse.cdt.launch.ui + org.eclipse.cdt.launch.ui, + org.eclipse.cdt.launch.ui.corebuild Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.2.0,4.0.0)", org.eclipse.core.expressions;bundle-version="[3.2.0,4.0.0)", org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)", @@ -23,7 +25,9 @@ Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.2.0,4.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)", - org.eclipse.ltk.core.refactoring;bundle-version="[3.5.0,4.0.0)" + org.eclipse.ltk.core.refactoring;bundle-version="[3.5.0,4.0.0)", + org.eclipse.launchbar.ui;bundle-version="2.1.0", + org.eclipse.launchbar.core;bundle-version="2.1.0" Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Import-Package: com.ibm.icu.text diff --git a/launch/org.eclipse.cdt.launch/plugin.xml b/launch/org.eclipse.cdt.launch/plugin.xml index fb521cdfd42..9fb7db2cad8 100644 --- a/launch/org.eclipse.cdt.launch/plugin.xml +++ b/launch/org.eclipse.cdt.launch/plugin.xml @@ -147,7 +147,7 @@ + type="org.eclipse.cdt.debug.core.localCoreBuildLaunchConfigType"> diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.java index d9216df2633..0b3e4a846a7 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.java +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.java @@ -46,6 +46,8 @@ public class LaunchMessages extends NLS { public static String LocalAttachLaunchDelegate_Platform_cannot_list_processes; public static String LocalAttachLaunchDelegate_Select_Process_to_attach_debugger_to; public static String LocalAttachLaunchDelegate_CDT_Launch_Error; + public static String CoreBuildTab_Build; + public static String CoreBuildTab_NoOptions; public static String CoreFileLaunchDelegate_Launching_postmortem_debugger; public static String CoreFileLaunchDelegate_No_Corefile_selected; public static String CoreFileLaunchDelegate_No_Shell_available_in_Launch; diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties index 26073b4d391..ef0d62cea5c 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchMessages.properties @@ -49,6 +49,8 @@ LocalAttachLaunchDelegate_Platform_cannot_list_processes=Current platform does n LocalAttachLaunchDelegate_Select_Process_to_attach_debugger_to=Select a Process to attach debugger to: LocalAttachLaunchDelegate_CDT_Launch_Error=CDT Launch Error +CoreBuildTab_Build=Build +CoreBuildTab_NoOptions=No build options required. CoreFileLaunchDelegate_Launching_postmortem_debugger=Launching postmortem debugger CoreFileLaunchDelegate_No_Corefile_selected=No Corefile selected CoreFileLaunchDelegate_No_Shell_available_in_Launch=No Shell available in Launch diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchUIPlugin.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchUIPlugin.java index 55a0b2bed6c..d9c1aca5f31 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchUIPlugin.java +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/internal/ui/LaunchUIPlugin.java @@ -23,6 +23,7 @@ import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; public class LaunchUIPlugin extends AbstractUIPlugin implements ILaunchesListener2 { @@ -226,4 +227,11 @@ public class LaunchUIPlugin extends AbstractUIPlugin implements ILaunchesListene } } } + + public static T getService(Class service) { + BundleContext context = fgPlugin.getBundle().getBundleContext(); + ServiceReference ref = context.getServiceReference(service); + return ref != null ? context.getService(ref) : null; + } + } 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 new file mode 100644 index 00000000000..c7b79e6c49e --- /dev/null +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/corebuild/CommonBuildTab.java @@ -0,0 +1,55 @@ +/******************************************************************************* + * 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.launch.ui.corebuild; + +import java.util.Map; + +import org.eclipse.cdt.core.build.ICBuildConfiguration; +import org.eclipse.cdt.core.build.ICBuildConfigurationManager; +import org.eclipse.cdt.debug.core.launch.CoreBuildLaunchConfigDelegate; +import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.NullProgressMonitor; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; +import org.eclipse.debug.ui.ILaunchConfigurationDialog; +import org.eclipse.launchbar.core.target.ILaunchTarget; +import org.eclipse.launchbar.ui.ILaunchBarLaunchConfigDialog; + +/** + * Common utilities for Core Build launch configuration tabs. + * + * @since 9.1 + */ +public abstract class CommonBuildTab extends AbstractLaunchConfigurationTab { + + public ILaunchBarLaunchConfigDialog getLaunchBarLaunchConfigDialog() { + ILaunchConfigurationDialog dialog = getLaunchConfigurationDialog(); + return dialog instanceof ILaunchBarLaunchConfigDialog ? (ILaunchBarLaunchConfigDialog) dialog : null; + } + + public ILaunchTarget getLaunchTarget() { + ILaunchBarLaunchConfigDialog dialog = getLaunchBarLaunchConfigDialog(); + return dialog != null ? dialog.getLaunchTarget() : null; + } + + public ICBuildConfiguration getBuildConfiguration(ILaunchConfiguration configuration) throws CoreException { + String mode = getLaunchConfigurationDialog().getMode(); + ILaunchTarget target = getLaunchTarget(); + if (target == null) { + return null; + } + + ICBuildConfigurationManager bcManager = LaunchUIPlugin.getService(ICBuildConfigurationManager.class); + IProject project = CoreBuildLaunchConfigDelegate.getProject(configuration); + Map properties = target.getAttributes(); + return bcManager.getBuildConfiguration(project, properties, mode, new NullProgressMonitor()); + } + +} diff --git a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/corebuild/CoreBuildTab.java b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/corebuild/CoreBuildTab.java index 2607c6e773d..af286f2faf1 100644 --- a/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/corebuild/CoreBuildTab.java +++ b/launch/org.eclipse.cdt.launch/src/org/eclipse/cdt/launch/ui/corebuild/CoreBuildTab.java @@ -7,6 +7,7 @@ *******************************************************************************/ package org.eclipse.cdt.launch.ui.corebuild; +import org.eclipse.cdt.launch.internal.ui.LaunchMessages; import org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; @@ -26,6 +27,12 @@ import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; +/** + * Launch configuration tab for adjusting Core Build settings. Contents of tab depends on the nature + * of the project which determines what build system is being used. + * + * @since 9.1 + */ public class CoreBuildTab extends AbstractLaunchConfigurationTab { private Composite container; @@ -84,7 +91,7 @@ public class CoreBuildTab extends AbstractLaunchConfigurationTab { @Override public String getName() { - return "Build"; + return LaunchMessages.CoreBuildTab_Build; } private IProject getProject(ILaunchConfiguration configuration) { @@ -111,7 +118,7 @@ public class CoreBuildTab extends AbstractLaunchConfigurationTab { comp.setLayout(new GridLayout()); Label label = new Label(comp, SWT.NONE); - label.setText("No build options required."); + label.setText(LaunchMessages.CoreBuildTab_NoOptions); activeTab = null; } diff --git a/qt/org.eclipse.cdt.qt.core/META-INF/MANIFEST.MF b/qt/org.eclipse.cdt.qt.core/META-INF/MANIFEST.MF index 5624d3662a5..a0e498d558f 100644 --- a/qt/org.eclipse.cdt.qt.core/META-INF/MANIFEST.MF +++ b/qt/org.eclipse.cdt.qt.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.qt.core;singleton:=true -Bundle-Version: 2.1.0.qualifier +Bundle-Version: 2.2.0.qualifier Bundle-Activator: org.eclipse.cdt.internal.qt.core.Activator Bundle-Vendor: %providerName Require-Bundle: org.eclipse.core.runtime, diff --git a/qt/org.eclipse.cdt.qt.core/pom.xml b/qt/org.eclipse.cdt.qt.core/pom.xml index 231985bf8da..b49db781a8b 100644 --- a/qt/org.eclipse.cdt.qt.core/pom.xml +++ b/qt/org.eclipse.cdt.qt.core/pom.xml @@ -11,7 +11,7 @@ ../../pom.xml - 2.1.0-SNAPSHOT + 2.2.0-SNAPSHOT org.eclipse.cdt.qt.core eclipse-plugin \ No newline at end of file diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/Messages.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/Messages.java index f279816ae76..9a6f0ec4f5e 100644 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/Messages.java +++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/Messages.java @@ -4,7 +4,10 @@ import org.eclipse.osgi.util.NLS; public class Messages extends NLS { private static final String BUNDLE_NAME = "org.eclipse.cdt.internal.qt.core.messages"; //$NON-NLS-1$ + public static String QtBuildConfiguration_ConfigNotFound; + public static String QtBuildConfiguration_MakeNotFound; public static String QtBuilder_0; + public static String QtBuildTab_Name; static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, Messages.class); diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfiguration.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfiguration.java index 81ca2ccd005..ba12633a2c9 100644 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfiguration.java +++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfiguration.java @@ -33,6 +33,8 @@ import org.eclipse.cdt.core.parser.IExtendedScannerInfo; import org.eclipse.cdt.core.parser.IScannerInfo; import org.eclipse.cdt.core.resources.IConsole; import org.eclipse.cdt.internal.qt.core.Activator; +import org.eclipse.cdt.internal.qt.core.Messages; +import org.eclipse.cdt.internal.qt.core.QtInstallManager; import org.eclipse.cdt.qt.core.IQtBuildConfiguration; import org.eclipse.cdt.qt.core.IQtInstall; import org.eclipse.cdt.qt.core.IQtInstallListener; @@ -53,13 +55,18 @@ import org.osgi.service.prefs.Preferences; public class QtBuildConfiguration extends CBuildConfiguration implements ICBuildConfiguration, IQtBuildConfiguration, IQtInstallListener { + public static final String QMAKE_COMMAND = "cdt.qt.qmake.command"; //$NON-NLS-1$ + public static final String QMAKE_ARGS = "cdt.qt.qmake.args"; //$NON-NLS-1$ + public static final String BUILD_COMMAND = "cdt.qt.buildCommand"; //$NON-NLS-1$ + private static final String QTINSTALL_NAME = "cdt.qt.install.name"; //$NON-NLS-1$ private static final String QTINSTALL_SPEC = "cdt.qt.install.spec"; //$NON-NLS-1$ private static final String LAUNCH_MODE = "cdt.qt.launchMode"; //$NON-NLS-1$ private final String qtInstallSpec; private IQtInstall qtInstall; - private Map properties; + private Map qtProperties; + private boolean doFullBuild; private IEnvironmentVariable pathVar = new IEnvironmentVariable() { @Override @@ -74,7 +81,7 @@ public class QtBuildConfiguration extends CBuildConfiguration @Override public String getName() { - return "PATH"; + return "PATH"; //$NON-NLS-1$ } @Override @@ -107,7 +114,7 @@ public class QtBuildConfiguration extends CBuildConfiguration if (getQtInstall() == null) { throw new CoreException( - Activator.error(String.format("Qt Install for build configuration %s not found.", name))); + Activator.error(String.format(Messages.QtBuildConfiguration_ConfigNotFound, name))); } String oldLaunchMode = settings.get(LAUNCH_MODE, null); @@ -144,6 +151,17 @@ public class QtBuildConfiguration extends CBuildConfiguration } } + @SuppressWarnings("unchecked") + @Override + public T getAdapter(Class adapter) { + if (adapter.equals(IQtBuildConfiguration.class)) { + return (T) this; + } else { + return super.getAdapter(adapter); + } + } + + @Override public IQtInstall getQtInstall() { if (qtInstall == null && !qtInstallSpec.isEmpty()) { // find one that matches the spec @@ -171,6 +189,11 @@ public class QtBuildConfiguration extends CBuildConfiguration @Override public String[] getQmakeConfig() { + String qmakeArgs = getProperties().get(QMAKE_ARGS); + if (qmakeArgs != null) { + return qmakeArgs.split(" "); //$NON-NLS-1$ + } + String launchMode = getLaunchMode(); if (launchMode != null) { switch (launchMode) { @@ -217,8 +240,8 @@ public class QtBuildConfiguration extends CBuildConfiguration } } - public String getProperty(String key) { - if (properties == null) { + public String getQtProperty(String key) { + if (qtProperties == null) { List cmd = new ArrayList<>(); cmd.add(getQmakeCommand().toString()); cmd.add("-E"); //$NON-NLS-1$ @@ -238,13 +261,13 @@ public class QtBuildConfiguration extends CBuildConfiguration setBuildEnvironment(processBuilder.environment()); Process proc = processBuilder.start(); try (BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()))) { - properties = new HashMap<>(); + qtProperties = new HashMap<>(); for (String line = reader.readLine(); line != null; line = reader.readLine()) { int i = line.indexOf('='); if (i >= 0) { String k = line.substring(0, i); String v = line.substring(i + 1); - properties.put(k.trim(), v.trim()); + qtProperties.put(k.trim(), v.trim()); } } } @@ -253,12 +276,12 @@ public class QtBuildConfiguration extends CBuildConfiguration } } - return properties != null ? properties.get(key) : null; + return qtProperties != null ? qtProperties.get(key) : null; } @Override public IEnvironmentVariable getVariable(String name) { - if ("PATH".equals(name)) { + if ("PATH".equals(name)) { //$NON-NLS-1$ return pathVar; } else { return null; @@ -274,7 +297,7 @@ public class QtBuildConfiguration extends CBuildConfiguration public IScannerInfo getScannerInformation(IResource resource) { IQtInstall qtInstall = getQtInstall(); - String cxx = getProperty("QMAKE_CXX"); //$NON-NLS-1$ + String cxx = getQtProperty("QMAKE_CXX"); //$NON-NLS-1$ if (cxx == null) { Activator.log("No QMAKE_CXX for " + qtInstall.getSpec()); //$NON-NLS-1$ return null; @@ -286,7 +309,7 @@ public class QtBuildConfiguration extends CBuildConfiguration for (int i = 1; i < cxxSplit.length; ++i) { args.add(cxxSplit[i]); } - args.addAll(Arrays.asList(getProperty("QMAKE_CXXFLAGS").split(" "))); //$NON-NLS-1$ //$NON-NLS-2$ + args.addAll(Arrays.asList(getQtProperty("QMAKE_CXXFLAGS").split(" "))); //$NON-NLS-1$ //$NON-NLS-2$ args.add("-o"); //$NON-NLS-1$ args.add("-"); //$NON-NLS-1$ @@ -300,7 +323,7 @@ public class QtBuildConfiguration extends CBuildConfiguration srcFile = "scannerInfo.cpp"; //$NON-NLS-1$ } - String[] includePaths = getProperty("INCLUDEPATH").split(" "); //$NON-NLS-1$ //$NON-NLS-2$ + String[] includePaths = getQtProperty("INCLUDEPATH").split(" "); //$NON-NLS-1$ //$NON-NLS-2$ for (int i = 0; i < includePaths.length; ++i) { Path path = Paths.get(includePaths[i]); if (!path.isAbsolute()) { @@ -330,15 +353,15 @@ public class QtBuildConfiguration extends CBuildConfiguration ConsoleOutputStream errStream = console.getErrorStream(); ConsoleOutputStream outStream = console.getOutputStream(); - Path makeCommand = getMakeCommand(); + String[] makeCommand = getMakeCommand(); if (makeCommand == null) { - errStream.write("'make' not found.\n"); + errStream.write(Messages.QtBuildConfiguration_MakeNotFound); return null; } Path buildDir = getBuildDirectory(); - if (!buildDir.resolve("Makefile").toFile().exists()) { //$NON-NLS-1$ + if (doFullBuild || !buildDir.resolve("Makefile").toFile().exists()) { //$NON-NLS-1$ // Need to run qmake List command = new ArrayList<>(); command.add(getQmakeCommand().toString()); @@ -366,16 +389,18 @@ public class QtBuildConfiguration extends CBuildConfiguration // TODO qmake error parser watchProcess(process, new IConsoleParser[0], console); + doFullBuild = false; } try (ErrorParserManager epm = new ErrorParserManager(project, getBuildDirectoryURI(), this, getToolChain().getErrorParserIds())) { // run make - ProcessBuilder processBuilder = new ProcessBuilder(makeCommand.toString(), "all") //$NON-NLS-1$ - .directory(buildDir.toFile()); + List command = new ArrayList<>(Arrays.asList(makeCommand)); + command.add("all"); //$NON-NLS-1$ + ProcessBuilder processBuilder = new ProcessBuilder(command).directory(buildDir.toFile()); setBuildEnvironment(processBuilder.environment()); Process process = processBuilder.start(); - outStream.write(makeCommand.toString() + '\n'); + outStream.write(String.join(" ", command) + '\n'); //$NON-NLS-1$ watchProcess(process, new IConsoleParser[] { epm }, console); } @@ -395,9 +420,9 @@ public class QtBuildConfiguration extends CBuildConfiguration ConsoleOutputStream errStream = console.getErrorStream(); ConsoleOutputStream outStream = console.getOutputStream(); - Path makeCommand = getMakeCommand(); + String[] makeCommand = getMakeCommand(); if (makeCommand == null) { - errStream.write("'make' not found.\n"); + errStream.write(Messages.QtBuildConfiguration_MakeNotFound); return; } @@ -406,11 +431,12 @@ public class QtBuildConfiguration extends CBuildConfiguration try (ErrorParserManager epm = new ErrorParserManager(project, getBuildDirectoryURI(), this, getToolChain().getErrorParserIds())) { // run make - ProcessBuilder processBuilder = new ProcessBuilder(makeCommand.toString(), "clean") //$NON-NLS-1$ - .directory(buildDir.toFile()); + List command = new ArrayList<>(Arrays.asList(makeCommand)); + command.add("clean"); //$NON-NLS-1$ + ProcessBuilder processBuilder = new ProcessBuilder(command).directory(buildDir.toFile()); setBuildEnvironment(processBuilder.environment()); Process process = processBuilder.start(); - outStream.write(makeCommand.toString() + "clean\n"); //$NON-NLS-1$ + outStream.write(String.join(" ", command) + '\n'); //$NON-NLS-1$ watchProcess(process, new IConsoleParser[] { epm }, console); } @@ -420,12 +446,85 @@ public class QtBuildConfiguration extends CBuildConfiguration } } - public Path getMakeCommand() { - Path makeCommand = findCommand("make"); //$NON-NLS-1$ - if (makeCommand == null) { - makeCommand = findCommand("mingw32-make"); //$NON-NLS-1$ + public String[] getMakeCommand() { + String buildCommandStr = getProperties().get(BUILD_COMMAND); + if (buildCommandStr != null) { + String[] buildCommand = buildCommandStr.split(" "); //$NON-NLS-1$ + Path command = findCommand(buildCommand[0]); + if (command == null) { + command = findCommand("make"); //$NON-NLS-1$ + if (command == null) { + command = findCommand("mingw32-make"); //$NON-NLS-1$ + } + } + + if (command != null) { + buildCommand[0] = command.toString(); + } + return buildCommand; + } else { + return null; + } + + } + + @Override + public Map getDefaultProperties() { + Map defaults = super.getDefaultProperties(); + + String qmakeCommand = qtInstall.getQmakePath().toString(); + defaults.put(QMAKE_COMMAND, qmakeCommand); + + String qmakeArgs; + String launchMode = getLaunchMode(); + if (launchMode != null) { + switch (launchMode) { + case "run": //$NON-NLS-1$ + qmakeArgs = "CONFIG-=debug_and_release CONFIG+=release"; //$NON-NLS-1$ + break; + case "debug": //$NON-NLS-1$ + qmakeArgs = "CONFIG-=debug_and_release CONFIG+=debug"; //$NON-NLS-1$ + break; + default: + qmakeArgs = "CONFIG-=debug_and_release CONFIG+=launch_mode_" + launchMode; //$NON-NLS-1$ + } + } else { + qmakeArgs = "CONFIG+=debug_and_release CONFIG+=launch_modeall"; //$NON-NLS-1$ + } + defaults.put(QMAKE_ARGS, qmakeArgs); + + String buildCommand = "make"; //$NON-NLS-1$ + if (findCommand(buildCommand) == null) { + buildCommand = "mingw32-make"; //$NON-NLS-1$ + if (findCommand(buildCommand) == null) { + // Neither was found, default to make + buildCommand = "make"; //$NON-NLS-1$ + } + } + defaults.put(BUILD_COMMAND, buildCommand); + + return defaults; + } + + @Override + public boolean setProperties(Map properties) { + if (super.setProperties(properties)) { + String qmakeCommand = properties.get(QMAKE_COMMAND); + if (qmakeCommand != null && !qmakeCommand.equals(qtInstall.getQmakePath().toString())) { + // TODO change the qtInstall + QtInstallManager installManager = Activator.getService(QtInstallManager.class); + IQtInstall newInstall = installManager.getInstall(Paths.get(qmakeCommand)); + if (newInstall != null) { + qtInstall = newInstall; + } + } + + // Do a full build to take in new properties + doFullBuild = true; + return true; + } else { + return false; } - return makeCommand; } } diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfigurationProvider.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfigurationProvider.java index c442de5da81..0a266365ce1 100644 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfigurationProvider.java +++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/build/QtBuildConfigurationProvider.java @@ -7,7 +7,6 @@ *******************************************************************************/ package org.eclipse.cdt.internal.qt.core.build; -import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -117,41 +116,4 @@ public class QtBuildConfigurationProvider implements ICBuildConfigurationProvide return null; } - // TODO this goes when the launch delegate goes - public IQtBuildConfiguration getConfiguration(IProject project, Map properties, String launchMode, - IProgressMonitor monitor) throws CoreException { - Collection toolChains = toolChainManager.getToolChainsMatching(properties); - for (IBuildConfiguration config : project.getBuildConfigs()) { - ICBuildConfiguration cconfig = config.getAdapter(ICBuildConfiguration.class); - if (cconfig != null) { - IQtBuildConfiguration qtConfig = cconfig.getAdapter(IQtBuildConfiguration.class); - if (qtConfig != null && launchMode.equals(qtConfig.getLaunchMode())) { - for (IToolChain toolChain : toolChains) { - if (qtConfig.getToolChain().equals(toolChain)) { - return qtConfig; - } - } - } - } - } - - // Not found, create one - for (IToolChain toolChain : toolChains) { - for (IQtInstall qtInstall : qtInstallManager.getInstalls()) { - if (qtInstallManager.supports(qtInstall, toolChain)) { - // TODO what if multiple matches, this returns first match - String configName = "qt." + qtInstall.getSpec() + "." + launchMode; //$NON-NLS-1$ //$NON-NLS-2$ - IBuildConfiguration config = configManager.createBuildConfiguration(this, project, configName, - monitor); - QtBuildConfiguration qtConfig = new QtBuildConfiguration(config, configName, toolChain, qtInstall, - launchMode); - configManager.addBuildConfiguration(config, qtConfig); - return qtConfig; - } - } - } - - return null; - } - } diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/launch/QtLocalDebugLaunchConfigDelegate.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/launch/QtLocalDebugLaunchConfigDelegate.java deleted file mode 100644 index 15034619d36..00000000000 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/launch/QtLocalDebugLaunchConfigDelegate.java +++ /dev/null @@ -1,119 +0,0 @@ -/******************************************************************************* - * 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.internal.qt.core.launch; - -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.concurrent.ExecutionException; - -import org.eclipse.cdt.core.build.IToolChain; -import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; -import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor; -import org.eclipse.cdt.dsf.concurrent.Query; -import org.eclipse.cdt.dsf.concurrent.RequestMonitorWithProgress; -import org.eclipse.cdt.dsf.concurrent.Sequence; -import org.eclipse.cdt.dsf.gdb.launching.GdbLaunch; -import org.eclipse.cdt.dsf.gdb.launching.GdbSourceLookupDirector; -import org.eclipse.cdt.dsf.gdb.launching.ServicesLaunchSequence; -import org.eclipse.cdt.dsf.gdb.service.GdbDebugServicesFactory; -import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl; -import org.eclipse.cdt.dsf.service.DsfServicesTracker; -import org.eclipse.cdt.internal.qt.core.Activator; -import org.eclipse.cdt.qt.core.IQtBuildConfiguration; -import org.eclipse.cdt.qt.core.QtLaunchConfigurationDelegate; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.debug.core.DebugException; -import org.eclipse.debug.core.ILaunch; -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.launchbar.core.target.ILaunchTarget; -import org.eclipse.launchbar.core.target.launch.ITargetedLaunch; - -public class QtLocalDebugLaunchConfigDelegate extends QtLaunchConfigurationDelegate { - - @Override - public ITargetedLaunch getLaunch(ILaunchConfiguration configuration, String mode, ILaunchTarget target) - throws CoreException { - GdbLaunch launch = new GdbLaunch(configuration, mode, null); - launch.setLaunchTarget(target); - launch.initialize(); - - GdbSourceLookupDirector locator = new GdbSourceLookupDirector(launch.getSession()); - String memento = configuration.getAttribute(ILaunchConfiguration.ATTR_SOURCE_LOCATOR_MEMENTO, (String) null); - if (memento == null) { - locator.initializeDefaults(configuration); - } else { - locator.initializeFromMemento(memento, configuration); - } - - launch.setSourceLocator(locator); - return launch; - } - - @Override - public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) - throws CoreException { - GdbLaunch gdbLaunch = (GdbLaunch) launch; - ILaunchTarget target = ((ITargetedLaunch) launch).getLaunchTarget(); - IQtBuildConfiguration qtBuildConfig = getQtBuildConfiguration(configuration, mode, target, monitor); - - IToolChain toolChain = qtBuildConfig.getToolChain(); - gdbLaunch.setGDBPath(toolChain.getCommandPath(Paths.get("gdb")).toString()); //$NON-NLS-1$ - String gdbVersion = gdbLaunch.getGDBVersion(); - - Path exeFile = qtBuildConfig.getProgramPath(); - gdbLaunch.setProgramPath(exeFile.toString()); - - gdbLaunch.setServiceFactory(new GdbDebugServicesFactory(gdbVersion, configuration)); - - Sequence servicesLaunchSequence = new ServicesLaunchSequence(gdbLaunch.getSession(), gdbLaunch, monitor); - gdbLaunch.getSession().getExecutor().execute(servicesLaunchSequence); - try { - servicesLaunchSequence.get(); - } catch (InterruptedException | ExecutionException e) { - throw new DebugException(new Status(IStatus.ERROR, Activator.ID, "Failure launching with gdb", e)); - } - - gdbLaunch.initializeControl(); - - gdbLaunch.addCLIProcess(gdbLaunch.getGDBPath().toOSString() + " (" + gdbVersion + ")"); //$NON-NLS-1$ //$NON-NLS-2$ - - Query ready = new Query() { - @Override - protected void execute(final DataRequestMonitor rm) { - DsfServicesTracker tracker = new DsfServicesTracker( - Activator.getDefault().getBundle().getBundleContext(), gdbLaunch.getSession().getId()); - IGDBControl control = tracker.getService(IGDBControl.class); - tracker.dispose(); - control.completeInitialization( - new RequestMonitorWithProgress(ImmediateExecutor.getInstance(), monitor) { - @Override - protected void handleCompleted() { - if (isCanceled()) { - rm.cancel(); - } else { - rm.setStatus(getStatus()); - } - rm.done(); - } - }); - } - }; - - // Start it up - gdbLaunch.getSession().getExecutor().execute(ready); - try { - ready.get(); - } catch (ExecutionException | InterruptedException e) { - throw new DebugException(new Status(IStatus.ERROR, Activator.ID, "Failure to start debug session", e)); - } - } - -} diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/messages.properties b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/messages.properties index f0d9d351b15..2c7efdfea3d 100644 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/messages.properties +++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/internal/qt/core/messages.properties @@ -1 +1,4 @@ +QtBuildConfiguration_ConfigNotFound=Qt Install for build configuration %s not found. +QtBuildConfiguration_MakeNotFound='make' not found.\n QtBuilder_0=Error: Qt has not been configured.\nPlease add a Qt install in the Qt preferences page.\n +QtBuildTab_Name=Qt Build diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/IQtBuildConfiguration.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/IQtBuildConfiguration.java index 3c429001412..024a91a9688 100644 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/IQtBuildConfiguration.java +++ b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/IQtBuildConfiguration.java @@ -12,6 +12,11 @@ import java.nio.file.Path; import org.eclipse.cdt.core.build.ICBuildConfiguration; import org.eclipse.core.runtime.CoreException; +/** + * Qt specific build configuration settings. + * + * @noimplement + */ public interface IQtBuildConfiguration extends ICBuildConfiguration { Path getBuildDirectory() throws CoreException; @@ -28,4 +33,6 @@ public interface IQtBuildConfiguration extends ICBuildConfiguration { String getLaunchMode(); + IQtInstall getQtInstall(); + } diff --git a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtLaunchConfigurationDelegate.java b/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtLaunchConfigurationDelegate.java deleted file mode 100644 index 998546284d7..00000000000 --- a/qt/org.eclipse.cdt.qt.core/src/org/eclipse/cdt/qt/core/QtLaunchConfigurationDelegate.java +++ /dev/null @@ -1,86 +0,0 @@ -/******************************************************************************* - * 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.qt.core; - -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.cdt.core.build.ICBuildConfigurationManager; -import org.eclipse.cdt.core.build.IToolChain; -import org.eclipse.cdt.internal.qt.core.Activator; -import org.eclipse.cdt.internal.qt.core.build.QtBuildConfigurationProvider; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.launchbar.core.target.ILaunchTarget; -import org.eclipse.launchbar.core.target.launch.LaunchConfigurationTargetedDelegate; - -public abstract class QtLaunchConfigurationDelegate extends LaunchConfigurationTargetedDelegate { - - @Override - public boolean buildForLaunch(ILaunchConfiguration configuration, String mode, ILaunchTarget target, - IProgressMonitor monitor) throws CoreException { - IQtBuildConfiguration qtBuildConfig = getQtBuildConfiguration(configuration, mode, target, monitor); - - // If found, set as active, if not just return - if (qtBuildConfig != null) { - IProject project = qtBuildConfig.getBuildConfiguration().getProject(); - IProjectDescription desc = project.getDescription(); - desc.setActiveBuildConfig(qtBuildConfig.getBuildConfiguration().getName()); - project.setDescription(desc, monitor); - return superBuildForLaunch(configuration, mode, monitor); - } else { - return false; - } - } - - @Override - protected IProject[] getBuildOrder(ILaunchConfiguration configuration, String mode) throws CoreException { - // 1. Extract project from configuration - // TODO dependencies too. - IProject project = configuration.getMappedResources()[0].getProject(); - return new IProject[] { project }; - } - - protected void populateToolChainProperties(ILaunchTarget target, Map properties) { - String os = target.getAttribute(ILaunchTarget.ATTR_OS, null); - if (os != null) { - properties.put(IToolChain.ATTR_OS, os.toLowerCase()); - } - String arch = target.getAttribute(ILaunchTarget.ATTR_ARCH, null); - if (arch != null) { - properties.put(IToolChain.ATTR_ARCH, arch.toLowerCase()); - } - } - - protected IQtBuildConfiguration getQtBuildConfiguration(ILaunchConfiguration configuration, String mode, - ILaunchTarget target, IProgressMonitor monitor) throws CoreException { - // Find the Qt build config - ICBuildConfigurationManager configManager = Activator.getService(ICBuildConfigurationManager.class); - QtBuildConfigurationProvider provider = (QtBuildConfigurationProvider) configManager - .getProvider(QtBuildConfigurationProvider.ID); - IProject project = configuration.getMappedResources()[0].getProject(); - - Map properties = new HashMap<>(); - populateToolChainProperties(target, properties); - - IQtBuildConfiguration qtConfig = provider.getConfiguration(project, properties, mode, monitor); - if (qtConfig != null) { - return qtConfig; - } - - // Couldn't find any - throw new CoreException(new Status(IStatus.ERROR, Activator.ID, - String.format("No suitable SDK found for target %s.", target.getId()))); - } - -} diff --git a/qt/org.eclipse.cdt.qt.ui/META-INF/MANIFEST.MF b/qt/org.eclipse.cdt.qt.ui/META-INF/MANIFEST.MF index 238a0518e34..83d562f3ad2 100644 --- a/qt/org.eclipse.cdt.qt.ui/META-INF/MANIFEST.MF +++ b/qt/org.eclipse.cdt.qt.ui/META-INF/MANIFEST.MF @@ -21,7 +21,9 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.tools.templates.ui;bundle-version="1.0.0", org.eclipse.launchbar.core;bundle-version="2.0.0", org.eclipse.launchbar.ui;bundle-version="2.0.0", - org.eclipse.tools.templates.freemarker;bundle-version="1.0.0" + org.eclipse.tools.templates.freemarker;bundle-version="1.0.0", + org.eclipse.cdt.launch;bundle-version="9.1.0", + org.eclipse.cdt.debug.core;bundle-version="8.1.0" Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Export-Package: org.eclipse.cdt.internal.qt.ui.assist;x-friends:="org.eclipse.cdt.qt.ui.tests", diff --git a/qt/org.eclipse.cdt.qt.ui/plugin.xml b/qt/org.eclipse.cdt.qt.ui/plugin.xml index a366ec0d587..c301bbb42ca 100644 --- a/qt/org.eclipse.cdt.qt.ui/plugin.xml +++ b/qt/org.eclipse.cdt.qt.ui/plugin.xml @@ -149,4 +149,11 @@ id="org.eclipse.cdt.qt.core.launchConfigurationType.image"> + + + + diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/Messages.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/Messages.java index 4d5c663e07b..1c53e610422 100644 --- a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/Messages.java +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/Messages.java @@ -21,6 +21,10 @@ public class Messages extends NLS { public static String NewQtInstallWizardPage_5; public static String NewQtInstallWizardPage_8; public static String NewQtInstallWizardPage_9; + public static String QtBuildTab_buildCommand; + public static String QtBuildTab_Name; + public static String QtBuildTab_qmakeArgs; + public static String QtBuildTab_qmakeCommand; public static String QtPreferencePage_0; public static String QtPreferencePage_1; public static String QtPreferencePage_2; diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/launch/QtBuildTab.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/launch/QtBuildTab.java new file mode 100644 index 00000000000..7430c6cf653 --- /dev/null +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/launch/QtBuildTab.java @@ -0,0 +1,154 @@ +/******************************************************************************* + * 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.internal.qt.ui.launch; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.cdt.core.build.IToolChainManager; +import org.eclipse.cdt.debug.core.launch.CoreBuildLaunchConfigDelegate; +import org.eclipse.cdt.internal.qt.core.build.QtBuildConfiguration; +import org.eclipse.cdt.internal.qt.ui.Activator; +import org.eclipse.cdt.internal.qt.ui.Messages; +import org.eclipse.cdt.launch.ui.corebuild.CommonBuildTab; +import org.eclipse.cdt.qt.core.IQtInstall; +import org.eclipse.cdt.qt.core.IQtInstallManager; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; +import org.eclipse.launchbar.core.target.ILaunchTarget; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Combo; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; + +public class QtBuildTab extends CommonBuildTab { + + Combo qmakeCombo; + Text qmakeArgsText; + Text buildCmdText; + + @Override + public void createControl(Composite parent) { + Composite comp = new Composite(parent, SWT.NONE); + comp.setLayout(new GridLayout(2, false)); + setControl(comp); + + Label label = new Label(comp, SWT.NONE); + label.setText(Messages.QtBuildTab_qmakeCommand); + + qmakeCombo = new Combo(comp, SWT.DROP_DOWN | SWT.READ_ONLY); + qmakeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + + label = new Label(comp, SWT.NONE); + label.setText(Messages.QtBuildTab_qmakeArgs); + + qmakeArgsText = new Text(comp, SWT.BORDER); + qmakeArgsText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + + label = new Label(comp, SWT.NONE); + label.setText(Messages.QtBuildTab_buildCommand); + + buildCmdText = new Text(comp, SWT.BORDER); + buildCmdText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + } + + @Override + public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { + try { + String mode = getLaunchConfigurationDialog().getMode(); + configuration.setAttribute(CoreBuildLaunchConfigDelegate.getBuildAttributeName(mode), + getBuildConfiguration(configuration).getDefaultProperties()); + } catch (CoreException e) { + Activator.log(e); + } + } + + private Map getProperties(ILaunchConfiguration configuration) throws CoreException { + String mode = getLaunchConfigurationDialog().getMode(); + Map properties = configuration + .getAttribute(CoreBuildLaunchConfigDelegate.getBuildAttributeName(mode), new HashMap<>()); + if (properties.isEmpty()) { + properties = getBuildConfiguration(configuration).getProperties(); + } + + return properties; + } + + @Override + public void initializeFrom(ILaunchConfiguration configuration) { + try { + Map properties = getProperties(configuration); + + // qmake command + IToolChainManager tcManager = Activator.getService(IToolChainManager.class); + IQtInstallManager qtManager = Activator.getService(IQtInstallManager.class); + ILaunchTarget target = getLaunchTarget(); + + String qmakeCmd = properties.get(QtBuildConfiguration.QMAKE_COMMAND); + qmakeCombo.removeAll(); + Collection toolChains = tcManager.getToolChainsMatching(target.getAttributes()); + int select = -1; + for (IQtInstall qtInstall : qtManager.getInstalls()) { + for (IToolChain toolChain : toolChains) { + if (qtManager.supports(qtInstall, toolChain)) { + qmakeCombo.add(qtInstall.getQmakePath().toString()); + if (qmakeCmd != null && qmakeCmd.equals(qtInstall.getQmakePath().toString())) { + select = qmakeCombo.getItemCount() - 1; + } + break; + } + } + } + + if (select != -1) { + qmakeCombo.select(select); + } + + // qmake args + String qmakeArgs = properties.get(QtBuildConfiguration.QMAKE_ARGS); + if (qmakeArgs != null) { + qmakeArgsText.setText(qmakeArgs); + } + + // build command + String buildCommand = properties.get(QtBuildConfiguration.BUILD_COMMAND); + if (buildCommand != null) { + buildCmdText.setText(buildCommand); + } + } catch (CoreException e) { + Activator.log(e); + } + } + + @Override + public void performApply(ILaunchConfigurationWorkingCopy configuration) { + try { + Map properties = new HashMap<>(getProperties(configuration)); + properties.put(QtBuildConfiguration.QMAKE_COMMAND, qmakeCombo.getItem(qmakeCombo.getSelectionIndex())); + properties.put(QtBuildConfiguration.QMAKE_ARGS, qmakeArgsText.getText().trim()); + properties.put(QtBuildConfiguration.BUILD_COMMAND, buildCmdText.getText().trim()); + + String mode = getLaunchBarLaunchConfigDialog().getMode(); + configuration.setAttribute(CoreBuildLaunchConfigDelegate.getBuildAttributeName(mode), properties); + } catch (CoreException e) { + Activator.log(e); + } + } + + @Override + public String getName() { + return Messages.QtBuildTab_Name; + } + +} diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/messages.properties b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/messages.properties index 2f96228e735..afe942b2405 100644 --- a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/messages.properties +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/messages.properties @@ -8,6 +8,10 @@ NewQtInstallWizardPage_4=Browse... NewQtInstallWizardPage_5=Select location of qmake NewQtInstallWizardPage_8=Get Qt Spec NewQtInstallWizardPage_9=mkspec: +QtBuildTab_buildCommand=Build command: +QtBuildTab_Name=Qt Build +QtBuildTab_qmakeArgs=qmake arguments: +QtBuildTab_qmakeCommand=qmake command: QtPreferencePage_0=Qt Installs QtPreferencePage_1=Location QtPreferencePage_2=mkspec