Pengenalan ringkas kepada 'makefiles' dalam pembangunan perisian sumber terbuka dengan GNU Make

Pengenalan ringkas kepada 'makefiles' dalam pembangunan perisian sumber terbuka dengan GNU Make

Gnu buat adalah utiliti pembangunan yang menentukan bahagian asas kod tertentu yang akan dikompilasi dan boleh mengeluarkan perintah untuk melaksanakan operasi tersebut di pangkalan kod. Ini khusus buat Utiliti boleh digunakan dengan mana -mana bahasa pengaturcaraan dengan syarat kompilasi mereka dapat dilakukan dari shell dengan mengeluarkan arahan.

Makefiles di Linux

Untuk menggunakan Gnu buat, Kita perlu mempunyai beberapa set peraturan yang mentakrifkan hubungan antara fail yang berbeza dalam program dan arahan kami untuk mengemas kini setiap fail. Ini ditulis pada fail khas yang dipanggil 'Makefile'. 'buat'Perintah menggunakan'Makefile'Pangkalan data dan masa pengubahsuaian terakhir fail untuk menentukan yang mana semua fail akan dikompilasi semula.

Kandungan Makefile

Secara amnya 'Makefiles'Mengandungi 5 jenis perkara iaitu: peraturan tersirat, peraturan eksplisit, definisi berubah -ubah, arahan, dan Komen.

  1. An peraturan eksplisit Menentukan cara membuat/membuat semula satu atau lebih fail (dipanggil sasaran, akan dijelaskan kemudian) dan bila melakukan perkara yang sama.
  2. An peraturan tersirat Menentukan cara membuat/membuat semula satu atau lebih fail berdasarkan nama mereka. Ia menerangkan bagaimana nama fail sasaran berkaitan dengan satu fail dengan nama yang serupa dengan sasaran.
  3. A definisi berubah -ubah adalah garis yang menentukan nilai rentetan untuk pembolehubah digantikan kemudian.
  4. A arahan adalah arahan untuk membuat sesuatu yang istimewa semasa membaca makefile.
  5. A '#'Simbol digunakan mewakili permulaan a komen dalam Makefiles. Garis bermula dengan '#'hanya diabaikan.

Struktur makefiles

Maklumat yang diberitahu buat cara mengkompilasi semula sistem dari membaca pangkalan data yang disebut Makefile. Yang mudah Makefile Akan terdiri daripada peraturan sintaks berikut:

Sasaran ...: Prasyarat ... resipi .. 

A sasaran ditakrifkan sebagai fail output yang dihasilkan oleh program. Ia juga boleh sasaran palsu, yang akan dijelaskan di bawah. Contoh fail sasaran termasuk executable, fail objek atau sasaran palsu Seperti Bersih, Pasang, Nyahpasang dan lain-lain.

A prasyarat adalah fail yang digunakan sebagai input untuk membuat fail sasaran.

A resipi adalah tindakan yang buat melakukan untuk membuat fail sasaran berdasarkan prasyarat. Adalah perlu untuk meletakkan watak tab sebelum setiap resipi di dalam Makefiles melainkan jika kita menentukan '.ResipiPrefix'Pembolehubah untuk menentukan watak lain sebagai awalan ke resipi.

Contoh makefile

Akhir: Utama.O akhir.o Inter.o Mula.o GCC -O utama akhir.O akhir.o Inter.o Mula.o Utama.O: Utama.c Global.h gcc -c utama.C END.O: akhir.c tempatan.H Global.h gcc -c akhir.C Inter.O: Inter.c Global.h gcc -c inter.C Mula.O: Mula.c Global.h gcc -c bermula.C Bersih: Rm -f Utama.O akhir.o Inter.o Mula.o

Dalam contoh di atas yang kami gunakan 4 c Fail sumber dan dua fail header untuk membuat laksanakan final. Di sini masing -masing '.o'Fail adalah sasaran dan prasyarat di dalam Makefile. Sekarang lihat nama sasaran terakhir Bersih. Itu hanya tindakan dan bukannya fail sasaran.

