I'm attempting to build and test a rust application targeted at the Arduino Uno.
This exercise is documented here.
I'll use the mseg-lib crate as an example of this error, but it occurs with all three crates...
CODE
mseg-lib $ tree -a
.
├── .cargo
│ └── config.toml
├── Cargo.lock
├── Cargo.toml
└── src
└── lib.rs
Files (mseg-lib):
$ cat .cargo/config.toml
[build]
target = "../avr-atmega328p.json"
[profile.dev]
panic = "abort"
[profile.release]
panic = "abort"
[unstable]
build-std = ["core"]
$ cat Cargo.toml
[package]
name = "mseg-lib"
version = "0.1.0"
authors = ["ToddG <pub+github@zwrob.com>"]
edition = "2018"
[dependencies]
panic-halt = "0.2.0"
arduino-uno = { git = "https://github.com/Rahix/avr-hal" }
$ cat src/lib.rs
#![no_std]
extern crate panic_halt;
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}
pub mod foo{
pub fn return_bar() -> &'static str{
"bar"
}
}
REPRO
clean and build targets work as expected:
$ cargo clean
mseg-lib $ cargo build
Compiling compiler_builtins v0.1.35
Compiling core v0.0.0 (/home/todd/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core)
Compiling proc-macro2 v1.0.21
Compiling unicode-xid v0.2.1
Compiling syn v1.0.41
Compiling semver-parser v0.7.0
Compiling proc-macro-hack v0.5.18
Compiling paste v1.0.1
Compiling semver v0.9.0
Compiling rustc_version v0.2.3
Compiling bare-metal v0.2.5
Compiling quote v1.0.7
Compiling avr-device-macros v0.2.2
Compiling ufmt-macros v0.1.1
Compiling rustc-std-workspace-core v1.99.0 (/home/todd/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/rustc-std-workspace-core)
Compiling nb v1.0.0
Compiling void v1.0.2
Compiling cfg-if v0.1.10
Compiling vcell v0.1.2
Compiling ufmt-write v0.1.0
Compiling panic-halt v0.2.0
Compiling ufmt v0.1.0
Compiling avr-device v0.2.2
Compiling nb v0.1.3
Compiling embedded-hal v0.2.4
Compiling avr-hal-generic v0.1.0 (https://github.com/Rahix/avr-hal#ad6fedd3)
Compiling atmega328p-hal v0.1.0 (https://github.com/Rahix/avr-hal#ad6fedd3)
Compiling arduino-uno v0.1.0 (https://github.com/Rahix/avr-hal#ad6fedd3)
Compiling mseg-lib v0.1.0 (/home/todd/repos/personal/learn-electronics/posts/hello-world/07-multisegment-led-rust-arduino/code/multisegment-led/mseg-lib)
Finished dev [unoptimized + debuginfo] target(s) in 32.57s
However, the test target fails:
$ cargo test
ERROR
Compiling nb v1.0.0
Compiling cfg-if v0.1.10
Compiling ufmt-write v0.1.0
Compiling vcell v0.1.2
Compiling void v1.0.2
Compiling panic-halt v0.2.0
Compiling bare-metal v0.2.5
error: duplicate lang item in crate `core` (which `rustc_std_workspace_core` depends on): `bool`.
|
= note: the lang item is first defined in crate `core` (which `ufmt_write` depends on)
= note: first definition in `core` loaded from /home/todd/repos/personal/learn-electronics/posts/hello-world/07-multisegment-led-rust-arduino/code/multisegment-led/mseg-lib/target/avr-atmega328p/debug/deps/libcore-6f3cf281fc4322f8.rmeta
= note: second definition in `core` loaded from /home/todd/repos/personal/learn-electronics/posts/hello-world/07-multisegment-led-rust-arduino/code/multisegment-led/mseg-lib/target/avr-atmega328p/debug/deps/libcore-24dc0d086ab40efb.rmeta
A little later in the error output, these are the error messages:
error: duplicate diagnostic item in crate `core`: `result_type`.
|
= note: the diagnostic item is first defined in crate `core`.
error[E0277]: the size for values of type `()` cannot be known at compilation time
--> /home/todd/.cargo/registry/src/github.com-1ecc6299db9ec823/bare-metal-0.2.5/src/lib.rs:10:10
|
10 | #[derive(Debug)]
| ^^^^^ doesn't have a size known at compile-time
|
::: /home/todd/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/result.rs:241:17
|
241 | pub enum Result<T, E> {
| - required by this bound in `core::result::Result`
|
= help: the trait `Sized` is not implemented for `()`
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
QUESTIONS:
- Why are two different implementations of various lang items being loaded?
- What is the work-around?
See discussion on avr-hal about this, too:
I'm still researching this, but I think there are hints here: