我已经有几个月没有更新我的 Gentoo 系统了。而且,正如您可以想象的那样,这意味着我需要检查很多软件包(和 USE 更改)。我的系统是“amd64”(multilib),但我有很多来自“~amd64”的手动关键字包。
无论如何,在此更新中,我不断看到“ABI_X86”USE 标志。这是什么?这是新的。 “eselect新闻列表”中没有任何相关内容。
我找到了这个话题:http://forums.gentoo.org/viewtopic-t-953900-start-0.html。这似乎展示了如何使用它,但是,有任何“真正的”文档吗?它有什么作用?我是什么应该将“ABI_X86”设置为?我有一个多库系统。我假设我想要“64”,但是“32”和“x32”是什么?我对我需要在这里做什么感到困惑。
Emerge 大喊大叫关于插槽冲突,它们似乎与“ABI_X86”有关(我完全忘记了错误,但我记得其中一个是 zlib)。
那么,是否有关于它ABI_X86
是什么以及如何使用它的“官方”文档?
从我链接的线程中,我找到了这个页面:http://kicherer.org/joomla/index.php/en/blog/liste/29-transition-of-emul-packages-to-true-multilib,但我想知道我在做什么之前我去关键字一堆东西并编辑我的make.conf
.
PS 我的“package.keywords”文件中有大部分“app-emulation/emul-linux-x86”软件包(我当时似乎需要的软件包)。
答案1
我必须透露,我在 Gentoo 中使用 -style multilib 的经验很少multilib-build.eclass
。
ABI_X86
是一个USE_EXPAND
多变的;设置ABI_X86="32 64"
或USE="abi_x86_32 abi_x86_64"
等效。截至撰写本文时 (2013-09-09),default/linux/amd64/13.0
配置文件的 ABI_X86 默认设置似乎只是ABI_X86=64
.
这个变量控制 ebuilds 中显式的 multilib 支持,它使用multilib-build.eclass
比原始方法更类似于 Gentoo 的 multilib 方式。
在 Gentoo 中安装 32 位库的原始方法是通过名为 的二进制快照app-emulation/emul-linux-*
。这些模拟二进制包中的每一个都包含由一些 Gentoo 开发人员为您编译的一整套 32 位库。因为每个都安装了一组必须协调在一起的库,所以跟踪仅 32 位 ebuild 的依赖关系更加困难。例如,如果您media-libs/alsa-lib
在 32 位系统上需要32 位版本,media-libs/alsa-lib
则只需安装.另外,构建这样一个二进制包的 Gentoo 开发人员必须解决以下问题:找出 multilib 和构建系统的怪癖app-emulation/emul-linux-soundlibs
media-libs/alsa-lib
每个快照包中包含的库的数量,使维护变得更加困难。而且,最重要的是,提供二进制包作为在 Gentoo 中使用 multilib 的唯一官方选项违背了 Gentoo 的精神。你应该有编译的权利一切你自己!
multilib-build.eclass
通过帮助单个 ebuild 安装来摆脱这种行为两个都32 位和 64 位版本。例如,这应该允许wine
只需要直接指定其所需的包的依赖关系,而不需要拉入app-emulation/emul-linux-*
包。正如 ssuominen 在中提到的您引用的论坛主题:
=app-emulation/emul-linux-x86-xlibs-20130224-r1 这是没有文件的空包,因为文件现在直接来自 x11-libs/
(请注意,-r1
此后已重命名为-r2
)最终,app-emulation/emul-linux-x86-xlibs
它本身应该能够被删除,因为仅 32 位软件包适当地直接依赖于正确的软件包x11-libs
,在multilib-build.eclass
的帮助下,提供所需的 32 位库。这就是ABI_X86
发挥作用的地方。任何multilib-build.eclass
启用的软件包至少都会获得新的 USE 标志abi_x86_32
,abi_x86_64
并且可能abi_x86_x32
.使用EAPI=2
-style USE 依赖项,包可以依赖于其他包的 32 位版本。如果x11-libs/libX11
出现时ABI_X86="32 64"
,则应使用 USE-flagsabi_x86_32
和abi_x86_64
USE-flags 设置来安装它。如果特定图形包需要 32 位版本的libX11
,可以x11-libs/libX11[abi_x86_32]
在其依赖项中指定。这样,如果你尝试emerge这个图形包并且libX11
没有安装32位库,portage将拒绝。也是通用的并且与 32 位系统兼容:在 32 位系统上安装相同的图形包将始终有效,因为如果不设置其useflagmultilib-build.eclass
则无法安装。这解决了在多库系统上需要依赖而在仅 32 位系统上直接依赖的问题。我们正在为在多库系统上拥有更清晰、更合理的包间依赖关系铺平道路。libX11
abi_x86_32
app-emulation/emul-linux-x86-xlibs
x11-libs/libX11
=app-emulation/emul-linux-x86-xlibs-20130224-r2
作为中介存在,它使任何曾经依赖但app-emulation/emul-linux-x86-xlibs
不知道如何直接依赖的旧包(例如,x11-libs/libX11[abi_x86_32]
)仍然可以工作。=app-emulation/emul-linux-x86-xlibs-20130224-r2
确保存在相同的 32 位库,/usr/lib32
就好像=app-emulation/emul-linux-x86-xlibs-20130224
已安装一样,但它是通过 Gentoo 方式通过其依赖项构建这些 32 位库而不是提供二进制包。它的行为方式与该类别中的包非常相似virtual
:它不安装任何东西,只是“转发”现有 ebuild 的依赖项。
我们已经看到了如何multilib-build.eclass
为多库系统上更清晰的依赖关系铺平道路。如果您指定了/ ,则任何具有ABI_X86
选项的软件包(与说它具有abi_x86_*
useflags 相同)都已安装其自身的 32 位版本。这是如何运作的(在高概念层面)?您可以阅读 ebuild 本身。基本上,这个想法与 python 或 ruby ebuilds 相同,它们可以选择同时安装多个版本的 python 和 ruby。当 ebuild 继承时,它会循环遍历 ABI_X86,并对 ABI_X86 中的每个条目执行解包、编译和安装过程的每一步。由于 portage 按顺序经历了所有 ebuild 阶段,例如、和(以及其他)并且仅执行一次,因此(当前,在 的帮助下)使用为 ABI_X86 的每个不同值创建一个目录。它将把源代码的副本解压到每个目录中。从那里开始,每个目录开始出现分歧,因为每个目录都针对特定的 ABI。该目录将使用面向 32 位的 FLAGS 运行(例如,来自 multilib 配置文件的 CFLAGS_x86 envvar(注意:portage 配置文件主要将 ABI_X86=32 称为 ABI=x86,将 ABI_X86=64 称为 ABI=amd64))。在此阶段,所有不同的编译 ABI 都会相互安装,以便当任何文件同时具有 32 位和 64 位版本时,本机 ABI 获胜(例如,在 PATH 中安装两个库和可执行文件的 ebuild 将仅安装64 位可执行文件进入 PATH,但同时包含 32 位和 64 位库)。USE=abi_x86_32
ABI_X86=32
multilib-build.eclass
src_unpack()
src_compile()
src_install()
multilib-build.eclass
multibuild.eclass
ABI_X86=32
./configure --libdir=/usr/lib32
CFLAGS=-m32
src_install()
总而言之:当您设置 时ABI_X86="32 64"
,make.conf
任何支持的包multilib-build.eclass
都将花费大约两倍的工作量(我不是说时间;-))来编译,因为它为每个 ABI 构建一次并生成 32 位库/usr/lib32
。
我不知道是否有官方文档ABI_X86
或其详细状态。目前使用的 Ebuildmultilib-build.eclass
似乎大多不稳定。如果您了解multilib 和新型 multilibABI_X86
之间的区别,您可以按照链接到的博客中的说明开始体验和测试。app-emulation/emul-linux-x86-xlibs-20130224
app-emulation/emul-linux-x86-xlibs-20130224-r2
但是,如果您对旧式二进制包感到满意,我认为它app-emulation/emul-linux-x86-xlibs-20130224
应该保持功能。-r2
如果您使用任何包,您只需要移动到直接依赖于另一个包的abi_x86_32
useflag(例如,app-emulation/emul-linux-x86-xlibs-20130224
和x1-libs/libX11[abi_x86_32]
不能共存,因为它们可能都将相同的库安装到/usr/lib32
,即/usr/lib32/libX11.so.6
)。 A快的看看wine-1.7.0.ebuild
向我表明它不需要-r2
。
答案2
还有 abi_x86_x32(与 abi_x86_32 不同)使用标志。这是实验性的,旨在构建半 64 位应用程序。唯一的区别是它们有 4 字节指针。这将内存使用量限制为 4GiB,并在大多数情况下减少开销,同时允许使用所有 64 位指令。
答案3
目前的情况真是地狱。问题似乎是许多软件包都是“半屏蔽”的......我不知道确切的术语,但似乎有些软件包的关键字为“~amd64”,带有“abi_x86_32”使用标志,而“amd64”没有使用标志结果是,在我的更新过程中,我启用了“abi_x86_32”,但emerge仍然会安装带有ABI_X86 =“(64)(-32)”的软件包,除非我为每个此类软件包添加“〜amd64”。如果它作为依赖项被拉取而不是直接出现,则不会提供自动取消屏蔽写入该更改 - emerge 只是告诉您它无法满足具有所需的“abi_x86_32”使用标志的该包的依赖项。所以我必须用“~amd64”将每个包一一添加到package.keywords中。这是大量的手动工作...我应该为哪个软件包版本执行此操作?我无法告诉它我真正想要什么,即“对于标记为“amd64”但没有使用标志的版本”。我可以放入我现在看到的特定最新版本,从而使其未来的更新变得复杂,或者放入所有版本,然后可能安装即使对于 64 位也未标记为稳定的版本...
答案4
间接相关信息:截至今天,systemd 上的完整 KDE 桌面系统可以以纯 multilib 方式编译(无仿真包)。现在唯一的问题是专有的 nvidia-drivers 软件包,但目前可以通过使用开源软件包来解决。
如何起点(其中包含其他链接): https://forums.gentoo.org/viewtopic-t-985380-highlight-.html
Gentoo Multilib 移植状态https://wiki.gentoo.org/wiki/Multilib_porting_status