Apa perbedaan dari opsi "./configure" "--build", "--host" dan "--target"?

121

Skrip ./configuremenerima 3 opsi --build, --hostdan --target. Saya membingungkan peran mereka. Apa perbedaan dan semantiknya?

eonil
sumber
Autotools akan menggunakan toolchain yang salah untuk kompilasi silang, bahkan menggunakan --hostdan --build. Saya punya dua proyek C ++ dan tidak mungkin membangun untuk Android karena Autotools sangat kacau. Itu bersikeras menjalankan tes menggunakan toolchain host.
jww

Jawaban:

109

Seperti tercantum dalam entri blog ini dan disebutkan di Persyaratan Konfigurasi GCC , --targethanya berlaku saat Anda menyusun toolchain. Saat Anda melakukan kompilasi silang normal perpustakaan atau biner yang Anda gunakan

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

Namun, ketika Anda sedang membangun toolchain, hal bisa lebih rumit. Saya pikir yang berikut ini benar (meskipun saya tidak bisa mengatakan saya pernah secara manual mengompilasi cross-debugger):

Katakanlah Anda memiliki:

  • mesin build powerpc tempat Anda akan melakukan semua kompilasi
  • beberapa perangkat yang disematkan, dengan prosesor mips, yang akan menjalankan kode Anda
  • laptop x86 yang akan Anda gunakan untuk men-debug perangkat ini di lapangan

Anda akan mengkonfigurasi dan membangun server debugging (mis. Gdbserver) untuk dijalankan pada perangkat tertanam Anda

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

sehingga Anda dapat menggunakan perangkat tertanam dan menjalankan "gdbserver: 1234 a.out" untuk memulai debugging dan mendengarkan pada port 1234.

Anda kemudian akan membangun klien debugging (yang menghubungkan dan mengontrol gdbserver) dengan

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

yang akan Anda salin ke laptop x86 Anda sehingga di lapangan Anda dapat menjalankan "gdbclient embedded.device: 1234" untuk men-debug program a.out Anda.

Ini semua berlaku untuk kompiler juga yang Anda mungkin ingin melihat tautan GCC di atas atau bagian tentang kompilasi silang Kanada ini .

Perhatikan juga bahwa, dalam praktiknya, Anda mungkin tidak melihat build, host, atau target ditentukan karena, menurut halaman manual Autoconf ini , "target defaults to host, host to build, dan build to result of config.guess."

Singkatnya, buat kode --build, jalankan --hostdengan --targetlingkungan arsitektur.

pengguna124850
sumber
11
Bagaimana cara mengetahui apa yang harus dimasukkan untuk "host" dan "target"?
Hitam
4
Saya rasa Anda berbicara tentang membangun kompiler baru, karena "--target" hanya relevan untuk kompiler. * "host" adalah tempat kompiler baru Anda harus dijalankan. * "target" adalah tempat menjalankan executable yang dihasilkan oleh kompilator baru Anda.
pengguna1735594
bukankah ini menjadikan ini sebagai jawaban yang salah, karena --host = i686 tidak valid di sini?
infocloged
1
Jawaban yang diberikan menyebutkan bahwa kompilasi telah dilakukan untuk target MIPS dan ini adalah build, dan host adalah debugger untuk mesin MIPS. Apakah ini berarti debugger / compiler juga dibuat oleh powerpc? Ini adalah komentar yang saya dapat dari pengguna lain (Ned): build = di mana saya mengkompilasi kompilator, host = di mana kompilator akan berjalan, target = kode apa yang akan dihasilkan kompilator. Referensi: stackoverflow.com/questions/7088576/…
supmethods
Menurut Ned, bukankah ini berarti powerpc adalah build / host, mesin x86 adalah target debugger, dan target sebagai sistem MIPS. Bisakah Anda menjelaskan lebih lanjut apa itu "membangun untuk" dan "membangun di atas"? Saya merujuk ke gcc.gnu.org/onlinedocs/gccint/Configure-Terms.html .
supmethods
75

Catatan: Argumen --targethanya masuk akal saat membangun kompilator (mis. GCC). Saat menjalankan configuresebelum membuat GCC:

  • --build: mesin yang sedang Anda buat
  • --host: mesin yang Anda buat
  • --target: mesin tempat GCC akan menghasilkan biner

Dari dokumentasi GCC ( Catatan penginstalan khusus Host / Target ):

Jika build, host, dan target semuanya sama, ini disebut native. Jika build dan host sama tetapi targetnya berbeda, ini disebut salib. Jika build, host, dan target semuanya berbeda, ini disebut Kanada (karena alasan yang tidak jelas terkait dengan partai politik Kanada dan latar belakang orang yang mengerjakan build pada saat itu). Jika host dan target sama, tetapi build berbeda, Anda menggunakan cross-compiler untuk membuat native untuk sistem yang berbeda. Beberapa orang menyebutnya sebagai host-x-host, crossed native, atau cross-built native. Jika build dan target sama, tetapi hostnya berbeda, Anda menggunakan kompiler silang untuk membuat kompiler silang yang menghasilkan kode untuk mesin tempat Anda membangun. Ini jarang terjadi, jadi tidak ada cara umum untuk menggambarkannya. Ada usulan untuk menyebutnya crossback.

Delan Azabani
sumber
2
Yang tampaknya berarti --targettidak relevan dengan proyek apa pun yang bukan kompiler itu sendiri. Jadi mengapa ini adalah opsi konfigurasi standar? Membingungkan.
dhardy
1
@dhardy: configurebukanlah puncak dari desain yang bagus dan bersih; Saya kira itu hanya hasil dari fitur khusus aplikasi.
Tim Čas
Jika saya ingin mendapatkan gcc, misalnya run "./configure --build = powerpc --host = i686 --target = mips", Apakah keluaran yang dapat dieksekusi lumpuh? Biasanya, gcc adalah alat yang ampuh yang dapat membangun kode c, kemudian mengeluarkan berbagai jenis hasil untuk banyak platform. Di sini, jika saya menggunakan '--target = mips', apakah gcc yang ditentukan kehilangan kemampuannya?
gfan
Yang juga mungkin berhasil adalah memperbarui file config.guess dan config.sub, sehingga kompiler mengetahui lebih banyak platform target .. Anda bisa mendapatkannya di sini: gnu.org/software/gettext/manual/html_node/config_002eguess.html
wirtsi