C ++ Build Systems - Apa yang digunakan? [Tutup]

136

Saya sedang mencari untuk memulai proyek baru di C ++ - hanya dalam waktu saya sendiri pada awalnya - dan saya sedang menyelidiki sistem build yang tersedia. Tampaknya jawabannya adalah "Banyak, dan semuanya mengerikan".

Fitur yang secara khusus saya butuhkan untuk ini adalah:

  1. Dukungan C ++ 11
  2. Lintas platform (Linux sebagai target utama, tetapi dapat dibangun setidaknya di Windows juga)
  3. Dukungan pengujian unit yang layak
  4. Dukungan untuk beberapa modul untuk memisahkan kode
  5. Dukungan untuk pembuatan kode (Menggunakan asn1c atau protobuf - belum 100% yakin)
  6. Mudah dirawat

Sekarang, saya tahu saya dapat melakukan 1-4 dari mereka yang menggunakan CMake dan Autotools dengan cukup mudah. Mungkin juga dengan SCons dan Waf dan beberapa lainnya juga. Masalahnya adalah saya tidak pernah mengetahui cara membuat kode dengan benar menggunakannya - yaitu file sumber yang tidak ada hingga proses build dijalankan pertama kali, jadi file sumber yang sistem build harus dapat diubah menjadi kode yang dapat dieksekusi tetapi tidak benar-benar mengetahuinya sampai build dimulai ... (ASN1C secara khusus menghasilkan lusinan file header dan sumber yang harus dapat bekerja sama, dan kumpulan file sebenarnya yang dihasilkan bergantung pada konten file asn Anda) Ada juga fakta bahwa tidak ada yang sangat mudah untuk dipelihara - CMake dan Autotools memiliki sekumpulan besar skrip yang perlu Anda kelola agar berfungsi,

Jadi - sistem build apa yang direkomendasikan untuk hal seperti ini? Atau apakah saya akan terjebak dengan membuat file dan skrip shell untuk saat ini?

Graham
sumber
11
"Tampaknya jawabannya adalah 'Banyak, dan semuanya mengerikan'" adalah kesan saya juga (dengan tambahan 'mengerikan dari sudut pandang saya'; Saya tidak suka menggeneralisasi terlalu banyak dengan istilah seperti ini ). Saya benar-benar mengatur sendiri untuk alasan itu, dan itu bekerja lebih baik dari yang diharapkan karena itu melakukan apa yang saya inginkan, dan bagaimana saya selalu ingin semuanya berhasil. Untuk sesuatu yang memakan waktu sedikit lebih sedikit, Anda mungkin harus melalui alat yang ada dan memilih salah satu yang memberi Anda sakit kepala lebih sedikit daripada yang lain.
Christian Stieber
4
Coba tup .
Kerrek SB
lihat juga: stackoverflow.com/q/3349956
ergosys
8
Jenis dukungan C ++ 11 apa yang Anda harapkan dari sistem build? Ini adalah sesuatu yang Anda dapatkan dari compiler, sistem build tidak mengurai atau bahkan membaca file sumber yang sebenarnya, hanya meneruskannya kepada siapa pun yang membutuhkannya, bukan?
Baruch
5
Benar, tetapi memudahkan untuk memberi tahu compiler untuk menggunakan dukungan C ++ 11 akan lebih baik. g ++ membutuhkan satu flag, clang set yang berbeda, msvc tampaknya tidak membutuhkan apapun dan seterusnya. Juga, dukungan untuk mendeteksi fitur c ++ 11 apa yang tersedia akan berguna karena itu juga berbeda di antara kompiler ...
Graham

Jawaban:

119

+1 untuk, "Banyak, dan mereka mengerikan."

