Make launchMode a core thing and add Debug for CMake configs.

Change-Id: Ie431824dddda07cd6985e5b644970eb525280577
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 c7ea5cd..1b7fec9 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
@@ -60,12 +60,12 @@
 	}
 
 	public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) {
-		this(config, name, toolChain, null);
+		this(config, name, toolChain, null, "run"); //$NON-NLS-1$
 	}
 
 	public CMakeBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain,
-			ICMakeToolChainFile toolChainFile) {
-		super(config, name, toolChain);
+			ICMakeToolChainFile toolChainFile, String launchMode) {
+		super(config, name, toolChain, launchMode);
 		this.toolChainFile = toolChainFile;
 
 		if (toolChainFile != null) {
@@ -120,6 +120,13 @@
 					command.add("-DCMAKE_TOOLCHAIN_FILE=" + toolChainFile.getPath().toString()); //$NON-NLS-1$
 				}
 
+				switch (getLaunchMode()) {
+				// TODO what to do with other modes
+				case "debug": //$NON-NLS-1$
+					command.add("-DCMAKE_BUILD_TYPE=Debug"); //$NON-NLS-1$
+					break;
+				}
+
 				command.add("-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"); //$NON-NLS-1$
 				command.add(new File(project.getLocationURI()).getAbsolutePath());
 
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 6478a62..4fe7a6d 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
@@ -29,7 +29,6 @@
 	public static final String ID = "org.eclipse.cdt.cmake.core.provider"; //$NON-NLS-1$
 
 	private ICMakeToolChainManager manager = Activator.getService(ICMakeToolChainManager.class);
-	private IToolChainManager tcManager = Activator.getService(IToolChainManager.class);
 	private ICBuildConfigurationManager configManager = Activator.getService(ICBuildConfigurationManager.class);
 
 	@Override
@@ -79,7 +78,8 @@
 			ICBuildConfiguration cconfig = config.getAdapter(ICBuildConfiguration.class);
 			if (cconfig != null) {
 				CMakeBuildConfiguration cmakeConfig = cconfig.getAdapter(CMakeBuildConfiguration.class);
-				if (cmakeConfig != null && cmakeConfig.getToolChain().equals(toolChain)) {
+				if (cmakeConfig != null && cmakeConfig.getToolChain().equals(toolChain)
+						&& launchMode.equals(cmakeConfig.getLaunchMode())) {
 					return cconfig;
 				}
 			}
@@ -104,7 +104,8 @@
 		// create config
 		String configName = "cmake." + launchMode + '.' + toolChain.getId(); //$NON-NLS-1$
 		IBuildConfiguration config = configManager.createBuildConfiguration(this, project, configName, monitor);
-		CMakeBuildConfiguration cmakeConfig = new CMakeBuildConfiguration(config, configName, toolChain, file);
+		CMakeBuildConfiguration cmakeConfig = new CMakeBuildConfiguration(config, configName, toolChain, file,
+				launchMode);
 		configManager.addBuildConfiguration(config, cmakeConfig);
 		return cmakeConfig;
 	}
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 53adab3..ff4d69a 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
@@ -92,12 +92,14 @@
 	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<String> DEFAULT_COMMAND = new ArrayList<>(0);
 
 	private final String name;
 	private final IBuildConfiguration config;
 	private final IToolChain toolChain;
+	private String launchMode;
 
 	private final Map<IResource, List<IScannerInfoChangeListener>> scannerInfoListeners = new HashMap<>();
 	private ScannerInfoCache scannerInfoCache;
@@ -127,12 +129,23 @@
 			}
 		}
 		toolChain = tc;
+
+		launchMode = settings.get(LAUNCH_MODE, null); // $NON-NLS-1$
 	}
 
 	protected CBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain) {
+		this(config, name, toolChain, "run"); //$NON-NLS-1$
+	}
+
+	/**
+	 * @since 6.2
+	 */
+	protected CBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain,
+			String launchMode) {
 		this.config = config;
 		this.name = name;
 		this.toolChain = toolChain;
+		this.launchMode = launchMode;
 
 		Preferences settings = getSettings();
 		settings.put(TOOLCHAIN_TYPE, toolChain.getProvider().getId());
@@ -158,6 +171,27 @@
 		return name;
 	}
 
