diff --git a/src/build/buildTask.ts b/src/build/buildTask.ts index 2916a1e3a..83ae95109 100644 --- a/src/build/buildTask.ts +++ b/src/build/buildTask.ts @@ -148,7 +148,7 @@ export class BuildTask { const sdkconfigFile = await getSDKConfigFilePath(this.currentWorkspace); if (compilerArgs.indexOf("SDKCONFIG") === -1) { - compilerArgs.push(`-DSDKCONFIG=${sdkconfigFile}`); + compilerArgs.push(`-DSDKCONFIG='${sdkconfigFile}'`); } const sdkconfigDefaults = diff --git a/src/espIdf/menuconfig/confServerProcess.ts b/src/espIdf/menuconfig/confServerProcess.ts index b1bca4e7a..0013b0f98 100644 --- a/src/espIdf/menuconfig/confServerProcess.ts +++ b/src/espIdf/menuconfig/confServerProcess.ts @@ -226,7 +226,7 @@ export class ConfserverProcess { (idfConf.readParameter("idf.sdkconfigDefaults") as string[]) || []; if (reconfigureArgs.indexOf("SDKCONFIG") === -1) { - reconfigureArgs.push(`-DSDKCONFIG=${ConfserverProcess.instance.configFile}`) + reconfigureArgs.push(`-DSDKCONFIG='${ConfserverProcess.instance.configFile}'`) } if ( @@ -346,7 +346,7 @@ export class ConfserverProcess { (idfConf.readParameter("idf.sdkconfigDefaults") as string[]) || []; if (confServerArgs.indexOf("SDKCONFIG") === -1) { - confServerArgs.push(`-DSDKCONFIG=${this.configFile}`) + confServerArgs.push(`-DSDKCONFIG='${this.configFile}'`) } if ( diff --git a/src/espIdf/reconfigure/task.ts b/src/espIdf/reconfigure/task.ts index bc54b9ab5..2e3c666d1 100644 --- a/src/espIdf/reconfigure/task.ts +++ b/src/espIdf/reconfigure/task.ts @@ -74,7 +74,7 @@ export class IdfReconfigureTask { const sdkconfigFile = await getSDKConfigFilePath(this.curWorkspace); if (reconfigureArgs.indexOf("SDKCONFIG") === -1) { - reconfigureArgs.push(`-DSDKCONFIG=${sdkconfigFile}`); + reconfigureArgs.push(`-DSDKCONFIG='${sdkconfigFile}'`); } const sdkconfigDefaults = diff --git a/src/project-conf/index.ts b/src/project-conf/index.ts index d5531f51d..79d864edc 100644 --- a/src/project-conf/index.ts +++ b/src/project-conf/index.ts @@ -16,9 +16,10 @@ * limitations under the License. */ -import { ExtensionContext, Uri } from "vscode"; +import * as path from "path"; +import { ExtensionContext, Uri, StatusBarItem } from "vscode"; import { ESP } from "../config"; -import { pathExists, readJson, writeJson } from "fs-extra"; +import { pathExists, readJson, writeJson, ensureDir } from "fs-extra"; import { ProjectConfElement } from "./projectConfiguration"; export class ProjectConfigStore { @@ -58,32 +59,53 @@ export async function getProjectConfigurationElements(workspaceFolder: Uri) { const projectConfElements: { [key: string]: ProjectConfElement } = {}; - Object.keys(projectConfJson).forEach((elem) => { - projectConfElements[elem] = { - build: { - compileArgs: projectConfJson[elem].build?.compileArgs, - ninjaArgs: projectConfJson[elem].build?.ninjaArgs, - buildDirectoryPath: projectConfJson[elem].build?.buildDirectoryPath, - sdkconfigDefaults: projectConfJson[elem].build?.sdkconfigDefaults, - sdkconfigFilePath: projectConfJson[elem].build?.sdkconfigFilePath - }, - env: projectConfJson[elem].env, - flashBaudRate: projectConfJson[elem].flashBaudRate, - monitorBaudRate: projectConfJson[elem].monitorBaudRate, - openOCD: { - debugLevel: projectConfJson[elem].openOCD?.debugLevel, - configs: projectConfJson[elem].openOCD?.configs, - args: projectConfJson[elem].openOCD?.args, - }, - tasks: { - preBuild: projectConfJson[elem].tasks?.preBuild, - preFlash: projectConfJson[elem].tasks?.preFlash, - postBuild: projectConfJson[elem].tasks?.postBuild, - postFlash: projectConfJson[elem].tasks?.postFlash, - }, - } as ProjectConfElement; - }); + await Promise.all( + Object.keys(projectConfJson).map(async (elem) => { + const buildConfig = projectConfJson[elem].build; + let buildDirPath: string; + const userBuildDir = buildConfig?.buildDirectoryPath; + if (userBuildDir) { + buildDirPath = (await resolveConfigPaths( + workspaceFolder, + userBuildDir + )) as string; + } + // Ensure directory is created for the resolved path + if (buildDirPath) { + await ensureDir(buildDirPath); + } + projectConfElements[elem] = { + build: { + compileArgs: buildConfig?.compileArgs, + ninjaArgs: buildConfig?.ninjaArgs, + buildDirectoryPath: buildDirPath, + sdkconfigDefaults: (await resolveConfigPaths( + workspaceFolder, + buildConfig?.sdkconfigDefaults + )) as string[], + sdkconfigFilePath: (await resolveConfigPaths( + workspaceFolder, + buildConfig?.sdkconfigFilePath + )) as string, + }, + env: projectConfJson[elem].env, + flashBaudRate: projectConfJson[elem].flashBaudRate, + monitorBaudRate: projectConfJson[elem].monitorBaudRate, + openOCD: { + debugLevel: projectConfJson[elem].openOCD?.debugLevel, + configs: projectConfJson[elem].openOCD?.configs, + args: projectConfJson[elem].openOCD?.args, + }, + tasks: { + preBuild: projectConfJson[elem].tasks?.preBuild, + preFlash: projectConfJson[elem].tasks?.preFlash, + postBuild: projectConfJson[elem].tasks?.postBuild, + postFlash: projectConfJson[elem].tasks?.postFlash, + }, + } as ProjectConfElement; + }) + ); return projectConfElements; } @@ -99,3 +121,30 @@ export async function saveProjectConfFile( spaces: 2, }); } + +/** + * Resolves config paths to absolute paths if relative, preserves if already absolute. + * Handles both single path string or array of paths. + */ +async function resolveConfigPaths( + workspaceFolder: Uri, + paths?: string | string[] +): Promise { + if (!paths) return undefined; + + if (Array.isArray(paths)) { + return Promise.all( + paths.map(async (configPath) => { + if (path.isAbsolute(configPath)) { + return configPath; + } + return Uri.joinPath(workspaceFolder, configPath).fsPath; + }) + ); + } + + if (path.isAbsolute(paths)) { + return paths; + } + return Uri.joinPath(workspaceFolder, paths).fsPath; +} diff --git a/src/statusBar/index.ts b/src/statusBar/index.ts index eaa37ee8e..230b7d524 100644 --- a/src/statusBar/index.ts +++ b/src/statusBar/index.ts @@ -16,6 +16,7 @@ * limitations under the License. */ +import * as path from "path"; import { env, StatusBarAlignment, @@ -31,6 +32,7 @@ import { ESP } from "../config"; import { CommandItem } from "../cmdTreeView/cmdTreeDataProvider"; import { CommandKeys, createCommandDictionary } from "../cmdTreeView/cmdStore"; import { getIdfTargetFromSdkconfig } from "../workspaceConfig"; +import { pathExists } from "fs-extra"; export const statusBarItems: { [key: string]: StatusBarItem } = {}; @@ -61,6 +63,12 @@ export async function createCmdsStatusBarItems(workspaceFolder: Uri) { let projectConf = ESP.ProjectConfiguration.store.get( ESP.ProjectConfiguration.SELECTED_CONFIG ); + let projectConfPath = path.join( + workspaceFolder.fsPath, + ESP.ProjectConfiguration.PROJECT_CONFIGURATION_FILENAME + ); + let projectConfExists = await pathExists(projectConfPath); + let currentIdfVersion = await getCurrentIdfSetup(workspaceFolder, false); statusBarItems["workspace"] = createStatusBarItem( @@ -101,16 +109,31 @@ export async function createCmdsStatusBarItems(workspaceFolder: Uri) { ); } - if (projectConf) { - statusBarItems["projectConf"] = createStatusBarItem( - `$(${ - commandDictionary[CommandKeys.SelectProjectConfiguration].iconId - }) ${projectConf}`, - commandDictionary[CommandKeys.SelectProjectConfiguration].tooltip, - CommandKeys.SelectProjectConfiguration, - 99, - commandDictionary[CommandKeys.SelectProjectConfiguration].checkboxState - ); + if (projectConfExists) { + if (!projectConf) { + let statusBarItemName = "Invalid Path"; + let statusBarItemTooltip = + "Invalid configuration path. Click to modify project configuration"; + statusBarItems["projectConf"] = createStatusBarItem( + `$(${ + commandDictionary[CommandKeys.SelectProjectConfiguration].iconId + }) ${statusBarItemName}`, + statusBarItemTooltip, + "espIdf.projectConfigurationEditor", + 99, + commandDictionary[CommandKeys.SelectProjectConfiguration].checkboxState + ); + } else { + statusBarItems["projectConf"] = createStatusBarItem( + `$(${ + commandDictionary[CommandKeys.SelectProjectConfiguration].iconId + }) ${projectConf}`, + commandDictionary[CommandKeys.SelectProjectConfiguration].tooltip, + CommandKeys.SelectProjectConfiguration, + 99, + commandDictionary[CommandKeys.SelectProjectConfiguration].checkboxState + ); + } } statusBarItems["target"] = createStatusBarItem(