อะไรคือความแตกต่างของตัวเลือก“ ./configure”“ --build”,“ --host” และ“ --target”?


121

สคริปต์ที่./configureยอมรับเลือก 3 --build, และ--host --targetฉันสับสนบทบาทของพวกเขา อะไรคือความแตกต่างและความหมายของพวกเขา?


Autotools จะใช้ toolchain ที่ไม่ถูกต้องสำหรับการคอมไพล์ข้ามแม้กระทั่งการใช้--hostและ--build. ฉันมีโปรเจ็กต์ C ++ สองโปรเจ็กต์และเป็นไปไม่ได้ที่จะสร้างสำหรับ Android เพราะ Autotools นั้นดีมาก ยืนยันในการดำเนินการทดสอบโดยใช้ toolchain ของโฮสต์
jww

คำตอบ:


109

ตามที่ระบุไว้ในบล็อกโพสต์นี้และพูดพาดพิงถึงในข้อตกลง GCC กำหนดค่า , --targetใช้เฉพาะเมื่อคุณกำลังรวบรวม toolchains เมื่อคุณทำการคอมไพล์ข้ามไลบรารีหรือไบนารีตามปกติที่คุณใช้

--build=the architecture of the build machine
--host=the architecture that you want the file to run on

แต่เมื่อคุณกำลังสร้าง toolchains สิ่งที่ได้รับความซับซ้อนมากขึ้น ฉันคิดว่าสิ่งต่อไปนี้ถูกต้อง (แม้ว่าฉันจะไม่สามารถบอกได้ว่าฉันเคยรวบรวมโปรแกรมแก้ไขจุดบกพร่องด้วยตนเอง):

บอกว่าคุณมี:

  • เครื่องสร้าง powerpc ที่คุณกำลังจะทำการรวบรวมทั้งหมด
  • อุปกรณ์ฝังตัวหลายตัวพร้อมโปรเซสเซอร์ mips ซึ่งโค้ดของคุณกำลังจะทำงาน
  • แล็ปท็อป x86 ที่คุณจะใช้สำหรับการดีบักอุปกรณ์เหล่านี้ในสนาม

คุณต้องกำหนดค่าและสร้างเซิร์ฟเวอร์การดีบัก (เช่น gdbserver) เพื่อทำงานบนอุปกรณ์ฝังตัวของคุณด้วย

./configure --build=powerpc --host=mips

เพื่อให้คุณสามารถฉาบไปยังอุปกรณ์ฝังตัวของคุณและเรียกใช้ "gdbserver: 1234 a.out" เพื่อเริ่มการดีบักและฟังบนพอร์ต 1234

จากนั้นคุณจะสร้างไคลเอ็นต์การดีบัก (ซึ่งเชื่อมต่อและควบคุม gdbserver) ด้วย

./configure --build=powerpc --host=i686 --target=mips 

ซึ่งคุณจะคัดลอกไปยังแล็ปท็อป x86 ของคุณเพื่อให้คุณสามารถเรียกใช้ "gdbclient embed.device: 1234" ในฟิลด์เพื่อดีบักโปรแกรม a.out ของคุณ

ทั้งหมดนี้ใช้กับคอมไพเลอร์ด้วยเช่นกันซึ่งคุณอาจต้องการดูลิงก์ GCC ด้านบนหรือส่วนนี้เกี่ยวกับการคอมไพล์ข้ามแคนาดา

โปรดทราบว่าในทางปฏิบัติคุณอาจไม่เห็นบิลด์โฮสต์หรือเป้าหมายที่ระบุไว้เนื่องจากตามหน้าคู่มือ Autoconf "กำหนดเป้าหมายเริ่มต้นเป็นโฮสต์โฮสต์ที่จะสร้างและสร้างตามผลลัพธ์ของ config.guess"

ในคำสร้างรหัส--buildเรียกใช้--hostด้วย--targetสภาพแวดล้อมสถาปัตยกรรม


11
จะหาอะไรใส่ "โฮสต์" และ "เป้าหมาย" ได้อย่างไร?
Black

4
ฉันเดาว่าคุณกำลังพูดถึงการสร้างคอมไพเลอร์ใหม่เนื่องจาก "- เป้าหมาย" เกี่ยวข้องกับคอมไพเลอร์เท่านั้น * "โฮสต์" คือที่ที่คอมไพเลอร์ใหม่ของคุณควรเรียกใช้ * "target" คือที่ที่ไฟล์ปฏิบัติการที่สร้างโดยคอมไพเลอร์ใหม่ของคุณควรรัน
user1735594

สิ่งนี้ไม่ทำให้เป็นคำตอบที่ผิดเพราะ --host = i686 ไม่ถูกต้องที่นี่?
infoclogged

