ใช้ ABI_X86 ใน Gentoo


24

เป็นเวลาหลายเดือนแล้วที่ฉันได้อัพเดตระบบ Gentoo ของฉัน และอย่างที่คุณจินตนาการได้นั่นหมายถึงมีแพ็คเกจมากมาย (และการเปลี่ยนแปลงการใช้งาน) ฉันต้องทำต่อไป ระบบของฉันคือ "amd64" (multilib) แต่ฉันมีแพคเกจคีย์เวิร์ดมากมายจาก "~ amd64"

อย่างไรก็ตามในการอัปเดตนี้ฉันเห็นการใช้ธง "ABI_X86" อยู่เสมอ นี่คืออะไร? นี่คือใหม่ ไม่มีอะไรใน "eselect news list" เกี่ยวกับมัน

ผมพบว่าหัวข้อนี้: http://forums.gentoo.org/viewtopic-t-953900-start-0.html ดูเหมือนว่าจะแสดงวิธีใช้ แต่มีเอกสาร "ของจริง" สำหรับสิ่งนี้หรือไม่ มันทำอะไร? ฉันควรตั้งค่า "ABI_X86" เป็นอะไร ฉันมีระบบ multilib ฉันคิดว่าฉันต้องการ "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 ฉันมีแพ็คเกจ "แอพจำลอง / emul-linux-x86" ส่วนใหญ่ (ไฟล์ที่ฉันต้องการในเวลานั้น) ในไฟล์ "package.keywords" ของฉัน

คำตอบ:


32

ฉันต้องเปิดเผยว่าฉันมีประสบการณ์เล็กน้อยในการใช้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


2
ฉันรู้ว่านี่คือ 3 เดือนต่อมา แต่ฉันอยากจะขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้ การมีแพ็กเกจ "amd64" และ "~ amd64" นั้นหมายถึงบางอย่างขึ้นอยู่กับแพคเกจapp-emulation/emul-linux-x86อื่น ๆ ขึ้นอยู่กับคู่ของพวกเขาโดยตรง มันใช้คีย์เวิร์ดจำนวนมากและการเปลี่ยนแปลงของ USE flag แต่ฉันได้ทุกอย่างมาคอมไพล์และวิ่งด้วยกันอย่างมีความสุข! :-D
จรวดฮาซแมตต์

2

นอกจากนี้ยังมี abi_x86_x32 (ซึ่งไม่เหมือนกับ abi_x86_32) ใช้การตั้งค่าสถานะ อันนี้เป็นการทดลองและตั้งใจที่จะสร้างโปรแกรมกึ่ง 64 บิต ข้อแตกต่างคือพวกมันมีพอยน์เตอร์ 4byte สิ่งนี้ จำกัด การใช้หน่วยความจำให้กับ 4GiB และลดค่าใช้จ่ายในกรณีส่วนใหญ่ในขณะที่อนุญาตให้ใช้คำสั่ง 64 บิตทั้งหมด


ฉันค้นหาสิ่งนี้ คุณมีลิงค์ไปสู่เอกสารเกี่ยวกับการตั้งค่าสถานะ x32 หรือไม่?
ikrabbe

0

ปัจจุบันสถานการณ์เป็นนรกที่แท้จริง ปัญหาน่าจะเป็นที่แพคเกจจำนวนมากเป็น "ครึ่งหน้ากาก" ... ฉันไม่ทราบคำศัพท์ที่แน่นอน แต่ดูเหมือนว่าแพคเกจบางอย่างจะคีย์เวิร์ด "~ amd64" กับ "abi_x86_32" ใช้ธงและ "amd64" โดยไม่ต้อง ที่ใช้แฟล็ก ... ผลลัพธ์คือในระหว่างการอัพเดตฉันเปิดใช้งาน "abi_x86_32" แต่ปรากฏว่ายังคงติดตั้งแพ็คเกจด้วย ABI_X86 = "(64) (-32)"-เว้นแต่จะเพิ่ม "~ amd64" ต่อแต่ละแพ็คเกจดังกล่าว และถ้ามันถูกดึงเป็นการอ้างอิงแทนการโผล่ออกมาโดยตรงไม่มีข้อเสนอให้ autounmask- เขียนการเปลี่ยนแปลงนั้น - โผล่ออกมาแค่บอกคุณว่ามันไม่สามารถตอบสนองการพึ่งพาสำหรับแพ็คเกจนั้นด้วยการใช้ธง "abi_x86_32" ที่ต้องการ ดังนั้นฉันต้องเพิ่มแต่ละแพ็กเกจทีละชุดเพื่อคีย์คำหลักด้วย "~ amd64" นั่นเป็นงานที่ทำด้วยมือมากมาย ... และเวอร์ชันแพคเกจใดที่ฉันควรทำ ฉันไม่สามารถบอกได้ว่าสิ่งที่ฉันต้องการคือ "สำหรับรุ่นที่มีการทำเครื่องหมาย" amd64 "โดยไม่ต้องใช้การตั้งค่าสถานะ" ฉันสามารถใส่รุ่นล่าสุดเฉพาะที่ฉันเห็นตอนนี้และทำให้การปรับปรุงในอนาคตมีความซับซ้อนหรือใส่ในทุกรุ่นและอาจติดตั้งรุ่นที่ไม่ได้ทำเครื่องหมายว่ามีเสถียรภาพแม้กระทั่งสำหรับ 64 บิต ...


