From ca44d8b0cdd0399fbac035f7f5bd1d33d3357440 Mon Sep 17 00:00:00 2001 From: Nikita Karatun Date: Tue, 15 Jul 2025 00:04:25 +0200 Subject: [PATCH] Set Build Target Same As Launch Target feature --- package.json | 6 ++++++ package.nls.json | 1 + src/cmakeProject.ts | 14 ++++++++++---- src/config.ts | 8 +++++++- test/unit-tests/config.test.ts | 3 ++- 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 3844b4531e..fc1bfe205e 100644 --- a/package.json +++ b/package.json @@ -3684,6 +3684,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 09b3e8451f..32e9eee0d0 100644 --- a/package.nls.json +++ b/package.nls.json @@ -308,6 +308,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 8fb5b8c92b..7c503d8c6a 100644 --- a/src/cmakeProject.ts +++ b/src/cmakeProject.ts @@ -2565,8 +2565,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; } @@ -2584,11 +2583,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 1048da7e9d..cef055ec6e 100644 --- a/src/config.ts +++ b/src/config.ts @@ -223,6 +223,7 @@ export interface ExtensionConfigurationSettings { postRunCoverageTarget: string | null; coverageInfoFiles: string[]; useFolderPropertyInBuildTargetDropdown: boolean; + setBuildTargetSameAsLaunchTarget: boolean; } type EmittersOf = { @@ -601,6 +602,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(), @@ -671,7 +676,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 1f857eb291..8b1bc096c7 100644 --- a/test/unit-tests/config.test.ts +++ b/test/unit-tests/config.test.ts @@ -84,7 +84,8 @@ function createConfig(conf: Partial): Configurat preRunCoverageTarget: null, postRunCoverageTarget: null, coverageInfoFiles: [], - useFolderPropertyInBuildTargetDropdown: true + useFolderPropertyInBuildTargetDropdown: true, + setBuildTargetSameAsLaunchTarget: false, }); ret.updatePartial(conf); return ret;