diff --git a/src/arduino/arduino.ts b/src/arduino/arduino.ts index 3de74779..267b3e9f 100644 --- a/src/arduino/arduino.ts +++ b/src/arduino/arduino.ts @@ -675,11 +675,17 @@ export class ArduinoApp { if (buildDir || dc.output) { // 2020-02-29, EW: This whole code appears a bit wonky to me. // What if the user specifies an output directory "../builds/my project" - buildDir = path.resolve(ArduinoWorkspace.rootPath, buildDir || dc.output); + + // the first choice of the path should be from the users explicit settings. + if (dc.output) { + buildDir = path.resolve(ArduinoWorkspace.rootPath, dc.output); + } else { + buildDir = path.resolve(ArduinoWorkspace.rootPath, buildDir); + } + const dirPath = path.dirname(buildDir); if (!util.directoryExistsSync(dirPath)) { - logger.notifyUserError("InvalidOutPutPath", new Error(constants.messages.INVALID_OUTPUT_PATH + buildDir)); - return false; + util.mkdirRecursivelySync(dirPath); } if (this.useArduinoCli()) { diff --git a/src/common/constants.ts b/src/common/constants.ts index be524359..c8a7de10 100644 --- a/src/common/constants.ts +++ b/src/common/constants.ts @@ -36,7 +36,6 @@ export const messages = { SERIAL_PORT_NOT_STARTED: "Serial Monitor has not been started.", SEND_BEFORE_OPEN_SERIALPORT: "Please open a serial port first.", NO_PROGRAMMMER_SELECTED: "Please select the programmer first.", - INVALID_OUTPUT_PATH: "Please check the \"output\" in the sketch Settings.Cannot find the output path:", }; export const statusBarPriority = { diff --git a/src/debug/configurationProvider.ts b/src/debug/configurationProvider.ts index 2e69dee5..fa0cd2cd 100644 --- a/src/debug/configurationProvider.ts +++ b/src/debug/configurationProvider.ts @@ -118,9 +118,15 @@ export class ArduinoDebugConfigurationProvider implements vscode.DebugConfigurat const dc = DeviceContext.getInstance(); if (!config.program || config.program === "${file}") { - // make a unique temp folder because keeping same temp folder will corrupt the build when board is changed - const outputFolder = path.join(dc.output || `.build`, ArduinoContext.boardManager.currentBoard.board); - util.mkdirRecursivelySync(path.join(ArduinoWorkspace.rootPath, outputFolder)); + const outputFolder = path.join(dc.output || `.build`); + const outputPath = path.join(ArduinoWorkspace.rootPath, outputFolder); + + // if the directory was already there, clear the folder so that it's not corrupted from previous builds. + if (util.directoryExistsSync(outputPath)) { + util.rmdirRecursivelySync(outputPath); + } + + util.mkdirRecursivelySync(outputPath); if (!dc.sketch || !util.fileExistsSync(path.join(ArduinoWorkspace.rootPath, dc.sketch))) { await dc.resolveMainSketch(); } @@ -134,7 +140,7 @@ export class ArduinoDebugConfigurationProvider implements vscode.DebugConfigurat vscode.window.showErrorMessage(`Cannot find ${dc.sketch}, Please specify the sketch in the arduino.json file`); return false; } - config.program = path.join(ArduinoWorkspace.rootPath, outputFolder, `${path.basename(dc.sketch)}.elf`); + config.program = path.join(outputPath, `${path.basename(dc.sketch)}.elf`); // always compile elf to make sure debug the right elf if (!await ArduinoContext.arduinoApp.build(BuildMode.Verify, outputFolder)) {