Tôi phải tiết lộ rằng tôi có ít kinh nghiệm sử dụng multilib-build.eclass
multilib trong Gentoo.
ABI_X86
là một USE_EXPAND
biến số; thiết lập ABI_X86="32 64"
hoặc USE="abi_x86_32 abi_x86_64"
là tương đương. Cài đặt mặc định của ABI_X86, kể từ khi viết bài này (2013-09-09), đối với default/linux/amd64/13.0
cấu hình dường như chỉ là ABI_X86=64
.
Biến này kiểm soát hỗ trợ multilib rõ ràng trong các ebuild sử dụng multilib-build.eclass
cách thức multilib giống như Gentoo hơn so với phương thức ban đầu.
Phương thức ban đầu mà các thư viện 32 bit sẽ được cài đặt trong Gentoo là thông qua các ảnh chụp nhanh nhị phân có tên app-emulation/emul-linux-*
. Mỗi gói nhị phân mô phỏng này chứa toàn bộ các thư viện 32 bit được một số nhà phát triển Gentoo biên soạn cho bạn. Bởi vì mỗi cái cài đặt một bó các thư viện phải được phối hợp với nhau, việc theo dõi các phụ thuộc của các ebuild chỉ có 32 bit là khó hơn. Ví dụ: nếu bạn cần 32 bit media-libs/alsa-lib
trên hệ thống 32 bit, bạn chỉ cần cài đặt media-libs/alsa-lib
, nhưng trên hệ thống multilib 64 bit, bạn phải khám phá rằng app-emulation/emul-linux-soundlibs
cài đặt đó , trong số các thư viện khác, phiên bản 32 bit media-libs/alsa-lib
. Ngoài ra, Gentoo dev xây dựng một gói nhị phân như vậy phải thực hiện công việc tìm ra các quirks multilib và buildsystem của mỗi góicủa các thư viện đi kèm trong gói ảnh chụp nhanh, khiến việc bảo trì khó khăn hơn. Và, quan trọng nhất, việc cung cấp các gói nhị phân là tùy chọn chính thức duy nhất để sử dụng multilib trong Gentoo đi ngược lại với tinh thần của Gentoo. Bạn nên có quyền tự biên dịch mọi thứ !
Việc multilib-build.eclass
tránh xa hành vi này bằng cách giúp các ebuild riêng lẻ cài đặt cả phiên bản 32 bit và 64 bit. Điều này sẽ cho phép, ví dụ, wine
chỉ cần chỉ định các phụ thuộc trực tiếp với các gói mà nó cần thay vì cần phải kéo app-emulation/emul-linux-*
các gói. Như ssuominen đề cập trong chủ đề diễn đàn mà bạn tham chiếu :
= app-emulation / emul-linux-x86-xlibs-20130224-r1 là gói trống không có tệp vì các tệp đến trực tiếp từ x11-libs /
(Lưu ý rằng -r1
từ đó đã được đổi tên thành -r2
) Cuối cùng, app-emulation/emul-linux-x86-xlibs
bản thân sẽ có thể được giảm xuống như các gói 32-bit chỉ thích hợp phụ thuộc trực tiếp vào các gói đúng ở x11-libs
đó, với multilib-build.eclass
sự giúp đỡ của, cung cấp các libs 32-bit cần thiết. Đây là nơi ABI_X86
đi vào chơi. Bất kỳ multilib-build.eclass
gói -enabled đạt ít nhất là sử dụng USE flag mới abi_x86_32
và abi_x86_64
và có lẽ abi_x86_x32
. Sử dụng các EAPI=2
phụ thuộc USE kiểu , các gói có thể phụ thuộc vào các phiên bản 32 bit của các gói khác. Nếu x11-libs/libX11
được xuất hiện trong khi đó ABI_X86="32 64"
, thì nó sẽ được cài đặt với cờ USE abi_x86_32
và cờ abi_x86_64
USE. Nếu một gói đồ họa cụ thể cần phiên bản 32 bit libX11
, nó có thể chỉ địnhx11-libs/libX11[abi_x86_32]
trong sự phụ thuộc của nó. Bằng cách này, nếu bạn cố gắng xuất hiện gói đồ họa này và libX11
chưa cài đặt lib 32 bit, portage sẽ từ chối. multilib-build.eclass
cũng là phổ quát và tương thích với các hệ thống 32 bit: cài đặt gói đồ họa tương tự này trên hệ thống 32 bit sẽ luôn hoạt động vì không thể cài đặt libX11
mà không cài đặt abi_x86_32
hữu ích. Điều này giải quyết vấn đề cần phải phụ thuộc vào app-emulation/emul-linux-x86-xlibs
khi nào trên hệ thống multilib và trực tiếp trên x11-libs/libX11
hệ thống chỉ có 32 bit. Chúng tôi đang mở đường cho việc có các phụ thuộc liên gói sạch hơn và hợp lý trên các hệ thống multilib. =app-emulation/emul-linux-x86-xlibs-20130224-r2
tồn tại như một trung gian cho phép mọi gói cũ được sử dụng để phụ thuộc vào app-emulation/emul-linux-x86-xlibs
việc không biết cách phụ thuộc trực tiếp vào, ví dụ, x11-libs/libX11[abi_x86_32]
vẫn hoạt động.=app-emulation/emul-linux-x86-xlibs-20130224-r2
đảm bảo rằng các thư viện 32 bit tương tự tồn tại /usr/lib32
như thể =app-emulation/emul-linux-x86-xlibs-20130224
đã được cài đặt, nhưng thực hiện theo cách Gentoo bằng cách xây dựng các thư viện 32 bit này thông qua các phụ thuộc thay vì cung cấp gói nhị phân. Nó hoạt động giống như các gói trong virtual
danh mục theo cách này: nó không cài đặt bất cứ thứ gì, chỉ phụ thuộc "chuyển tiếp" cho các ebuild hiện có.
Chúng ta đã thấy cách multilib-build.eclass
mở đường cho sự phụ thuộc sạch hơn vào các hệ thống multilib. Bất kỳ gói nào có ABI_X86
tùy chọn (tương tự như nói nó có abi_x86_*
useflags) đã cài đặt phiên bản 32 bit của chính nó nếu bạn đã chỉ định USE=abi_x86_32
/ ABI_X86=32
. Làm thế nào để nó hoạt động (ở mức độ khái niệm cao)? Bạn có thể đọc ebuild chính nó. Về cơ bản, ý tưởng này giống như các ebuild python hoặc ruby có tùy chọn tự cài đặt cho nhiều phiên bản của python và ruby cùng một lúc. Khi một ebuild kế thừa multilib-build.eclass
, nó lặp lại ABI_X86 và thực hiện từng bước của quá trình giải nén, biên dịch và cài đặt cho mỗi mục trong ABI_X86. Kể từ portage đi qua tất cả các giai đoạn ebuild như src_unpack()
, src_compile()
và src_install()
(và những người khác) theo thứ tự và chỉ một lần, cácmultilib-build.eclass
(hiện tại, với sự trợ giúp của multibuild.eclass
), việc sử dụng sẽ tạo một thư mục cho mỗi giá trị khác nhau của ABI_X86. Nó sẽ giải nén một bản sao của các nguồn cho mỗi thư mục này. Từ đó, mỗi thư mục này bắt đầu phân kỳ khi mỗi mục tiêu là một ABI cụ thể. Thư mục cho ABI_X86=32
sẽ ./configure --libdir=/usr/lib32
chạy với FLAGS nhắm mục tiêu 32 bit (ví dụ: CFLAGS=-m32
xuất phát từ CFLAGS_x86 envvar của cấu hình multilib (lưu ý: cấu hình portage chủ yếu đề cập đến ABI_X86 = 32 là ABI = x86 và ABI_X86 = 64 là ABI = amd64). Trong thời giansrc_install()
pha, tất cả các ABI được biên dịch khác nhau được cài đặt trên nhau để khi bất kỳ tệp nào có cả phiên bản 32 bit và 64 bit, ABI bản địa sẽ thắng (ví dụ: một ebuild cài đặt cả thư viện và tệp thực thi trong PATH sẽ chỉ cài đặt 64 -bit thực thi vào PATH nhưng bao gồm cả thư viện 32 bit và 64 bit). Tổng hợp: khi bạn thiết lập ABI_X86="32 64"
trong make.conf
, bất kỳ gói mà hỗ trợ multilib-build.eclass
sẽ mất khoảng gấp đôi so với khối lượng công việc (Tôi không nói rằng thời gian ;-)) để biên dịch vì nó đang được xây dựng một lần cho mỗi ABI và kết quả trong thư viện 32-bit trong /usr/lib32
.
Tôi không biết có tài liệu chính thức ABI_X86
nào chưa hoặc tình trạng chi tiết của nó. Ebuilds sử dụng multilib-build.eclass
dường như không ổn định cho đến nay. Bạn có thể làm theo các hướng dẫn tại blog bạn đã liên kết để bắt đầu trải nghiệm và thử nghiệm ABI_X86
nếu bạn hiểu sự khác biệt giữa app-emulation/emul-linux-x86-xlibs-20130224
và multilib kiểu mới app-emulation/emul-linux-x86-xlibs-20130224-r2
. Nhưng, nếu bạn ổn với gói nhị phân kiểu cũ, tôi nghĩ rằng nó app-emulation/emul-linux-x86-xlibs-20130224
vẫn hoạt động. Bạn sẽ chỉ cần phải di chuyển đến -r2
nếu bạn sử dụng bất kỳ gói mà trực tiếp phụ thuộc vào của gói khác abi_x86_32
useflag (ví dụ, app-emulation/emul-linux-x86-xlibs-20130224
và x1-libs/libX11[abi_x86_32]
không thể cùng tồn tại bởi vì họ có thể cả cài đặt cùng một thư viện để /usr/lib32
, cụ thể là /usr/lib32/libX11.so.6
). Một cách nhanh chóngnhìn vào wine-1.7.0.ebuild
gợi ý cho tôi rằng nó không cần -r2
.
app-emulation/emul-linux-x86
và các gói khác phụ thuộc vào các đối tác trực tiếp của chúng. Phải mất rất nhiều thay đổi từ khóa và cờ USE, nhưng tôi có mọi thứ để biên dịch và chạy hạnh phúc cùng nhau! :-D