Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[VSC-1573] ensure build directories exist and resolve relative paths #1417

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/build/buildTask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down
4 changes: 2 additions & 2 deletions src/espIdf/menuconfig/confServerProcess.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -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 (
Expand Down
2 changes: 1 addition & 1 deletion src/espIdf/reconfigure/task.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 =
Expand Down
101 changes: 74 additions & 27 deletions src/project-conf/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Await is not needed if function is not asynchronous

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;
}

Expand All @@ -99,3 +121,28 @@ 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.
*/
function resolveConfigPaths(
workspaceFolder: Uri,
paths?: string | string[]
): string | string[] {
if (!paths) return undefined;

if (Array.isArray(paths)) {
return paths.map((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;
}
43 changes: 33 additions & 10 deletions src/statusBar/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
* limitations under the License.
*/

import * as path from "path";
import {
env,
StatusBarAlignment,
Expand All @@ -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 } = {};

Expand Down Expand Up @@ -61,6 +63,12 @@ export async function createCmdsStatusBarItems(workspaceFolder: Uri) {
let projectConf = ESP.ProjectConfiguration.store.get<string>(
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(
Expand Down Expand Up @@ -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) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

projectConf doesn't mean is an error. Means the user has not selected a profile at the moment. Even if ESP.ProjectConfiguration.PROJECT_CONFIGURATION_FILENAME exists.

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(
Expand Down
Loading