Panduan Singkat Membuat Makefile

Tedi Heriyanto 1

11 Juni 2001

Ringkasan:

Artikel ini akan mengetengahkan beberapa hal yang dapat anda jadikan panduan bila anda ingin membuat makefile sendiri. Pembahasan dimulai dengan menjelaskan mengapa diperlukan makefile, kemudian diberikan beberapa hal penting dalam membuat makefile. Kemudian artikel diakhiri dengan contoh sebuah makefile yang telah mengimplementasikan hal-hal yang telah dibahas.

Pendahuluan

Misalkan saja anda sedang membuat sebuah program bernama foo, yang terdiri dari lima buah header, yaitu 1.h, 2.h, 3.h, 4.h, dan 5.h, serta enam buah file sumber 1.cpp hingga 5.cpp dan sebuah main.cpp (kami tidak menganjurkan penamaan file yang demikian dalam kehidupan nyata...:).

Apa yang anda lakukan jika anda merubah salah satu file tersebut, anda harus mengkompilasi ulang seluruh file tersebut, meskipun yang anda rubah hanya satu buah file. Ini bukanlah sebuah pekerjaan yang menyenangkan, menunggu komputer selesai membuild program anda, apalagi jika komputer anda sangat lambat. :)

Jangan kuatir, masalah tersebut sudah pernah dialami oleh para hacker komputer sejak dulu, dan terciptalah sebuah program bernama make, yang dapat membantu mengatasi masalah anda. Program make hanya akan mem-build ulang kode sumber bilamana tanggal kode tersebut mengalami perubahan. Jadi jika anda hanya merubah satu buah file, maka make akan membuild ulang hanya file tersebut saja. Betapa menyenangkannya. :)

Selain hal yang telah disebutkan di atas, berikut ini adalah beberapa alasan mengapa perlu make [2] :

Mengapa Perlu makefile

Jika anda kemudian berpikir bahwa program make dapat menyelesaikan seluruh masalah anda dalam hal membuild kode sumber, silakan berpikir lagi, karena make tidak dapat mengerjakan sesuatu tanpa terlebih dulu diberitahukan. Make sendirian tidak berguna, ia harus dilengkapi dengan sebuah file lain yang berisikan perintah-perintah kepada make, file ini biasanya disebut makefile.

File ini biasanya memiliki nama makefile atau Makefile. Secara konvensi, program-program GNU memiliki makefile bernama Makefile, karena mudah dilihat (jika anda melakukan perintah ls maka file ini biasanya selalu berada di urutan paling atas). Jika anda memberi nama lainnya, berikan option-f pada perintah make untuk memberitahu make bahwa anda menggunakan file tersebut.

Anda menggunakan makefile bernama bejo, perintah untuk menjalankan make terhadap file tersebut menjadi :

make -f bejo

Struktur makefile

Sebuah makefile terdiri dari bagian target, dependencies dan rules. Dependecies berisikan hal-hal atau kode sumber yang diperlukan untuk membuat sebuah target, target ini biasanya berupa sebuah file eksekutabel. Sementara rules mendefinisikan perintah-perintah yang digunakan untuk membuat target tersebut.

Berikut ini adalah bagan sederhana sebuah makefile :

target: dependencies
	command
	command
	...

Contoh makefile

Berikut ini adalah sebuah contoh makefile yang sangat sederhana :

1 client: conn.o 
2	g++ client.cpp conn.o -o client
 
3 conn.o: conn.cpp conn.h
4   g++ -c conn.cpp -o conn.o

Dalam makefile di atas, dependencies adalah baris yang berisikan client: conn.o, sementara rules adalah baris yang berisikan g++ client.cpp conn.o -o client. Perhatikan bahwa dalam baris rules, terdapat ruangan yang cukup lebar, ruang tersebut dibuat dengan memberikan sebuah tab. Seringkali kesalahan pemberian spasi alih-alih tab dapat menyebabkan kita bingung tujuh keliling. :)

Pengertian makefile di atas adalah sebagai berikut :

Komentar

Untuk membuat komentar di dalam makefile dapat dilakukan dengan memberikan tanda # di awal baris yang ingin dikomentari.

Berikut ini adalah contoh makefile di atas yang telah diberikan komentar sederhana :

# Membuat target dengan nama client
1 client: conn.o
2   g++ client.cpp conn.o -o client

# Membuat file obyek conn.o 
3 conn.o: conn.cpp conn.h
4   g++ -c conn.cpp -o conn.o

Phony Target[1]

Sebuah phony target adalah nama file yang bukan sebenarnya. Ia hanyalah nama bagi beberapa perintah yang akan dieksekusi ketika anda memberikan permintaan eksplisit. Terdapat dua buah alasan untuk menggunakan sebuah phony target : untuk menghindari konflik dengan sebuah file bernama sama dan untuk meningkatkan kinerja.

Jika anda menulis sebuah aturan yang perintahnya tidak akan menciptakan file target, perintah-perintah tersebut akan dieksekusi tiap kali target dibuat ulang. Berikut ini contohnya :

clean:
	rm *.o temp

Karena perintah rm tidak membuat file bernama clean, mungkin tidak akan ada file tersebut. Oleh karena itu, perintah rm akan dieksekusi setiap kali anda mengatakan make clean.

Phony target akan berhenti bekerja jika sesuatu membuat file bernama clean di direktori ini. Oleh karena ia tidak membutuhkan persyaratan, file clean akan dianggap uptodate, dan perintahnya tidak akan dieksekusi. Untuk menghindari masalah ini, anda dapat secara eksplisit mendeklarasikan target menjadi phony, menggunakan target khusus yaitu .PHONY. Berikut ini adalah contohnya :

.PHONY : clean

Setelah hal ini selesai, make clean akan menjalankan perintah-perintah tanpa terganggu adanya file bernama clean.

Variabel

Untuk mendefinisikan sebuah variabel dalam makefile, dapat dilakukan dengan perintah berikut :
$VAR_NAME=isinya

Biasanya nama sebuah variabel diberikan dalam huruf kapital semua.

Contoh :

$OBJECTS=main.o test.o

Untuk mengambil isi sebuah variabel, dapat dilakukan dengan cara memberi tanda $ dan nama variabel diapit dalam tanda kurung, contohnya :

$(VAR_NAME)

Dalam makefile dikenal ada dua buah variabel, yaitu variabel recursively expanded dan simply expanded. Pada variabel recursively expanded, make akan terus mengekspansi variabel tersebut, hingga tidak dapat lagi diekspansi, contohnya :

TOPDIR=/home/tedi/project
SRCDIR=$(TOPDIR)/src

Variabel SRCDIR akan diekspansikan dengan terlebih dulu mengekspansikan variabel TOPDIR. Hasil akhirnya adalah /home/tedi/project/src

Namun, variabel recursively expanded ini tidak akan sesuai untuk perintah berikut :

CC = gcc -o
CC = $(CC) -O2

Dengan menggunakan variabel recursively expanded, perintah di atas tidak akan pernah berkesudahan, oleh karena itu digunakan variabel simply expanded berikut :

CC := gcc -o
CC += $(CC) -O2

Penutup

Demikianlah uraian singkat kami mengenai makefile, semoga dapat memberikan manfaat.

Bibliografi

1
GNU Make Documentation File, info make.

2
Kurt Wall, et.al., Linux Programming Unleashed, 2001.


Footnotes

... Heriyanto1
Seorang Software Engineer, dapat dihubungi di tedi_h@gmx.net


Tedi Heriyanto 2001-06-11