Open Curvedair2024 opened 4 months ago
I could reproduce the bug using the CLI, it's unrelated to the IDE code-base.
I used the HEAD (https://github.com/arduino/arduino-cli/commit/faa635960f7b8e2d5a15401dfd080bc17796025e) of the CLI repo instead of 0.36.0-rc.1
. It may be clear to the maintainers, but I did not see this mentioned in the bug report or an existing CLI issue.
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:
grpcurl \
-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
}
}
grpcurl \
-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
grpcurl \
-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
sourceOverride
but original content)grpcurl \
-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", "sourceOverride": {"my_sketch.ino": "#include <EEPROM.h>\n#include <SPI.h>\n#include <SoftwareSerial.h>\n#include <Wire.h>\nvoid setup() {}\nvoid loop() {}\n"}}' \
127.0.0.1:50051 \
cc.arduino.cli.commands.v1.ArduinoCoreService.Compile
β compile_output__source_override_original.txt
sourceOverride
start with a new line)grpcurl \
-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", "sourceOverride": {"my_sketch.ino": "\n#include <EEPROM.h>\n#include <SPI.h>\n#include <SoftwareSerial.h>\n#include <Wire.h>\nvoid setup() {}\nvoid loop() {}\n"}}' \
127.0.0.1:50051 \
cc.arduino.cli.commands.v1.ArduinoCoreService.Compile
β compile_output__source_override_edit1.txt
{
"errStream": "L1VzZXJzL2Frb3Mua2l0dGEvRGVza3RvcC9kZXYvYXJkdWluby1jbGkvbXlfc2tldGNoL215X3NrZXRjaC5pbm86MjoxMDogZmF0YWwgZXJyb3I6IEVFUFJPTS5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CiAjaW5jbHVkZSA8U1BJLmg+CiAgICAgICAgICBefn5+fn5+ICAgCmNvbXBpbGF0aW9uIHRlcm1pbmF0ZWQuCg=="
}
Decoded error message:
/Users/akos.kitta/Desktop/dev/arduino-cli/my_sketch/my_sketch.ino:2:10: fatal error: EEPROM.h: No such file or directory
#include <SPI.h>
^~~~~~~
compilation terminated.
sourceOverride
start with two new lines)grpcurl \
-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", "sourceOverride": {"my_sketch.ino": "\n\n#include <EEPROM.h>\n#include <SPI.h>\n#include <SoftwareSerial.h>\n#include <Wire.h>\nvoid setup() {}\nvoid loop() {}\n"}}' \
127.0.0.1:50051 \
cc.arduino.cli.commands.v1.ArduinoCoreService.Compile
β compile_output__source_override_edit2.txt
{
"errStream": "L1VzZXJzL2Frb3Mua2l0dGEvRGVza3RvcC9kZXYvYXJkdWluby1jbGkvbXlfc2tldGNoL215X3NrZXRjaC5pbm86MzoxMDogZmF0YWwgZXJyb3I6IEVFUFJPTS5oOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CiAjaW5jbHVkZSA8U29mdHdhcmVTZXJpYWwuaD4KICAgICAgICAgIF5+fn5+fn5+fn4KY29tcGlsYXRpb24gdGVybWluYXRlZC4K"
}
Decoded error message:
/Users/akos.kitta/Desktop/dev/arduino-cli/my_sketch/my_sketch.ino:3:10: fatal error: EEPROM.h: No such file or directory
#include <SoftwareSerial.h>
^~~~~~~~~~
compilation terminated.
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
β The fault will occur with any sketch that contains multiple consecutive
#include
directives.β Note that the
#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.#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/arduino-ide@2.0.0-rc9.2
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