Apa perbedaan antara Autotools, Cmake dan Scons?

259

Apa perbedaan antara Autotools, Cmake dan Scons?

Wazery
sumber
Topik ini sudah dibahas di Scons wiki . Saya sarankan Anda mengunjungi tautan berikut: 1. scons.org/wiki/SconsVsOtherBuildTools Sudahkah Anda mengunjungi utas diskusi yang sangat mirip di Forum Ubuntu ?
bhadra
Anda dapat memeriksa pdf ini www-alt.gsi.de/documents/DOC-2007-Sep-17-1.pdf ; ia memiliki pro dan kontra dan juga beberapa detail tentang masing-masing alat.
Adam

Jawaban:

190

Sebenarnya, Autotools 'satu-satunya' rahmat penyelamatan 'yang sebenarnya adalah apa yang sebagian besar proyek GNU gunakan.

Masalah dengan Autotools:

  • Sintaks makro benar-benar ARCANE m4 dikombinasikan dengan skrip shell verbose, twisted untuk tes "kompatibilitas", dll.
  • Jika Anda tidak membayar perhatian, Anda akan mengacaukan kemampuan cross-kompilasi (Ini harus jelas dicatat bahwa Nokia datang dengan Scratchbox / Scratchbox2 ke samping-langkah yang sangat rusak Autotools membangun setup untuk Maemo / Meego.) Jika Anda, untuk setiap alasannya, telah memperbaiki, jalur statis dalam pengujian Anda, Anda akan mematahkan dukungan lintas-kompilasi karena itu tidak akan menghormati spesifikasi sysroot Anda dan itu akan menarik hal-hal dari sistem host Anda. Jika Anda memecah dukungan lintas-kompilasi, itu membuat kode Anda tidak dapat digunakan untuk hal-hal seperti OpenEmbedded dan menjadikannya "menyenangkan" untuk distribusi yang mencoba membuat rilis mereka pada cross-compiler alih-alih tepat sasaran.
  • Apakah sejumlah besar pengujian untuk masalah dengan compiler kuno, rusak yang NOBODY gunakan saat ini dengan produksi apa pun yang cukup banyak di zaman sekarang ini. Kecuali jika Anda sedang membangun sesuatu seperti glibc, libstdc ++, atau GCC pada versi Solaris, AIX, atau sejenisnya yang benar - benar kuno , tes tersebut hanya buang-buang waktu dan merupakan sumber bagi banyak, banyak kemungkinan pecahnya hal-hal seperti disebutkan di atas.
  • Ini adalah pengalaman yang sangat menyakitkan untuk mendapatkan pengaturan Autotools untuk membangun kode yang dapat digunakan untuk sistem Windows. (Meskipun saya jarang menggunakan Windows, itu adalah masalah serius jika Anda mengembangkan kode yang dianggap cross-platform.)
  • Ketika rusak, Anda akan menghabiskan JAM mengejar ekor Anda mencoba memilah hal-hal yang siapa pun yang menulis skrip salah untuk memilah bangunan Anda (Faktanya, inilah yang saya coba lakukan (atau, lebih tepatnya, merobek Autotools sepenuhnya- Saya ragu ada cukup waktu di sisa bulan ini untuk menyelesaikan masalah ...) untuk bekerja sekarang saat saya mengetik ini. Apache Thrift memiliki salah satu dari sistem Rusak yang dibangun yang tidak akan menyeberang -menyusun.)
  • Pengguna "normal" sebenarnya TIDAK hanya akan melakukan "./configure; make" - untuk banyak hal, mereka akan menarik paket yang disediakan oleh seseorang, seperti keluar dari PPA, atau vendor distribusi mereka. Pengguna "normal" bukan devs dan dalam banyak kasus tidak meraih tarbal. Itu keangkuhan di pihak semua orang untuk menganggap itu akan terjadi di sana. Pengguna tipikal untuk tarball adalah devs yang melakukan sesuatu, jadi mereka akan terbanting oleh kehancuran jika itu ada.

