Треба multilib-build.eclass
сказати, що у Gentoo у мене мало досвіду використання -style multilib.
ABI_X86
- USE_EXPAND
змінна; налаштування ABI_X86="32 64"
або USE="abi_x86_32 abi_x86_64"
еквівалентні. Налаштування ABI_X86 за замовчуванням станом на цей текст (2013-09-09) для default/linux/amd64/13.0
профілю здається справедливим ABI_X86=64
.
Ця змінна керує явною підтримкою багатолітражів у ebuilds, яка використовує multilib-build.eclass
більш гентоподібний спосіб робити multilib, ніж оригінальний метод.
Оригінальний метод встановлення 32-розрядної бібліотеки в Gentoo - це бінарні знімки з назвою app-emulation/emul-linux-*
. Кожен з цих двійкових пакунків емуляції містить цілий набір 32-бітових бібліотек, зібраних для вас деяким розробником Gentoo. Оскільки кожна з них встановлює набір бібліотек, які повинні бути узгоджені разом, відстежувати залежності 32-бітових електронних будівель важче. Наприклад, якщо вам потрібна 32-розрядна система media-libs/alsa-lib
в 32-бітній системі, ви просто встановите media-libs/alsa-lib
, але в 64-бітній багатолібковій системі вам доведеться виявити, що app-emulation/emul-linux-soundlibs
встановлюється серед інших бібліотек 32-розрядна версія media-libs/alsa-lib
. Крім того, Gentoo Dev, що створює один такий двійковий пакет, повинен виконувати роботу з з'ясування мультилібкових і побудови системних вигадок кожногоз включених бібліотек до пакету знімків, що ускладнює обслуговування. І, найголовніше, надання бінарних пакетів як єдиного офіційного варіанту використання мультиліб у Gentoo суперечить духу Gentoo. Ви повинні мати право складати все самостійно!
У multilib-build.eclass
віддаляється від такої поведінки, допомагаючи окремі складальні встановити як 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
-Enabled пакет отримує принаймні нові USE-прапори abi_x86_32
і abi_x86_64
та , ймовірно abi_x86_x32
. Використовуючи EAPI=2
-style USE залежності , пакети можуть залежати від 32-бітних версій інших пакетів. Якщо x11-libs/libX11
це з'явилося в той час ABI_X86="32 64"
, він повинен бути встановлений за допомогою USE-прапорів abi_x86_32
та abi_x86_64
USE-прапорів. Якщо певному графічному пакету потрібна 32-бітна версія libX11
, він може вказатиx11-libs/libX11[abi_x86_32]
в її залежностях. Таким чином, якщо ви спробуєте вивести цей графічний пакет і libX11
не встановили 32-бітні libs, portage відмовиться. multilib-build.eclass
також є універсальним і сумісний з 32-бітовими системами: встановлення цього ж графічного пакета в 32-бітній системі завжди працюватиме, оскільки неможливо встановити libX11
без встановлення його abi_x86_32
useflag. Це вирішує проблему необхідності залежати від того, app-emulation/emul-linux-x86-xlibs
коли буде багатомільтова система та безпосередньо від x11-libs/libX11
32-бітової системи. Ми прокладаємо шлях до більш чистих і розумних залежностей між пакетами від багатолібкових систем. =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
категорії таким чином: він нічого не встановлює, просто "вперед" залежність для існуючих ebuilds.
Ми бачили, як multilib-build.eclass
відкриває шлях до більш чистих залежностей від багатолібкових систем. Будь-який пакунок, який має ABI_X86
параметри (те саме, що він має abi_x86_*
useflags), встановив 32-бітну версію, якщо ви вказали USE=abi_x86_32
/ ABI_X86=32
. Як це працює (на високому концептуальному рівні)? Ви можете прочитати сам ebuild. В основному, ідея така ж, як python або ruby ebuilds, які мають можливість встановити себе для декількох версій python та ruby одночасно. Коли ebuild успадковується multilib-build.eclass
, він переходить на ABI_X86 і робить кожен етап процесу розпакування, компіляції та установки для кожного запису в ABI_X86. Оскільки волок проходить через весь ебілд фаз , як src_unpack()
, src_compile()
, і src_install()
(і інші) в порядку і тільки один раз,multilib-build.eclass
(в даний час за допомогою multibuild.eclass
) використовує створює каталог для кожного різного значення ABI_X86. Він розпакує копію джерел до кожного з цих каталогів. Звідти кожен із цих каталогів починає розходитися, оскільки кожен націлений на певний ABI. Каталог для ABI_X86=32
буде ./configure --libdir=/usr/lib32
запускатися з націлюванням на FLAGS на 32-бітне (наприклад, CFLAGS=-m32
походить від envivar CFLAGS_x86 мультілібкового профілю (зауважте: профілі переносу здебільшого посилаються на ABI_X86 = 32 як ABI = x86, а ABI_X86 = 64 як ABI = amd64)). Під часsrc_install()
Фаза, всі різні компільовані ABI встановлюються іншим чином, так що коли будь-які файли мають і 32-бітну, і 64-бітну версії, нативний ABI виграє (наприклад, ebuild, що встановлює обидві бібліотеки та виконувану програму в PATH, встановить лише 64 -біт, який виконується в PATH, але включає 32-бітну та 64-бітну бібліотеки). Резюмуючи: при установці ABI_X86="32 64"
в make.conf
будь-який пакет , який підтримує multilib-build.eclass
займе приблизно в два рази більше роботи (я не кажу , що час ;-)) для компіляції , як вона будується один раз для кожного ABI і результати в 32-бітних бібліотек в /usr/lib32
.
Я не знаю, чи є ще офіційна документація ABI_X86
або її детальний стан. На сьогоднішній день будівництво, що використовується, multilib-build.eclass
здається, здебільшого нестабільне. Ви можете дотримуватися вказівок на блозі, до якого ви пов’язані, щоб почати переживати і тестувати, ABI_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
). швидкоПодивіться на wine-1.7.0.ebuild
підказки мені, що це не потрібно -r2
.
app-emulation/emul-linux-x86
інших, а інші залежать від їхніх прямих аналогів. Потрібно було багато змін ключових слів і USE прапор, але я все мав для компіляції та роботи із задоволенням разом! :-D