ฉันต้องเปิดเผยว่าฉันมีประสบการณ์เล็กน้อยในการใช้multilib-build.eclass
สไตล์ multilib ใน Gentoo
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
ตัวแปรนี้ควบคุมการสนับสนุน multilib อย่างชัดเจนใน ebuilds ซึ่งใช้multilib-build.eclass
ซึ่งเป็นวิธีที่เหมือนกับ Gentoo ในการทำ multilib มากกว่าวิธีดั้งเดิม
วิธีการเดิมที่ห้องสมุด 32 บิตจะได้รับการติดตั้งใน Gentoo app-emulation/emul-linux-*
ผ่านทางภาพรวมไบนารีชื่อ แต่ละแพ็กเกจไบนารีการจำลองเหล่านี้มีไลบรารี 32- บิตทั้งชุดที่รวบรวมโดย Gentoo dev สำหรับคุณ เนื่องจากแต่ละคนติดตั้งมัดของไลบรารีที่ต้องประสานกันการติดตามการพึ่งพาของ ebuilds แบบ 32 บิตเท่านั้นจึงยากกว่า เช่นถ้าคุณต้องการ 32 บิตmedia-libs/alsa-lib
บนระบบ 32 บิตคุณเพียงแค่ติดตั้งmedia-libs/alsa-lib
แต่ในระบบ multilib 64 บิตที่คุณต้องพบว่าapp-emulation/emul-linux-soundlibs
การติดตั้งในหมู่ห้องสมุดอื่น ๆ รุ่น 32 media-libs/alsa-lib
บิต นอกจากนี้ Gentoo dev กำลังสร้างแพคเกจไบนารีหนึ่งแพคเกจดังกล่าวจะต้องทำงานในการหาองค์ประกอบของ multilib และ buildsystem ของแต่ละของห้องสมุดที่รวมอยู่ในแพคเกจภาพรวมทำให้การบำรุงรักษายากขึ้น และที่สำคัญที่สุดคือการให้แพคเกจไบนารีเป็นตัวเลือกอย่างเป็นทางการตัวเลือกเดียวสำหรับการใช้ multilib ใน Gentoo ซึ่งขัดกับจิตวิญญาณของ Gentoo คุณควรมีสิทธิ์รวบรวมทุกอย่างด้วยตัวคุณเอง!
การmultilib-build.eclass
ย้ายออกไปจากลักษณะการทำงานนี้โดยช่วยให้แต่ละ ebuilds ติดตั้งทั้งรุ่น 32 บิตและ 64 บิต ตัวอย่างเช่นควรอนุญาตให้wine
ระบุการพึ่งพาโดยตรงกับแพ็คเกจที่ต้องการแทนที่จะต้องดึงในapp-emulation/emul-linux-*
แพ็คเกจ ตามที่ susuenen กล่าวถึงในฟอรั่มกระทู้ที่คุณอ้างอิง :
= app-emulation / emul-linux-x86-xlibs-20130224-r1 ซึ่งเป็นแพคเกจเปล่าที่ไม่มีไฟล์เพราะตอนนี้ไฟล์มาโดยตรงจาก x11-libs /
(โปรดทราบว่า-r1
นับตั้งแต่ถูกเปลี่ยนชื่อเป็น-r2
) ในที่สุดapp-emulation/emul-linux-x86-xlibs
ตัวของมันเองควรจะถูกทิ้งเป็นแพ็คเกจ 32- บิตเท่านั้นอย่างเหมาะสมขึ้นอยู่กับแพคเกจที่ถูกต้องโดยตรงในx11-libs
นั้นด้วยmultilib-build.eclass
ความช่วยเหลือของให้ libs 32- บิตที่จำเป็น นี่คือที่ABI_X86
เข้ามาเล่น ใด ๆmultilib-build.eclass
แพคเกจที่เปิดใช้งานได้รับอย่างน้อยใหม่ใช้ธงabi_x86_32
และและอาจabi_x86_64
abi_x86_x32
การใช้EAPI=2
-style USE dependenciesแพคเกจสามารถขึ้นอยู่กับแพ็คเกจอื่น ๆ รุ่น 32 บิต หากx11-libs/libX11
ปรากฏในขณะABI_X86="32 64"
นั้นจะต้องติดตั้งพร้อมกับชุด USE-flag abi_x86_32
และabi_x86_64
USE-flags หากแพ็คเกจกราฟิกเฉพาะต้องการเวอร์ชัน 32 บิตlibX11
สามารถระบุได้x11-libs/libX11[abi_x86_32]
ในการพึ่งพาของมัน ด้วยวิธีนี้ถ้าคุณพยายามที่จะปรากฏแพ็คเกจกราฟิกนี้และlibX11
ยังไม่ได้ติดตั้ง libs 32- บิต, portage จะปฏิเสธ multilib-build.eclass
นอกจากนี้ยังเป็นสากลและสามารถทำงานร่วมกับระบบ 32 บิต: การติดตั้งแพคเกจกราฟิกเดียวกันนี้บนระบบ 32 บิตจะทำงานเสมอเพราะมันเป็นไปไม่ได้ที่จะติดตั้งlibX11
โดยไม่ต้องมันabi_x86_32
เป็นชุด useflag สิ่งนี้จะช่วยแก้ปัญหาของการจำเป็นต้องพึ่งพาapp-emulation/emul-linux-x86-xlibs
เมื่ออยู่บนระบบ multilib และโดยตรง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
ประเภทนี้: มันไม่ได้ติดตั้งอะไรเลยเพียงแค่ "ส่งต่อ" การพึ่งพาสำหรับ ebuild ที่มีอยู่
เราได้เห็นวิธีการ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 ตั้งแต่การขนส่งไปผ่านทุกขั้นตอน ebuild เหมือน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
มาจาก CFLAGS_x86 envvar ของโปรไฟล์หลายโปรไฟล์ (หมายเหตุ: ส่วนกำหนดค่าส่วนใหญ่อ้างอิงถึง ABI_X86 = 32 เป็น ABI = x86 และ ABI_X86 = 64 เป็น ABI = amd64) ในช่วงsrc_install()
เฟสทั้งหมดของ ABI ที่คอมไพล์แล้วจะถูกติดตั้งไว้ที่ eachother ดังนั้นเมื่อไฟล์ใดก็ตามที่มีทั้งเวอร์ชั่น 32- บิตและ 64- บิต ABI ดั้งเดิมจะชนะ (เช่น ebuild ที่ติดตั้งทั้งสองไลบรารีและไฟล์ที่รันได้ใน PATH - บิตที่ปฏิบัติการได้ใน PATH แต่รวมทั้งไลบรารี่ทั้งแบบ 32- บิตและ 64- บิต) เพื่อสรุป: เมื่อคุณตั้งค่าABI_X86="32 64"
ในmake.conf
แพคเกจใด ๆ ที่สนับสนุนmultilib-build.eclass
จะใช้เวลาประมาณสองเท่าของการทำงาน (ฉันไม่ได้บอกเวลา ;-)) เพื่อรวบรวมเป็นมันจะถูกสร้างขึ้นครั้งสำหรับแต่ละ ABI และผลในห้องสมุด 32 บิตใน/usr/lib32
.
ฉันไม่ทราบว่ามีเอกสารอย่างเป็นทางการสำหรับABI_X86
หรือยังสถานะรายละเอียด Ebuilds ที่ใช้multilib-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_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 flag แต่ฉันได้ทุกอย่างมาคอมไพล์และวิ่งด้วยกันอย่างมีความสุข! :-D