Tapi, yang "terkaya" dan "paling skalabel" mungkin adalah CMake , yang merupakan generator Makefile (juga menghasilkan MSVC ++ *.proj/ *.sln) asli. Sintaks yang aneh, tetapi setelah Anda mempelajarinya, Anda dapat membuat build dengan baik untuk platform yang berbeda. Jika saya "mulai-segar", saya mungkin akan menggunakan CMake. Ini harus menangani daftar Anda, meskipun "pembuatan kode" Anda dapat mengambil "kehidupan-nya-nya sendiri" di luar sistem build tergantung pada apa yang ingin Anda lakukan. (Lihat di bawah.)

Untuk proyek sederhana, generator QMake baik-baik saja (Anda tidak perlu menggunakan pustaka Qt untuk menggunakan QMake). Namun, Anda tidak mendeskripsikan "sederhana" - pembuatan kode dan "fase ekstra" berarti Anda mungkin menginginkan CMakeatau sesuatu dengan API yang kaya untuk ekstensi Anda sendiri, seperti Scons(atau Waf).

Kami menggunakan Scons di tempat kerja. Ini menghasilkan "bullet-proof-builds", tetapi sangat lambat. Tidak ada sistem lain yang anti peluru seperti Scons. Tapi, ini lambat. Itu ditulis dengan Python dan kami telah memperluas antarmuka untuk "organisasi-ruang kerja" kami (di mana kami hanya menentukan dependensi modul), dan itu adalah bagian dari Sconsmaksud desain (jenis ekstensi ini melalui Python). Nyaman, tetapi pembuatannya lambat. Anda mendapatkan build anti peluru (kotak developer mana pun dapat membuat rilis final), tetapi lambat. Dan, itu lambat. Jangan lupa bahwa jika Anda menggunakannya Scons, lambat. Dan, itu lambat.

Membuat saya sakit ketika berpikir bahwa satu dekade setelah Tahun 2000, kita masih belum memiliki mobil terbang. Kami mungkin harus menunggu seratus tahun lagi atau sesuatu untuk mendapatkannya. Dan, kita semua mungkin akan terbang dengan mobil terbang kita yang masih dibuat dengan sistem build yang jelek.

Ya, semuanya mengerikan.

[TENTANG PEMBUATAN KODE]

Sconsbekerja pada "fase", dan mereka "agak statis". Ia dapat membangun kode yang dihasilkan sebagai bagian dari pembangunan (orang-orang melakukan ini dengan beberapa cara berbeda), tetapi ini telah dijelaskan sebagai, "sesuatu yang sangat tidak mirip Scons".