Ini berfungsi ... sebagian besar waktu ... adalah semua yang dapat Anda katakan tentang Autotools. Ini adalah sistem yang memecahkan beberapa masalah yang hanya benar-benar menyangkut proyek GNU ... untuk basis mereka, kode toolchain inti. (Sunting (24/5/2014): Perlu dicatat bahwa jenis kekhawatiran ini berpotensi mengkhawatirkan BAD - Heartbleed sebagian berasal dari pemikiran ini dan dengan sistem modern yang benar , Anda benar-benartidak memiliki bisnis yang berurusan dengan banyak hal untuk mengoreksi Autotools. GNU mungkin perlu melakukan penghapusan kode dasar, mengingat apa yang terjadi dengan Heartbleed) Anda dapat menggunakannya untuk melakukan proyek Anda dan mungkin bekerja dengan baik untuk proyek bertubuh kecil yang Anda tidak harapkan untuk bekerja di mana pun kecuali Linux atau di mana toolchain GNU jelas bekerja dengan benar. Pernyataan bahwa "menyatu dengan baik dengan Linux" adalah cukup pernyataan berani dan cukup benar . Ini terintegrasi dengan GNU toolsuite dengan cukup baik dan memecahkan masalah yang TI miliki dengan tujuan itu.

Ini bukan untuk mengatakan bahwa tidak ada masalah dengan opsi lain yang dibahas di utas di sini.

SCons lebih merupakan pengganti Make / GMake / etc. dan terlihat cukup bagus, semua hal dipertimbangkan Namun ...

  • Ini masih lebih dari satu-satunya alat POSIX. Anda mungkin bisa lebih mudah mendapatkan MinGW untuk membuat barang-barang Windows dengan ini daripada dengan Autotools, tetapi masih lebih diarahkan untuk melakukan hal-hal POSIX dan Anda harus menginstal Python dan SCons untuk menggunakannya.
  • Ini memiliki masalah melakukan kompilasi silang kecuali jika Anda menggunakan sesuatu seperti Scratchbox2.
  • Diakui lebih lambat dan kurang stabil daripada CMake dari perbandingan mereka sendiri. Mereka datang dengan setengah hati (sisi POSIX perlu membuat / membuat untuk membangun ...) negatif untuk CMake dibandingkan dengan SCons. (Sebagai samping, jika Anda membutuhkan BAHWA banyak diperpanjang atas solusi lain, Anda harus bertanya pada diri sendiri apakah proyek Anda yang terlalu rumit ...)

Contoh yang diberikan untuk CMake di utas ini agak palsu.

Namun...

  • Anda perlu belajar bahasa baru.
  • Ada hal-hal yang kontra-intuitif jika Anda terbiasa dengan Make, SCons, atau Autotools.
  • Anda harus menginstal CMake pada sistem yang Anda bangun.
  • Anda memerlukan kompiler C ++ yang solid jika Anda tidak memiliki binari pra-bangun untuknya.

