Tedi Heriyanto 1
11 Juni 2001
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] :
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
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 ...
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 :
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
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.
$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
Demikianlah uraian singkat kami mengenai makefile, semoga dapat memberikan manfaat.