Jika itu sederhana "praproses beberapa file dan buat file sumber", maka tidak ada masalah besar (Anda memiliki banyak opsi, dan inilah mengapa qmakeditulis - untuk mocpraproses *.hpp/*.cppfile).

Namun, jika Anda melakukan ini dengan "cara yang berat", Anda perlu membuat skrip sendiri. Sebagai contoh, kami memiliki skrip as-a-part-of-the-build yang menanyakan database dan menghasilkan kelas C ++ untuk antarmuka antara "lapisan" (dalam pengembangan aplikasi 3-tingkat tradisional). Demikian pula, kami membuat kode sumber server / klien melalui IDL, dan informasi versi tertanam untuk mengizinkan beberapa klien / server berjalan secara bersamaan dengan versi yang berbeda (untuk "klien" atau "server" yang sama). Banyak kode sumber yang dihasilkan. Kita bisa "berpura-pura" bahwa itu adalah "sistem-build", tetapi sebenarnya, ini adalah infrastruktur non-sepele untuk "manajemen konfigurasi", yang bagiannya adalah "sistem-build". Misalnya, sistem ini harus, "menghapus" dan "

charley
sumber
37
Saya suka Scons juga - tapi menurut saya lambat.
Lothar
1
Anda bisa meminta CMake untuk menangani pembuatan kode dengan pembungkus Makefile untuk melakukan fase kedua opsional saat kode dibuat. Saya dapat mendukung pelacakan ketergantungan penuh, keluar lebih awal setelah pembuatan kode untuk memicu pembuatan ulang, dll. Lihat: javaglue.com/javaglue.html#tag:JavaGlue dan code.google.com/p/javaglue
sdw
3
Hampir 2 tahun berlalu, apakah Anda masih menganggap SCons lambat? Ketika saya memilih sistem build, saya menemukan ini dan itu berkontribusi pada keputusan saya untuk menggunakan SCons.
JBentley
2
@Ben, itu benar, tapi juga lambat.
charley
2
Siapapun yang melihat ini harus mempertimbangkan Meson (yang menggunakan ninja).
Matthew D. Scholefield
33

Anda dapat menggunakan Gradle sekarang: https://docs.gradle.org/current/userguide/native_software.html

Ini tampaknya sudah cukup matang selama bertahun-tahun sejak saya pertama kali memposting ini. Halaman yang menyatakan bahwa proyek sedang "inkubasi" telah hilang, tetapi saya tidak dapat menemukan pengumuman resmi yang menghapus status ini.

Nate Glenn
sumber
Saya setuju dengan Gradle. Gradle dirancang agar dapat diskalakan. Namun, itu tergantung pada seberapa cepat implementasi plugin itu. Ada juga biaya tambahan untuk gradle itu sendiri. Ketahuilah juga, bahwa beberapa plugin mungkin perlu disesuaikan untuk kasus penggunaan Anda.
JE42
Menarik untuk melihat minat gradle dalam mendukung C ++. Berharap mereka menghasilkan sistem bangunan yang bagus dan kokoh untuk proyek c ++ yang hilang dari kita semua.
hbobenicio
@squid terima kasih, diperbarui.
Nate Glenn
1
Gradle sangat kuat namun sederhana. Tidak ada sintaks yang aneh, satu file gradle.build seringkali cukup untuk membangun keseluruhan proyek dengan beberapa output yang dapat dieksekusi (main, tes, dll). Tidak ada file dumping di semua direktori sumber. Sangat ramah untuk pembuatan versi.
Overdrivr
1
Saya telah menghabiskan dua hari terakhir melakukan pertempuran dengan Gradle, hanya mencoba membuat pustaka, aplikasi, dan gtests "hello world", dan saya tidak bisa mengatakan saya dapat merekomendasikannya untuk proyek baru. Semua alat mungkin ada di sana, tetapi dokumentasinya tidak (memberikan manfaat keraguan). Mungkin bagi Anda yang menganggapnya layak dapat menunjukkan sumber daya favorit Anda?
jwm
16

Saya menemukan ini, saya secara pribadi belum menggunakan semuanya:

Ninja , sistem bangunan kecil yang berfokus pada kecepatan. Google sekarang menggunakan Ninja untuk membangun Android, bukan Make: link .

Goyang , sistem build yang kuat dan cepat.

Tup , sistem build berkinerja tinggi. Desain berbasis algoritmik . Analisis Tup .

Semua sekarang lintas platform dan mendukung Windows. Saya belum yakin tentang persyaratan Anda lainnya karena, sekali lagi, saya belum mengujinya sendiri. Mereka sedang digunakan dalam pengembangan komersial, CIG mengambil Ninja. Saya telah menggunakan dan menyukai kemudahan dan kecepatan Ninja dengan generator proyek. Dua yang pertama mirip dengan Scons, Ant, dll.

leetNightshade
sumber
1
Tup akan mengacaukan pencarian simbol, tidak berfungsi dengan baik dengan sistem build lain (sama sekali, sungguh), tidak berfungsi dengan baik dengan output acak (seperti class yang dihasilkan oleh javacclass dalam, yang dipisahkan menjadi class$1.classfile), adalah ditulis dengan buruk dan menggunakan peretasan sistem untuk mencapai apa yang dilakukannya. Ini bagus untuk sistem kecil; tidak dapat dipertahankan untuk proyek yang lebih besar.
Qix - MONICA DISALAHKAN
@ Qix: Apakah Anda tidak dapat memisahkan output dari repositori Anda?
Kerrek SB
1
@KerrekSB Anda bisa, tapi bukan itu masalahnya dengan pencarian simbol. Tup menggunakan FUSE , dan memasang middleware-nya sendiri ke .tup/mnt. Ia kemudian menjalankan semua program build dalam sebuah folder (yaitu .tup/mnt/@tupjob-XXXXX) sebagai direktori kerja untuk memantau baca / tulis, yang memberlakukan konfigurasi build. Ini bekerja dengan baik, kecuali path disimpan secara mutlak (yaitu dengan simbol). Saat Anda mengompilasi biner, lintasan simbol disimpan dalam biner itu sendiri. Itu berarti ketika GDB mencoba memuat simbol, GDB mencari tupjobjalur tersebut, yang tidak menyebabkan kesalahan.
Qix - MONICA DISALAHKAN
Baik Tup dan Ninja adalah alat level sangat rendah, serendah atau lebih rendah dari Make. Mereka tidak disesuaikan dengan C ++. Saya bahkan tidak akan menyebut alat ini membangun sistem sendiri karena mereka kehilangan banyak fitur tingkat tinggi yang penting yang ditawarkan oleh sistem pembangunan sejati untuk menangani proyek dunia nyata yang kompleks. Beberapa dari sistem ini mungkin menggunakan Ninja sebagai back-end.
Johan Boulé
11

Scon adalah sistem yang sangat ramah dan fleksibel, tetapi Anda benar, Lothar, itu sangat lambat.

Tetapi ada cara untuk meningkatkan kinerja program yang ditulis dengan Python. Penggunaan JIT ini. Dari semua proyek yang diketahui, PyPy adalah implementasi JIT yang sangat kuat, tumbuh cepat dan termotivasi - Python 2.7. Kompatibilitas PyPy dengan Python 2.7 sangat menakjubkan. Namun, Scons dinyatakan sebagai proyek yang tidak didukung di wiki kompatibilitas PyPy . Waf , di sisi lain, dimodelkan sebagai sucessor autotools berbasis python, didukung penuh oleh infrastruktur PyPy. Dalam proyek saya, kecepatan perakitan telah meningkat 5-7 kali dalam transisi ke PyPy. Anda dapat melihat laporan kinerja dari PyPy .

Untuk sistem build yang modern dan relatif cepat, Waf adalah pilihan yang baik.

aegor
sumber
Perlu dicatat bahwa scon sekarang ditandai sebagai "Kompatibel" di halaman wiki yang ditautkan, jadi tampaknya sekarang scon tersebut berfungsi dengan PyPy.
Nama Palsu
8

Sistem Google build adalah alternatif yang baik: http://bazel.io/

Mike B
sumber
3
"Lintas platform (Linux sebagai target utama, tetapi dapat dibangun di setidaknya Windows juga)". FAQ Bazel mengatakan "Kami saat ini secara aktif bekerja untuk meningkatkan dukungan Windows, tetapi masih belum bisa digunakan."
Michael Mrozek
3
Saya tidak yakin apakah itu sistem itu sendiri atau orang yang menyiapkan proyek, tetapi saya mengalami kesulitan besar di bagian belakang menggunakannya @ work. Ini sangat tidak fleksibel (dalam arti hanya mendukung satu cara untuk melakukan sesuatu, seringkali suboptimal, jika tidak menyeramkan), tidak cukup kuat, didokumentasikan dengan buruk (selain kasus dasar), memiliki komunitas kecil jadi jangan berharap stackoverflow datang menyelamatkan Anda , cukup bergantung dengan sendirinya, jangan bermain baik dengan sebagian besar IDE di sebagian besar sistem, dll, dll, dll. Jadi, kecuali Anda adalah penggemar Google - menjauhlah darinya (btw ada versi facebook ini, yang disebut Buck - untuk penggemar facebook)
Slava
Hei, saya merasa sangat mudah digunakan setelah menghabiskan 6 minggu mencoba membuat CMake berfungsi. Saya ingin mendownload dependensi pihak ke-3 dan mengkompilasinya (karena saya terbiasa membangun alat dari python dan JavaScript). Ini membuatnya mudah tetapi memiliki kekurangan bahwa Anda mungkin harus menulis file bazel Anda sendiri untuk pihak ketiga yang tidak mendukungnya. Mereka membutuhkan repo pusat untuk menyimpannya dalam hitungan i'ze.
CpILL
6

Saya menggunakan SCons dan saya terkesan dengan sistem build ini. SCons dapat dikembangkan oleh python dan python itu sendiri - itu hebat, karena Python memiliki semua yang Anda butuhkan, cukup kodekan logikanya, semua fungsionalitas tingkat rendah sudah diterapkan di SCons dan Python dan bersifat lintas platform. Jika memiliki keterampilan pemrograman yang baik maka skrip build Anda akan terlihat sempurna dan mudah.

Make, CMake, dan sistem build serupa tampaknya seperti tempat sampah macroses. Waf adalah analog SCons. Saya mencoba Waf tetapi SCons akan lebih ramah dan jadi saya tetap menggunakan SCons.

Menurut pendapat orang banyak SCons terlalu lambat, tetapi di tengah proyek saya tidak melihat perbedaan antara make dan SCons berdasarkan kecepatan build. Sebaliknya, SCons telah bekerja dengan baik dengan build paralel, sementara make memiliki masalah besar dengannya.

Selain itu, SCons memungkinkan Anda untuk mendapatkan - mengkonfigurasi, membangun, menerapkan, menghasilkan konfigurasi dari template, menjalankan pengujian, dan melakukan tugas lain yang dapat dilakukan dapat melakukan pengkodean dengan python dan SCons - semuanya dalam satu. Itu adalah keuntungan yang sangat besar.

Untuk proyek sederhana, CMake juga merupakan pilihan yang baik.

Torsten
sumber
3
Masalah saya di sini adalah saya dimanjakan. Saya berprofesi sebagai pengembang Java, dan alat seperti Gradle di dunia Java adalah jenis alat yang sangat ingin saya miliki untuk pengembangan C ++. Saya dapat menyiapkan proyek gradle, tanpa ketergantungan eksternal, menggunakan file build baris tunggal. Itu dia. Proyek multi-modul yang memiliki banyak dependensi masih mudah dilakukan juga, dan sebenarnya memiliki konfigurasi yang jauh lebih sedikit daripada proyek C ++ sederhana ...
Graham
Saya mengalami masalah dalam membangun paket lain yang menggunakan Scons karena tidak abstrak tanda konfigurasi sistem seperti -I include dirs dan -L library dirs. Tidak perlu CFLAGS, Anda sering kali harus memodifikasi setiap skrip scons agar terlihat di tempat yang tepat.
ACyclic
5

hanya untuk menambahkan sen saya: premake

http://industriousone.com/premake

ada juga halaman web khusus di wiki.

pengguna827992
sumber
2
Sayangnya Premake tidak mendukung pembuatan kode sesuai persyaratan OP. Dan saya tidak akan menyebut dukungannya untuk pengujian unit "layak", meskipun ada beberapa hal yang dapat Anda lakukan.
ergosys
@ergosys saya perhatikan bahwa semut tidak disebutkan, antjuga mendukung C / C ++, lihat apakah ini bagus untuk Anda, ini adalah nama belakang yang saya miliki, saya hanya menggunakan Makefiles dan Cmake untuk ini.
user827992
2

Anda bisa menggunakan Ceedling . Perhatikan, bagaimanapun itu hanya mendukung C saat ini dan itu terkait erat dengan kerangka pengujian Unity dan CMock penulis.

Ini dapat bercabang dan dimodifikasi untuk bekerja dengan kompiler C ++ dan kerangka pengujian unit / mocking dengan cukup mudah.

Juga Tup adalah sebutan yang layak. Ini sangat cepat tetapi tidak tahu apa-apa tentang pengujian kerangka kerja dll. Yang berarti Anda harus menulis sistem build Anda sendiri menggunakan Tup. Jika Anda berencana melakukan TDD, Tup mungkin adalah cara yang tepat.

thegreendroid
sumber