Roc*_*mat 24 gentoo package-management x86 emerge
我更新我的 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”包(我当时似乎需要的包)。
bin*_*nki 33
我必须透露,我multilib-build.eclass在 Gentoo 中使用-style multilib 的经验很少。
ABI_X86是一个USE_EXPAND变量;设置ABI_X86="32 64"或USE="abi_x86_32 abi_x86_64"等效。在撰写本文 (2013-09-09) 时,ABI_X86 的默认设置default/linux/amd64/13.0似乎只是ABI_X86=64.
该变量控制 ebuild 中的显式 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,但在 64 位 multilib 系统上,您必须发现app-emulation/emul-linux-soundlibs安装了media-libs/alsa-lib. 此外,Gentoo 开发人员构建一个这样的二进制包必须要弄清楚每个包的 multilib 和 buildsystem 怪癖。快照包中包含的库,使维护更加困难。而且,最重要的是,提供二进制包作为在 Gentoo 中使用 multilib 的唯一选项官方选项违背了 Gentoo 的精神。你应该有权自己编译一切!
在multilib-build.eclass帮助个人从ebuilds的这种行为远离移动安装两个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 dependencies,包可以依赖于其他包的 32 位版本。如果x11-libs/libX11出现 while ABI_X86="32 64",则安装时应设置 USE-flagsabi_x86_32和abi_x86_64USE-flags。如果特定图形包需要 32 位版本的libX11,则可以指定x11-libs/libX11[abi_x86_32]在其依赖项中。这样,如果你尝试emerge这个图形包并且libX11没有安装32位的libs,portage会拒绝。multilib-build.eclass也是通用的并且与 32 位系统兼容:在 32 位系统上安装相同的图形包将始终有效,因为如果libX11不abi_x86_32设置 useflag就无法安装。这解决了需要依赖app-emulation/emul-linux-x86-xlibs何时在 multilib 系统上和直接在x11-libs/libX1132 位系统上的问题。我们正在为在 multilib 系统上拥有更清晰、更合理的包间依赖关系铺平道路。=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已安装一样,但通过其依赖项构建这些 32 位库而不是提供二进制包,这是 Gentoo 的方式。它的行为方式很像virtual类别中的包:它不安装任何东西,只是“转发”现有 ebuild 的依赖项。
我们已经看到如何multilib-build.eclass为更清晰的 multilib 系统依赖性铺平道路。如果您指定了/ ,则任何具有ABI_X86选项(与说它具有abi_x86_*useflags 相同)的包都安装了其自身的 32 位版本。这是如何工作的(在高概念层面)?您可以阅读 ebuild 本身。基本上,这个想法与 python 或 ruby ebuilds 相同,它们可以选择同时为多个版本的 python 和 ruby 安装自己。当 ebuild 继承 时,它会遍历 ABI_X86 并为 ABI_X86 中的每个条目执行解包、编译和安装过程的每一步。由于Portage经历都喜欢的ebuild阶段,和以(及其他),只有一次,USE=abi_x86_32ABI_X86=32multilib-build.eclasssrc_unpack()src_compile()src_install()multilib-build.eclass(目前,在 的帮助下multibuild.eclass)使用为 ABI_X86 的每个不同值创建一个目录。它会将源的副本解压缩到每个目录中。从那里开始,这些目录中的每一个都开始出现分歧,因为每个目录都针对特定的 ABI。该目录ABI_X86=32将./configure --libdir=/usr/lib32使用面向 32 位的 FLAGS 运行(例如,CFLAGS=-m32来自 multilib 配置文件的 CFLAGS_x86 envvar(注意:portage 配置文件主要将 ABI_X86=32 称为 ABI=x86,将 ABI_X86=64 称为 ABI=amd64))。在此期间src_install()阶段,所有不同的编译 ABI 都相互安装,因此当任何文件同时具有 32 位和 64 位版本时,本机 ABI 获胜(例如,安装这两个库的 ebuild 和 PATH 中的可执行文件将仅安装 64 -bit 可执行文件到 PATH 但包括 32 位和 64 位库)。总而言之:当您设置ABI_X86="32 64"in 时make.conf,任何支持的包multilib-build.eclass将花费大约两倍的工作量(我不是说时间;-))进行编译,因为它为每个 ABI 构建一次,并生成 32 位库/usr/lib32.
我不知道是否有官方文档ABI_X86或其详细状态。目前使用的 Ebuildmultilib-build.eclass似乎大多不稳定。ABI_X86如果您了解app-emulation/emul-linux-x86-xlibs-20130224与新型 multilib之间的区别,您可以按照您链接的博客中的说明开始体验和测试app-emulation/emul-linux-x86-xlibs-20130224-r2。但是,如果您对旧式二进制包没问题,我认为它app-emulation/emul-linux-x86-xlibs-20130224应该保持功能。-r2如果您使用任何直接依赖于另一个包的abi_x86_32useflag 的包(例如,app-emulation/emul-linux-x86-xlibs-20130224并且x1-libs/libX11[abi_x86_32]不能共存,因为它们可能都将相同的库安装到/usr/lib32,即/usr/lib32/libX11.so.6),您只需要移动到。一个快速看wine-1.7.0.ebuild向我建议它不需要-r2.