Правильно ли компилировать Rust-код для чистого ARM как stati c lib и как бинарный для x86_64? - PullRequest
1 голос
/ 19 февраля 2020

Что я хочу сделать: у меня есть фрагмент кода Rustcode, который я хочу построить

  • как stati c lib для чистого ARM, чтобы его можно было связать с существующим c программа, И
  • как исполняемый файл для x86_64, так что я могу разработать, unittest и т. Д. c.

Я могу сделать оба, но, к сожалению, мне приходится каждый раз менять Автомобиль go .томл.

main.rs

use foobar::foo::Bar;

fn main() {
    let bar = Bar::new();
    let ret = bar.do_something();

    //  ...
}

lib.rs

#![feature(core_intrinsics)]
#![cfg_attr(feature = "EMBEDDED", no_std)]

#[cfg(feature = "EMBEDDED")]
use core::intrinsics;

#[cfg(feature = "EMBEDDED")]
use core::panic::PanicInfo;

#[cfg(feature = "EMBEDDED")]
#[panic_handler]
fn panic(_info: &PanicInfo) -> ! {
    unsafe { intrinsics::abort() }
}

#[cfg(not(feature = "EMBEDDED"))]
pub mod foo;

foo.rs

pub struct Bar;

impl Bar {
    pub fn new() -> Self {
        Bar{}
    }

    pub fn do_something(&self) -> u32 {
        42
    }
}

#[no_mangle]
pub extern "C" fn call_from_c_prog() -> u32 {
    let bar = Bar::new();

    bar.do_something()
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn foo_test() {
        let bar = Bar::new();
        let ret = bar.do_something();

        assert_eq!(ret, 42);
    }
}

Автомобиль go .toml

[package]
name = "foobar"
version = "0.1.0"
authors = ["..."]
edition = "2018"

[dependencies]

#[[bin]]
#name = "foobar"
#path = "src/main.rs"
#test = true
#bench = false

[lib]
name = "foobar"
path = "src/lib.rs"
crate-type = ["staticlib"] # Creates static lib
#crate-type = ["cdylib"] # Creates synamic lib

[features]
default = []
EMBEDDED = []

С помощью этого автомобиля go .toml я могу создать код как stati c lib на работающей машине go

cargo build --lib --release --features EMBEDDED --target thumbv7em-none-eabihf

Но когда я пытаюсь построить этот код для x86_64 с

cargo test --target x86_64-unknown-linux-gnu

, я получаю эту ошибку:

error[E0433]: failed to resolve: use of undeclared type or module `foobar`
 --> src/main.rs:1:5
  |
1 | use foobar::foo::Bar;
  |     ^^^^^^ use of undeclared type or module `foobar`

error[E0433]: failed to resolve: use of undeclared type or module `Bar`
 --> src/main.rs:4:15
  |
4 |     let bar = Bar::new();
  |               ^^^ use of undeclared type or module `Bar`

error: aborting due to 2 previous errors

Я получаю ту же ошибку при включении обоих разделов ([[bin]] + [lib]).

Итак, когда я сейчас заменяю Car go .toml на

[[bin]]
name = "foobar"
path = "src/main.rs"
test = true
bench = false


#[lib]
#name = "foobar"
#path = "src/lib.rs"
#crate-type = ["staticlib"] # Creates static lib
##crate-type = ["cdylib"] # Creates synamic lib

, я могу собрать и запустить код с помощью

cargo test --target x86_64-unknown-linux-gnu

Но если запустить сейчас

cargo build --lib --release --features EMBEDDED --target thumbv7em-none-eabihf

Я получу .rlib, что очевидно, так как раздел закомментирован.

Итак, мой вопрос сейчас: как я могу делать обе вещи, не меняя автомобиль go .toml каждый раз? Я не мог найти правильный путь.

С уважением

1 Ответ

2 голосов
/ 19 февраля 2020

От Автомобиль go Книга :

- путь манифеста PATH

Путь к файлу автомобиля go .toml. По умолчанию Car go ищет файл Car go .toml в текущем каталоге или в любом родительском каталоге.

Просто укажите два файла Cargo.toml и используйте --manifest-path, чтобы указать файл манифеста. Также используйте --target-dir различный для обеих сборок, чтобы построить обе одновременно.

...