diff --git a/package.json b/package.json index cc2df0c26..0c03082c1 100644 --- a/package.json +++ b/package.json @@ -3841,6 +3841,12 @@ "default": false, "description": "%cmake-tools.configuration.cmake.useFolderPropertyInBuildTargetDropdown.description%", "scope": "resource" + }, + "cmake.setBuildTargetSameAsLaunchTarget": { + "type": "boolean", + "default": false, + "description": "%cmake-tools.configuration.cmake.setBuildTargetSameAsLaunchTarget.description%", + "scope": "resource" } } }, diff --git a/package.nls.json b/package.nls.json index db23b311c..9ba3b4b16 100644 --- a/package.nls.json +++ b/package.nls.json @@ -332,6 +332,7 @@ "cmake-tools.configuration.cmake.postRunCoverageTarget.description": "Target to build after running tests with coverage using the test explorer", "cmake-tools.configuration.cmake.coverageInfoFiles.description": "LCOV coverage info files to be processed after running tests with coverage using the test explorer.", "cmake-tools.configuration.cmake.useFolderPropertyInBuildTargetDropdown.description": "Controls if the default build target dropdown is grouped by the CMake folder groups.", + "cmake-tools.configuration.cmake.setBuildTargetSameAsLaunchTarget.description": "When the launch target is set, the build target is set to match it.", "cmake-tools.debugger.pipeName.description": "Name of the pipe (on Windows) or domain socket (on Unix) to use for debugger communication.", "cmake-tools.debugger.clean.description": "Clean prior to configuring.", "cmake-tools.debugger.configureAll.description": "Configure for all projects.", diff --git a/src/cmakeProject.ts b/src/cmakeProject.ts index afea14ba4..979306b79 100644 --- a/src/cmakeProject.ts +++ b/src/cmakeProject.ts @@ -2582,8 +2582,7 @@ export class CMakeProject { return null; } if (executableTargets.length === 1) { const target = executableTargets[0]; - await this.workspaceContext.state.setLaunchTargetName(this.folderName, target.name, this.isMultiProjectFolder); - this._launchTargetName.set(target.name); + await this.setLaunchTargetName(target.name); return target.path; } @@ -2601,11 +2600,18 @@ export class CMakeProject { if (!chosen) { return null; } - await this.workspaceContext.state.setLaunchTargetName(this.folderName, chosen.label, this.isMultiProjectFolder); - this._launchTargetName.set(chosen.label); + await this.setLaunchTargetName(chosen.label); return chosen.detail; } + private async setLaunchTargetName(name: string) { + await this.workspaceContext.state.setLaunchTargetName(this.folderName, name, this.isMultiProjectFolder); + if (this.workspaceContext.config.setBuildTargetSameAsLaunchTarget) { + await this.setDefaultBuildTarget(name); + } + this._launchTargetName.set(name); + } + async getCurrentLaunchTarget(): Promise { const targetName = this.workspaceContext.state.getLaunchTargetName(this.folderName, this.isMultiProjectFolder); const target = (await this.executableTargets).find(e => e.name === targetName); diff --git a/src/config.ts b/src/config.ts index 25156035c..7b1421db9 100644 --- a/src/config.ts +++ b/src/config.ts @@ -234,6 +234,7 @@ export interface ExtensionConfigurationSettings { postRunCoverageTarget: string | null; coverageInfoFiles: string[]; useFolderPropertyInBuildTargetDropdown: boolean; + setBuildTargetSameAsLaunchTarget: boolean; } type EmittersOf = { @@ -615,6 +616,10 @@ export class ConfigurationReader implements vscode.Disposable { return this.configData.useFolderPropertyInBuildTargetDropdown; } + get setBuildTargetSameAsLaunchTarget(): boolean { + return this.configData.setBuildTargetSameAsLaunchTarget; + } + private readonly emitters: EmittersOf = { autoSelectActiveFolder: new vscode.EventEmitter(), defaultActiveFolder: new vscode.EventEmitter(), @@ -685,7 +690,8 @@ export class ConfigurationReader implements vscode.Disposable { preRunCoverageTarget: new vscode.EventEmitter(), postRunCoverageTarget: new vscode.EventEmitter(), coverageInfoFiles: new vscode.EventEmitter(), - useFolderPropertyInBuildTargetDropdown: new vscode.EventEmitter() + useFolderPropertyInBuildTargetDropdown: new vscode.EventEmitter(), + setBuildTargetSameAsLaunchTarget: new vscode.EventEmitter(), }; /** diff --git a/test/unit-tests/config.test.ts b/test/unit-tests/config.test.ts index b32538874..f449f5d88 100644 --- a/test/unit-tests/config.test.ts +++ b/test/unit-tests/config.test.ts @@ -85,7 +85,8 @@ function createConfig(conf: Partial): Configurat preRunCoverageTarget: null, postRunCoverageTarget: null, coverageInfoFiles: [], - useFolderPropertyInBuildTargetDropdown: true + useFolderPropertyInBuildTargetDropdown: true, + setBuildTargetSameAsLaunchTarget: false, }); ret.updatePartial(conf); return ret;