ฉันต้องเปิดเผยว่าฉันมีประสบการณ์เล็กน้อยในการใช้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.0ABI_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_64USE-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_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
app-emulation/emul-linux-x86อื่น ๆ ขึ้นอยู่กับคู่ของพวกเขาโดยตรง มันใช้คีย์เวิร์ดจำนวนมากและการเปลี่ยนแปลงของ USE flag แต่ฉันได้ทุกอย่างมาคอมไพล์และวิ่งด้วยกันอย่างมีความสุข! :-D