Sebenarnya, tujuan Anda harus menentukan apa yang Anda pilih di sini.

  • Apakah Anda perlu berurusan dengan BANYAK rantai alat yang rusak untuk menghasilkan biner yang berfungsi? Jika ya, Anda mungkin ingin mempertimbangkan Autotools, karena menyadari kekurangan yang saya sebutkan di atas. CMake dapat mengatasi banyak hal ini, tetapi kekhawatirannya lebih sedikit daripada Autotools. SCons dapat diperluas untuk khawatir tentang hal itu, tetapi itu bukan jawaban di luar kotak di sana.
  • Apakah Anda perlu khawatir tentang target Windows? Jika demikian, Autotools harus benar-benar tidak berjalan. Jika demikian, SCON mungkin / mungkin bukan pilihan yang baik. Jika demikian, CMake adalah pilihan yang tepat.
  • Apakah Anda perlu khawatir tentang kompilasi silang (Universal apps / libraries, hal-hal seperti Google Protobuf, Apache Thrift, dll. HARUS peduli tentang ini ...)? Jika demikian, Autotools mungkinbekerja untuk Anda selama Anda tidak perlu khawatir tentang Windows, tetapi Anda akan menghabiskan banyak waktu untuk mempertahankan sistem konfigurasi Anda ketika hal-hal berubah pada Anda. SCons hampir tidak boleh digunakan saat ini kecuali Anda menggunakan Scratchbox2 - itu benar-benar tidak memiliki pegangan pada cross-compilation dan Anda akan perlu menggunakan ekstensibilitas itu dan menjaganya banyak dengan cara yang sama seperti Anda akan dengan Automake. Jika demikian, Anda mungkin ingin mempertimbangkan CMake karena mendukung kompilasi silang tanpa banyak kekhawatiran bocor keluar dari kotak pasir dan akan bekerja dengan / tanpa sesuatu seperti Scratchbox2 dan terintegrasi dengan baik dengan hal-hal seperti OpenEmbedded.

Ada alasan mengapa banyak, banyak proyek yang membuang qmake, Autotools, dll dan pindah ke CMake. Sejauh ini, saya dapat dengan bersih mengharapkan proyek berbasis CMake baik jatuh ke dalam situasi lintas-kompilasi atau ke setup VisualStudio atau hanya perlu sedikit pembersihan karena proyek tidak memperhitungkan hanya bagian Windows atau OSX saja saja. ke basis kode. Saya tidak dapat benar-benar berharap bahwa dari proyek berbasis SCons- dan saya sepenuhnya berharap 1/3 atau lebih proyek Autotools telah mendapatkan SESUATU yang salah yang menghalanginya membangun tepat pada konteks apa pun kecuali host yang membangun satu atau yang Scratchbox2.

Svartalf
sumber
12
Bagian yang menyebutkan Heartbleed mengurangi kata-kata kasar yang frustrasi ini. Masalahnya adalah OpenSSL TIDAK menggunakan paket tipe konfigurator untuk mendeteksi pustaka sistem malloc yang rusak tetapi mengimplementasikan kembali dan mengalahkan pengembang platform yang menghasilkan pustaka yang akan mendeteksi kekurangan lebih cepat. Salah satu alasan untuk mem-port program adalah kualitasnya menjadi lebih tinggi karena mereka tidak terlalu bergantung pada asumsi-asumsi kecil yang tidak Anda sadari sedang Anda buat
Rob11311
9
Masalahnya adalah itu tidak mengurangi sama sekali. Dengan Autotools, Anda khawatir tentang kompensasi UNTUK hal-hal seperti itu - implementasi ulang itu adalah PERLUASAN dari pemikiran itu. Membawanya ke tingkat berikutnya. Anda harus melihatnya dari latar belakang itu ... pada titik mana itu tidak mengurangi sama sekali. Anda tidak menyentuh akar penyebab dalam alasan Anda - hanya apa yang terjadi. Saya meraba-raba PEMIKIRAN yang tepat yang membawanya ke bersama Shellshock dan beberapa orang lain menyukainya. Jika rusak, Anda harus MEMPERBAIKInya. Jika Anda tidak bisa - Anda harus bertanya mengapa tetap berjalan.
Svartalf
5
Saya tidak ragu bahwa autotool dan scon payah, tetapi jawaban ini tidak berhasil mencatat kontra CMake (sistem build pilihan saya, hanya karena sistem build yang sangat, sangat menyedihkan). Pada dasarnya, CMake adalah fraktal ketidakkonsistenan dengan dukungan bawaan untuk kasus tepi individual daripada beberapa abstraksi inti yang menangani sebagian besar hal. Ini jelas selotip dan kawat pemrograman pemrograman. Saya yakin saya melakukan sesuatu yang salah, tetapi itu tidak mendukung VisualStudio kecuali jika Anda menemukan satu proyek VS per CMakeLists.txt dapat diterima (saya bukan pengguna VS, tetapi Winfriends saya mengatakan itu buruk).
weberc2
5
Tidak seperti alat pemrograman yang dibenci lainnya , tidak ada bahan yang cukup untuk membuat buku yang disebut, "CMake, bagian yang baik" (mungkin pamflet atau posting blog), dan itu lebih merupakan fraktal dari desain yang buruk daripada PHP .
weberc2
2
@ JAB Saya diberitahu oleh pengguna VS bahwa ini bukan idiomatik. Faktanya, CMake digantikan sebagai sistem pembangunan untuk proyek kami karena tidak ada yang bisa menemukan cara untuk menghasilkan file Proyek VS "idiomatik" tersebut.
weberc2
73

