-
-
Notifications
You must be signed in to change notification settings - Fork 386
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
Compilation fails with spurious "No such file or directory
" error if line number of #include
directives are changed while editor is "dirty"
#2684
Comments
No such file or directory
" error if line number of #include
directives are changed while editor is "dirty"
I could reproduce the bug using the CLI, it's unrelated to the IDE code-base. I used the HEAD (faa6359) of the CLI repo instead of Steps in a terminal: git rev-parse --short HEAD
faa63596 ./arduino-cli version
arduino-cli Version: git-snapshot Commit: faa63596 Date: 2024-08-01T18:39:18Z tree ./my_sketch
./my_sketch
└── my_sketch.ino
1 directory, 1 file cat ./my_sketch/my_sketch.ino
#include <EEPROM.h>
#include <SPI.h>
#include <SoftwareSerial.h>
#include <Wire.h>
void setup() {}
void loop() {} ./arduino-cli daemon
Daemon is now listening on 127.0.0.1:50051
{"IP":"127.0.0.1","Port":"50051"} Open a new terminal: Creategrpcurl \
-plaintext \
-import-path ./rpc \
-proto cc/arduino/cli/commands/v1/commands.proto \
127.0.0.1:50051 \
cc.arduino.cli.commands.v1.ArduinoCoreService.Create {
"instance": {
"id": 1
}
} Initgrpcurl \
-plaintext \
-import-path ./rpc \
-proto cc/arduino/cli/commands/v1/commands.proto \
-d '{"instance": {"id": 1}}' \
127.0.0.1:50051 \
cc.arduino.cli.commands.v1.ArduinoCoreService.Init Compilegrpcurl \
-plaintext \
-import-path ./rpc \
-proto cc/arduino/cli/commands/v1/commands.proto \
-d '{"instance": {"id": 1}, "fqbn": "arduino:avr:uno", "sketchPath": "./my_sketch/my_sketch.ino"}' \
127.0.0.1:50051 \
cc.arduino.cli.commands.v1.ArduinoCoreService.Compile Compile with dirty state (with
|
Describe the problem
An Arduino IDE editor tab can be in one of two states:
Regardless of the state, when a compilation is triggered, it is the code in the editor buffer that must be compiled.
At the start of the sketch compilation process, Arduino CLI performs a "library discovery" procedure, where the preprocessor is run tentatively on the sketch program repeatedly. If preprocessing fails, Arduino CLI parses the text of the error message. If it is a "
No such file or directory
" error from an#include
directive, the header filename is extracted from that directive and the searches installed libraries are searched to find the one that provides that header file. The library is added to the compiler's "search path", then the process repeated until either the preprocessing passes, or else a library can't be discovered for an#include
directive (see the flowchart in the "Additional context" section of the issue if this isn't clear).🐛 Sketch compilation fails if the sketch code staged in the editor buffer differs from the file on disk in a way that causes one
#include
directive to be present in the staged code at the line number of a different#include
directive in the file on disk.To reproduce
A new sketch will open in an Arduino IDE window.
#include
directives.ⓘ The fault will occur with any board. The "Arduino Uno" was picked arbitrarily for the sake of the demonstration.
🙂 The sketch compiles without errors.
❗ Do not save the sketch. It must be in a "dirty" state to reproduce the fault.
🐛 Compilation fails spuriously:
#include
directive forEEPROM.h
is at line 1 in the file on disk, while it is at line 2 in the staged code, which is the position of the#include
directive forSPI.h
in the file on disk.❗ Do not save the sketch. It must be in a "dirty" state to reproduce the fault.
🐛 Compilation fails spuriously:
❗ Do not save the sketch. It must be in a "dirty" state to reproduce the fault.
🐛 Compilation fails spuriously:
🙂 The sketch compiles without errors.
ⓘ Note that the
#include
directive forEEPROM.h
is at line 1 in the file on disk, while it is at line 5 in the staged code, which is the position of thesetup
function definition in the file on disk.Expected behavior
Library discovery always works correctly, even when a sketch is in a "dirty" state.
Arduino IDE version
Original report
arduino/[email protected]
Last verified with
arduino/arduino-ide@aa9b10d
Operating system
Windows
Operating system version
Additional context
The fault does not occur if the sketch is not in a "dirty" state when compiled, whether the non-dirty state is achieved by the IDE's auto save, or by saving manually.
Blank lines were added in the demo for the sake of simplicity, but the fault occurs regardless of what the content of the added line is.
I didn't bisect the regression, but the fault does not occur with Arduino IDE 1.8.19.
Workaround
Select File > Save from the Arduino IDE menus.
Library discovery overview
In case the text description of library discovery provided in the introduction is not clear, this flowchart might make it easier to understand:
Additional reports
Issue checklist
The text was updated successfully, but these errors were encountered: