LINUX.ORG.RU

Проблема с зависимостями Cargo при сборке greetd

 , ,


0

2

Приветствую. Осваиваю сборку пакетов с ПО на Rust. В качестве подопытного выбран greetd. Все шло нормально, до момента пока Cargo не начал ругаться на неразрешимую зависимость:

error: failed to select a version for the requirement `nix = "^0.17"`
candidate versions found which didn't match: 0.19.0
. rust-nix установлен из deb-пакета, но в принципе остальные зависимости также установлены из deb, и отлично подходят. Если я правильно понимаю - версия nix в данном случае захардкожена на 0.17? Как решить эту проблему? Вот Cargo.toml от greetd
[package]
name = "greetd"
version = "0.6.0"
authors = ["Kenny Levinsen"]
edition = "2018"
license = "GPL-3.0"
homepage = "https://kl.wtf/projects/greetd"
repository = "https://git.sr.ht/~kennylevinsen/greetd/"

[features]
debug = []

[dependencies]
nix = "0.17"
pam-sys = "0.5.6"
users = "0.9.1"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
greetd_ipc = { path = "../greetd_ipc", features = ["tokio-codec"] }
inish = { path = "../inish" }
libc = "0.2"
tokio = { version = "0.2", features = ["net", "sync", "macros", "signal", "rt-util", "io-util", "time"] }
getopts = "0.2"
thiserror = "1.0"
async-trait = "0.1"
enquote = "1.0.3"[/quote]

Ещё есть такие строки:

location searched: directory source `/media/DATA/Repos/RUST/rust-greetd-0.7.0/debian/cargo_registry` (which is replacing registry `https://github.com/rust-lang/crates.io-index`)
required by package `greetd v0.6.0 (/media/DATA/Repos/RUST/rust-greetd-0.7.0/greetd)`
perhaps a crate was updated and forgotten to be re-vendored?

Sunderland93 ★★★★★
() автор топика

Если я правильно понимаю - версия nix в данном случае захардкожена на 0.17?

Да.

Как решить эту проблему?

Либо бампнуть зависимость (и проверить, что ничего при этом не ломается), либо завендорить старую версию.

Ещё есть такие строки:

location searched: directory source `/media/DATA/Repos/RUST/rust-greetd-0.7.0/debian/cargo_registry` (which is replacing registry `https://github.com/rust-lang/crates.io-index`)
required by package `greetd v0.6.0 (/media/DATA/Repos/RUST/rust-greetd-0.7.0/greetd)`
perhaps a crate was updated and forgotten to be re-vendored?>

Я ненастоящий сварщик, но что у тебя там лежит? Вероятно, подкладывать старую версию нужно именно туда.

intelfx ★★★★★
()
Ответ на: комментарий от Sunderland93

А, ну тогда всё понятно, всё работает as intended. Cargo принудительно оторвали от crates.io и вместо него подсунули каталог с локально установленными пакетами.

Нужно либо патчить исходники твоего пакета (то есть бампать зависимость, проверять, что ничего при этом не ломается, а если ломается, то чинить), либо одно из двух.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Cargo принудительно оторвали от crates.io и вместо него подсунули каталог с локально установленными пакетами.

Да, дебовцы намутили утилиту debcargo, собирающую пакеты из crates.io в deb, и соответственно эти пакеты лежат среди остальных системных.

Sunderland93 ★★★★★
() автор топика
Ответ на: комментарий от Sunderland93

Не очень понял, как связана обсуждаемая проблема и коммит по ссылке, учитывая, что по ссылке бамп 0.19 → 0.20, а тебе нужно наоборот бампнуть 0.17 → 0.19. Но в любом случае рад, что проблема решена 🤣

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Ещё такой вопрос. Мне нужно чтобы собранный greetd мог устанавливаться в систему. Но при попытке запустить установку он выдает ошибку, что Cargo.toml является виртуальным манифестом, а ему нужен package-манифест. Можно ли сгенерировать этот манифест автоматически, или нужно писать его вручную?

Sunderland93 ★★★★★
() автор топика
Ответ на: комментарий от Sunderland93

Без понятия, если честно. Что о Debian, что о Cargo я имею представление только в рамках общей эрудиции. Могу погуглить за тебя, но тогда мне нужны точные сообщения об ошибках и всё такое.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

В общем вот такая ошибка. Гуглеж не помог

make[1]: выход из каталога «/home/sunderland93/Загрузки/rust-greetd-0.8.0»
   create-stamp debian/debhelper-build-stamp
   dh_testroot -O--buildsystem=cargo
   dh_prep -O--buildsystem=cargo
   dh_auto_install --destdir=debian/rust-greetd/ -O--buildsystem=cargo