Perbedaan penting harus dibuat antara siapa yang menggunakan alat. Cmake adalah alat yang harus digunakan oleh pengguna saat membangun perangkat lunak. Autotool digunakan untuk menghasilkan tarball distribusi yang dapat digunakan untuk membangun perangkat lunak hanya menggunakan alat standar yang tersedia pada sistem yang sesuai SuS. Dengan kata lain, jika Anda menginstal perangkat lunak dari tarball yang dibangun menggunakan autotools, Anda tidak menggunakan autotools . Di sisi lain, jika Anda menginstal perangkat lunak yang menggunakan Cmake, maka Anda sedang menggunakan Cmake dan harus menginstalnya untuk membangun perangkat lunak.

Sebagian besar pengguna tidak perlu menginstal autotool pada kotaknya. Secara historis, banyak kebingungan telah disebabkan karena banyak pengembang mendistribusikan tarbal yang salah bentuk yang memaksa pengguna untuk menjalankan autoconf untuk membuat ulang skrip configure, dan ini adalah kesalahan pengemasan. Lebih banyak kebingungan telah disebabkan oleh kenyataan bahwa sebagian besar distribusi linux utama menginstal beberapa versi autotool, ketika mereka seharusnya tidak menginstal salah satu dari mereka secara default. Bahkan lebih banyak kebingungan disebabkan oleh pengembang yang mencoba menggunakan sistem kontrol versi (mis. Cvs, git, svn) untuk mendistribusikan perangkat lunak mereka daripada membangun tarbal.

William Pursell
sumber
5
Benar, meskipun Anda membuatnya terdengar buruk menggunakan VCS untuk mendistribusikan perangkat lunak. Jika isi checkout atau klon sama dengan isi tarball, mengapa Anda merekomendasikan tarball?
d -_- b
5
@Toor Saya tidak mengerti pertanyaan Anda. Semua proyek yang saya kerjakan menghasilkan tarball yang berbeda dari checkout VCS. Menjaga dua yang berbeda membantu dengan distribusi yang andal.
William Pursell
13
Memang benar bahwa banyak proyek meminta orang untuk menggunakan VCS untuk mendapatkan rilis terbaru, tetapi itu hanya sesuai untuk pengembang. Sayangnya, banyak pengguna gagal memahami perbedaan antara tarball rilis dan VCS. Mencoba membangun dari VCS membebankan lebih banyak dependensi. Pengguna mungkin perlu asciidocatau help2manatau doxygenatau, penting, kombinasi Autotool yang benar. Ini telah menjadi masalah pemasaran yang sangat besar bagi para autotool. Pengguna salah mengira mereka perlu menginstal autoconf karena mereka tidak mengerti perbedaan antara tarball dan VCS.
William Pursell
3
Mengapa suatu proyek tidak dapat mendistribusikan output Cmake, file proyek dan Makefile untuk platform umum misalnya) Menang, Linux dan MacOSX? Sepertinya situasi yang sama dengan alat lex / yacc, Anda memasukkan kode C genar sehingga dapat dibangun pada platform tanpa alat
Rob11311
3
Meskipun saya pikir poin yang disebutkan dalam diskusi ini benar, saya percaya bahwa diskusi ini tidak ada gunanya. Pengguna perlu menginstal sejumlah hal lain dan apakah perlu tambahan atau tidak untuk menginstal cmake seharusnya tidak menjadi masalah besar. Saya akan lebih khawatir tentang perpustakaan, rantai alat kompiler, dan alat-alat lain yang diperlukan untuk membangun perangkat lunak.
lanoxx
24

