From affb599f2490deeba0451367d51bdefe50b1f8e4 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Thu, 12 Oct 2017 15:38:26 -0400 Subject: Allow for changing manually setting toolchains for build configs. A number of changes that clean up how build configs are done. Now build settings are stored with the build config instead of in launch configs. That makes it less launch bar specific. Add build settings UI to change the toolchain used for a given launch config. Also changed CMake so it's IToolchain based instead of property which doesn't work when multiple IToolchains match. Change-Id: I958d90ede3c1f873ab1530c2b2880808e8f7abef --- .../eclipse/cdt/build/gcc/core/GCCToolChain.java | 2 +- .../core/internal/GCCPathToolChainProvider.java | 3 + .../cdt/cmake/core/ICMakeToolChainFile.java | 11 + .../cdt/cmake/core/ICMakeToolChainManager.java | 5 + .../core/internal/CMakeBuildConfiguration.java | 12 +- .../internal/CMakeBuildConfigurationProvider.java | 16 +- .../cmake/core/internal/CMakeToolChainFile.java | 22 ++ .../cmake/core/internal/CMakeToolChainManager.java | 14 ++ .../org.eclipse.cdt.cmake.ui/META-INF/MANIFEST.MF | 3 +- .../eclipse/cdt/cmake/ui/internal/Activator.java | 6 +- .../cdt/cmake/ui/internal/CMakeBuildTab.java | 167 ++++++++----- .../cdt/cmake/ui/internal/CMakePreferencePage.java | 43 ++-- .../eclipse/cdt/cmake/ui/internal/Messages.java | 17 ++ .../ui/internal/NewCMakeToolChainFilePage.java | 79 +++---- .../ui/internal/NewCMakeToolChainFileWizard.java | 8 +- .../cdt/cmake/ui/internal/messages.properties | 16 ++ core/org.eclipse.cdt.core/.settings/.api_filters | 46 ++++ .../src/org/eclipse/cdt/core/CCorePlugin.java | 9 + .../cdt/core/build/CBuildConfiguration.java | 62 +++-- .../cdt/core/build/ICBuildConfiguration.java | 66 +++++- .../core/build/ICBuildConfigurationManager.java | 241 ++++++++++--------- .../core/build/ICBuildConfigurationProvider.java | 13 + .../eclipse/cdt/core/build/IToolChainManager.java | 19 +- .../core/build/CBuildConfigurationManager.java | 29 ++- .../eclipse/cdt/internal/core/build/Messages.java | 2 +- .../cdt/internal/core/build/ToolChainManager.java | 6 +- .../cdt/internal/core/build/messages.properties | 1 + .../core/envvar/EnvironmentVariableManager.java | 12 +- .../core/launch/CoreBuildLaunchBarTracker.java | 11 +- .../core/launch/CoreBuildLaunchConfigDelegate.java | 245 ++++++++++--------- .../internal/core/InternalDebugCoreMessages.java | 4 +- .../core/InternalDebugCoreMessages.properties | 1 + .../launch/CoreBuildLocalRunLaunchDelegate.java | 5 +- .../CoreBuildLocalDebugLaunchDelegate.java | 262 ++++++++++----------- .../.settings/org.eclipse.jdt.core.prefs | 13 +- launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF | 2 +- .../cdt/launch/internal/ui/LaunchMessages.java | 3 + .../launch/internal/ui/LaunchMessages.properties | 3 + .../cdt/launch/ui/corebuild/CommonBuildTab.java | 193 ++++++++++++++- .../qt/core/build/QtBuildConfiguration.java | 4 +- .../org/eclipse/cdt/internal/qt/ui/Activator.java | 4 + .../cdt/internal/qt/ui/launch/QtBuildTab.java | 71 +++--- 42 files changed, 1144 insertions(+), 607 deletions(-) diff --git a/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/GCCToolChain.java b/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/GCCToolChain.java index 3ee7de0d1b6..4665dda940e 100644 --- a/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/GCCToolChain.java +++ b/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/GCCToolChain.java @@ -103,7 +103,7 @@ public class GCCToolChain extends PlatformObject implements IToolChain { idBuilder.append(arch); } idBuilder.append('-'); - idBuilder.append(pathToToolChain.toString()); + idBuilder.append(pathToToolChain.toString().replaceAll("\\\\", "/")); //$NON-NLS-1$ //$NON-NLS-2$ this.id = idBuilder.toString(); properties.put(ATTR_ARCH, arch); diff --git a/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/internal/GCCPathToolChainProvider.java b/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/internal/GCCPathToolChainProvider.java index d44607af45b..cd1aa9daa02 100644 --- a/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/internal/GCCPathToolChainProvider.java +++ b/build/org.eclipse.cdt.build.gcc.core/src/org/eclipse/cdt/build/gcc/core/internal/GCCPathToolChainProvider.java @@ -40,6 +40,9 @@ public class GCCPathToolChainProvider implements IToolChainProvider { File dir = new File(dirStr); if (dir.isDirectory()) { for (File file : dir.listFiles()) { + if (file.isDirectory()) { + continue; + } Matcher matcher = gccPattern.matcher(file.getName()); if (matcher.matches()) { try { diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/ICMakeToolChainFile.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/ICMakeToolChainFile.java index 0f40cc6699e..c7052f95fa7 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/ICMakeToolChainFile.java +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/ICMakeToolChainFile.java @@ -9,6 +9,15 @@ package org.eclipse.cdt.cmake.core; import java.nio.file.Path; +import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.core.runtime.CoreException; + +/** + * A toolchain file. + * + * @noimplement + * @noextend + */ public interface ICMakeToolChainFile { Path getPath(); @@ -17,4 +26,6 @@ public interface ICMakeToolChainFile { void setProperty(String key, String value); + IToolChain getToolChain() throws CoreException; + } diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/ICMakeToolChainManager.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/ICMakeToolChainManager.java index b522fb1d0ef..b77bfff288d 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/ICMakeToolChainManager.java +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/ICMakeToolChainManager.java @@ -11,10 +11,13 @@ import java.nio.file.Path; import java.util.Collection; import java.util.Map; +import org.eclipse.cdt.core.build.IToolChain; + /** * Manages toolchain files for CMake. * * @noimplement + * @noextend */ public interface ICMakeToolChainManager { @@ -28,6 +31,8 @@ public interface ICMakeToolChainManager { Collection getToolChainFilesMatching(Map properties); + ICMakeToolChainFile getToolChainFileFor(IToolChain toolchain); + Collection getToolChainFiles(); void addListener(ICMakeToolChainListener listener); diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java index eb4bea66f1b..0d9a9c06ac6 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfiguration.java @@ -90,8 +90,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { throws CoreException { IProject project = getProject(); try { - Map properties = getProperties(); - String generator = properties.get(CMAKE_GENERATOR); + String generator = getProperty(CMAKE_GENERATOR); if (generator == null) { generator = "Ninja"; //$NON-NLS-1$ } @@ -131,7 +130,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { command.add("-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"); //$NON-NLS-1$ - String userArgs = properties.get(CMAKE_ARGUMENTS); + String userArgs = getProperty(CMAKE_ARGUMENTS); if (userArgs != null) { command.addAll(Arrays.asList(userArgs.trim().split("\\s+"))); //$NON-NLS-1$ } @@ -147,7 +146,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { try (ErrorParserManager epm = new ErrorParserManager(project, getBuildDirectoryURI(), this, getToolChain().getErrorParserIds())) { - String buildCommand = properties.get(BUILD_COMMAND); + String buildCommand = getProperty(BUILD_COMMAND); if (buildCommand == null) { if (generator.equals("Ninja")) { //$NON-NLS-1$ buildCommand = "ninja"; //$NON-NLS-1$ @@ -184,8 +183,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { public void clean(IConsole console, IProgressMonitor monitor) throws CoreException { IProject project = getProject(); try { - Map properties = getProperties(); - String generator = properties.get(CMAKE_GENERATOR); + String generator = getProperty(CMAKE_GENERATOR); project.deleteMarkers(ICModelMarker.C_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_INFINITE); @@ -198,7 +196,7 @@ public class CMakeBuildConfiguration extends CBuildConfiguration { return; } - String cleanCommand = properties.get(CLEAN_COMMAND); + String cleanCommand = getProperty(CLEAN_COMMAND); if (cleanCommand == null) { if (generator == null || generator.equals("Ninja")) { //$NON-NLS-1$ cleanCommand = "ninja clean"; //$NON-NLS-1$ diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfigurationProvider.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfigurationProvider.java index c09b0850d2e..71916f5d22a 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfigurationProvider.java +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeBuildConfigurationProvider.java @@ -73,18 +73,6 @@ public class CMakeBuildConfigurationProvider implements ICBuildConfigurationProv @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 properties = new HashMap<>(); String os = toolChain.getProperty(IToolChain.ATTR_OS); @@ -108,13 +96,13 @@ public class CMakeBuildConfigurationProvider implements ICBuildConfigurationProv configName.append('.'); configName.append(os); } - if (arch != null) { + if (arch != null && !arch.isEmpty()) { configName.append('.'); configName.append(arch); } String name = configName.toString(); int i = 0; - while (project.hasBuildConfig(name)) { + while (configManager.hasConfiguration(this, project, name)) { name = configName.toString() + '.' + (++i); } diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeToolChainFile.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeToolChainFile.java index 5e97996a5c2..ce4e7045063 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeToolChainFile.java +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeToolChainFile.java @@ -8,15 +8,20 @@ package org.eclipse.cdt.cmake.core.internal; import java.nio.file.Path; +import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; +import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.cdt.core.build.IToolChainManager; +import org.eclipse.core.runtime.CoreException; public class CMakeToolChainFile implements ICMakeToolChainFile { String n; private final Path path; + private IToolChain toolchain; final Map properties = new HashMap<>(); @@ -40,6 +45,23 @@ public class CMakeToolChainFile implements ICMakeToolChainFile { properties.put(key, value); } + @Override + public IToolChain getToolChain() throws CoreException { + if (toolchain == null) { + IToolChainManager tcManager = Activator.getService(IToolChainManager.class); + toolchain = tcManager.getToolChain(properties.get(CMakeBuildConfiguration.TOOLCHAIN_TYPE), + properties.get(CMakeBuildConfiguration.TOOLCHAIN_ID)); + + if (toolchain == null) { + Collection tcs = tcManager.getToolChainsMatching(properties); + if (!tcs.isEmpty()) { + toolchain = tcs.iterator().next(); + } + } + } + return toolchain; + } + boolean matches(Map properties) { for (Map.Entry property : properties.entrySet()) { if (!property.getValue().equals(getProperty(property.getKey()))) { diff --git a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeToolChainManager.java b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeToolChainManager.java index 98582f0de2c..42b94794a49 100644 --- a/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeToolChainManager.java +++ b/build/org.eclipse.cdt.cmake.core/src/org/eclipse/cdt/cmake/core/internal/CMakeToolChainManager.java @@ -24,6 +24,7 @@ import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; import org.eclipse.cdt.cmake.core.ICMakeToolChainListener; import org.eclipse.cdt.cmake.core.ICMakeToolChainManager; import org.eclipse.cdt.cmake.core.ICMakeToolChainProvider; +import org.eclipse.cdt.core.build.IToolChain; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; @@ -181,6 +182,19 @@ public class CMakeToolChainManager implements ICMakeToolChainManager { return matches; } + @Override + public ICMakeToolChainFile getToolChainFileFor(IToolChain toolchain) { + String id = toolchain.getId(); + + for (ICMakeToolChainFile file : getToolChainFiles()) { + if (id.equals(file.getProperty(CMakeBuildConfiguration.TOOLCHAIN_ID))) { + return file; + } + } + + return null; + } + @Override public void addListener(ICMakeToolChainListener listener) { listeners.add(listener); 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 78e0949d57f..0f54e0028b4 100644 --- a/build/org.eclipse.cdt.cmake.ui/META-INF/MANIFEST.MF +++ b/build/org.eclipse.cdt.cmake.ui/META-INF/MANIFEST.MF @@ -15,7 +15,8 @@ Require-Bundle: org.eclipse.core.runtime, org.eclipse.debug.ui;bundle-version="3.11.200", org.eclipse.cdt.launch;bundle-version="9.1.0", org.eclipse.cdt.debug.core;bundle-version="8.1.0", - org.eclipse.cdt.ui;bundle-version="6.2.0" + org.eclipse.cdt.ui;bundle-version="6.2.0", + org.eclipse.launchbar.core 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/Activator.java b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/Activator.java index d0e3630ac5e..036da68941b 100644 --- a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/Activator.java +++ b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/Activator.java @@ -40,9 +40,13 @@ public class Activator extends AbstractUIPlugin { return new Status(IStatus.ERROR, PLUGIN_ID, message, cause); } + public static void log(IStatus status) { + plugin.getLog().log(status); + } + public static void log(Exception e) { if (e instanceof CoreException) { - plugin.getLog().log(((CoreException) e).getStatus()); + log(((CoreException) e).getStatus()); } else { plugin.getLog().log(errorStatus(e.getLocalizedMessage(), e)); } 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 6cc9a02e012..9ce46b0fa28 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 @@ -7,15 +7,14 @@ *******************************************************************************/ package org.eclipse.cdt.cmake.ui.internal; -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.cdt.cmake.core.internal.CMakeBuildConfigurationProvider; +import org.eclipse.cdt.core.build.ICBuildConfiguration; +import org.eclipse.cdt.launch.ui.corebuild.CommonBuildTab; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; -import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; @@ -23,10 +22,12 @@ import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; -public class CMakeBuildTab extends AbstractLaunchConfigurationTab { +public class CMakeBuildTab extends CommonBuildTab { private Button unixGenButton; private Button ninjaGenButton; @@ -34,16 +35,29 @@ public class CMakeBuildTab extends AbstractLaunchConfigurationTab { private Text buildCommandText; private Text cleanCommandText; + @Override + protected String getBuildConfigProviderId() { + return CMakeBuildConfigurationProvider.ID; + } + @Override public void createControl(Composite parent) { Composite comp = new Composite(parent, SWT.NONE); comp.setLayout(new GridLayout()); setControl(comp); - Label label = new Label(comp, SWT.NONE); + Control tcControl = createToolchainSelector(comp); + tcControl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); + + Group cmakeGroup = new Group(comp, SWT.NONE); + cmakeGroup.setText(Messages.CMakeBuildTab_Settings); + cmakeGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + cmakeGroup.setLayout(new GridLayout()); + + Label label = new Label(cmakeGroup, SWT.NONE); label.setText(Messages.CMakeBuildTab_Generator); - Composite genComp = new Composite(comp, SWT.BORDER); + Composite genComp = new Composite(cmakeGroup, SWT.BORDER); genComp.setLayout(new GridLayout(2, true)); unixGenButton = new Button(genComp, SWT.RADIO); @@ -64,67 +78,61 @@ public class CMakeBuildTab extends AbstractLaunchConfigurationTab { } }); - label = new Label(comp, SWT.NONE); + label = new Label(cmakeGroup, SWT.NONE); label.setText(Messages.CMakeBuildTab_CMakeArgs); - cmakeArgsText = new Text(comp, SWT.BORDER); + cmakeArgsText = new Text(cmakeGroup, SWT.BORDER); cmakeArgsText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); cmakeArgsText.addModifyListener(e -> updateLaunchConfigurationDialog()); - label = new Label(comp, SWT.NONE); + label = new Label(cmakeGroup, SWT.NONE); label.setText(Messages.CMakeBuildTab_BuildCommand); - buildCommandText = new Text(comp, SWT.BORDER); + buildCommandText = new Text(cmakeGroup, SWT.BORDER); buildCommandText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); buildCommandText.addModifyListener(e -> updateLaunchConfigurationDialog()); - label = new Label(comp, SWT.NONE); + label = new Label(cmakeGroup, SWT.NONE); label.setText(Messages.CMakeBuildTab_CleanCommand); - cleanCommandText = new Text(comp, SWT.BORDER); + cleanCommandText = new Text(cmakeGroup, SWT.BORDER); cleanCommandText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); cleanCommandText.addModifyListener(e -> updateLaunchConfigurationDialog()); } @Override public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { - String mode = getLaunchConfigurationDialog().getMode(); - configuration.removeAttribute("COREBUILD_" + mode); //$NON-NLS-1$ + // TODO } @Override public void initializeFrom(ILaunchConfiguration configuration) { - try { - String mode = getLaunchConfigurationDialog().getMode(); - // TODO find a home for the attribute name - Map properties = configuration.getAttribute("COREBUILD_" + mode, //$NON-NLS-1$ - new HashMap<>()); - - String generator = properties.get(CMakeBuildConfiguration.CMAKE_GENERATOR); - updateGeneratorButtons(generator); - - String cmakeArgs = properties.get(CMakeBuildConfiguration.CMAKE_ARGUMENTS); - if (cmakeArgs != null) { - cmakeArgsText.setText(cmakeArgs); - } else { - cmakeArgsText.setText(""); //$NON-NLS-1$ - } + super.initializeFrom(configuration); - String buildCommand = properties.get(CMakeBuildConfiguration.BUILD_COMMAND); - if (buildCommand != null) { - buildCommandText.setText(buildCommand); - } else { - buildCommandText.setText(""); //$NON-NLS-1$ - } + ICBuildConfiguration buildConfig = getBuildConfiguration(); - String cleanCommand = properties.get(CMakeBuildConfiguration.CLEAN_COMMAND); - if (cleanCommand != null) { - cleanCommandText.setText(buildCommand); - } else { - cleanCommandText.setText(""); //$NON-NLS-1$ - } - } catch (CoreException e) { - Activator.log(e); + String generator = buildConfig.getProperty(CMakeBuildConfiguration.CMAKE_GENERATOR); + updateGeneratorButtons(generator); + + String cmakeArgs = buildConfig.getProperty(CMakeBuildConfiguration.CMAKE_ARGUMENTS); + if (cmakeArgs != null) { + cmakeArgsText.setText(cmakeArgs); + } else { + cmakeArgsText.setText(""); //$NON-NLS-1$ + } + + String buildCommand = buildConfig.getProperty(CMakeBuildConfiguration.BUILD_COMMAND); + if (buildCommand != null) { + buildCommandText.setText(buildCommand); + } else { + buildCommandText.setText(""); //$NON-NLS-1$ + } + + String cleanCommand = buildConfig.getProperty(CMakeBuildConfiguration.CLEAN_COMMAND); + if (cleanCommand != null) { + cleanCommandText.setText(buildCommand); + } else { + cleanCommandText.setText(""); //$NON-NLS-1$ } } @@ -138,32 +146,83 @@ public class CMakeBuildTab extends AbstractLaunchConfigurationTab { @Override public void performApply(ILaunchConfigurationWorkingCopy configuration) { - Map properties = new HashMap<>(); + super.performApply(configuration); - properties.put(CMakeBuildConfiguration.CMAKE_GENERATOR, + ICBuildConfiguration buildConfig = getBuildConfiguration(); + + buildConfig.setProperty(CMakeBuildConfiguration.CMAKE_GENERATOR, ninjaGenButton.getSelection() ? "Ninja" : "Unix Makefiles"); //$NON-NLS-1$ //$NON-NLS-2$ String cmakeArgs = cmakeArgsText.getText().trim(); if (!cmakeArgs.isEmpty()) { - properties.put(CMakeBuildConfiguration.CMAKE_ARGUMENTS, cmakeArgs); + buildConfig.setProperty(CMakeBuildConfiguration.CMAKE_ARGUMENTS, cmakeArgs); + } else { + buildConfig.removeProperty(CMakeBuildConfiguration.CMAKE_ARGUMENTS); } String buildCommand = buildCommandText.getText().trim(); if (!buildCommand.isEmpty()) { - properties.put(CMakeBuildConfiguration.BUILD_COMMAND, buildCommand); + buildConfig.setProperty(CMakeBuildConfiguration.BUILD_COMMAND, buildCommand); + } else { + buildConfig.removeProperty(CMakeBuildConfiguration.BUILD_COMMAND); } String cleanCommand = cleanCommandText.getText().trim(); if (!cleanCommand.isEmpty()) { - properties.put(CMakeBuildConfiguration.CLEAN_COMMAND, cleanCommand); + buildConfig.setProperty(CMakeBuildConfiguration.CLEAN_COMMAND, cleanCommand); + } else { + buildConfig.removeProperty(CMakeBuildConfiguration.CLEAN_COMMAND); + } + } + + @Override + protected void saveProperties(Map properties) { + super.saveProperties(properties); + properties.put(CMakeBuildConfiguration.CMAKE_GENERATOR, + ninjaGenButton.getSelection() ? "Ninja" : "Unix Makefiles"); //$NON-NLS-1$ //$NON-NLS-2$ + + properties.put(CMakeBuildConfiguration.CMAKE_ARGUMENTS, cmakeArgsText.getText().trim()); + properties.put(CMakeBuildConfiguration.BUILD_COMMAND, buildCommandText.getText().trim()); + properties.put(CMakeBuildConfiguration.CLEAN_COMMAND, cleanCommandText.getText().trim()); + } + + @Override + protected void restoreProperties(Map properties) { + super.restoreProperties(properties); + + String gen = properties.get(CMakeBuildConfiguration.CMAKE_GENERATOR); + if (gen != null) { + switch (gen) { + case "Ninja": //$NON-NLS-1$ + ninjaGenButton.setSelection(true); + unixGenButton.setSelection(false); + break; + case "Unix Makefiles": //$NON-NLS-1$ + ninjaGenButton.setSelection(false); + unixGenButton.setSelection(true); + break; + } + } + + String cmakeArgs = properties.get(CMakeBuildConfiguration.CMAKE_ARGUMENTS); + if (cmakeArgs != null) { + cmakeArgsText.setText(cmakeArgs); + } else { + cmakeArgsText.setText(""); //$NON-NLS-1$ + } + + String buildCmd = properties.get(CMakeBuildConfiguration.BUILD_COMMAND); + if (buildCmd != null) { + buildCommandText.setText(buildCmd); + } else { + buildCommandText.setText(""); //$NON-NLS-1$ } - String buildAttribute = CoreBuildLaunchConfigDelegate - .getBuildAttributeName(getLaunchConfigurationDialog().getMode()); - if (!properties.isEmpty()) { - configuration.setAttribute(buildAttribute, properties); + String cleanCmd = properties.get(CMakeBuildConfiguration.CLEAN_COMMAND); + if (cleanCmd != null) { + cleanCommandText.setText(cleanCmd); } else { - configuration.removeAttribute(buildAttribute); + cleanCommandText.setText(""); //$NON-NLS-1$ } } diff --git a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/CMakePreferencePage.java b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/CMakePreferencePage.java index 94406b75ac5..7cc58fbb996 100644 --- a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/CMakePreferencePage.java +++ b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/CMakePreferencePage.java @@ -17,6 +17,7 @@ import java.util.Map; import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; import org.eclipse.cdt.cmake.core.ICMakeToolChainManager; import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.preference.PreferencePage; @@ -59,7 +60,7 @@ public class CMakePreferencePage extends PreferencePage implements IWorkbenchPre Group filesGroup = new Group(control, SWT.NONE); filesGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - filesGroup.setText("ToolChain Files"); + filesGroup.setText(Messages.CMakePreferencePage_Files); filesGroup.setLayout(new GridLayout(2, false)); Composite filesComp = new Composite(filesGroup, SWT.NONE); @@ -75,18 +76,14 @@ public class CMakePreferencePage extends PreferencePage implements IWorkbenchPre }); TableColumn pathColumn = new TableColumn(filesTable, SWT.NONE); - pathColumn.setText("ToolChain File"); + pathColumn.setText(Messages.CMakePreferencePage_Path); - TableColumn osColumn = new TableColumn(filesTable, SWT.NONE); - osColumn.setText("OS"); - - TableColumn archColumn = new TableColumn(filesTable, SWT.NONE); - archColumn.setText("CPU"); + TableColumn tcColumn = new TableColumn(filesTable, SWT.NONE); + tcColumn.setText(Messages.CMakePreferencePage_Toolchain); TableColumnLayout tableLayout = new TableColumnLayout(); - tableLayout.setColumnData(pathColumn, new ColumnWeightData(75, 350, true)); - tableLayout.setColumnData(osColumn, new ColumnWeightData(25, 100, true)); - tableLayout.setColumnData(archColumn, new ColumnWeightData(25, 100, true)); + tableLayout.setColumnData(pathColumn, new ColumnWeightData(50, 350, true)); + tableLayout.setColumnData(tcColumn, new ColumnWeightData(50, 350, true)); filesComp.setLayout(tableLayout); Composite buttonsComp = new Composite(filesGroup, SWT.NONE); @@ -95,11 +92,11 @@ public class CMakePreferencePage extends PreferencePage implements IWorkbenchPre Button addButton = new Button(buttonsComp, SWT.PUSH); addButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); - addButton.setText("Add..."); + addButton.setText(Messages.CMakePreferencePage_Add); addButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { - NewCMakeToolChainFileWizard wizard = new NewCMakeToolChainFileWizard(getFiles()); + NewCMakeToolChainFileWizard wizard = new NewCMakeToolChainFileWizard(); WizardDialog dialog = new WizardDialog(getShell(), wizard); if (dialog.open() == Window.OK) { ICMakeToolChainFile file = wizard.getNewFile(); @@ -115,11 +112,11 @@ public class CMakePreferencePage extends PreferencePage implements IWorkbenchPre removeButton = new Button(buttonsComp, SWT.PUSH); removeButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); - removeButton.setText("Remove"); + removeButton.setText(Messages.CMakePreferencePage_Remove); removeButton.setEnabled(false); removeButton.addListener(SWT.Selection, e -> { - if (MessageDialog.openConfirm(getShell(), "Deregister CMake ToolChain File", - "Do you wish to deregister the selected files?")) { + if (MessageDialog.openConfirm(getShell(), Messages.CMakePreferencePage_ConfirmRemoveTitle, + Messages.CMakePreferencePage_ConfirmRemoveDesc)) { for (TableItem item : filesTable.getSelection()) { ICMakeToolChainFile file = (ICMakeToolChainFile) item.getData(); if (filesToAdd.containsKey(file.getPath())) { @@ -145,14 +142,16 @@ public class CMakePreferencePage extends PreferencePage implements IWorkbenchPre for (ICMakeToolChainFile file : sorted) { TableItem item = new TableItem(filesTable, SWT.NONE); item.setText(0, file.getPath().toString()); - String os = file.getProperty(IToolChain.ATTR_OS); - if (os != null) { - item.setText(1, os); - } - String arch = file.getProperty(IToolChain.ATTR_ARCH); - if (arch != null) { - item.setText(2, arch); + + try { + IToolChain tc = file.getToolChain(); + if (tc != null) { + item.setText(1, tc.getName()); + } + } catch (CoreException e) { + Activator.log(e.getStatus()); } + item.setData(file); } } 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 50df2366fab..91e4a323295 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 @@ -17,7 +17,17 @@ public class Messages extends NLS { public static String CMakeBuildTab_CMakeArgs; public static String CMakeBuildTab_Generator; public static String CMakeBuildTab_Ninja; + public static String CMakeBuildTab_NoneAvailable; + public static String CMakeBuildTab_Settings; + public static String CMakeBuildTab_Toolchain; public static String CMakeBuildTab_UnixMakefiles; + public static String CMakePreferencePage_Add; + public static String CMakePreferencePage_ConfirmRemoveDesc; + public static String CMakePreferencePage_ConfirmRemoveTitle; + public static String CMakePreferencePage_Files; + public static String CMakePreferencePage_Path; + public static String CMakePreferencePage_Remove; + public static String CMakePreferencePage_Toolchain; public static String CMakePropertyPage_FailedToStartCMakeGui_Body; public static String CMakePropertyPage_FailedToStartCMakeGui_Title; public static String CMakePropertyPage_LaunchCMakeGui; @@ -26,6 +36,13 @@ public class Messages extends NLS { public static String NewCMakeProjectWizard_PageTitle; public static String NewCMakeProjectWizard_WindowTitle; + public static String NewCMakeToolChainFilePage_Browse; + public static String NewCMakeToolChainFilePage_NoPath; + public static String NewCMakeToolChainFilePage_Path; + public static String NewCMakeToolChainFilePage_Select; + public static String NewCMakeToolChainFilePage_Title; + public static String NewCMakeToolChainFilePage_Toolchain; + static { // initialize resource bundle NLS.initializeMessages("org.eclipse.cdt.cmake.ui.internal.messages", Messages.class); //$NON-NLS-1$ diff --git a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/NewCMakeToolChainFilePage.java b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/NewCMakeToolChainFilePage.java index b40c60a2d86..4e6f63b9cae 100644 --- a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/NewCMakeToolChainFilePage.java +++ b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/NewCMakeToolChainFilePage.java @@ -7,18 +7,20 @@ *******************************************************************************/ package org.eclipse.cdt.cmake.ui.internal; -import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Map; import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; import org.eclipse.cdt.cmake.core.ICMakeToolChainManager; +import org.eclipse.cdt.cmake.core.internal.CMakeBuildConfiguration; import org.eclipse.cdt.core.build.IToolChain; +import org.eclipse.cdt.core.build.IToolChainManager; +import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Label; @@ -26,14 +28,13 @@ import org.eclipse.swt.widgets.Text; public class NewCMakeToolChainFilePage extends WizardPage { - private final Map existing; private Text pathText; - private Text osText; - private Text archText; + private Combo tcCombo; - public NewCMakeToolChainFilePage(Map existing) { - super("NewCMakeToolChainFilePage", "New CMake ToolChain File", null); //$NON-NLS-1$ - this.existing = existing; + private IToolChain[] toolchains; + + public NewCMakeToolChainFilePage() { + super("NewCMakeToolChainFilePage", Messages.NewCMakeToolChainFilePage_Title, null); //$NON-NLS-1$ } @Override @@ -44,7 +45,7 @@ public class NewCMakeToolChainFilePage extends WizardPage { Label pathLabel = new Label(comp, SWT.NONE); pathLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); - pathLabel.setText("Path:"); + pathLabel.setText(Messages.NewCMakeToolChainFilePage_Path); Composite pathComp = new Composite(comp, SWT.NONE); pathComp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); @@ -58,31 +59,33 @@ public class NewCMakeToolChainFilePage extends WizardPage { Button pathButton = new Button(pathComp, SWT.PUSH); pathButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); - pathButton.setText("Browse..."); + pathButton.setText(Messages.NewCMakeToolChainFilePage_Browse); pathButton.addListener(SWT.Selection, e -> { FileDialog dialog = new FileDialog(getShell(), SWT.OPEN); - dialog.setText("Select location for CMake toolchain file"); + dialog.setText(Messages.NewCMakeToolChainFilePage_Select); String path = dialog.open(); if (path != null) { pathText.setText(path); } }); - Label osLabel = new Label(comp, SWT.NONE); - osLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); - osLabel.setText("Target OS:"); - - osText = new Text(comp, SWT.BORDER); - osText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - osText.addModifyListener(e -> validate()); - - Label archLabel = new Label(comp, SWT.NONE); - archLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); - archLabel.setText("Target CPU:"); - - archText = new Text(comp, SWT.BORDER); - archText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - archText.addModifyListener(e -> validate()); + Label tcLabel = new Label(comp, SWT.NONE); + tcLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); + tcLabel.setText(Messages.NewCMakeToolChainFilePage_Toolchain); + + tcCombo = new Combo(comp, SWT.READ_ONLY); + tcCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + + try { + IToolChainManager tcManager = Activator.getService(IToolChainManager.class); + toolchains = tcManager.getAllToolChains().toArray(new IToolChain[0]); + for (IToolChain tc : toolchains) { + tcCombo.add(tc.getName()); + } + tcCombo.select(0); + } catch (CoreException e) { + Activator.log(e.getStatus()); + } setControl(comp); validate(); @@ -93,17 +96,7 @@ public class NewCMakeToolChainFilePage extends WizardPage { String path = pathText.getText(); if (path.isEmpty()) { - setErrorMessage("Please set the path to the CMake toolchain file."); - return; - } - - if (existing.containsKey(Paths.get(path))) { - setErrorMessage("CMake toolchain file entry already exists."); - return; - } - - if (osText.getText().isEmpty()) { - setErrorMessage("Please set the target operating system."); + setErrorMessage(Messages.NewCMakeToolChainFilePage_NoPath); return; } @@ -115,15 +108,9 @@ public class NewCMakeToolChainFilePage extends WizardPage { ICMakeToolChainManager manager = Activator.getService(ICMakeToolChainManager.class); ICMakeToolChainFile file = manager.newToolChainFile(Paths.get(pathText.getText())); - String os = osText.getText(); - if (!os.isEmpty()) { - file.setProperty(IToolChain.ATTR_OS, os); - } - - String arch = archText.getText(); - if (!arch.isEmpty()) { - file.setProperty(IToolChain.ATTR_ARCH, arch); - } + IToolChain tc = toolchains[tcCombo.getSelectionIndex()]; + file.setProperty(CMakeBuildConfiguration.TOOLCHAIN_TYPE, tc.getProvider().getId()); + file.setProperty(CMakeBuildConfiguration.TOOLCHAIN_ID, tc.getId()); return file; } diff --git a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/NewCMakeToolChainFileWizard.java b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/NewCMakeToolChainFileWizard.java index f5be2f3e642..fe616eeeac9 100644 --- a/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/NewCMakeToolChainFileWizard.java +++ b/build/org.eclipse.cdt.cmake.ui/src/org/eclipse/cdt/cmake/ui/internal/NewCMakeToolChainFileWizard.java @@ -7,9 +7,6 @@ *******************************************************************************/ package org.eclipse.cdt.cmake.ui.internal; -import java.nio.file.Path; -import java.util.Map; - import org.eclipse.cdt.cmake.core.ICMakeToolChainFile; import org.eclipse.jface.wizard.Wizard; @@ -18,12 +15,9 @@ public class NewCMakeToolChainFileWizard extends Wizard { private ICMakeToolChainFile newFile; private NewCMakeToolChainFilePage page; - public NewCMakeToolChainFileWizard(Map existing) { - page = new NewCMakeToolChainFilePage(existing); - } - @Override public void addPages() { + page = new NewCMakeToolChainFilePage(); addPage(page); } 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 51b607823f3..09d2055d8c4 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 @@ -4,10 +4,26 @@ CMakeBuildTab_Cmake=CMake CMakeBuildTab_CMakeArgs=Additional CMake arguments: CMakeBuildTab_Generator=Generator CMakeBuildTab_Ninja=Ninja +CMakeBuildTab_NoneAvailable=No Toolchains Available for this Target +CMakeBuildTab_Settings=CMake Settings +CMakeBuildTab_Toolchain=Toolchain CMakeBuildTab_UnixMakefiles=Unix Makefiles +CMakePreferencePage_Add=Add... +CMakePreferencePage_ConfirmRemoveDesc=Do you wish to deregister the selected files? +CMakePreferencePage_ConfirmRemoveTitle=Deregister CMake ToolChain File +CMakePreferencePage_Files=Toolchain Files +CMakePreferencePage_Path=Toolchain File +CMakePreferencePage_Remove=Remove +CMakePreferencePage_Toolchain=Toolchain CMakePropertyPage_FailedToStartCMakeGui_Body=Failed to run the CMake GUI: CMakePropertyPage_FailedToStartCMakeGui_Title=Failed to run CMake GUI CMakePropertyPage_LaunchCMakeGui=Launch CMake GUI... NewCMakeProjectWizard_Description=Specify properties of new CMake project. NewCMakeProjectWizard_PageTitle=New CMake Project NewCMakeProjectWizard_WindowTitle=New CMake Project +NewCMakeToolChainFilePage_Browse=Browse... +NewCMakeToolChainFilePage_NoPath=Please set the path to the CMake toolchain file. +NewCMakeToolChainFilePage_Path=Path: +NewCMakeToolChainFilePage_Select=Select location for CMake toolchain file +NewCMakeToolChainFilePage_Title=New CMake ToolChain File +NewCMakeToolChainFilePage_Toolchain=Toolchain: diff --git a/core/org.eclipse.cdt.core/.settings/.api_filters b/core/org.eclipse.cdt.core/.settings/.api_filters index f95a509891f..3f75336083e 100644 --- a/core/org.eclipse.cdt.core/.settings/.api_filters +++ b/core/org.eclipse.cdt.core/.settings/.api_filters @@ -1,5 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java index 5b677382683..0f1ac134595 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java @@ -108,9 +108,11 @@ import com.ibm.icu.text.MessageFormat; * @noinstantiate This class is not intended to be instantiated by clients. */ public class CCorePlugin extends Plugin { + // IStatus codes for our plug-in public static final int STATUS_CDTPROJECT_EXISTS = 1; public static final int STATUS_CDTPROJECT_MISMATCH = 2; public static final int CDT_PROJECT_NATURE_ID_MISMATCH = 3; + /** * Status code for core exception that is thrown if a pdom grew larger than * the supported limit. @@ -119,6 +121,13 @@ public class CCorePlugin extends Plugin { */ public static final int STATUS_PDOM_TOO_LARGE = 4; + /** + * Toolchain not found when inflating a build configuration. + * + * @since 6.4 + */ + public static final int STATUS_TOOLCHAIN_NOT_FOUND = 5; + public static final String PLUGIN_ID = "org.eclipse.cdt.core"; //$NON-NLS-1$ public static final String BUILDER_MODEL_ID = PLUGIN_ID + ".CBuildModel"; //$NON-NLS-1$ 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 e2adadf98c2..d90e35e9ef6 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,7 +24,6 @@ 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; @@ -96,9 +95,6 @@ import com.google.gson.JsonParseException; public abstract class CBuildConfiguration extends PlatformObject implements ICBuildConfiguration, IMarkerGenerator, IConsoleParser { - private static final String TOOLCHAIN_TYPE = "cdt.toolChain.type"; //$NON-NLS-1$ - private static final String TOOLCHAIN_ID = "cdt.toolChain.id"; //$NON-NLS-1$ - private static final String TOOLCHAIN_VERSION = "cdt.toolChain.version"; //$NON-NLS-1$ private static final String LAUNCH_MODE = "cdt.launchMode"; //$NON-NLS-1$ private static final List DEFAULT_COMMAND = new ArrayList<>(0); @@ -111,8 +107,6 @@ public abstract class CBuildConfiguration extends PlatformObject private final Map> scannerInfoListeners = new HashMap<>(); private ScannerInfoCache scannerInfoCache; - private Map properties; - protected CBuildConfiguration(IBuildConfiguration config, String name) throws CoreException { this.config = config; this.name = name; @@ -120,9 +114,8 @@ public abstract class CBuildConfiguration extends PlatformObject Preferences settings = getSettings(); String typeId = settings.get(TOOLCHAIN_TYPE, ""); //$NON-NLS-1$ String id = settings.get(TOOLCHAIN_ID, ""); //$NON-NLS-1$ - String version = settings.get(TOOLCHAIN_VERSION, ""); //$NON-NLS-1$ IToolChainManager toolChainManager = CCorePlugin.getService(IToolChainManager.class); - IToolChain tc = toolChainManager.getToolChain(typeId, id, version); + IToolChain tc = toolChainManager.getToolChain(typeId, id); if (tc == null) { // check for other versions @@ -132,7 +125,9 @@ public abstract class CBuildConfiguration extends PlatformObject tc = tcs.iterator().next(); } else { throw new CoreException(new Status(IStatus.ERROR, CCorePlugin.PLUGIN_ID, - String.format(Messages.CBuildConfigurationtoolchainMissing, config.getName()))); + CCorePlugin.STATUS_TOOLCHAIN_NOT_FOUND, + String.format(Messages.CBuildConfiguration_ToolchainMissing, config.getName()), + null)); } } toolChain = tc; @@ -157,7 +152,6 @@ public abstract class CBuildConfiguration extends PlatformObject Preferences settings = getSettings(); settings.put(TOOLCHAIN_TYPE, toolChain.getProvider().getId()); settings.put(TOOLCHAIN_ID, toolChain.getId()); - settings.put(TOOLCHAIN_VERSION, toolChain.getVersion()); try { settings.flush(); } catch (BackingStoreException e) { @@ -181,6 +175,7 @@ public abstract class CBuildConfiguration extends PlatformObject /** * @since 6.2 */ + @Override public String getLaunchMode() { return launchMode; } @@ -756,12 +751,11 @@ public abstract class CBuildConfiguration extends PlatformObject */ @Override public boolean setProperties(Map properties) { - if (this.properties == null || !this.properties.equals(properties)) { - this.properties = properties; - return true; - } else { - return false; + Preferences settings = getSettings(); + for (Entry entry : properties.entrySet()) { + settings.put(entry.getKey(), entry.getValue()); } + return true; } /** @@ -769,10 +763,42 @@ public abstract class CBuildConfiguration extends PlatformObject */ @Override public Map getProperties() { - if (properties == null) { - properties = getDefaultProperties(); + Map properties = new HashMap<>(); + Preferences settings = getSettings(); + try { + for (String key : settings.childrenNames()) { + String value = settings.get(key, null); + if (value != null) { + properties.put(key, value); + } + } + } catch (BackingStoreException e) { + CCorePlugin.log(e); } - return Collections.unmodifiableMap(properties); + return properties; + } + + /** + * @since 6.4 + */ + @Override + public String getProperty(String name) { + return getSettings().get(name, null); + } + + /** + * @since 6.4 + */ + @Override + public void setProperty(String name, String value) { + Preferences settings = getSettings(); + settings.put(name, value); + } + + @Override + public void removeProperty(String name) { + Preferences settings = getSettings(); + settings.remove(name); } /** 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 0794d4f054f..b53a01e434d 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,11 +34,21 @@ 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"; //$NON-NLS-1$ + public static final String DEFAULT_NAME = "default"; //$NON-NLS-1$ /** - * Returns the resources build configuration that this CDT build - * configuration is associated with. + * @since 6.4 + */ + public static final String TOOLCHAIN_TYPE = "cdt.toolChain.type"; //$NON-NLS-1$ + + /** + * @since 6.4 + */ + public static final String TOOLCHAIN_ID = "cdt.toolChain.id"; //$NON-NLS-1$ + + /** + * Returns the resources build configuration that this CDT build configuration + * is associated with. * * @return resources build configuration */ @@ -51,6 +61,15 @@ public interface ICBuildConfiguration extends IAdaptable, IScannerInfoProvider { */ IToolChain getToolChain() throws CoreException; + /** + * Return the launch mode associated with this build configuration. + * + * @since 6.4 + */ + default String getLaunchMode() { + return null; + } + /** * Ids for the Binary Parsers to use when checking whether a file is a * binary that can be launched. @@ -73,7 +92,7 @@ public interface ICBuildConfiguration extends IAdaptable, IScannerInfoProvider { /** * Return all of the build environment variables for this configuration. * - * @return + * @return environment variables * @throws CoreException */ IEnvironmentVariable[] getVariables() throws CoreException; @@ -160,6 +179,45 @@ public interface ICBuildConfiguration extends IAdaptable, IScannerInfoProvider { return new HashMap<>(); } + /** + * Set a property to the given value. + * + * @param name + * the name of the property + * @param the + * new value for the property + * @since 6.4 + */ + default void setProperty(String name, String value) { + Map properties = new HashMap<>(getProperties()); + properties.put(name, value); + setProperties(properties); + } + + /** + * Remove the named property. + * + * @param name + * name of the property + * @since 6.4 + */ + default void removeProperty(String name) { + Map properties = new HashMap<>(getProperties()); + properties.remove(name); + setProperties(properties); + } + + /** + * Return the named property. + * + * @param name + * the name of the property + * @since 6.4 + */ + default String getProperty(String name) { + return getProperties().get(name); + } + /** * Returns whether this build configuration supports the given build * properties. 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 91efa47a7e5..8a20f1412d8 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 @@ -1,112 +1,129 @@ -/******************************************************************************* - * 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.core.build; - -import java.util.Map; - -import org.eclipse.core.resources.IBuildConfiguration; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; - -/** - * The OSGi service that manages the mapping from platform build configuration - * to CDT build configuration. - * - * @since 6.0 - * @noimplement This interface is not intended to be implemented by clients. - */ -public interface ICBuildConfigurationManager { - - /** - * Return the build configuration provider with the given id. - * - * @param id - * @return build configuration provider - */ - ICBuildConfigurationProvider getProvider(String id); - - /** - * Create a new build configuration to be owned by a provider. - * - * @param provider - * @param project - * @param configName - * @param monitor - * @return new build configuration - * @throws CoreException - */ - IBuildConfiguration createBuildConfiguration(ICBuildConfigurationProvider provider, IProject project, - 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 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. - * - * @param buildConfig - * platform build configuration - * @param cConfig - * CDT build configuration - */ - void addBuildConfiguration(IBuildConfiguration buildConfig, ICBuildConfiguration cConfig); - - /** - * Return the CDT build configuration associated with the given Platform - * build configuration. - * - * @param buildConfig - * @return the matching CDT build configuration - */ - ICBuildConfiguration getBuildConfiguration(IBuildConfiguration buildConfig) throws CoreException; - - /** - * Does this build system support this project. This is determined by - * searching the build configuration providers looking to see if any of them - * support this project. - * - * @param project - * @return is this project supported by this build system - * @throws CoreException - * @since 6.1 - */ - boolean supports(IProject project) throws CoreException; - -} +/******************************************************************************* + * 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.core.build; + +import java.util.Map; + +import org.eclipse.core.resources.IBuildConfiguration; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; + +/** + * The OSGi service that manages the mapping from platform build configuration + * to CDT build configuration. + * + * @since 6.0 + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface ICBuildConfigurationManager { + + /** + * Return the build configuration provider with the given id. + * + * @param id + * @return build configuration provider + */ + ICBuildConfigurationProvider getProvider(String id); + + /** + * Return whether the given project has a configuration with the given + * configName. + * + * @param provider + * @param project + * @param configName + * @return true if project has the named config + * @throws CoreException + * @since 6.4 + */ + boolean hasConfiguration(ICBuildConfigurationProvider provider, IProject project, String configName) + throws CoreException; + + /** + * Create a new build configuration to be owned by a provider. + * + * @param provider + * @param project + * @param configName + * @param monitor + * @return new build configuration + * @throws CoreException + */ + IBuildConfiguration createBuildConfiguration(ICBuildConfigurationProvider provider, IProject project, + 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 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. + * + * @deprecated clients really need to pick which toolchain they want a build + * config for. This method pretty much picks one at random. + * @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 + */ + @Deprecated + ICBuildConfiguration getBuildConfiguration(IProject project, Map properties, + String launchMode, IProgressMonitor monitor) throws CoreException; + + /** + * Called by providers to add new build configurations as they are created. + * + * @param buildConfig + * platform build configuration + * @param cConfig + * CDT build configuration + */ + void addBuildConfiguration(IBuildConfiguration buildConfig, ICBuildConfiguration cConfig); + + /** + * Return the CDT build configuration associated with the given Platform + * build configuration. + * + * @param buildConfig + * @return the matching CDT build configuration + */ + ICBuildConfiguration getBuildConfiguration(IBuildConfiguration buildConfig) throws CoreException; + + /** + * Does this build system support this project. This is determined by + * searching the build configuration providers looking to see if any of them + * support this project. + * + * @param project + * @return is this project supported by this build system + * @throws CoreException + * @since 6.1 + */ + boolean supports(IProject project) throws CoreException; + +} diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationProvider.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationProvider.java index 6de0c38e49c..f2a75174641 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationProvider.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/ICBuildConfigurationProvider.java @@ -7,6 +7,8 @@ *******************************************************************************/ package org.eclipse.cdt.core.build; +import java.util.Collection; + import org.eclipse.core.resources.IBuildConfiguration; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; @@ -53,4 +55,15 @@ public interface ICBuildConfigurationProvider { return null; } + /** + * Return a collection of supported toolchains for build configurations of this + * type. + * + * @since 6.4 + */ + default Collection getSupportedToolchains(Collection toolchains) + throws CoreException { + return toolchains; + } + } diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/IToolChainManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/IToolChainManager.java index b1b0ec270bd..08d210cf79f 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/IToolChainManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/build/IToolChainManager.java @@ -35,6 +35,7 @@ public interface IToolChainManager { /** * Return the toolchain from the given provider with the given id and version. * + * @deprecated Version is now irrelevant. id's are unique. * @param providerId * id of provider * @param id @@ -44,7 +45,23 @@ public interface IToolChainManager { * @return the toolchain * @throws CoreException */ - IToolChain getToolChain(String providerId, String id, String version) throws CoreException; + @Deprecated + default IToolChain getToolChain(String providerId, String id, String version) throws CoreException { + return getToolChain(providerId, id); + } + + /** + * Return the toolChain from the given provider with the given id. + * + * @param providerId + * id of provider + * @param id + * id of toolchain + * @return the toolchain + * @throws CoreException + * @since 6.4 + */ + IToolChain getToolChain(String providerId, String id) throws CoreException; /** * Return the toolchains provided by the given provider 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 0c867535003..3f8ead11ed8 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 @@ -40,6 +40,7 @@ import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.InstanceScope; import org.osgi.service.prefs.BackingStoreException; @@ -141,6 +142,13 @@ public class CBuildConfigurationManager implements ICBuildConfigurationManager, return null; } + @Override + public boolean hasConfiguration(ICBuildConfigurationProvider provider, IProject project, + String configName) throws CoreException { + String name = provider.getId() + '/' + configName; + return project.hasBuildConfig(name); + } + @Override public IBuildConfiguration createBuildConfiguration(ICBuildConfigurationProvider provider, IProject project, String configName, IProgressMonitor monitor) throws CoreException { @@ -196,7 +204,15 @@ public class CBuildConfigurationManager implements ICBuildConfigurationManager, } if (provider != null) { - config = provider.getCBuildConfiguration(buildConfig, configName); + try { + config = provider.getCBuildConfiguration(buildConfig, configName); + } catch (CoreException e) { + IStatus status = e.getStatus(); + if (!status.getPlugin().equals(CCorePlugin.PLUGIN_ID) + || status.getCode() != CCorePlugin.STATUS_TOOLCHAIN_NOT_FOUND) { + throw e; + } + } if (config != null) { configs.put(buildConfig, config); // Also make sure we reset the binary parser cache @@ -224,8 +240,19 @@ public class CBuildConfigurationManager implements ICBuildConfigurationManager, @Override public ICBuildConfiguration getBuildConfiguration(IProject project, IToolChain toolChain, String launchMode, IProgressMonitor monitor) throws CoreException { + // First see if we have one + for (IBuildConfiguration config : project.getBuildConfigs()) { + ICBuildConfiguration cconfig = getBuildConfiguration(config); + if (cconfig != null && cconfig.getToolChain().equals(toolChain) + && launchMode.equals(cconfig.getLaunchMode())) { + return cconfig; + } + } + + // Nope, ask the provider to create one ICBuildConfigurationProvider provider = getProvider(project); if (provider != null) { + // The provider will call us back to add in the new one return provider.createBuildConfiguration(project, toolChain, launchMode, monitor); } else { return null; 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 index e94820da9da..f9cc33c3514 100644 --- 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 @@ -11,7 +11,7 @@ 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; + public static String CBuildConfiguration_ToolchainMissing; public static String CBuilder_ExceptionWhileBuilding; public static String CBuilder_ExceptionWhileBuilding2; public static String CBuilder_NotConfiguredCorrectly; diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/ToolChainManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/ToolChainManager.java index 754f9194694..1ac9b8b7df7 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/ToolChainManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/build/ToolChainManager.java @@ -68,7 +68,6 @@ public class ToolChainManager implements IToolChainManager { List id = new ArrayList<>(3); id.add(toolChain.getProvider().getId()); id.add(toolChain.getId()); - id.add(toolChain.getVersion()); return id; } @@ -101,12 +100,11 @@ public class ToolChainManager implements IToolChainManager { } @Override - public IToolChain getToolChain(String providerId, String id, String version) throws CoreException { + public IToolChain getToolChain(String providerId, String id) throws CoreException { init(); List tid = new ArrayList<>(3); tid.add(providerId); tid.add(id); - tid.add(version); IToolChain toolChain = toolChains.get(tid); if (toolChain != null) { @@ -116,7 +114,7 @@ public class ToolChainManager implements IToolChainManager { // Try the provider IToolChainProvider realProvider = providers.get(providerId); if (realProvider != null) { - toolChain = realProvider.getToolChain(id, version); + toolChain = realProvider.getToolChain(id); if (toolChain != null) { toolChains.put(getId(toolChain), toolChain); return toolChain; 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 index 318235d700b..8a4bc16a5cc 100644 --- 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 @@ -10,3 +10,4 @@ CBuilder_ExceptionWhileBuilding2=Exception while building CBuilder_NotConfiguredCorrectly=Build not configured correctly\n CBuilder_NotConfiguredCorrectly2=Build not configured correctly\n StandardBuildConfiguration_0=Building in: %s\n +CBuildConfiguration_ToolchainMissing=Toolchain is missing for build configuration diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/envvar/EnvironmentVariableManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/envvar/EnvironmentVariableManager.java index b00b7fae88a..b272142894e 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/envvar/EnvironmentVariableManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/envvar/EnvironmentVariableManager.java @@ -446,18 +446,22 @@ public class EnvironmentVariableManager implements IEnvironmentVariableManager { @Override public void setEnvironment(Map env, IBuildConfiguration config, boolean resolveMacros) { for (IEnvironmentVariable var : getVariables(config, resolveMacros)) { + String name = var.getName(); + if ("PATH".equals(name) && env.containsKey("Path")) { //$NON-NLS-1$ //$NON-NLS-2$ + name = "Path"; //$NON-NLS-1$ + } switch (var.getOperation()) { case IEnvironmentVariable.ENVVAR_REPLACE: - env.put(var.getName(), var.getValue()); + env.put(name, var.getValue()); break; case IEnvironmentVariable.ENVVAR_APPEND: - env.put(var.getName(), env.get(var.getName()) + var.getDelimiter() + var.getValue()); + env.put(name, env.get(name) + var.getDelimiter() + var.getValue()); break; case IEnvironmentVariable.ENVVAR_PREPEND: - env.put(var.getName(), var.getValue() + var.getDelimiter() + env.get(var.getName())); + env.put(name, var.getValue() + var.getDelimiter() + env.get(name)); break; case IEnvironmentVariable.ENVVAR_REMOVE: - env.remove(var.getName()); + env.remove(name); break; } } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchBarTracker.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchBarTracker.java index b79da79032d..81ccf982b8f 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchBarTracker.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchBarTracker.java @@ -17,6 +17,7 @@ import org.eclipse.cdt.core.build.IToolChain; import org.eclipse.cdt.core.build.IToolChainManager; import org.eclipse.cdt.debug.core.CDebugCorePlugin; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; +import org.eclipse.cdt.debug.internal.core.InternalDebugCoreMessages; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; @@ -86,7 +87,7 @@ public class CoreBuildLaunchBarTracker implements ILaunchBarListener { // Pick build config based on toolchain for target // Since this may create a new config, need to run it in a Job - Job job = new Job("Change Build Configurations") { + Job job = new Job(InternalDebugCoreMessages.CoreBuildLaunchBarTracker_Job) { @Override protected IStatus run(IProgressMonitor monitor) { try { @@ -102,14 +103,6 @@ public class CoreBuildLaunchBarTracker implements ILaunchBarListener { IProjectDescription desc = finalProject.getDescription(); desc.setActiveBuildConfig(buildConfig.getBuildConfiguration().getName()); finalProject.setDescription(desc, monitor); - - // Copy over the build attributes from the launch config - ILaunchConfiguration configuration = launchBarManager.getLaunchConfiguration(descriptor, - target); - Map buildProps = configuration.getAttribute( - CoreBuildLaunchConfigDelegate.getBuildAttributeName(mode.getIdentifier()), - buildConfig.getDefaultProperties()); - buildConfig.setProperties(buildProps); } } diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java index cf8e12788ca..0a3ef900b37 100644 --- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/launch/CoreBuildLaunchConfigDelegate.java @@ -1,107 +1,138 @@ -/******************************************************************************* - * 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.debug.core.launch; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -import org.eclipse.cdt.core.build.ICBuildConfiguration; -import org.eclipse.cdt.core.build.ICBuildConfigurationManager; -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.debug.internal.core.InternalDebugCoreMessages; -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; - -/** - * Common launch delegate code for core build launches. - * - * @since 8.1 - */ -public abstract class CoreBuildLaunchConfigDelegate extends LaunchConfigurationTargetedDelegate { - - protected ICBuildConfigurationManager configManager = CDebugCorePlugin - .getService(ICBuildConfigurationManager.class); - protected IToolChainManager toolChainManager = CDebugCorePlugin.getService(IToolChainManager.class); - - public static IProject getProject(ILaunchConfiguration configuration) throws CoreException { - // TODO - make sure this is really the correct project - return configuration.getMappedResources()[0].getProject(); - } - - protected ICBuildConfiguration getBuildConfiguration(IProject project, String mode, ILaunchTarget target, - IProgressMonitor monitor) throws CoreException { - // Pick build config based on toolchain for target - Map properties = new HashMap<>(); - properties.putAll(target.getAttributes()); - Collection tcs = toolChainManager.getToolChainsMatching(properties); - if (!tcs.isEmpty()) { - IToolChain toolChain = tcs.iterator().next(); - return configManager.getBuildConfiguration(project, toolChain, mode, monitor); - } else { - return null; - } - } - - protected IBinary getBinary(ICBuildConfiguration buildConfig) throws CoreException { - IBinary[] binaries = buildConfig.getBuildOutput(); - IBinary exeFile = null; - for (IBinary binary : binaries) { - if (binary.isExecutable()) { - exeFile = binary; - break; - } - } - if (exeFile == null) { - throw new CoreException(new Status(IStatus.ERROR, CDebugCorePlugin.PLUGIN_ID, InternalDebugCoreMessages.CoreBuildLaunchConfigDelegate_noBinaries)); - } - return exeFile; - } - - @Override - protected IProject[] getBuildOrder(ILaunchConfiguration configuration, String mode) throws CoreException { - // 1. Extract project from configuration - // TODO dependencies too. - IProject project = getProject(configuration); - 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 { - IProject project = getProject(configuration); - ICBuildConfiguration buildConfig = getBuildConfiguration(project, mode, target, monitor); - if (buildConfig != null) { - IProjectDescription desc = project.getDescription(); - desc.setActiveBuildConfig(buildConfig.getBuildConfiguration().getName()); - project.setDescription(desc, monitor); - - Map buildProps = configuration.getAttribute(getBuildAttributeName(mode), - buildConfig.getDefaultProperties()); - buildConfig.setProperties(buildProps); - } - - // proceed with the build - return superBuildForLaunch(configuration, mode, monitor); - } - -} +/******************************************************************************* + * 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.debug.core.launch; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +import org.eclipse.cdt.core.build.ICBuildConfiguration; +import org.eclipse.cdt.core.build.ICBuildConfigurationManager; +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.debug.internal.core.InternalDebugCoreMessages; +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; + +/** + * Common launch delegate code for core build launches. + * + * @since 8.1 + */ +public abstract class CoreBuildLaunchConfigDelegate extends LaunchConfigurationTargetedDelegate { + + protected ICBuildConfigurationManager configManager = CDebugCorePlugin + .getService(ICBuildConfigurationManager.class); + protected IToolChainManager toolChainManager = CDebugCorePlugin.getService(IToolChainManager.class); + + public static IProject getProject(ILaunchConfiguration configuration) throws CoreException { + // TODO - make sure this is really the correct project + return configuration.getMappedResources()[0].getProject(); + } + + /** + * @deprecated Use the version that takes the launch config so we can see if it + * know what toolchain to use. + */ + @Deprecated + protected ICBuildConfiguration getBuildConfiguration(IProject project, String mode, ILaunchTarget target, + IProgressMonitor monitor) throws CoreException { + // Pick build config based on toolchain for target + Map properties = new HashMap<>(); + properties.putAll(target.getAttributes()); + Collection tcs = toolChainManager.getToolChainsMatching(properties); + if (!tcs.isEmpty()) { + IToolChain toolChain = tcs.iterator().next(); + return configManager.getBuildConfiguration(project, toolChain, mode, monitor); + } else { + return null; + } + } + + /** + * @since 8.3 + */ + protected ICBuildConfiguration getBuildConfiguration(ILaunchConfiguration configuration, String mode, + ILaunchTarget target, IProgressMonitor monitor) throws CoreException { + IProject project = getProject(configuration); + String toolchainId = configuration.getAttribute(ICBuildConfiguration.TOOLCHAIN_ID, (String) null); + if (toolchainId != null) { + String providerId = configuration.getAttribute(ICBuildConfiguration.TOOLCHAIN_TYPE, ""); //$NON-NLS-1$ + IToolChain toolchain = toolChainManager.getToolChain(providerId, toolchainId); + if (toolchain != null) { + return configManager.getBuildConfiguration(project, toolchain, mode, monitor); + } + } + + // Pick the first one that matches + Map properties = new HashMap<>(); + properties.putAll(target.getAttributes()); + Collection tcs = toolChainManager.getToolChainsMatching(properties); + if (!tcs.isEmpty()) { + IToolChain toolChain = tcs.iterator().next(); + return configManager.getBuildConfiguration(project, toolChain, mode, monitor); + } + + return null; + } + protected IBinary getBinary(ICBuildConfiguration buildConfig) throws CoreException { + IBinary[] binaries = buildConfig.getBuildOutput(); + IBinary exeFile = null; + for (IBinary binary : binaries) { + if (binary.isExecutable()) { + exeFile = binary; + break; + } + } + if (exeFile == null) { + throw new CoreException(new Status(IStatus.ERROR, CDebugCorePlugin.PLUGIN_ID, InternalDebugCoreMessages.CoreBuildLaunchConfigDelegate_noBinaries)); + } + return exeFile; + } + + @Override + protected IProject[] getBuildOrder(ILaunchConfiguration configuration, String mode) throws CoreException { + // 1. Extract project from configuration + // TODO dependencies too. + IProject project = getProject(configuration); + return new IProject[] { project }; + } + + /** + * @deprecated Store build properties right on the build configs + */ + @Deprecated + 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 { + ICBuildConfiguration buildConfig = getBuildConfiguration(configuration, mode, target, monitor); + if (buildConfig != null) { + IProject project = getProject(configuration); + IProjectDescription desc = project.getDescription(); + desc.setActiveBuildConfig(buildConfig.getBuildConfiguration().getName()); + project.setDescription(desc, monitor); + } + + // proceed with the build + return superBuildForLaunch(configuration, mode, monitor); + } + +} 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 c5494d95df6..85a9d73bc7a 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 @@ -11,7 +11,6 @@ *******************************************************************************/ package org.eclipse.cdt.debug.internal.core; -import org.eclipse.core.internal.variables.VariablesMessages; import org.eclipse.osgi.util.NLS; public class InternalDebugCoreMessages extends NLS { @@ -27,6 +26,7 @@ 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 CoreBuildLaunchBarTracker_Job; public static String CoreBuildLaunchConfigDelegate_noBinaries; public static String CoreBuildLocalRunLaunchDelegate_ErrorLaunching; public static String CRegisterManager_0; @@ -39,7 +39,7 @@ public class InternalDebugCoreMessages extends NLS { static { // Load message values from a bundle file. - NLS.initializeMessages(InternalDebugCoreMessages.class.getName(), VariablesMessages.class); + NLS.initializeMessages(InternalDebugCoreMessages.class.getName(), InternalDebugCoreMessages.class); } } 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 8c0130ab937..b9320c0048f 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,7 @@ 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 +CoreBuildLaunchBarTracker_Job=Change Build Configurations CoreBuildLaunchConfigDelegate_noBinaries=No binaries CoreBuildLocalRunLaunchDelegate_ErrorLaunching=Error launching CRegisterManager_0=Unable to restore register groups - invalid memento. 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 4ff8b3921c0..b9e62ba39c2 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 @@ -15,7 +15,6 @@ import org.eclipse.cdt.core.model.IBinary; import org.eclipse.cdt.debug.core.CDebugCorePlugin; 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; import org.eclipse.core.runtime.IStatus; @@ -31,10 +30,8 @@ public class CoreBuildLocalRunLaunchDelegate extends CoreBuildLaunchConfigDelega @Override public void launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException { - IProject project = getProject(configuration); ILaunchTarget target = ((ITargetedLaunch) launch).getLaunchTarget(); - - ICBuildConfiguration buildConfig = getBuildConfiguration(project, mode, target, monitor); + ICBuildConfiguration buildConfig = getBuildConfiguration(configuration, mode, target, monitor); IBinary exeFile = getBinary(buildConfig); try { 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 e962a55e4c7..8b5cff15a84 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 @@ -1,132 +1,130 @@ -/******************************************************************************* - * 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.dsf.gdb.internal.launching; - -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; -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.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; -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.core.resources.IProject; -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 CoreBuildLocalDebugLaunchDelegate extends CoreBuildLaunchConfigDelegate { - - @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(); - IProject project = getProject(configuration); - ICBuildConfiguration buildConfig = getBuildConfiguration(project, mode, target, monitor); - - Map buildEnv = new HashMap<>(); - buildConfig.setBuildEnvironment(buildEnv); - Properties envProps = new Properties(); - envProps.putAll(buildEnv); - gdbLaunch.setInitialEnvironment(envProps); - - IToolChain toolChain = buildConfig.getToolChain(); - 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()); - 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, GdbPlugin.PLUGIN_ID, Messages.CoreBuildLocalDebugLaunchDelegate_FailureLaunching, 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( - GdbPlugin.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, GdbPlugin.PLUGIN_ID, Messages.CoreBuildLocalDebugLaunchDelegate_FailureStart, e)); - } - } - -} +/******************************************************************************* + * 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.dsf.gdb.internal.launching; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +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.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; +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.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 CoreBuildLocalDebugLaunchDelegate extends CoreBuildLaunchConfigDelegate { + + @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(); + ICBuildConfiguration buildConfig = getBuildConfiguration(configuration, mode, target, monitor); + + Map buildEnv = new HashMap<>(); + buildConfig.setBuildEnvironment(buildEnv); + Properties envProps = new Properties(); + envProps.putAll(buildEnv); + gdbLaunch.setInitialEnvironment(envProps); + + IToolChain toolChain = buildConfig.getToolChain(); + 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()); + 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, GdbPlugin.PLUGIN_ID, Messages.CoreBuildLocalDebugLaunchDelegate_FailureLaunching, 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( + GdbPlugin.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, GdbPlugin.PLUGIN_ID, Messages.CoreBuildLocalDebugLaunchDelegate_FailureStart, e)); + } + } + +} diff --git a/jtag/org.eclipse.cdt.debug.gdbjtag.core/.settings/org.eclipse.jdt.core.prefs b/jtag/org.eclipse.cdt.debug.gdbjtag.core/.settings/org.eclipse.jdt.core.prefs index bd3f7152821..09a75c5c995 100644 --- a/jtag/org.eclipse.cdt.debug.gdbjtag.core/.settings/org.eclipse.jdt.core.prefs +++ b/jtag/org.eclipse.cdt.debug.gdbjtag.core/.settings/org.eclipse.jdt.core.prefs @@ -2,18 +2,22 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.APILeak=warning org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=error org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=ignore org.eclipse.jdt.core.compiler.problem.comparingIdentical=error org.eclipse.jdt.core.compiler.problem.deadCode=error -org.eclipse.jdt.core.compiler.problem.deprecation=error +org.eclipse.jdt.core.compiler.problem.deprecation=warning org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=error @@ -45,12 +49,14 @@ org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=error org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.jdt.core.compiler.problem.potentialNullReference=error org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore @@ -67,12 +73,16 @@ org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=enabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=error +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore @@ -80,6 +90,7 @@ org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedImport=error org.eclipse.jdt.core.compiler.problem.unusedLabel=error org.eclipse.jdt.core.compiler.problem.unusedLocal=error diff --git a/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF b/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF index 731ca773c56..346e4d26e51 100644 --- a/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF +++ b/launch/org.eclipse.cdt.launch/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.launch; singleton:=true -Bundle-Version: 9.1.0.qualifier +Bundle-Version: 9.2.0.qualifier Bundle-Activator: org.eclipse.cdt.launch.internal.ui.LaunchUIPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin 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 0b3e4a846a7..2b25f90f594 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,9 @@ 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 CommonBuildTab_Default; + public static String CommonBuildTab_NotFound; + public static String CommonBuildTab_Toolchain; public static String CoreBuildTab_Build; public static String CoreBuildTab_NoOptions; public static String CoreFileLaunchDelegate_Launching_postmortem_debugger; 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 e287e387bf4..cf0cca03848 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,9 @@ 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 +CommonBuildTab_Default=Default (%s) +CommonBuildTab_NotFound=No suitable toolchains found +CommonBuildTab_Toolchain=Toolchain CoreBuildTab_Build=Build Settings CoreBuildTab_NoOptions=No build options required. CoreFileLaunchDelegate_Launching_postmortem_debugger=Launching postmortem debugger 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 index c7b79e6c49e..27e7da3d104 100644 --- 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 @@ -7,20 +7,36 @@ *******************************************************************************/ package org.eclipse.cdt.launch.ui.corebuild; +import java.util.HashMap; import java.util.Map; 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.debug.core.launch.CoreBuildLaunchConfigDelegate; +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.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.debug.core.ILaunchConfiguration; +import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; 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; +import org.eclipse.launchbar.ui.internal.Activator; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +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.Control; +import org.eclipse.swt.widgets.Group; /** * Common utilities for Core Build launch configuration tabs. @@ -29,6 +45,163 @@ import org.eclipse.launchbar.ui.ILaunchBarLaunchConfigDialog; */ public abstract class CommonBuildTab extends AbstractLaunchConfigurationTab { + private Combo tcCombo; + private ICBuildConfiguration buildConfig; + private IToolChain[] toolchains; + + private IToolChain currentToolchain; + private IProject project; + + private Map> savedProperties = new HashMap<>(); + + private static IToolChainManager tcManager = LaunchUIPlugin.getService(IToolChainManager.class); + private static ICBuildConfigurationManager bcManager = LaunchUIPlugin.getService(ICBuildConfigurationManager.class); + + /** + * @since 9.2 + */ + protected String getBuildConfigProviderId() { + return null; + } + + /** + * @since 9.2 + */ + protected void saveProperties(Map properties) { + } + + /** + * @since 9.2 + */ + protected void restoreProperties(Map properties) { + } + + /** + * @since 9.2 + */ + protected Control createToolchainSelector(Composite parent) { + Group tcGroup = new Group(parent, SWT.NONE); + tcGroup.setText(LaunchMessages.CommonBuildTab_Toolchain); + tcGroup.setLayout(new GridLayout()); + + tcCombo = new Combo(tcGroup, SWT.READ_ONLY); + tcCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); + tcCombo.addSelectionListener(new SelectionAdapter() { + @Override + public void widgetSelected(SelectionEvent e) { + if (buildConfig != null) { + Map saved = new HashMap<>(); + saveProperties(saved); + savedProperties.put(buildConfig, saved); + } + + if (toolchainChanged()) { + Map saved = savedProperties.get(buildConfig); + if (saved != null) { + restoreProperties(saved); + } + } + } + }); + + return tcGroup; + } + + @Override + public void initializeFrom(ILaunchConfiguration configuration) { + if (tcCombo == null) { + return; + } + + try { + project = CoreBuildLaunchConfigDelegate.getProject(configuration); + + ICBuildConfigurationProvider bcProvider = bcManager.getProvider(getBuildConfigProviderId()); + ILaunchTarget target = getLaunchTarget(); + toolchains = bcProvider.getSupportedToolchains(tcManager.getToolChainsMatching(target.getAttributes())) + .toArray(new IToolChain[0]); + + tcCombo.removeAll(); + if (toolchains.length > 0) { + tcCombo.add(String.format(LaunchMessages.CommonBuildTab_Default, toolchains[0])); + } else { + tcCombo.add(LaunchMessages.CommonBuildTab_NotFound); + } + + for (IToolChain tc : toolchains) { + tcCombo.add(tc.getName()); + } + + tcCombo.select(0); + + String toolchainId = configuration.getAttribute(ICBuildConfiguration.TOOLCHAIN_ID, (String) null); + if (toolchainId != null) { + String typeId = configuration.getAttribute(ICBuildConfiguration.TOOLCHAIN_TYPE, ""); //$NON-NLS-1$ + IToolChain toolchain = tcManager.getToolChain(typeId, toolchainId); + if (toolchain != null) { + for (int i = 0; i < toolchains.length; i++) { + if (toolchains[i] == toolchain) { + tcCombo.select(i + 1); + break; + } + } + } + } + + toolchainChanged(); + } catch (CoreException e) { + LaunchUIPlugin.log(e.getStatus()); + } + } + + @Override + public void performApply(ILaunchConfigurationWorkingCopy configuration) { + if (tcCombo == null) { + return; + } + + int i = tcCombo.getSelectionIndex(); + if (i == 0) { + configuration.removeAttribute(ICBuildConfiguration.TOOLCHAIN_ID); + configuration.removeAttribute(ICBuildConfiguration.TOOLCHAIN_TYPE); + } else { + IToolChain tc = toolchains[i - 1]; + configuration.setAttribute(ICBuildConfiguration.TOOLCHAIN_ID, tc.getId()); + configuration.setAttribute(ICBuildConfiguration.TOOLCHAIN_TYPE, tc.getProvider().getId()); + } + } + + @Override + public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { + configuration.removeAttribute(ICBuildConfiguration.TOOLCHAIN_ID); + configuration.removeAttribute(ICBuildConfiguration.TOOLCHAIN_TYPE); + } + + private boolean toolchainChanged() { + int i = tcCombo.getSelectionIndex(); + if (i < 0) { + buildConfig = null; + return false; + } else if (i == 0) { + i = 1; + } + + IToolChain newToolchain = toolchains[i - 1]; + if (newToolchain == currentToolchain) { + return false; + } + currentToolchain = newToolchain; + + String mode = getLaunchConfigurationDialog().getMode(); + try { + buildConfig = bcManager.getBuildConfiguration(project, newToolchain, mode, new NullProgressMonitor()); + } catch (CoreException e) { + Activator.log(e.getStatus()); + } + + return true; + } + public ILaunchBarLaunchConfigDialog getLaunchBarLaunchConfigDialog() { ILaunchConfigurationDialog dialog = getLaunchConfigurationDialog(); return dialog instanceof ILaunchBarLaunchConfigDialog ? (ILaunchBarLaunchConfigDialog) dialog : null; @@ -39,17 +212,19 @@ public abstract class CommonBuildTab extends AbstractLaunchConfigurationTab { return dialog != null ? dialog.getLaunchTarget() : null; } + /** + * @deprecated Just use getBuildConfiguration() + */ + @Deprecated public ICBuildConfiguration getBuildConfiguration(ILaunchConfiguration configuration) throws CoreException { - String mode = getLaunchConfigurationDialog().getMode(); - ILaunchTarget target = getLaunchTarget(); - if (target == null) { - return null; - } + return buildConfig; + } - ICBuildConfigurationManager bcManager = LaunchUIPlugin.getService(ICBuildConfigurationManager.class); - IProject project = CoreBuildLaunchConfigDelegate.getProject(configuration); - Map properties = target.getAttributes(); - return bcManager.getBuildConfiguration(project, properties, mode, new NullProgressMonitor()); + /** + * @since 9.2 + */ + public ICBuildConfiguration getBuildConfiguration() { + return buildConfig; } } 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 ba12633a2c9..3ef3b6983aa 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 @@ -189,7 +189,7 @@ public class QtBuildConfiguration extends CBuildConfiguration @Override public String[] getQmakeConfig() { - String qmakeArgs = getProperties().get(QMAKE_ARGS); + String qmakeArgs = getProperty(QMAKE_ARGS); if (qmakeArgs != null) { return qmakeArgs.split(" "); //$NON-NLS-1$ } @@ -447,7 +447,7 @@ public class QtBuildConfiguration extends CBuildConfiguration } public String[] getMakeCommand() { - String buildCommandStr = getProperties().get(BUILD_COMMAND); + String buildCommandStr = getProperty(BUILD_COMMAND); if (buildCommandStr != null) { String[] buildCommand = buildCommandStr.split(" "); //$NON-NLS-1$ Path command = findCommand(buildCommand[0]); diff --git a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/Activator.java b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/Activator.java index 2f1f20995e5..17e55adb6a2 100644 --- a/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/Activator.java +++ b/qt/org.eclipse.cdt.qt.ui/src/org/eclipse/cdt/internal/qt/ui/Activator.java @@ -118,6 +118,10 @@ public class Activator extends AbstractUIPlugin { getDefault().getLog().log(new Status(code, PLUGIN_ID, msg, e)); } + public static void log(IStatus status) { + getDefault().getLog().log(status); + } + public static T getService(Class service) { BundleContext context = plugin.getBundle().getBundleContext(); ServiceReference ref = context.getServiceReference(service); 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 index 7430c6cf653..e03995a7080 100644 --- 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 @@ -8,12 +8,10 @@ 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.ICBuildConfiguration; 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; @@ -34,9 +32,9 @@ import org.eclipse.swt.widgets.Text; public class QtBuildTab extends CommonBuildTab { - Combo qmakeCombo; - Text qmakeArgsText; - Text buildCmdText; + private Combo qmakeCombo; + private Text qmakeArgsText; + private Text buildCmdText; @Override public void createControl(Composite parent) { @@ -63,39 +61,16 @@ public class QtBuildTab extends CommonBuildTab { 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); - + ICBuildConfiguration buildConfig = getBuildConfiguration(); // qmake command IToolChainManager tcManager = Activator.getService(IToolChainManager.class); IQtInstallManager qtManager = Activator.getService(IQtInstallManager.class); ILaunchTarget target = getLaunchTarget(); - String qmakeCmd = properties.get(QtBuildConfiguration.QMAKE_COMMAND); + String qmakeCmd = buildConfig.getProperty(QtBuildConfiguration.QMAKE_COMMAND); qmakeCombo.removeAll(); Collection toolChains = tcManager.getToolChainsMatching(target.getAttributes()); int select = -1; @@ -116,13 +91,13 @@ public class QtBuildTab extends CommonBuildTab { } // qmake args - String qmakeArgs = properties.get(QtBuildConfiguration.QMAKE_ARGS); + String qmakeArgs = buildConfig.getProperty(QtBuildConfiguration.QMAKE_ARGS); if (qmakeArgs != null) { qmakeArgsText.setText(qmakeArgs); } // build command - String buildCommand = properties.get(QtBuildConfiguration.BUILD_COMMAND); + String buildCommand = buildConfig.getProperty(QtBuildConfiguration.BUILD_COMMAND); if (buildCommand != null) { buildCmdText.setText(buildCommand); } @@ -131,18 +106,30 @@ public class QtBuildTab extends CommonBuildTab { } } + @Override + public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { + ICBuildConfiguration buildConfig = getBuildConfiguration(); + buildConfig.removeProperty(QtBuildConfiguration.QMAKE_ARGS); + buildConfig.removeProperty(QtBuildConfiguration.BUILD_COMMAND); + } + @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()); + ICBuildConfiguration buildConfig = getBuildConfiguration(); + buildConfig.setProperty(QtBuildConfiguration.QMAKE_COMMAND, qmakeCombo.getItem(qmakeCombo.getSelectionIndex())); + + String qmakeArgs = qmakeArgsText.getText().trim(); + if (qmakeArgs.isEmpty()) { + buildConfig.removeProperty(QtBuildConfiguration.QMAKE_ARGS); + } else { + buildConfig.setProperty(QtBuildConfiguration.QMAKE_ARGS, qmakeArgs); + } - String mode = getLaunchBarLaunchConfigDialog().getMode(); - configuration.setAttribute(CoreBuildLaunchConfigDelegate.getBuildAttributeName(mode), properties); - } catch (CoreException e) { - Activator.log(e); + String buildCmd = buildCmdText.getText().trim(); + if (buildCmd.isEmpty()) { + buildConfig.removeProperty(QtBuildConfiguration.BUILD_COMMAND); + } else { + buildConfig.setProperty(QtBuildConfiguration.BUILD_COMMAND, buildCmd); } } -- cgit v1.2.3