debian cargo wrapper: options, profiles, parallel: ['parallel=12'] ['noudeb'] ['-j12']
debian cargo wrapper: rust_type, gnu_type: x86_64-unknown-linux-gnu, x86_64-linux-gnu
debian cargo wrapper: installing into destdir 'debian/rust-greetd' prefix '/usr'
debian cargo wrapper: running subprocess (['env', 'RUST_BACKTRACE=1', 'CARGO_TARGET_DIR=/home/sunderland93/Загрузки/rust-greetd-0.8.0/target', '/usr/bin/cargo', '-Zavoid-dev-deps', 'install', '--verbose', '--verbose', '-j12', '--target', 'x86_64-unknown-linux-gnu', '--path', '/home/sunderland93/Загрузки/rust-greetd-0.8.0', '--root', 'debian/rust-greetd/usr'],) {'check': True}
error: found a virtual manifest at `/home/sunderland93/Загрузки/rust-greetd-0.8.0/Cargo.toml` instead of a package manifest
Traceback (most recent call last):
  File "/usr/share/cargo/bin/cargo", line 231, in <module>
    sys.exit(main(*sys.argv[1:]))
  File "/usr/share/cargo/bin/cargo", line 221, in main
    return install(os.getenv("DESTDIR", ""),
  File "/usr/share/cargo/bin/cargo", line 127, in install
    logrun(["env", "RUST_BACKTRACE=1",
  File "/usr/share/cargo/bin/cargo", line 76, in logrun
    return subprocess.run(*args, **kwargs)
  File "/usr/lib/python3.10/subprocess.py", line 524, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '['env', 'RUST_BACKTRACE=1', 'CARGO_TARGET_DIR=/home/sunderland93/Загрузки/rust-greetd-0.8.0/target', '/usr/bin/cargo', '-Zavoid-dev-deps', 'install', '--verbose', '--verbose', '-j12', '--target', 'x86_64-unknown-linux-gnu', '--path', '/home/sunderland93/Загрузки/rust-greetd-0.8.0', '--root', 'debian/rust-greetd/usr']' returned non-zero exit status 101.
dh_auto_install: error: env DESTDIR=debian/rust-greetd /usr/share/cargo/bin/cargo install returned exit code 1
make: *** [debian/rules:3: binary] Ошибка 25
dpkg-buildpackage: ошибка: debian/rules binary subprocess returned exit status 2
debuild: fatal error at line 1182:
dpkg-buildpackage -us -uc -ui failed

Sunderland93 ★★★★★
() автор топика
Ответ на: комментарий от intelfx

Нет, вот этот

[profile.dev]
panic = "abort"

[profile.release]
lto = "fat"
panic = "abort"
opt-level = 'z'
incremental = false
codegen-units = 1

[workspace]
members = ["inish", "greetd_ipc", "greetd", "agreety", "fakegreet"]
У каждого из этих компонентов свой Cargo.toml, и мне нужно каким то образом пройтись по ним всем, и рассовать бинарники по нужным директориям

Sunderland93 ★★★★★
() автор топика
Ответ на: комментарий от Sunderland93

А, ну я так понимаю, работать не будет.

https://users.rust-lang.org/t/cargo-install-workspace/29145

Надо как-то дебиановский тулинг заставить вызывать cargo install несколько раз для каждого компонента по отдельности.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

В общем я решил проблему. Посмотрел как сделали разработчики Pop_OS, у них много своих утилит на расте. И такая же структура. Они используют Makefile. Написал свой, вроде ничего лишнего. По крайней мере делает то, что мне нужно. Врапперы от Debian здесь бесполезны, поэтому собирается с помощью обычного Cargo:

export prefix ?= /usr
sysconfdir ?= /etc
bindir = $(prefix)/bin
libdir = $(prefix)/lib

PACKAGE=greetd
BIN=greetd
BIN_AGREETY=agreety
CONF=greetd.conf
CONF_TOML=config.toml
PAM=greetd.pam

DEBUG ?= 0
TARGET = debug
ifeq ($(DEBUG),0)
	ARGS += "--release"
	TARGET = release
endif

BINARY=target/$(TARGET)/$(BIN)

.PHONY: all clean install uninstall update

all: $(BINARY)

clean:
	cargo clean

install:
	install -Dm04755 "$(BINARY)" "$(DESTDIR)$(bindir)/$(BIN)"
	install -Dm04755 "$(BINARY)" "$(DESTDIR)$(bindir)/$(BIN_AGREETY)"
	install -Dm0644 "./$(BIN).service" "$(DESTDIR)$(libdir)/systemd/system/$(BIN).service"
	install -Dm0644 "debian/$(BIN).pam" "$(DESTDIR)$(sysconfdir)/pam.d/$(BIN)"
	install -Dm0644 "debian/$(CONF)" "$(DESTDIR)$(libdir)/sysusers.d/$(CONF)"
	install -Dm0644 "./$(CONF_TOML)" "$(DESTDIR)$(sysconfdir)/greetd/$(CONF_TOML)"

$(BINARY):
	cargo build $(ARGS) --locked

Sunderland93 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.