Previous Next Table of Contents

4. Makefile

4.1 Makefile Sederhana

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.

4.2 Membedah Makefile

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

Struktur 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:

Sebagai contoh, mari kita lihat target hello pada Makefile di atas:


hello: hello.o
        gcc -o hello hello.o

Melihat target hello di atas:

Bagaimana sebuah Makefile Dieksekusi

Ketika sebuah target dieksekusi, maka yang dilakukan adalah:

  1. jika file-file dependency bukan file sumber (*.h, *.c, etc), maka dependency ini adalah target juga, dan akan dieksekusi terlebih dahulu.
  2. Selanjutnya file-file yang ada di dependency akan dicek tanggalnya, apakah ada yang lebih baru dari file target.
  3. Jika tidak ada file dependency yang tanggalnya lebih baru, maka eksekusi target ini berhenti sampai di sini.
  4. Jika ada file dependency yang tanggalnya lebih baru, maka perintah-perintah yang ada di target ini akan dieksekusi.

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.


Previous Next Table of Contents