1
คำตอบที่ระบุถึงการคอมไพล์เสร็จสิ้นสำหรับเป้าหมาย MIPS และนี่คือบิลด์และโฮสต์คือดีบักเกอร์สำหรับเครื่อง MIPS นี่หมายความว่าตัวดีบักเกอร์ / คอมไพเลอร์ถูกสร้างโดย powerpc ด้วยหรือไม่? นี่เป็นความคิดเห็นที่ฉันได้รับจากผู้ใช้รายอื่น (Ned): build = ฉันกำลังรวบรวมคอมไพเลอร์อยู่ที่ไหนโฮสต์ = ที่คอมไพเลอร์จะทำงานเป้าหมาย = รหัสใดที่คอมไพเลอร์จะสร้าง อ้างอิง: stackoverflow.com/questions/7088576/…
supmethods

ตามที่ Ned ไม่ได้หมายความว่า powerpc เป็นทั้ง build / host เครื่อง x86 เป็นเป้าหมายของดีบักเกอร์และเป้าหมายเป็นระบบ MIPS ช่วยอธิบายเพิ่มเติมได้ไหมว่า "building for" และ "building on" คืออะไร? ผมอ้างอิงไปgcc.gnu.org/onlinedocs/gccint/Configure-Terms.html
supmethods

75

หมายเหตุ:อาร์กิวเมนต์มี--targetเหตุผลเฉพาะเมื่อสร้างคอมไพเลอร์ (เช่น GCC) เมื่อทำงานconfigureก่อนสร้าง GCC:

  • --build: เครื่องจักรที่คุณกำลังสร้าง
  • --host: เครื่องจักรที่คุณกำลังสร้าง
  • --target: เครื่องที่ GCC จะผลิตไบนารีให้

จากเอกสาร GCC ( หมายเหตุการติดตั้งเฉพาะโฮสต์ / เป้าหมาย ):

หากบิลด์โฮสต์และเป้าหมายเหมือนกันทั้งหมดจะเรียกว่าเนทีฟ หากบิลด์และโฮสต์เหมือนกัน แต่เป้าหมายต่างกันสิ่งนี้เรียกว่าครอส หากบิลด์โฮสต์และเป้าหมายแตกต่างกันทั้งหมดสิ่งนี้เรียกว่าชาวแคนาดา (ด้วยเหตุผลที่คลุมเครือเกี่ยวกับพรรคการเมืองของแคนาดาและภูมิหลังของบุคคลที่ทำงานในการสร้างในเวลานั้น) หากโฮสต์และเป้าหมายเหมือนกัน แต่บิลด์ต่างกันคุณกำลังใช้คอมไพเลอร์ข้ามเพื่อสร้างเนทีฟสำหรับระบบอื่น บางคนเรียกสิ่งนี้ว่า host-x-host, cross native หรือ cross-built native หากบิวด์และเป้าหมายเหมือนกัน แต่โฮสต์ต่างกันคุณกำลังใช้คอมไพเลอร์ข้ามเพื่อสร้างคอมไพเลอร์ข้ามที่สร้างโค้ดสำหรับเครื่องที่คุณกำลังสร้าง นี่เป็นเรื่องที่หายากดังนั้นจึงไม่มีวิธีอธิบายทั่วไป มีข้อเสนอให้เรียกสิ่งนี้ว่า crossback


2
ซึ่งหมายความว่า--targetไม่เกี่ยวข้องกับโครงการใด ๆ ที่ไม่ใช่ตัวคอมไพเลอร์ เหตุใดจึงเป็นตัวเลือกกำหนดค่ามาตรฐาน ทำให้เกิดความสับสน
dhardy

1
@dhardy: configureไม่ใช่จุดสุดยอดของการออกแบบที่ดีและสะอาด ฉันเดาว่ามันเป็นผลมาจากการคืบของฟีเจอร์เฉพาะแอปพลิเคชัน
Tim Čas

หากฉันต้องการรับ gcc เช่น run "./configure --build = powerpc --host = i686 --target = mips" เอาต์พุตที่เรียกใช้งานได้นั้นพิการหรือไม่ โดยปกติแล้ว gcc เป็นเครื่องมือที่มีประสิทธิภาพที่สามารถสร้างรหัส c จากนั้นจะแสดงผลลัพธ์หลายประเภทสำหรับหลาย ๆ แพลตฟอร์ม ที่นี่ถ้าฉันใช้ '--target = mips' gcc ที่ระบุจะสูญเสียความสามารถหรือไม่?
gfan

สิ่งที่อาจได้ผลคือการอัปเดตไฟล์ config.guess และ config.sub เพื่อให้คอมไพเลอร์รู้จักแพลตฟอร์มเป้าหมายมากขึ้น .. คุณสามารถหาได้ที่นี่: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.