Cargo test fails for arduino targets with duplicate lang item in crate

Viewed 449

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:

0 Answers
Related