2
ฉันคิดว่าคำตอบของคุณอาจได้รับประโยชน์จากการเขียนใหม่และ / หรือการคิดใหม่ เนื่องจากมันไม่ได้เพิ่มคำตอบที่โพสต์ไว้แล้ว
Sami Laine

เกี่ยวกับ“ฉันสามารถใส่เฉพาะรุ่นล่าสุดที่ผมเห็นในขณะนี้จึงมีความซับซ้อนการปรับปรุงในอนาคตของตนหรือใส่ในทุกรุ่นและจากนั้นอาจจะติดตั้งรุ่นที่ไม่ได้ทำเครื่องหมายที่มีเสถียรภาพแม้สำหรับ 64bit ..” ถ้าคุณเพียงแค่นำmy-category/packageเข้าpackage.keywords, การขนส่งจะ ตีความโดยอัตโนมัติว่าเป็นการยอมรับใด ๆ~amd64(สมมติว่าคุณเป็นARCH=amd64) คุณจะได้รับพฤติกรรมที่คุณอธิบาย (รุ่นที่ตรงกันโดยไม่ต้อง~amd64ธง) my-category/package **ถ้าคุณบอกว่าสิ่งที่ต้องการ
binki

เซนี่น่าจะเป็นความเห็นที่ไม่ใช่คำตอบถ้ามีเพียงนโยบายการแลกเปลี่ยนสแต็คเท่านั้นที่เข้าท่า (Franky ฉันประหลาดใจที่ให้ฉันแสดงความคิดเห็นในเวลานี้ ... )
user73010

binki, อ่านซ้ำ ... ฉันไม่ต้องการรุ่น ~ amd64 ทั้งหมด ฉันต้องการเวอร์ชันเหล่านั้นที่จะเป็น "amd64" (ไม่แน่นอน) หากมีหากไม่มี "abi_x86_32" ให้ใช้การตั้งค่าสถานะ
73010

-1

ข้อมูลที่เกี่ยวข้องทางอ้อม: ณ วันนี้ระบบเดสก์ท็อป KDE ที่สมบูรณ์แบบบน systemd สามารถรวบรวมได้ด้วยวิธี multilib บริสุทธิ์ (ไม่มีแพ็คเกจการจำลอง) ปัญหาเดียวคือตอนนี้แพ็คเกจ nvidia-drivers ที่เป็นกรรมสิทธิ์ แต่สามารถแก้ไขได้ด้วยการใช้โอเพ่นซอร์สหนึ่งเดียว

วิธีเริ่มต้น (ลิงก์อื่น ๆ รวมอยู่ที่นั่น): https://forums.gentoo.org/viewtopic-t-985380-highlight-.html

สถานะการย้ายพอร์ต Gentoo Multilib https://wiki.gentoo.org/wiki/Multilib_porting_status


นี่เป็นเพียงความคิดเห็นไม่มีคำตอบ
Jonas Stein

โจนัสไม่ใช่ปัญหากับคำตอบ แต่คำถามถ้าคุณเข้าใจ :-) มันเป็นเรื่องธรรมดามากขนาดของเนื้อหาคำตอบล้วนๆไม่ใช่จากมุมมองที่จะใส่ที่นี่ดังนั้นฉันจึงควรให้ลิงก์ไปและ การศึกษา ... คุณเห็นด้วยไหม ดังนั้นฉันกำลังพูดว่ามันไม่ถูกที่จะถามคำถามแบบนี้ แต่ไปที่ฟอรัม gentoo .... เข้าท่าใช่ไหม?
เคนไซ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.