我是 Rust/Cargo 的新手,在为
gst-plugins-rs
编译新的 Yocto 配方时一直在努力解决问题,Cargo.toml
文件可以在此目录结构中找到。
../gstreamer1.0-plugins-rs/0.12.11-r0/git/
├── audio
│ ├── audiofx
│ ├── claxon
│ ├── csound
│ ├── lewton
│ └── spotify
├── Cargo.lock
├── Cargo.lock.orig
├── Cargo.toml
├── cargo_wrapper.py
├── CHANGELOG.md
| ...
└── video
├── cdg
...
└── webp
Cargo.toml
基本上由以下内容组成。
[workspace]
resolver = "2"
members = [
"audio/audiofx"
"audio/claxon"
...
]
default-members = [
"audio/audiofx"
"audio/claxon"
...
]
[workspace.package]
version = "0.12.11"
repository = "https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs"
edition = "2021"
rust-version = "1.70"
[workspace.dependencies]
once_cell = "1"
glib = { git = "https://github.com/gtk-rs/gtk-rs-core", branch = "0.19", version = "0.19" }
...
gtk = { package = "gtk4", git = "https://github.com/gtk-rs/gtk4-rs", branch = "0.8", version = "0.8"}
...
gst = { package = "gstreamer", git = "https://gitlab.freedesktop.org/gstreamer/gstreamer-rs", branch = "0.22", version = "0.22" }
...
关于 Yocto Recipe 并没有什么特别之处,只有一个自定义的
do_install
可以移动 .so
文件,但它在 do_compile
阶段失败了。 该配方基于这个旧的补丁请求,但已更新到更新的版本。基本上由以下几部分组成,
...
SRC_URI = " \
git://gitlab.freedesktop.org/gstreamer/gst-plugins-rs.git;protocol=https;branch=0.12;name=default; \
gitsm://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git;protocol=https;branch=0.22;name=gstreamer-rs;destsuffix=cargo_home/git/db/gstreamer-rs-79e52a2d27eb91a3 \
git://github.com/gtk-rs/gtk-rs-core.git;protocol=https;branch=0.19;name=gtk-rs-core;destsuffix=cargo_home/git/db/gtk-rs-core-7be42ca38bd6361c \
git://github.com/gtk-rs/gtk4-rs;protocol=https;branch=0.8;name=gtk4-rs;destsuffix=cargo_home/git/db/gtk4-rs-e74ad56283dfeb5e \
git://github.com/rust-av/ffv1.git;protocol=https;branch=master;name=ffv1;destsuffix=cargo_home/git/db/ffv1-08f2e3b26709fb34 \
git://github.com/rust-av/flavors;protocol=https;branch=master;name=flavors;destsuffix=cargo_home/git/db/flavors-0f978a4d88ad8592 \
crate://crates.io/adler/1.0.2 \
crate://crates.io/adler32/1.2.0 \
crate://crates.io/aes/0.8.4 \
crate://crates.io/aho-corasick/1.1.3 \
...
inherit cargo pkgconfig
DEPENDS = " \
gstreamer1.0 \
gstreamer1.0-plugins-good \
"
...
我收到的错误如下,
cargo build -v --frozen --target aarch64-lmp-linux-gnu --release --manifest-path=.../gstreamer1.0-plugins-rs/0.12.11-r0/git//Cargo.toml
NOTE: cargo build -v --frozen --target aarch64-lmp-linux-gnu --release --manifest-path=.../gstreamer1.0-plugins-rs/0.12.11-r0/git//Cargo.toml
error: failed to load source for dependency `gtk4-rs`
Caused by:
Unable to update .../gstreamer1.0-plugins-rs/0.12.11-r0/cargo_home/git/db/gtk4-rs-e74ad56283dfeb5e
Caused by:
found a virtual manifest at `.../gstreamer1.0-plugins-rs/0.12.11-r0/cargo_home/git/db/gtk4-rs-e74ad56283dfeb5e/Cargo.toml` instead of a package manifest
也许我需要将
gtk4-rs
的 Cargo.toml
转换为包清单?或者是否需要更改货物命令以使其需要虚拟清单?
任何建议将不胜感激,我很乐意分享更多细节。另外,如果我可以运行一些货物调试命令,请告诉我。
我最初认为
SRC_URI
,特别是destsuffix
,是最初的问题,但是当删除源时,例如gstreamer-rs
、gtk-rs-core
等,我已经确认gst-plugins-rs
正在这些路径上寻找其他来源。
我不熟悉 Yocto,所以我无法建议你确切地如何解决这个问题,但我熟悉 Cargo。根据构建错误,您似乎正在尝试将
git
依赖项替换为 path
依赖项。
Cargo 对于 Git 依赖项有一个特殊的行为,这是其他依赖项类型所没有的:它将搜索所请求包的存储库(所请求的修订版)的内容(此处为
gtk4
)。因此,当 Cargo 查看 https://github.com/gtk-rs/gtk4-rs 时,它会进行搜索,直到找到包清单 https://github.com/gtk-rs/gtk4-rs/blob /main/gtk4/Cargo.toml,而不是工作区清单https://github.com/gtk-rs/gtk4-rs/blob/main/Cargo.toml。 (我相信工作区清单根本不会影响搜索,但我可能是错的。)
path
依赖项没有这样的搜索行为——路径必须是
包含确切所需的包清单的目录。因此,当您希望将 git
依赖项转换为 path
依赖项时,您必须在存储库中找到正确的包目录 in 并在依赖项中使用该路径。
Cargo 说“找到虚拟清单”的原因是,“虚拟清单”是不定义包,仅定义工作空间的清单。为了您的目的,请将错误理解为“在此目录中找不到包”。您需要将 Cargo 指向存储库的正确(子)目录。