Saya kode pada C / C ++ dan menggunakan Makefile (GNU) untuk mengkompilasi kode. Saya dapat melakukan hal yang sama dengan CMake dan mendapatkan MakeFile. Namun, apa perbedaan antara menggunakan Makefile dan CMake untuk mengkompilasi kode?
288
Jawaban:
Make (atau lebih tepatnya Makefile) adalah sistem build - ia menggerakkan kompiler dan alat bantu bangunan lain untuk membangun kode Anda.
CMake adalah generator sistem pembangunan. Dapat menghasilkan Makefiles, dapat menghasilkan file build Ninja, dapat menghasilkan proyek KDEvelop atau Xcode, dapat menghasilkan solusi Visual Studio. Dari titik awal yang sama, file CMakeLists.txt yang sama. Jadi jika Anda memiliki proyek platform-independen, CMake adalah cara untuk membuatnya membangun sistem juga.
Jika Anda memiliki pengembang Windows yang terbiasa dengan pengembang Visual Studio dan Unix yang bersumpah dengan GNU Make, CMake adalah salah satu cara untuk melakukannya.
Saya selalu merekomendasikan menggunakan CMake (atau generator buildsystem lain, tetapi CMake adalah pilihan pribadi saya) jika Anda ingin proyek Anda multi-platform atau dapat digunakan secara luas. CMake sendiri juga menyediakan beberapa fitur bagus seperti deteksi ketergantungan, manajemen antarmuka perpustakaan, atau integrasi dengan CTest, CDash dan CPack.
Menggunakan generator buildsystem membuat proyek Anda lebih tahan masa depan. Bahkan jika Anda hanya GNU-Make-only sekarang, bagaimana jika Anda kemudian memutuskan untuk memperluas ke platform lain (baik itu Windows atau sesuatu yang disematkan), atau hanya ingin menggunakan IDE?
sumber
find_package()
) atau dukungan pengujian / pengemasan.Pernyataan tentang CMake menjadi "generator pembangkit" adalah kesalahpahaman yang umum.
Secara teknis tidak salah; itu hanya menjelaskan BAGAIMANA cara kerjanya, tetapi tidak APA yang berfungsi.
Dalam konteks pertanyaan, mereka melakukan hal yang sama: mengambil banyak file C / C ++ dan mengubahnya menjadi biner.
Jadi, apa perbedaan sebenarnya?
CMake jauh lebih tinggi levelnya. Ini dirancang untuk mengkompilasi C ++, yang mana Anda menulis lebih sedikit kode build, tetapi dapat juga digunakan untuk build tujuan umum.
make
memiliki beberapa aturan C / C ++ bawaan juga, tetapi kebanyakan tidak berguna.CMake
membangun dua langkah: itu menghasilkan skrip pembangunan tingkat rendah dininja
ataumake
atau banyak generator lainnya, dan kemudian Anda menjalankannya. Semua potongan skrip shell yang biasanya ditumpukMakefile
hanya dieksekusi pada tahap generasi. Dengan demikian,CMake
build bisa menjadi urutan besarnya lebih cepat.Tata bahasanya
CMake
jauh lebih mudah untuk mendukung alat eksternal daripada make .Setelah
make
membangun artefak, ia lupa bagaimana itu dibangun. Sumber apa itu dibangun, apa bendera kompiler?CMake
melacaknya,make
menyerahkannya kepada Anda. Jika salah satu sumber pustaka dihapus sejak versi sebelumnyaMakefile
,make
tidak akan membangunnya kembali.Modern
CMake
(dimulai dengan versi 3.something) berfungsi dalam hal ketergantungan antara "target". Target masih berupa file otput tunggal (sayangnya), tetapi dapat memiliki dependensi transitif ("publik" / "antarmuka" dalam istilah CMake). Ketergantungan transitif ini dapat diekspos atau disembunyikan dari paket dependen.CMake
akan mengelola direktori untuk Anda juga. Denganmake
, Anda terjebak pada level file per file dan kelola-direktori-dengan-tangan.Anda bisa membuat kode sesuatu dalam
make
menggunakan file flag untuk menutupi dua celah terakhir, tetapi Anda sendiri.make
memang mengandung bahasa lengkap Turing (bahkan dua, terkadang tiga menghitung Tipu muslihat ), dan semuanya mengerikan.Jujur saja, ini adalah kesamaan
CMake
danmake
kesamaan - bahasa mereka cukup mengerikan:memulai dengan.
Tetapi di dalam
CMake
kamu menulis lebih sedikit baris kode.sumber