Pengantar singkat untuk 'makefiles' dalam pengembangan perangkat lunak sumber terbuka dengan GNU Make

Pengantar singkat untuk 'makefiles' dalam pengembangan perangkat lunak sumber terbuka dengan GNU Make

GNU Make adalah utilitas pengembangan yang menentukan bagian -bagian dari basis kode tertentu yang akan dikompilasi ulang dan dapat mengeluarkan perintah untuk melakukan operasi tersebut pada basis kode. Ini membuat Utilitas dapat digunakan dengan bahasa pemrograman apa pun asalkan kompilasi mereka dapat dilakukan dari shell dengan menerbitkan perintah.

Makfile di Linux

Untuk digunakan GNU Make, Kita perlu memiliki beberapa set aturan yang mendefinisikan hubungan antara file yang berbeda dalam program dan perintah kami untuk memperbarui setiap file. Ini ditulis ke file khusus yang dipanggil 'Makefile'. The 'membuat'Perintah menggunakan'Makefile'Basis data dan waktu modifikasi terakhir dari file untuk memutuskan semua file mana yang harus dikompilasi kembali.

Isi Makefile

Umumnya 'makefile'berisi 5 jenis hal yaitu: aturan implisit, aturan eksplisit, Definisi variabel, arahan, Dan Komentar.

  1. Sebuah aturan eksplisit Menentukan cara membuat/membuat ulang satu atau lebih file (disebut target, akan dijelaskan nanti) dan kapan melakukan hal yang sama.
  2. Sebuah aturan implisit Menentukan cara membuat/membuat ulang satu atau lebih file berdasarkan nama mereka. Ini menjelaskan bagaimana nama file target terkait dengan satu file dengan nama yang mirip dengan target.
  3. A Definisi variabel adalah baris yang menentukan nilai string untuk variabel yang akan diganti nanti.
  4. A pengarahan adalah instruksi untuk membuat sesuatu yang istimewa saat membaca Makefile.
  5. A '#'Simbol digunakan mewakili awal dari a komentar di dalam makefile. Garis yang dimulai dengan '#'Diabaikan.

Struktur makefile

Informasi yang memberi tahu membuat Bagaimana mengkomposisi sistem berasal dari membaca basis data yang disebut Makefile. Sederhana Makefile akan terdiri dari aturan sintaks berikut:

Target ...: Prasyarat… Resep… 

A target didefinisikan sebagai file output yang dihasilkan oleh program. Itu bisa juga target palsu, yang akan dijelaskan di bawah ini. Contoh file target termasuk executable, file objek atau target palsu menyukai membersihkan, Install, uninstall dll.

A prasyarat adalah file yang digunakan sebagai input untuk membuat file target.

A resep adalah tindakan itu membuat melakukan untuk membuat file target berdasarkan prasyarat. Perlu untuk menempatkan karakter tab sebelum setiap resep di dalam makefile kecuali kami menentukan '.Recipeprefix'Variabel untuk mendefinisikan beberapa karakter lain sebagai awalan untuk resep.

Sampel makefile

Final: Utama.o Akhir.o Inter.o Mulai.o gcc -o final utama.o Akhir.o Inter.o Mulai.o Utama.O: Utama.C Global.H GCC -C Main.C AKHIR.O: Akhir.C Lokal.h global.H GCC -C Akhir.C Inter.O: Inter.C Global.H GCC -C Inter.C Mulai.O: Mulai.C Global.H GCC -C mulai.C Bersihkan: RM -F Utama.o Akhir.o Inter.o Mulai.Hai

Dalam contoh di atas yang kami gunakan 4 c file sumber dan dua file header untuk membuat yang dapat dieksekusi terakhir. Di sini masing -masing '.Hai'File adalah target dan prasyarat di dalam Makefile. Sekarang lihatlah nama target terakhir membersihkan. Itu hanya tindakan daripada file target.

Karena kita biasanya tidak membutuhkan ini selama kompilasi, itu tidak ditulis sebagai prasyarat dalam aturan lain. Target yang tidak merujuk ke file tetapi hanya tindakan yang disebut target palsu. Mereka tidak akan memiliki prasyarat sebagai file target lainnya.

Bagaimana GNU membuat proses makefile

Secara default membuat dimulai dengan target pertama di 'Makefile'dan dipanggil sebagai'tujuan default'. Mempertimbangkan contoh kami, kami punya terakhir Sebagai target pertama kami. Karena prasyaratnya termasuk file objek lain yang akan diperbarui sebelum membuat terakhir. Masing -masing prasyarat ini diproses sesuai dengan aturan mereka sendiri.

Kompilasi terjadi jika ada modifikasi yang dilakukan file sumber atau file header atau jika file objek tidak ada sama sekali. Setelah mengkompilasi ulang file objek yang diperlukan, membuat memutuskan apakah akan mundur terakhir atau tidak. Ini harus dilakukan jika file terakhir tidak ada, atau jika ada file objek yang lebih baru dari itu.

Jadi jika kita mengubah file antar.C, lalu berlari membuat Ini akan mengkomposisi ulang file sumber untuk memperbarui file objek antar.Hai dan kemudian tautan terakhir.

Menggunakan variabel di dalam makefiles

Dalam contoh kami, kami harus mencantumkan semua file objek dua kali dalam aturan untuk terakhir seperti yang ditunjukkan di bawah ini.

Final: Utama.o Akhir.o Inter.o Mulai.o gcc -o final utama.o Akhir.o Inter.o Mulai.Hai

Untuk menghindari duplikasi seperti itu, kami dapat memperkenalkan variabel untuk menyimpan daftar file objek yang digunakan di dalam Makefile. Dengan menggunakan variabel OBJ Kami dapat menulis ulang sampel Makefile ke yang serupa yang ditunjukkan di bawah ini.

OBJ = Main.o Akhir.o Inter.o Mulai.o Final: $ (OBJ) GCC -O Final $ (OBJ) Utama.O: Utama.C Global.H GCC -C Main.C AKHIR.O: Akhir.C Lokal.h global.H GCC -C Akhir.C Inter.O: Inter.C Global.H GCC -C Inter.C Mulai.O: Mulai.C Global.H GCC -C mulai.C Bersihkan: RM -F $ (OBJ)

Aturan untuk membersihkan direktori sumber

Seperti yang kita lihat dalam contohnya Makefile, kita dapat mendefinisikan aturan untuk membersihkan direktori sumber dengan menghapus file objek yang tidak diinginkan setelah kompilasi. Misalkan kita memiliki file target yang dipanggil membersihkan. bagaimana bisa membuat Bedakan dua situasi di atas? Inilah konsepnya target palsu.

A target palsu adalah salah satu yang sebenarnya bukan nama file, melainkan hanya nama untuk resep yang akan dieksekusi setiap kali permintaan eksplisit dibuat dari Makefile. Salah satu alasan utama untuk digunakan target palsu adalah menghindari konflik dengan file dengan nama yang sama. Alasan lain adalah meningkatkan kinerja.

Untuk menjelaskan hal ini, saya akan mengungkapkan satu sentuhan yang tidak terduga. Resep untuk membersihkan tidak akan dieksekusi secara default saat berjalan membuat. Sebaliknya perlu untuk memohon yang sama dengan mengeluarkan perintah membersihkan.

.Phony: Bersihkan Bersihkan: RM -F $ (OBJ)

Sekarang coba buat makefile Untuk basis kode Anda sendiri. Jangan ragu untuk berkomentar di sini dengan keraguan Anda.