+	/**
+	 * @since 6.2
+	 */
+	public String getLaunchMode() {
+		return launchMode;
+	}
+
+	/**
+	 * @since 6.2
+	 */
+	protected void setLaunchMode(String launchMode) {
+		this.launchMode = launchMode;
+		Preferences settings = getSettings();
+		settings.put(LAUNCH_MODE, launchMode);
+		try {
+			settings.flush();
+		} catch (BackingStoreException e) {
+			CCorePlugin.log(e);
+		}
+	}
+
 	public IProject getProject() {
 		return config.getProject();
 	}
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 d2bd857..3236ea2 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
@@ -57,7 +57,6 @@
 	private static final String QTINSTALL_SPEC = "cdt.qt.install.spec"; //$NON-NLS-1$
 	private static final String LAUNCH_MODE = "cdt.qt.launchMode"; //$NON-NLS-1$
 
-	private final String launchMode;
 	private final String qtInstallSpec;
 	private IQtInstall qtInstall;
 	private Map<String, String> properties;
@@ -89,15 +88,23 @@
 					Activator.error(String.format("Qt Install for build configuration %s not found.", name)));
 		}
 
-		launchMode = settings.get(LAUNCH_MODE, null); // $NON-NLS-1$
+		String oldLaunchMode = settings.get(LAUNCH_MODE, null);
+		if (oldLaunchMode != null) {
+			setLaunchMode(oldLaunchMode);
+			settings.remove(LAUNCH_MODE);
+			try {
+				settings.flush();
+			} catch (BackingStoreException e) {
+				Activator.log(e);
+			}
+		}
 	}
 
 	QtBuildConfiguration(IBuildConfiguration config, String name, IToolChain toolChain, IQtInstall qtInstall,
 			String launchMode) throws CoreException {
-		super(config, name, toolChain);
+		super(config, name, toolChain, launchMode);
 		this.qtInstall = qtInstall;
 		this.qtInstallSpec = qtInstall.getSpec();
-		this.launchMode = launchMode;
 
 		IQtInstallManager manager = Activator.getService(IQtInstallManager.class);
 		manager.addListener(this);
@@ -136,17 +143,13 @@
 	}
 
 	@Override
-	public String getLaunchMode() {
-		return launchMode;
-	}
-
-	@Override
 	public Path getQmakeCommand() {
 		return getQtInstall().getQmakePath();
 	}
 
 	@Override
 	public String[] getQmakeConfig() {
+		String launchMode = getLaunchMode();
 		if (launchMode != null) {
 			switch (launchMode) {
 			case "run": //$NON-NLS-1$
@@ -185,7 +188,7 @@
 		case Platform.OS_WIN32:
 			return getBuildDirectory().resolve(projectName + ".exe"); //$NON-NLS-1$
 		case Platform.OS_LINUX:
-			return getBuildDirectory().resolve(projectName); //$NON-NLS-1$
+			return getBuildDirectory().resolve(projectName);
 		default:
 			Path releaseFolder = getBuildDirectory().resolve("release"); //$NON-NLS-1$
 			return releaseFolder.resolve(projectName);
@@ -344,7 +347,8 @@
 			try (ErrorParserManager epm = new ErrorParserManager(project, getBuildDirectoryURI(), this,
 					getToolChain().getErrorParserIds())) {
 				// run make
-				ProcessBuilder processBuilder = new ProcessBuilder(makeCommand.toString(), "all").directory(buildDir.toFile());
+				ProcessBuilder processBuilder = new ProcessBuilder(makeCommand.toString(), "all") //$NON-NLS-1$
+						.directory(buildDir.toFile());
 				setBuildEnvironment(processBuilder.environment());
 				Process process = processBuilder.start();
 				outStream.write(makeCommand.toString() + '\n');