Gentoo 升级遇难小记(四)



最近又来升级笔记本上的 Gentoo,但是遇到软件冲突导致某软件被跳过安装的问题:

$ sudo emerge --ask --verbose --update --newuse --deep @world

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

Calculating dependencies... done!

Total: 0 packages, Size of downloads: 0 KiB

WARNING: One or more updates/rebuilds have been skipped due to a dependency conflict:


  (media-gfx/qrencode-4.1.1:0/4::gentoo, ebuild scheduled for merge) USE="-png -test" conflicts with
    media-gfx/qrencode[png(+)] required by (app-admin/pass-1.7.4-r2:0/0::gentoo, installed) USE="git -X -dmenu -emacs -importers -wayland"

Nothing to merge; quitting.

可以看到 media-gfx/qrencode-4.1.1 与 app-admin/pass-1.7.4-r2 产生了冲突导致前者无法更新。 但首先看下 qrencode 在当前系统的版本:

$ equery l media-gfx/qrencode
 * Searching for qrencode in media-gfx ...
[IP-] [  ] media-gfx/qrencode-4.1.1:0/4

可以看到 media-gfx/qrencode 目前已经是 4.1.1 版本,那么此次更新只可能是 USE flag 的变动导致的。 通过二者的 ebuild 源码文件一探究竟。

首先是 /var/db/repos/gentoo/media-gfx/qrencode/qrencode-4.1.1.ebuild

IUSE="png test"

然后是 /var/db/repos/gentoo/app-admin/pass/pass-1.7.4-r2.ebuild

        ... (omit remaining content here)

上面的 media-gfx/qrencode[png(+)] 是什么意思呢? [1] 其表示 pass 在运行时依赖 qrencode,且需要后者同时启用 png USE flag。 如果 qrencode 不支持 png USE flag 呢,则假装它支持,且启用该 USE flag。

而事实上在 qrencode 的 ebuild 源码文件中发现其已经支持了 png USE flag, 但该 flag 默认是非启用状态,同时我们并没有在任何地方声明要启用它,因此导致了冲突。


$ vim /etc/portage/package.use/qrencode.use
    media-gfx/qrencode png

之后查看了这两个 ebuild 文件在官方 github 仓库中的历史修改记录, 发现二者都是在前段时间 2 月 14 号的时候 [2] [3],给加上的 png USE flag 相关代码。 估计之后在 pass 的 ebuild 文件中,维护者会将上面的依赖语句更新成 media-gfx/qrencode[png] , 因为 qrencode 已经支持 png USE flag 了,不用再假装它支持了。

Updated 2022/03/20

忽地发现 emerge 有个神奇的参数 --bracktrack ,能自动解决这个冲突:

$ sudo emerge -avp --backtrack=10 qrencode pass

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

Calculating dependencies... done!
[ebuild   R    ] media-gfx/qrencode-4.1.1:0/4::gentoo  USE="png%* -test" 0 KiB
[ebuild   R    ] app-admin/pass-1.7.4-r2::gentoo  USE="git -X -dmenu -emacs -importers -wayland" 0 KiB

Total: 2 packages (2 reinstalls), Size of downloads: 0 KiB

The following USE changes are necessary to proceed:
 (see "package.use" in the portage(5) man page for more details)
# required by app-admin/pass-1.7.4-r2::gentoo
# required by @selected
# required by @world (argument)
>=media-gfx/qrencode-4.1.1 png

 * In order to avoid wasting time, backtracking has terminated early
 * due to the above autounmask change(s). The --autounmask-backtrack=y
 * option can be used to force further backtracking, but there is no
 * guarantee that it will produce a solution.

不过本质也是给 qrencode 启动 png USE flag.

Thanks for reading :)