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:
- Dukungan C ++ 11
- Lintas platform (Linux sebagai target utama, tetapi dapat dibangun setidaknya di Windows juga)
- Dukungan pengujian unit yang layak
- Dukungan untuk beberapa modul untuk memisahkan kode
- Dukungan untuk pembuatan kode (Menggunakan asn1c atau protobuf - belum 100% yakin)
- 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?
Jawaban:
+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 menggunakanCMake
. 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
CMake
atau sesuatu dengan API yang kaya untuk ekstensi Anda sendiri, sepertiScons
(atauWaf
).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 dariScons
maksud 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 menggunakannyaScons
, 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]
Scons
bekerja 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
qmake
ditulis - untukmoc
praproses*.hpp/*.cpp
file).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 "
sumber
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.
sumber
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.
sumber
javac
class dalam, yang dipisahkan menjadiclass$1.class
file), 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..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 mencaritupjob
jalur tersebut, yang tidak menyebabkan kesalahan.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.
sumber
Sistem Google build adalah alternatif yang baik: http://bazel.io/
sumber
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.
sumber
hanya untuk menambahkan sen saya: premake
http://industriousone.com/premake
ada juga halaman web khusus di wiki.
sumber
ant
juga mendukung C / C ++, lihat apakah ini bagus untuk Anda, ini adalah nama belakang yang saya miliki, saya hanya menggunakan Makefiles dan Cmake untuk ini.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.
sumber