File Makefile
dalam bentuknya yang paling sederhana:
# Komentar diawali dengan karakter '#'
# !! PENTING: WHITESPACE SEBELUM 'gcc' ADALAH TAB, BUKAN SPASI !!
all:
gcc -o hello hello.c
File Makefile
ini harus ditempatkan di direktori yang sama dengan file hello.c
. Untuk menjalankannya, cukup ketik perintah:
$ make all
atau
$ make
karena perintah make
tanpa option sama dengan make all
.
Mari kita membuat sebuah file Makefile
yang baru untuk program kita.
# Komentar diawali dengan '#'
# Penting: whitespace sebelum 'gcc' dan 'rm' adalah TAB, bukan SPASI.
all: hello
hello: hello.o
gcc -o hello hello.o
hello.o: hello.c
gcc -c hello.c
clean:
rm -f *.o
rm -f hello
Dengan Makefile
di atas, untuk membuat executable hello
kita cukup menjalankan perintah (pilih salah satu):
$ make
$ make all
$ make hello
Sedangkan untuk menghapus file executable dan file-file objek di current directori:
$ make clean
Makefile
Sebuah Makefile
terdiri dari target-target (berupa string yang diakhiri dengant titik-dua (':')). Pada contoh di atas, terdapat empat buah target, yaitu all
, hello
, hello.o
, dan clean
.
Sebuah target mempunyai tiga buah elemen:
make
memutuskan bahwa target harus dibangun.Sebagai contoh, mari kita lihat target hello
pada Makefile
di atas:
hello: hello.o
gcc -o hello hello.o
Melihat target hello
di atas:
hello
(ada di sebelah kiri titik-dua).hello.o
.gcc -o hello hello.o
.Makefile
DieksekusiKetika sebuah target dieksekusi, maka yang dilakukan adalah:
Mari kita lihat bagaimana Makefile
kita dieksekusi oleh make
.
$ make
Perintah di atas sama dengan perintah make all
. Perintah ini akan mengeksekusi target all
pada Makefile:
all: hello
Karena dependency hello.o
bukan merupakan file source, maka berarti ini adalah target, dan target ini akan dieksekusi terlebih dahulu. Setelah itu make
akan mencek apakah file hello
mempunyai tanggal yang lebih baru dari file all
. Karena tidak ada file all
pada current directory, maka dianggap bahwa all
perlu dibikin. Namun ternyata tidak ada perintah untuk membangun file all
ini, sehingga make
berhenti sampai di sini.
Sekarang mari kita lihat ketika target hello
dieksekusi (target ini akan dieksekusi oleh target all
atau ketika kita memberi perintah make hello
).
hello: hello.o
gcc -o hello hello.o
Karena dependency hello.o
bukan merupakan file source, maka berarti ini adalah target, dan target ini akan dieksekusi terlebih dahulu. Setelah itu, make
mencek apakah file dependency (hello.o
) mempunyai tanggal yang lebih baru dari file target (hello
). Jika tidak lebih baru, maka eksekusi target hello
ini berhenti sampai di sini (dan jika target ini dieksekusi oleh target all
, maka eksekusi akan kembali ke target all
). Jika lebih baru, maka perintah yang ada di target hello
ini akan dieksekusi (gcc -o hello hello.o
).
Sedangkan target hello.o
bisa dieksekusi oleh target hello
atau lewat perintah make hello.o
.
hello.o: hello.c
gcc -c hello.c
Karena dependency hello.c
adalah file source, maka make
cukup melihat apakah file ini lebih baru dari file hello.o
. Jika lebih baru, maka perintah di bawahnya akan dieksekusi.
Target clean
hanya bisa dieksekusi secara eksplisit lewat perintah make clean
.
clean:
rm -f *.o
rm -f hello
Target ini tidak mempunyai dependency, sehingga perintah-perintahnya akan selalu dieksekusi.