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<>()); + super.initializeFrom(configuration); - String generator = properties.get(CMakeBuildConfiguration.CMAKE_GENERATOR); - updateGeneratorButtons(generator); + ICBuildConfiguration buildConfig = getBuildConfiguration(); - String cmakeArgs = properties.get(CMakeBuildConfiguration.CMAKE_ARGUMENTS); - if (cmakeArgs != null) { - cmakeArgsText.setText(cmakeArgs); - } else { - cmakeArgsText.setText(""); //$NON-NLS-1$ - } + String generator = buildConfig.getProperty(CMakeBuildConfiguration.CMAKE_GENERATOR); + updateGeneratorButtons(generator); - String buildCommand = properties.get(CMakeBuildConfiguration.BUILD_COMMAND); - if (buildCommand != null) { - buildCommandText.setText(buildCommand); - } else { - buildCommandText.setText(""); //$NON-NLS-1$ - } + String cmakeArgs = buildConfig.getProperty(CMakeBuildConfiguration.CMAKE_ARGUMENTS); + if (cmakeArgs != null) { + cmakeArgsText.setText(cmakeArgs); + } else { + cmakeArgsText.setText(""); //$NON-NLS-1$ + } - 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 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 buildAttribute = CoreBuildLaunchConfigDelegate - .getBuildAttributeName(getLaunchConfigurationDialog().getMode()); - if (!properties.isEmpty()) { - configuration.setAttribute(buildAttribute, properties); + String cmakeArgs = properties.get(CMakeBuildConfiguration.CMAKE_ARGUMENTS); + if (cmakeArgs != null) { + cmakeArgsText.setText(cmakeArgs); } else { - configuration.removeAttribute(buildAttribute); + 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 cleanCmd = properties.get(CMakeBuildConfiguration.CLEAN_COMMAND); + if (cleanCmd != null) { + cleanCommandText.setText(cleanCmd); + } else { + 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:"); + Label tcLabel = new Label(comp, SWT.NONE); + tcLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false)); + tcLabel.setText(Messages.NewCMakeToolChainFilePage_Toolchain); - 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()); + 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); } @@ -132,17 +107,29 @@ public class QtBuildTab extends CommonBuildTab { } @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()); + public void setDefaults(ILaunchConfigurationWorkingCopy configuration) { + ICBuildConfiguration buildConfig = getBuildConfiguration(); + buildConfig.removeProperty(QtBuildConfiguration.QMAKE_ARGS); + buildConfig.removeProperty(QtBuildConfiguration.BUILD_COMMAND); + } - String mode = getLaunchBarLaunchConfigDialog().getMode(); - configuration.setAttribute(CoreBuildLaunchConfigDelegate.getBuildAttributeName(mode), properties); - } catch (CoreException e) { - Activator.log(e); + @Override + public void performApply(ILaunchConfigurationWorkingCopy configuration) { + 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 buildCmd = buildCmdText.getText().trim(); + if (buildCmd.isEmpty()) { + buildConfig.removeProperty(QtBuildConfiguration.BUILD_COMMAND); + } else { + buildConfig.setProperty(QtBuildConfiguration.BUILD_COMMAND, buildCmd); } }