diff --git a/src/cpptools.ts b/src/cpptools.ts index 7c8911e75..06246df78 100644 --- a/src/cpptools.ts +++ b/src/cpptools.ts @@ -431,6 +431,11 @@ export class CppConfigurationProvider implements cpt.CustomConfigurationProvider throw new MissingCompilerException(); } + const buildType = opts.cache.get('CMAKE_BUILD_TYPE'); + if (buildType) { + opts.activeBuildTypeVariant = buildType.as(); + } + const targetFromToolchains = comp_toolchains?.target; const targetArchFromToolchains = targetFromToolchains ? parseTargetArch(targetFromToolchains) : undefined; diff --git a/src/drivers/codemodel-driver-interface.ts b/src/drivers/codemodel-driver-interface.ts index 0fe0ba76b..3bf360be1 100644 --- a/src/drivers/codemodel-driver-interface.ts +++ b/src/drivers/codemodel-driver-interface.ts @@ -132,7 +132,7 @@ export interface CodeModelContent { */ activeTarget: string|null; /** - * The active build_type variant + * CMAKE_BUILD_TYPE for single config generators, and build config for multi config ones. */ activeBuildTypeVariant: string|null; /** diff --git a/src/drivers/driver.ts b/src/drivers/driver.ts index 64eaa0e70..ff9becbe9 100644 --- a/src/drivers/driver.ts +++ b/src/drivers/driver.ts @@ -684,6 +684,9 @@ export abstract class CMakeDriver implements vscode.Disposable { */ get currentBuildType(): string { if (this.useCMakePresets) { + if ((this.isMultiConfig || this.isMultiConfFast) && this._buildPreset?.configuration) { + return this._buildPreset.configuration; + } const buildType = this._configurePreset?.cacheVariables?.['CMAKE_BUILD_TYPE']; if (util.isString(buildType)) { return buildType; @@ -696,8 +699,12 @@ export abstract class CMakeDriver implements vscode.Disposable { } } - get isMultiConf(): boolean { - return this.generatorName ? util.isMultiConfGenerator(this.generatorName) : false; + private _isMultiConfig: boolean = false; + get isMultiConfig(): boolean { return this._isMultiConfig; } + set isMultiConfig(v: boolean) { this._isMultiConfig = v; } + + get isMultiConfFast(): boolean { + return this.generatorName ? util.isMultiConfGeneratorFast(this.generatorName) : false; } /** @@ -1229,7 +1236,7 @@ export abstract class CMakeDriver implements vscode.Disposable { telemetryProperties = { CMakeExecutableVersion: cmakeVersion ? util.versionToString(cmakeVersion) : '', CMakeGenerator: this.generatorName || '', - ConfigType: this.isMultiConf ? 'MultiConf' : this.currentBuildType || '', + ConfigType: this.isMultiConfFast ? 'MultiConf' : this.currentBuildType || '', Toolchain: this._kit?.toolchainFile ? 'true' : 'false', // UseToolchain? Trigger: trigger }; @@ -1354,7 +1361,7 @@ export abstract class CMakeDriver implements vscode.Disposable { const allowBuildTypeOnMultiConfig = config.get("cmake.setBuildTypeOnMultiConfig") || false; - if (!this.isMultiConf || (this.isMultiConf && allowBuildTypeOnMultiConfig)) { + if (!this.isMultiConfFast || (this.isMultiConfFast && allowBuildTypeOnMultiConfig)) { // Mutliconf generators do not need the CMAKE_BUILD_TYPE property settingMap.CMAKE_BUILD_TYPE = util.cmakeify(this.currentBuildType); } @@ -1416,7 +1423,7 @@ export abstract class CMakeDriver implements vscode.Disposable { const child = await this._doCMakeBuild(target, consumer); const timeEnd: number = new Date().getTime(); const telemetryProperties: telemetry.Properties | undefined = this.useCMakePresets ? undefined : { - ConfigType: this.isMultiConf ? 'MultiConf' : this.currentBuildType || '' + ConfigType: this.isMultiConfFast ? 'MultiConf' : this.currentBuildType || '' }; const telemetryMeasures: telemetry.Measures = { Duration: timeEnd - timeStart diff --git a/src/extension.ts b/src/extension.ts index 13c205bf7..62b22a696 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -127,6 +127,7 @@ class ExtensionManager implements vscode.Disposable { subs.push(new_cmt.onCodeModelChanged(FireLate, () => this._updateCodeModel(cmtFolder))); subs.push(new_cmt.onTargetNameChanged(FireLate, () => this._updateCodeModel(cmtFolder))); subs.push(new_cmt.onLaunchTargetNameChanged(FireLate, () => this._updateCodeModel(cmtFolder))); + subs.push(new_cmt.onActiveBuildPresetChanged(FireLate, () => this._updateCodeModel(cmtFolder))); this._codeModelUpdateSubs.set(new_cmt.folder.uri.fsPath, subs); } rollbar.takePromise('Post-folder-open', {folder: cmtFolder.folder}, this._postWorkspaceOpen(cmtFolder)); @@ -209,7 +210,8 @@ class ExtensionManager implements vscode.Disposable { this._codeModelUpdateSubs.set(cmtFolder.folder.uri.fsPath, [ cmtFolder.cmakeTools.onCodeModelChanged(FireLate, () => this._updateCodeModel(cmtFolder)), cmtFolder.cmakeTools.onTargetNameChanged(FireLate, () => this._updateCodeModel(cmtFolder)), - cmtFolder.cmakeTools.onLaunchTargetNameChanged(FireLate, () => this._updateCodeModel(cmtFolder)) + cmtFolder.cmakeTools.onLaunchTargetNameChanged(FireLate, () => this._updateCodeModel(cmtFolder)), + cmtFolder.cmakeTools.onActiveBuildPresetChanged(FireLate, () => this._updateCodeModel(cmtFolder)) ]); rollbar.takePromise('Post-folder-open', {folder: cmtFolder.folder}, this._postWorkspaceOpen(cmtFolder)); } @@ -734,15 +736,20 @@ class ExtensionManager implements vscode.Disposable { } } + const isMultiConfig = !!cache.get('CMAKE_CONFIGURATION_TYPES'); + if (drv) { + drv.isMultiConfig = isMultiConfig; + } + const actualBuildType = isMultiConfig && cmt.useCMakePresets ? cmt.buildPreset?.configuration || null : cmt.activeVariant; const clCompilerPath = await findCLCompilerPath(env); this._configProvider.cpptoolsVersion = cpptools.getVersion(); let codeModelContent; if (cmt.codeModelContent) { codeModelContent = cmt.codeModelContent; - this._configProvider.updateConfigurationData({ cache, codeModelContent, clCompilerPath, activeTarget: cmt.defaultBuildTarget, activeBuildTypeVariant: cmt.activeVariant, folder: cmt.folder.uri.fsPath }); + this._configProvider.updateConfigurationData({ cache, codeModelContent, clCompilerPath, activeTarget: cmt.defaultBuildTarget, activeBuildTypeVariant: actualBuildType, folder: cmt.folder.uri.fsPath }); } else if (drv && drv.codeModelContent) { codeModelContent = drv.codeModelContent; - this._configProvider.updateConfigurationData({ cache, codeModelContent, clCompilerPath, activeTarget: cmt.defaultBuildTarget, activeBuildTypeVariant: cmt.activeVariant, folder: cmt.folder.uri.fsPath }); + this._configProvider.updateConfigurationData({ cache, codeModelContent, clCompilerPath, activeTarget: cmt.defaultBuildTarget, activeBuildTypeVariant: actualBuildType, folder: cmt.folder.uri.fsPath }); this._projectOutlineProvider.updateCodeModel( cmt.workspaceContext.folder, codeModelContent, diff --git a/src/util.ts b/src/util.ts index cc12c245c..42cac4e71 100644 --- a/src/util.ts +++ b/src/util.ts @@ -314,8 +314,11 @@ export function splitCommandLine(cmd: string): string[] { return quoted_args!.map(arg => arg.replace(/\\(")/g, '$1').replace(/^"(.*)"$/g, '$1')); } -export function isMultiConfGenerator(gen: string): boolean { - return gen.includes('Visual Studio') || gen.includes('Xcode'); +/** + * This is an initial check without atually configuring. It may or may not be accurate. + */ +export function isMultiConfGeneratorFast(gen: string): boolean { + return gen.includes('Visual Studio') || gen.includes('Xcode') || gen.includes('Multi-Config'); } export class InvalidVersionString extends Error {}