Saya bertanya-tanya apakah ada kode sampel untuk Makefile
s ( make
) dan CMakeLists.txt
( cmake
) yang keduanya melakukan hal yang sama (satu-satunya perbedaan adalah yang satu ditulis make
dan yang lainnya di cmake
).
Saya mencoba mencari 'cmake vs make', tetapi saya tidak pernah menemukan perbandingan kode apa pun. Akan sangat membantu untuk memahami perbedaannya, meskipun hanya untuk kasus sederhana.
cmake
saya menginginkan ini juga. Tapi saya ragu Anda akan menemukannya karena kemampuannya tidak memetakan dengan baik satu sama lain. Jika Anda mencoba membuatcmake
tindakan seperti itumake
, Anda akan membuat diri Anda gila, sungguh. Sebaiknya mulai dari awal. Hal-hal yang sepelemake
cukup terlibatcmake
, begitu pula sebaliknya.make
dancmake
begitu berbeda sehingga mereka harus dilihat lebih sebagai alat yang saling melengkapi daripada bersaing?cp *.x $(OUTDIR)
" yang Anda tulis di Makefile. Mungkin bagian yang paling menjengkelkan bagi saya adalah bahwa Makefile yang dihasilkan dirancang dengan benar-benar tidak dapat dibawa dan tidak fleksibel (lanjutan)Jawaban:
Makefile berikut membuat executable yang dinamai
prog
dari sumberprog1.c, prog2.c, prog3.c and main.c
.prog
ditautkanlibmystatlib.a
danlibmydynlib.so
keduanya juga dibangun dari sumber. Selain itu,prog
menggunakan pustakalibstuff.a
distuff/lib
dan headernya distuff/include
. Makefile secara default membangun target rilis, tetapi juga menawarkan target debug:Berikut ini adalah
CMakeLists.txt
yang (hampir) persis sama, dengan beberapa komentar untuk menggarisbawahi kesamaan dengan Makefile:Dalam contoh sederhana ini, perbedaan terpenting adalah:
CMake mengenali kompiler mana yang akan digunakan untuk jenis sumber apa. Juga, itu memanggil urutan perintah yang benar untuk setiap jenis target. Oleh karena itu, tidak ada spesifikasi eksplisit dari perintah seperti
$(CC) ...
,$(RANLIB) ...
dan sebagainya.Semua flag compiler / linker biasa yang menangani penyertaan file header, library, dll. Diganti dengan perintah platform independen / sistem build independen.
Bendera debugging termasuk oleh salah satu pengaturan variabel
CMAKE_BUILD_TYPE
untuk "Debug", atau dengan melewatkan ke CMake saat menjalankan program:cmake -DCMAKE_BUILD_TYPE:STRING=Debug
.CMake juga menawarkan penyertaan bendera '-fPIC' secara independen pada platform (melalui
POSITION_INDEPENDENT_CODE
properti) dan banyak lainnya. Namun, pengaturan yang lebih tidak jelas dapat diimplementasikan dengan tangan di CMake serta di Makefile (dengan menggunakanCOMPILE_FLAGS
dan properti serupa). Tentu saja CMake benar-benar mulai bersinar saat pustaka pihak ketiga (seperti OpenGL) disertakan secara portabel.Proses build memiliki satu langkah jika menggunakan Makefile yaitu mengetik
make
pada baris perintah. Untuk CMake, ada dua langkah: Pertama, Anda perlu menyiapkan lingkungan build Anda (baik dengan mengetikcmake <source_dir>
di direktori build Anda atau dengan menjalankan beberapa klien GUI). Ini membuat Makefile atau sesuatu yang setara, tergantung pada sistem build pilihan Anda (misalnya make di Unixes atau VC ++ atau MinGW + Msys di Windows). Sistem build dapat diteruskan ke CMake sebagai parameter; namun, CMake membuat pilihan default yang wajar bergantung pada konfigurasi sistem Anda. Kedua, Anda menjalankan build sebenarnya dalam sistem build yang dipilih.Sumber dan instruksi pembuatan tersedia di https://github.com/rhoelzel/make_cmake .
sumber
CPPFLAGS
bukanINCDIR
seseorang dapat menggunakan aturan built-in dan pemanggilan eksplisit dari compiler akan menjadi redundan. Demikian pula untuk penanganan ar, aturan bawaan juga bisa mencakup itu. Juga, mengapa ditetapkanCPP
danCC
secara eksplisit? Mereka sudah diatur ke nilai yang baik denganmake
, mereka adalah variabel yang telah ditentukan sebelumnya.make
juga mengenali kompiler mana yang akan digunakan untuk jenis sumber apa, aturan bawaannya banyak.:=
bukan=
.cmake
lebih sebanding denganautomake
darimake
.INCLUDES
bukanINCDIR
. Anda tidak membutuhkan aturan% .o:%. C.Ambil beberapa perangkat lunak yang menggunakan CMake sebagai sistem pembuatannya (ada banyak proyek sumber terbuka untuk dipilih sebagai contoh). Dapatkan kode sumber dan konfigurasikan menggunakan CMake. Baca makefile yang dihasilkan dan nikmati.
Satu hal yang perlu diingat bahwa alat tersebut tidak memetakan satu-ke-satu. Perbedaan yang paling jelas adalah CMake memindai dependensi antara file yang berbeda (mis. Header C dan file sumber), sementara meninggalkannya ke pembuat makefile.
sumber
Jika pertanyaan ini tentang contoh
Makefile
keluaranCMakeList.txt
file, silakan periksa sumber cmake-backend dan buat satu seperti ituMakefile
. Jika tidak, maka menambahkan balasan @Roberto saya mencoba membuatnya sederhana dengan menyembunyikan detailnya.Fungsi CMake
Sedangkan
Make
alat fleksibel untuk aturan dan resep,CMake
merupakan lapisan abstraksi yang juga menambahkan fitur konfigurasi.Dataran saya
CMakeLists.txt
akan terlihat seperti berikut ini,Perhatikan, bahwa
CMake
menyembunyikanhow
build bisa dilakukan. Kami hanya menentukanwhat
adalah input dan output.The
CMakeLists.txt
berisi daftar fungsi-panggilan yang ditentukan olehcmake
.(Fungsi CMake) Vs Buat aturan
Dalam
Makefile
saturules and recipes
digunakan sebagai penggantifunctions
. Selainfunction
fitur -like,rules and recipes
sediakan chaining. Minimalis sayaMakefile
akan terlihat seperti berikut,Sedangkan tampilannya
executable.mk
akan seperti berikut ini,Mulai dari awal saya akan mulai dengan
Makefile
yang berikut ini,Saya mendapatkan potongan ini dari sini dan memodifikasinya. Perhatikan bahwa beberapa implisit-rules ditambahkan ke file ini yang dapat ditemukan di dokumentasi makefile. Beberapa variabel implisit juga relevan di sini.
Catatan, itu
Makefile
memberikan detail yangrecipe
menunjukkanhow
bahwa pembangunan bisa dilakukan. Dimungkinkan untuk menulisexecutable.mk
untuk menjaga detail yang ditentukan dalam satu file. Dengan cara itu makefile bisa dikurangi seperti yang saya tunjukkan tadi.Variabel Internal dalam
CMake
danMake
Sekarang sedikit lebih maju, di
CMake
kita dapat mengatur bendera kompilator seperti berikut,Cari tahu lebih lanjut tentang
CMake
variabel default dalamCMakeCache.txt
file. TheCMake
kode di atas akan setara denganMake
kode di bawah ini,Perhatikan bahwa
CFLAGS
variabel internal dalamMake
, dengan cara yang sama,CMAKE_C_FLAGS
adalah variabel internal dalamCMake
.menambahkan penyertaan dan jalur perpustakaan di CMake
Kita bisa melakukannya dengan
cmake
menggunakan fungsi.Vs menambahkan penyertaan dan jalur pustaka di Make
Kita dapat menambahkan penyertaan dan pustaka dengan menambahkan baris seperti berikut,
Perhatikan bahwa baris di atas dapat dibuat dari alat auto-gen atau pkg-config. (meskipun Makefile tidak bergantung pada alat konfigurasi otomatis)
Konfigurasi CMake / tweek
Biasanya dimungkinkan untuk menghasilkan beberapa
config.h
file sepertiauto-config
alat dengan menggunakanconfigure_file
fungsi. Dimungkinkan untuk melakukan lebih banyak trik menulis fungsi kustom. Dan terakhir kita bisa memilih konfigurasi seperti berikut,Dimungkinkan untuk menambahkan beberapa opsi yang dapat dikonfigurasi menggunakan
option
fungsi tersebut.Konfigurasi / tweak Makefile
Jika entah bagaimana kita perlu mengkompilasinya dengan beberapa flag debug, kita bisa memanggil
make
like,Saya pikir variabel internal,
Makefile-rules
danCMake-functions
awal yang baik untuk perbandingan, semoga sukses dengan lebih banyak menggali.sumber