Skip to content

Bundled libraries of other platforms are discoverable #1740

Closed
@per1234

Description

@per1234

Describe the problem

The Arduino boards platform system supports bundling of libraries. These libraries are typically specific to the platform's architecture, often variants of fundamental libraries which are standardized infrastructure of each plaform (e.g., "SPI", "Wire").

For this reason, these libraries must only be discoverable when compiling for a board of that platform or its core dependents.

🐛 Bundled libraries of all installed platforms are discoverable during compilation for any board.

To reproduce

$ ./arduino-cli version
arduino-cli.exe  Version: git-snapshot Commit: f0245bc2 Date: 2022-05-29T10:31:11Z

$ ./arduino-cli core install arduino:avr arduino:samd
[...]

$ mkdir /tmp/FooSketch

$ echo "#include <SAMD_BootloaderUpdater.h>
> void setup () {}
> void loop () {}
> " > /tmp/FooSketch/FooSketch.ino

$ ./arduino-cli compile --fqbn arduino:avr:uno /tmp/FooSketch/
WARNING: library SAMD_BootloaderUpdater claims to run on samd_beta architecture(s) and may be incompatible with your current board which runs on avr architecture(s).
E:\deleteme\arduino-cli\directories\data\packages\arduino\hardware\samd\1.8.13\libraries\SAMD_BootloaderUpdater\src\SAMD_BootloaderUpdater.cpp:32:4: error: #error "Unsupported board!"
   #error "Unsupported board!"
    ^~~~~
E:\deleteme\arduino-cli\directories\data\packages\arduino\hardware\samd\1.8.13\libraries\SAMD_BootloaderUpdater\src\SAMD_BootloaderUpdater.cpp: In function 'void eraseFlash(uint32_t, int)':
E:\deleteme\arduino-cli\directories\data\packages\arduino\hardware\samd\1.8.13\libraries\SAMD_BootloaderUpdater\src\SAMD_BootloaderUpdater.cpp:47:7: error: 'NVMCTRL' was not declared in this scope
       NVMCTRL->ADDR.reg = ((uint32_t)((uint32_t)address + i)) / 2;
       ^~~~~~~
E:\deleteme\arduino-cli\directories\data\packages\arduino\hardware\samd\1.8.13\libraries\SAMD_BootloaderUpdater\src\SAMD_BootloaderUpdater.cpp:48:28: error: 'NVMCTRL_CTRLA_CMDEX_KEY' was not declared in this scope
       NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_ER;
                            ^~~~~~~~~~~~~~~~~~~~~~~
E:\deleteme\arduino-cli\directories\data\packages\arduino\hardware\samd\1.8.13\libraries\SAMD_BootloaderUpdater\src\SAMD_BootloaderUpdater.cpp:48:54: error: 'NVMCTRL_CTRLA_CMD_ER' was not declared in this scope
       NVMCTRL->CTRLA.reg = NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_ER;
                                                      ^~~~~~~~~~~~~~~~~~~~
E:\deleteme\arduino-cli\directories\data\packages\arduino\hardware\samd\1.8.13\libraries\SAMD_BootloaderUpdater\src\SAMD_BootloaderUpdater.cpp: In function 'void writeFlash(uint32_t, const void*, int)':
E:\deleteme\arduino-cli\directories\data\packages\arduino\hardware\samd\1.8.13\libraries\SAMD_BootloaderUpdater\src\SAMD_BootloaderUpdater.cpp:69:15: error: 'NVMCTRL' was not declared in this scope
       while (!NVMCTRL->INTFLAG.bit.READY);
               ^~~~~~~
E:\deleteme\arduino-cli\directories\data\packages\arduino\hardware\samd\1.8.13\libraries\SAMD_BootloaderUpdater\src\SAMD_BootloaderUpdater.cpp: In member function 'int SAMD_BootloaderUpdaterClass::update(void 
(*)(float))':
E:\deleteme\arduino-cli\directories\data\packages\arduino\hardware\samd\1.8.13\libraries\SAMD_BootloaderUpdater\src\SAMD_BootloaderUpdater.cpp:82:3: error: 'NVMCTRL' was not declared in this scope
   NVMCTRL->CTRLB.bit.MANW = 0;
   ^~~~~~~


Error during build: exit status 1

🐛 The "SAMD_BootloaderUpdater" library of the arduino:samd platform was discovered while compiling for a board of the arduino:avr platform.

Expected behavior

Platform bundled libraries are discoverable only when compiling for a board of that platform or of a platform which references its core.

In the contrived demo above, the compilation was expected to fail, but with a different error:

$ arduino-cli version
arduino-cli.exe  Version: git-snapshot Commit: 7e9e4cac Date: 2022-05-29T10:33:38Z

$ ./arduino-cli compile --fqbn arduino:avr:uno /tmp/FooSketch/
C:\Users\per\AppData\Local\Temp\FooSketch\FooSketch.ino:1:10: fatal error: SAMD_BootloaderUpdater.h: No such file or directory
 #include <SAMD_BootloaderUpdater.h>
          ^~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.


Error during build: exit status 1

Arduino CLI version

f0245bc

Operating system

Windows

Operating system version

10

Additional context

I bisected the bug to f0245bc (it does not occur at the previous commit 7e9e4ca)


The more significant (but less suitable for a simple demo) manifestations of the bug result from compiling a sketch that is valid for the target platform which uses one of the common platform bundled libraries such as "Wire". In this case the bug may manifest, at best, as a compilation error cryptic to the target user, at worst, as a subtle runtime fault or degradation.

Issue checklist

  • I searched for previous reports in the issue tracker
  • I verified the problem still occurs when using the nightly build
  • My report contains all necessary details

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions