在 Gentoo 中使用 ABI_X86
我已經有幾個月沒有更新我的 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”包(我當時似乎需要的包)。
我必須透露我
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 的依賴關係更加困難。例如,如果您在 32 位系統上需要 32位,media-libs/alsa-lib
您只需安裝. 此外,建構一個這樣的二進制包的 Gentoo 開發人員必須弄清楚每個包的 multilib 和 buildsystem 怪癖。media-libs/alsa-lib``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 dependencies,包可以依賴於其他包的 32 位版本。如果x11-libs/libX11
出現 whileABI_X86="32 64"
,則應安裝 USE-flagsabi_x86_32
並abi_x86_64
設置 USE-flags。如果特定的圖形包需要 32 位版本libX11
,它可以指定x11-libs/libX11[abi_x86_32]
在它的依賴中。這樣,如果你嘗試emerge這個圖形包並且libX11
沒有安裝32位的庫,portage會拒絕。multilib-build.eclass
也是通用的並且與 32 位系統兼容:在 32 位系統上安裝相同的圖形包將始終有效,因為如果libX11
不設置其abi_x86_32
useflag 就無法安裝。這解決了需要依賴app-emulation/emul-linux-x86-xlibs
when 在 multilib 系統上和直接在x11-libs/libX11
32 位系統上的問題。我們正在為在 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
已經安裝一樣,但它是通過 Gentoo 的方式通過其依賴項建構這些 32 位庫而不是提供二進制包來實現的。**它的行為很像該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_32``ABI_X86=32``multilib-build.eclass``src_unpack()``src_compile()``src_install()``multilib-build.eclass
(目前,在 的幫助下multibuild.eclass
)使用為 ABI_X86 的每個不同值創建一個目錄。它會將源的副本解壓縮到每個目錄。從那裡開始,這些目錄中的每一個都開始出現分歧,因為每個目錄都針對特定的 ABI。for 的目錄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 獲勝(例如,在 PATH 中安裝兩個庫和執行檔的 ebuild 將僅安裝 64 -bit 可執行到 PATH 中,但包括 32 位和 64 位庫)。總而言之:當您設置ABI_X86="32 64"
時make.conf
,任何支持的包都multilib-build.eclass
將花費大約兩倍的工作量(我不是說時間;-))編譯,因為它為每個 ABI 建構一次並導致 32 位庫/usr/lib32
.我不知道是否有官方文件
ABI_X86
或其詳細狀態。目前使用的 Ebuildmultilib-build.eclass
似乎大多不穩定。如果您了解與新式 multilibABI_X86
之間的區別,則可以按照連結到的部落格中的說明開始體驗和測試。但是,如果你對舊式二進制包沒問題,我認為它***應該可以正常工作。**如果您使用直接依賴於另一個包的useflag的任何包(例如,並且不能共存,因為它們可能都將相同的庫安裝到,即) ,您只需要移動到。一個快速*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
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
.