LINUX.ORG.RU

Как возникает циклическая зависимость?

 , ,


0

1

там https://github.com/gentoo/gentoo/blob/master/dev-java/openjdk/openjdk-21.0.1_p12.ebuild#L102-L107 написано:

IUSE="... +system-bootstrap ..."

...

DEPEND="
	...
	system-bootstrap? (
		|| (
			dev-java/openjdk-bin:${SLOT}
			dev-java/openjdk:${SLOT}
		)
	)
"

Мне непонятно, как это должно работать, и почему пакетный менеджер сообщает о циклической зависимости dev-java/openjdk от dev-java/openjdk вместо того, чтобы тихо и молча установить dev-java/openjdk-bin

# emerge -av dev-java/openjdk

These are the packages that would be merged, in order:

Calculating dependencies... done!
Dependency resolution took 38.57 s.

[ebuild  NS   ~] dev-java/openjdk-bin-21.0.1_p12:21::gentoo [17.0.8.1_p1:17::gentoo] USE="alsa cups -headless-awt (-selinux) -source" 202982 KiB
[ebuild  NS   ~] dev-java/openjdk-21.0.1_p12:21::gentoo [17.0.8.1_p1:17::gentoo] USE="alsa cups jbootstrap (system-bootstrap) (-big-endian) -debug -doc -examples -headless-awt (-javafx) -lto (-selinux) -source -systemtap" 109611 KiB

Total: 2 packages (2 in new slots), Size of downloads: 312592 KiB

Would you like to merge these packages? [Yes/No]

Пропадёт ли залоченность USE-флага USE=«(system-bootstrap)» после второго мёржа? Что станет после этого с пакетом dev-java/openjdk-bin, например при выполнении emerge --depclean. Почему для сборки используется бинарник, вместо того, чтобы собирать всё из исходников, как это делают в репозитории gentoo-bootstrap ?

★★★

Последнее исправление: Shushundr (всего исправлений: 7)

Залоченность флага пропадёт после того, как ты сам руками его разлочишь, сама она пропадать не будет

mittorn ★★★★★
()

Да, emerge --depclean удаляет пакеты:

dev-java/openjdk-17.0.8.1_p1
dev-java/openjdk-bin-21.0.1_p12
Shushundr ★★★
() автор топика
Ответ на: комментарий от mittorn

А зачем они так сделали?
https://github.com/gentoo/gentoo/blob/master/profiles/base/package.use.force#L58-L62

# Arthur Zamarin <arthurzam@gentoo.org> (2022-01-13)
# Force to use installed openjdk{,-bin} for bootstrapping
dev-java/openjdk:11 system-bootstrap
dev-java/openjdk:17 system-bootstrap
dev-java/openjdk:21 system-bootstrap

Если этот флаг всегда включен, то он, получается, в принципе не нужен.

Вот если бы они с его помощью могли бы предотвращать циклическую зависимость, это было бы интересно.

DEPEND="
	...
	|| (
	        system-bootstrap ( dev-java/openjdk-bin:${SLOT} )
		!system-bootstrap ( dev-java/openjdk:${SLOT} )
	)
"

но именно так оно не сработает. Надо как-то по-другому.

Есть alternatives и Virtual Packages пакет dev-java/openjdk мог бы зависеть от virtual/openjdk, а представлять интерфейс этого пакета мог бы как dev-java/openjdk-bin, так и dev-java/openjdk.

Там прям с virtuals есть отсылка на установку -bin пакетов в качестве альтернативы.

В общем, мне не ясно, как сделать наилучшим образом.

Например, если в world прописана установка virtual/пакета, то в качестве реализации первой будет установлена первая альтернатива? Или это не определено? GLEP 37 невнятный, в нём непонятно, можно ли/нужно ли прописывать «+system-bootstrap» в IUSE для виртуального пакета.

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

в virtual/openjdk добавить

IUSE="+system-bootstrap"
|| (
system-bootstrap ( dev-java/openjdk-bin:${SLOT} )
!system-bootstrap ( dev-java/openjdk:${SLOT} )
)

в dev-java/openjdk добавить зависимость от

virtual/openjdk

dev-java/openjdk-bin и сам установится, ему никаких зависимостей не нужно.

Тогда:

  1. флаг system-bootstrap будет показываться выключенным и невключаемым, если dev-java/openjdk-bin замаскирован
  2. при включённом по-умолчанию system-bootstrap не будет возникать циклическая зависимость (но что, если он замаскирован?)

Что будет с флагом и зависимостью

system-bootstrap ( dev-java/openjdk-bin )

если system-bootstrap добавлен в package.use.force, а dev-java/openjdk-bin замаскирован?

  1. при установленном dev-java/openjdk бинарный пакет будет так же самовыпиливаться по emerge --depclean, как и сейчас? (не будет, только если отключить system-bootstrap)

можно добавить system-bootstrap в dev-java/openjdk и протащить его в virtual/openjdk:

|| ( system-bootstrap ( virtual/openjdk[system-bootstrap] )
( !system-bootstrap ( virtual/openjdk ) )
)

тогда вручную можно будет указывать USE="system-bootstrap" emerge dev-java/openjdk (один раз) и оно будет устанавливать -bin. А для того, чтобы установка срабатывала по умолчанию - рекомендовать устанавливать virtual/openjdk (там флаг будет по-умолчанию включен, а в dev-java/openjdk по-умолчанию выключен).

Будет ли это работать, или я что-то недодумал?

Shushundr ★★★
() автор топика
Последнее исправление: Shushundr (всего исправлений: 4)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.