强制使用Yocto的cargo版本

3

我正在尝试使用meta-rust层,使用bitbake/yocto来使用rust

在该层中,我可以看到最近添加了一个版本为1.58.0的cargo配方。不幸的是,当我尝试使用BitBake构建任何rust代码时,会出现以下错误:

NOTE: Executing Tasks
ERROR: echo-server-0.1.0.AUTOINC+c37d3bb2f3-r0 do_compile: ExecutionError('./tmp/work/corei7-64-poky-linux/echo-server/0.1.0.AUTOINC+c37d3bb2f3-r0/temp/run.do_compile.391773', 101, None, None)
ERROR: Logfile of failure stored in: ./tmp/work/corei7-64-poky-linux/echo-server/0.1.0.AUTOINC+c37d3bb2f3-r0/temp/log.do_compile.391773
Log data follows:
| DEBUG: Executing shell function do_compile
| NOTE: cargo = build/tmp/work/corei7-64-poky-linux/echo-server/0.1.0.AUTOINC+c37d3bb2f3-r0/recipe-sysroot-native/usr/bin/cargo
| NOTE: rustc =
| NOTE: cargo build -v --target x86_64-poky-linux --release --manifest-path=./build/tmp/work/corei7-64-poky-linux/echo-server/0.1.0.AUTOINC+c37d3bb2f3-r0/git//Cargo.toml
| error: failed to parse manifest at ./build/tmp/work/corei7-64-poky-linux/echo-server/0.1.0.AUTOINC+c37d3bb2f3-r0/git/Cargo.toml
|
| Caused by:
|   feature `edition2021` is required
|
|   consider adding `cargo-features = ["edition2021"]` to the manifest
| WARNING: exit code 101 from a shell command.

这段 Rust 代码在本地系统上可以正常构建,我认为错误是因为 Yocto 使用的 Cargo 版本是1.54。

tmp/work/corei7-64-poky-linux/libstd-rs/1.54.0-r0/recipe-sysroot-native/usr/bin/cargo --version

cargo 1.54.0

我该如何让 yocto 使用更高版本的 cargo?在 meta-rust 中有相关的配方,我可以看到 yocto 已知道这一点。
bitbake -s | grep cargo

cargo                                              :1.58.1-r0
cargo-cross-canadian-x86-64                        :1.58.1-r0
cargo-native                                       :1.58.1-r0                :1.54.0-r0
nativesdk-cargo                                    :1.58.1-r0

请注意,如果设置了RUSTVERSION ?= "1.58",将会出现以下警告:

WARNING: preferred version 1.58 of cargo-native not available (for item cargo-native)
WARNING: versions of cargo-native available: 1.54.0
WARNING: preferred version 1.58 of libstd-rs not available (for item libstd-rs)
WARNING: versions of libstd-rs available: 1.54.0
WARNING: preferred version 1.58 of libstd-rs not available (for item libstd-rs)
WARNING: versions of libstd-rs available: 1.54.0
WARNING: preferred version 1.58 of libstd-rs not available (for item libstd-rs-dev)
WARNING: versions of libstd-rs available: 1.54.0
WARNING: preferred version 1.58 of rust-native not available (for item rust-native)
WARNING: versions of rust-native available: 1.54.0
WARNING: preferred version 1.58 of rust-llvm-native not available (for item rust-llvm-native)
WARNING: versions of rust-llvm-native available: 1.54.0

这表明它正在使用默认版本1.54.0

注意:bitbake -c cleanall rust cargo会产生以下错误:

ERROR: Nothing PROVIDES 'rust'
rust was skipped: Rust recipe doesn't work for target builds at this time. Fixes welcome.

类似的问题(由我提出)在这里 https://github.com/rust-embedded/meta-rust-bin/issues/89,对你的情况应该适用(去掉“-bin”)。 - hellow
顺便提一下:如果您使用的是Honister或更高版本,则meta-rust层已经包含在poky中,不再需要额外的层。此时变量称为“RUSTVERSION”。 - hellow
谢谢你提供有关Honister的提示,我已经删除了meta-rust层的显式锥体。不幸的是,如果我将RUSTVERSION设置为1.58,在检查依赖项时会产生很多警告,并且最终在获取cargo-native时失败。目前我的解决方法是在我的Cargo.toml文件中将版本设置为2018年版。 - mark
将配方和源代码存储在不同的仓库中非常麻烦 - 是否有一种方法可以将配方与 Rust 源代码一起包含? - mark
没有更多关于你的警告的信息,我无法告诉你发生了什么。也许尝试使用 bitbake -c cleanall rust cargo 命令和本地包也许会有帮助。我从不建议混合配方和源码。它们之间没有任何关联!但如果你还不知道的话,有一个名为 cargo-bitbake 的工具可以使用。 - hellow
1个回答

0

这通常是通过 bitbake 进行的,可以使用 PREFERRED_VERSION_foo 来实现。似乎 meta-rust 包含一个文件,可以为您完成此更改:

https://github.com/meta-rust/meta-rust/blob/c654f5cb928bd4f4c7da7d74a8356fd2a94283f6/conf/distro/include/rust_versions.inc#L4

RUST_VERSION ?= "1.58"

如果你在你的 distro.conf(或 local.conf)中包含此文件并更改第4行以匹配版本1.58,那么你应该能够使用/构建 cargo 版本1.58。

你仍然可以在 local.conf 上手动更改 PREFERRED_VERSION_cargo/rust*,但你需要为所有 rust 组件都这样做,就像 rust_versions.inc 文件所做的那样。


谢谢 - 我刚试着在local.conf中添加了 RUST_VERSION ?= "1.58",但没有任何改变,仍然使用版本1.54。 - mark
将 RUST_VERSION 添加到 local.conf 中本身不会有任何作用,您必须同时添加一个包含/要求 distro/include/rust_versions.inc 文件的指令。 - ah008a
抱歉我没听懂——因为我正在使用 Hoister,我已经删除了 meta-rust 克隆库,并且我在任何其他层中都找不到“rust_versions.inc”文件。目前,我使用旧版本的 rust/Cargo 进行工作,但我想这将来可能会有问题。作为一个项目,我们可能不得不放弃 Rust,坚持使用 C/C++(并在以后当工具更加成熟时再重新考虑 Rust)。 - mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接