Makefile

Makefile adalah file yang digunakan oleh program GNU Make untuk melakukan kompilasi secara cerdas. Makefile bekerja dengan cara memeriksa waktu modifikasi dari file terkait dan melakukan kompilasi hanya pada file yang telah berubah sejak waktu kompilasi terakhir.

Rule Makefile

Untuk menggunakan Makefile, kita harus membuat file dengan nama Makefile yang berada pada direktori kompilasi. Masing-masing direktori dapat memiliki Makefile yang berbeda-beda. Berikut adalah rule umum dari Makefile:

target: dependencies
    command
    command
Syntax Keterangan
target Nama dari file yang akan dibuat.
dependencies Nama dari satu atau file yang dibutuhkan untuk membuat target.
command Perintah yang akan dijalankan untuk membuat target.

Apabila ada beberapa file yang ditulis di target, masing-masing file akan dibuat secara terpisah dimulai.

File Makefile harus menggunakan indentasi hard dalam bentuk Tab sebelum setiap command.

Menjalankan Makefile

Untuk membuat salah satu target yang ada di Makefile, kita dapat menggunakan perintah:

make target

Apabila tidak ada file dengan nama target, setiap file di dependencies akan menjadi target baru yang akan dibuat. Setelah itu, command untuk target akan dijalankan.

Sebaliknya, apabila sudah ada file dengan nama target, hanya file di dependencies yang memiliki timestamp lebih baru dari target akan dibuat menjadi target baru. Apabila ada target yang dibuat ulang, command untuk target akan dijalankan.

Variabel Makefile

Ada beberapa cara definisi variabel di Makefile:

Syntax Keterangan
VARIABLE = value Variabel memiliki nilai value yang akan diekspansi saat penggunaan VARIABLE.
VARIABLE := value Variabel memiliki nilai value yang akan diekspansi saat definisi VARIABLE.
VARIABLE += value Nilai value akan ditambahkan ke VARIABLE nilai value akan diekspansi sesuai dengan jenis definisi VARIABLE.
VARIABLE ?= value Variabel memiliki nilai value yang akan diekspansi saat penggunaan VARIABLE apabila VARIABLE belum didefinisikan.

Nilai variabel dapat diakses dengan menggunakan $(VARIABLE).

Wildcard

Wildcard dapat digunakan untuk menyederhanakan penulisan Makefile. Sama seperti penggunaan di shell, kita dapat menggunakan *.o untuk mencocokan semua file yang berakhiran .o.

Wildcard tidak terekspansi saat menggunakan definisi variabel. Untuk penggunaan yang optimum gunakan definisi objects := $(wildcard *.o).

Pattern Rule

Pattern rule dapat digunakan untuk menyederhanakan penulisan Makefile. Pattern rule digunakan untuk membuat target yang memiliki pola tertentu. Berikut adalah contoh penggunaan pattern rule:

%.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@

Pada contoh di atas, target yang dibuat memiliki pola %.o yang mencakup semua file *.o. %.c menandakan bahwa dependencies adalah file berakhiran .c dengan nama yang sama. $< dan $@ adalah variabel otomatis yang akan dijelaskan pada bagian selanjutnya.

Variabel Otomatis

Ada beberapa variabel otomatis yang juga dapat digunakan untuk menyederhanakan penulisan Makefile:

Variabel Keterangan
$@ Nama dari target yang sedang dibuat.
$< Nama dari file pertama di dependencies.
$^ Nama dari semua file di dependencies.
$? Nama dari semua file di dependencies yang memiliki timestamp lebih baru dari target.
$* Nama dari target yang sedang dibuat tanpa ekstensi. Biasanya digunakan untuk penggunaan pattern rule.

.PHONY

.PHONY adalah target spesial yang dapat digunakan agar perintah make selalu dapat berjalan tanpa harus khawatir akan adanya file dengan nama yang sama. Berikut adalah contoh penggunaan .PHONY:

.PHONY: clean

clean:
    rm -f *.o

Contoh Makefile

CC = gcc
CFLAGS = -O2

objects := $(wildcard *.o)

all: program

%.o: %.c
    $(CC) -c $(CFLAGS) $< -o $@

program: $(objects)
    $(CC) $(CFLAGS) $^ -o $@

.PHONY: all

clean:
    rm -f *.o