Ini bukan tentang standar pengkodean GNU.

Manfaat autotool saat ini - khususnya ketika digunakan dengan automake - adalah mereka berintegrasi dengan sangat baik dengan membangun distribusi Linux.

Dengan cmake misalnya, selalu "apakah -DCMAKE_CFLAGS atau -DCMAKE_C_FLAGS yang saya butuhkan?" Tidak, tidak juga, ini "-DCMAKE_C_FLAGS_RELEASE". Atau -DCMAKE_C_FLAGS_DEBUG. Ini membingungkan - dalam autoconf, hanya saja ./configure CFLAGS = "- O0 -ggdb3" dan Anda memilikinya.

Dalam integrasi dengan membangun infrastruktur, scon memiliki masalah yang tidak dapat Anda gunakan make %{?_smp_mflags}, _smp_mflagsdalam hal ini menjadi makro RPM yang secara kasar memperluas daya sistem (admin dapat mengaturnya). Orang-orang menaruh hal-hal seperti -jNCPUS di sini melalui lingkungan mereka. Dengan scon yang tidak berfungsi, jadi paket-paket yang menggunakan scon hanya bisa mendapatkan serial built in distro.

pengguna502515
sumber
8
+1, dan dunia akan menjadi tempat yang lebih baik jika ini benar. Sayangnya, ./configure CFLAGS=-O0sering gagal dengan paket yang menimpa CFLAGS di makefile dan mengharuskan pengguna untuk menjalankannya ./configure --enable-debug. (misalnya tmux).
William Pursell
2
Ini tidak lebih membingungkan daripada Autotools dan seperti yang ditunjukkan oleh William dengan benar, ia akan rusak semua dengan CFLAGS = "<foo>" yang dibingkai tidak benar dalam makefile. Sederhananya ini adalah salah satu dari barang-barang "gergaji tua". Dan contoh CMake adalah palsu ... lagi ... Anda dapat melakukan yang pertama jika Anda tidak menentukan RELEASE atau DEBUG. GAGAL.
Svartalf
17

Yang penting untuk diketahui tentang Autotools adalah bahwa mereka bukan sistem pembangunan umum - mereka menerapkan standar pengkodean GNU dan tidak ada yang lain. Jika Anda ingin membuat paket yang mengikuti semua standar GNU, maka Autotools adalah alat yang sangat baik untuk pekerjaan itu. Jika tidak, maka Anda harus menggunakan Scons atau CMake. (Misalnya, lihat pertanyaan ini .) Kesalahpahaman umum ini adalah dari mana sebagian besar frustrasi dengan Autotools berasal.

ptomato
sumber
11
Standar GNU dapat dinonaktifkan di Automake dengan AUTOMAKE_OPTIONS = -foreigndi Makefile.am. (Atau -foreigndalam bahasa Anda autogen.sh. Saya pikir hampir semua orang menggunakan ini.)
Dietrich Epp
9
Ya, tetapi itu hanya mengontrol apakah Automake memberlakukan aturan GNU dangkal seperti apakah file README diperlukan. Itu tidak mengubah premis dasar untuk membangun tarball gaya GNU dengan aturan seperti installcheckdan distclean. Jika Anda mencoba mengubah perilaku semacam itu saat masih menggunakan Autotools, maka Anda hanya membuang-buang waktu.
ptomato
1
Mereka (secara teori) memungkinkan semua paket perangkat lunak dibangun dan diinstal dengan cara yang persis sama.
ptomato
Mereka, secara teori, memungkinkan Anda untuk berurusan dengan kompiler dan OS BROKEN lebih tepat daripada dengan alat lain dan untuk menerapkan aturan superfisial seperti @ptomato yang disorot di sana. Jika Anda menggunakan alat modern (misalnya GCC atau dentang ... misalnya) pada sistem operasi modern dengan tidak ada yang benar-benar konyol, katakanlah Linux atau BSD * saat ini, Anda tidak PERLU "aturan" di sana. Mereka, sebenarnya, membuat jauh lebih banyak pekerjaan untuk Anda dan tidak dapat membantu, jujur ​​untuk kompilasi silang. Hampir setengah dari semua penggunaan hari ini adalah untuk Linux tertanam dan * BSD. MENGAPA Anda pergi dengan hal-hal yang tidak dapat membantu Anda di sana?
Svartalf
Tidak yakin mengapa Anda menurunkan jawaban, karena Anda tampaknya mengakuinya dalam komentar Anda ...?
ptomato
9