Oleh kerana kita biasanya tidak memerlukan ini semasa penyusunan, ia tidak ditulis sebagai prasyarat dalam peraturan lain. Sasaran yang tidak merujuk kepada fail tetapi hanya tindakan yang dipanggil sasaran palsu. Mereka tidak akan mempunyai prasyarat sebagai fail sasaran lain.

Bagaimana GNU membuat proses membuatefile

Secara lalai buat bermula dengan sasaran pertama dalam 'Makefile'dan dipanggil sebagai'Matlamat lalai'. Memandangkan contoh kami, kami ada final Sebagai sasaran pertama kami. Oleh kerana prasyaratnya termasuk fail objek lain yang akan dikemas kini sebelum membuat final. Setiap prasyarat ini diproses mengikut peraturan mereka sendiri.

Penyusunan semula berlaku jika terdapat pengubahsuaian yang dibuat fail sumber atau fail header atau jika fail objek sama sekali tidak wujud. Setelah mengembalikan semula fail objek yang diperlukan, buat memutuskan sama ada untuk menghidupkan semula final atau tidak. Ini mesti dilakukan jika fail final tidak wujud, atau jika mana -mana fail objek lebih baru daripadanya.

Oleh itu jika kita menukar fail antara.c, kemudian berjalan buat ia akan mengkompilasi fail sumber untuk mengemas kini fail objek antara.o dan kemudian pautan final.

Menggunakan pembolehubah di dalam makefiles

Dalam contoh kami, kami terpaksa menyenaraikan semua fail objek dua kali dalam peraturan untuk final seperti yang ditunjukkan di bawah.

Akhir: Utama.O akhir.o Inter.o Mula.o GCC -O utama akhir.O akhir.o Inter.o Mula.o

Untuk mengelakkan pertindihan tersebut, kami dapat memperkenalkan pembolehubah untuk menyimpan senarai fail objek yang digunakan di dalamnya Makefile. Dengan menggunakan pemboleh ubah Obj kita boleh menulis semula sampel Makefile kepada yang serupa ditunjukkan di bawah.

Obj = utama.O akhir.o Inter.o Mula.O Final: $ (OBJ) GCC -O Final $ (OBJ) Utama.O: Utama.c Global.h gcc -c utama.C END.O: akhir.c tempatan.H Global.h gcc -c akhir.C Inter.O: Inter.c Global.h gcc -c inter.C Mula.O: Mula.c Global.h gcc -c bermula.C Bersih: rm -f $ (obj)

Peraturan untuk membersihkan direktori sumber

Seperti yang kita lihat dalam contoh Makefile, kita boleh menentukan peraturan untuk bersihkan Direktori sumber dengan mengeluarkan fail objek yang tidak diingini selepas penyusunan. Katakan kita kebetulan mempunyai fail sasaran yang dipanggil Bersih. Bagaimana boleh buat membezakan dua situasi di atas? Inilah konsep konsep sasaran palsu.

A sasaran palsu adalah salah satu yang tidak benar -benar nama fail, sebaliknya ia hanya nama untuk resipi yang akan dilaksanakan apabila permintaan eksplisit dibuat dari Makefile. Satu sebab utama untuk digunakan sasaran palsu adalah untuk mengelakkan konflik dengan fail dengan nama yang sama. Sebab lain adalah untuk meningkatkan prestasi.

Untuk menerangkan perkara ini, saya akan mendedahkan satu sentuhan yang tidak dijangka. Resipi untuk Bersih tidak akan dilaksanakan secara lalai semasa berjalan buat. Sebaliknya perlu menggunakannya dengan mengeluarkan arahan Buat bersih.

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

Sekarang cuba buat Makefiles untuk pangkalan kod anda sendiri. Jangan ragu untuk memberi komen di sini dengan keraguan anda.