Cargo 无法加载源依赖项、虚拟清单

问题描述 投票:0回答:1

我是 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
正在这些路径上寻找其他来源。

rust gstreamer yocto rust-cargo
1个回答
0
投票

我不熟悉 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 指向存储库的正确(子)目录。

© www.soinside.com 2019 - 2024. All rights reserved.