Sementara dari sudut pandang pengembang, cmake saat ini paling mudah digunakan, dari sudut pandang pengguna autotool memiliki satu keuntungan besar

autotools menghasilkan skrip konfigurasi file tunggal dan semua file untuk menghasilkannya dikirimkan bersama distribusi. mudah dimengerti dan diperbaiki dengan bantuan grep / sed / awk / vi. Bandingkan ini dengan Cmake di mana banyak file ditemukan di / usr / share / cmak * / Modul, yang tidak dapat diperbaiki oleh pengguna kecuali dia memiliki akses admin.

Jadi, jika sesuatu tidak cukup berfungsi, biasanya dapat dengan mudah "diperbaiki" dengan menggunakan alat-alat Standard Unix (grep / sed / awk / vi dll) dengan cara palu godam tanpa harus memahami sistem builds.

Pernahkah Anda menggali melalui direktori build cmake untuk mencari tahu apa yang salah? Dibandingkan dengan shellscript sederhana yang dapat dibaca dari atas ke bawah, mengikuti file Cmake yang dihasilkan untuk mengetahui apa yang sedang terjadi cukup sulit. JUGA, dengan CMake, mengadaptasi file FindFoo.cmake tidak hanya membutuhkan pengetahuan tentang bahasa CMake, tetapi juga mungkin memerlukan hak superuser.

melengkung
sumber
7
Saya tidak berpikir masalah dengan Autotools "mudah diperbaiki" dibandingkan dengan CMake ...
sleske
7
Karena autotool adalah sistem yang kompleks (seperti halnya CMake). Jika Anda berpikir Autotools "mudah diperbaiki" (mungkin ada alasan untuk berpikir ini), akan lebih baik IMHO untuk menjelaskan dalam jawaban dengan cara apa masalah lebih mudah untuk diperbaiki.
sleske
5
autotools menghasilkan skrip konfigurasi file tunggal dan semua file untuk menghasilkannya dikirimkan bersama distribusi. mudah dimengerti dan diperbaiki dengan bantuan grep / sed / awk / vi. Bandingkan ini dengan Cmake di mana banyak file ditemukan di / usr / share / cmak * / Modul, yang tidak dapat diperbaiki oleh pengguna kecuali dia memiliki akses admin. Pernahkah Anda menggali melalui direktori build cmake untuk mencari tahu apa yang salah? Dibandingkan dengan shellscript sederhana yang dapat dibaca dari atas ke bawah, mengikuti file Cmake yang dihasilkan untuk mencari tahu apa yang sedang terjadi cukup sulit
dikembangkan
2
Ya, itu masuk akal, terima kasih. Saya mengambil kebebasan untuk menambahkannya ke jawaban Anda. Jangan ragu untuk kembali :-).
sleske
1
Anda selalu dapat menggunakan versi cmake lokal Anda sendiri; tidak ada alasan untuk menggunakan apa yang diinstal pada level sistem. Bagi siapa pun yang melakukan pekerjaan lintas platform, itu sepenuhnya normal; itu tentu cara saya menggunakan cmake sebagian besar waktu.
James Moore