Previous Next Table of Contents

6. Makefile Tingkat Lanjut

6.1 Pola Target

Jika kita mempunyai banyak file sumber, akan repot untuk menuliskannya satu-satu menjadi target-target. Misalnya kita mempunyai 100 file .c, maka bayangkan bahwa kita harus membuat 100 target .o di Makefile kita.


# Sekali lagi, whitespace di bawah target-target adalah TAB, bukan SPACE !!

all: hello

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

main.o: main.c hello.h
        gcc -c main.c
        
hello.o: hello.c hello.h
        gcc -c hello.c

Dua target .o dalam Makefile di atas dapat kita sederhanakan menjadi satu target:


all: hello

hello: main.o hello.o
        gcc -o hello main.o hello.o
        
%.o: %.c hello.h
        gcc -c $<

Artinya, untuk semua target yang berakhiran .o, dependency-nya adalah file dengan nama yang sama tapi berakhiran .c plus file hello.h. Sedangkan variabel $< akan di-replace dengan nama file .c yang sesuai.

Misalkan make sedang mengeksekusi target hello, dan melihat dependency main.o. Dengan adanya pola itu, maka seolah-olah make akan membuat target main.o ini secara on-the-fly:


main.o: main.c hello.h
        gcc -c main.c

Demikian juga ketika memproses dependency hello.o, seolah-olah make akan membuat target baru hello.o secara on-the-fly:


hello.o: hello.c hello.h
        gcc -c hello.c

6.2 Menggunakan Variabel

Makefile dapat berisi variabel-variabel yang berisi nilai-nilai. Kegunaan variabel antara lain untuk memudahkan peng-update-an Makefile jika ada yang berubah pada program kita.

Pada contoh di bawah misalnya, kita menyimpan nama-nama file objek dalam variabel OBJS. Jika kita hendak menambah file sumber baru, maka cukup menambahkan nama file objeknya saja dalam variabel OBJS, tanpa merubah bagian lain dari Makefile:


# kita masukkan nama-nama object-file dalam variabel OBJS
OBJS = head.o main.o

all: hello

hello: $(OBJS)
        gcc -o hello $(OBJS)

%.o: %.c hello.h
        gcc -c $<
        
clean:
        rm -f $(OBJS)
        rm -f hello

Variabel dapat didefinisikan dengan syntax:

VARNAME = values

dimana values bisa berupa string, variabel lain (dengan format $(OTHERVAR)), atau kombinasi antara keduanya. Contoh definisi variabel:

MAIN = main.o
HELLO = hello.o

# di kedua kasus, variabel OBJ akan berisi nilai = main.o hello.o
OBJ = $(MAIN) $(HELLO)
OBJ = main.o $(HELLO)
Whitespace sebelum dan setelah tanda sama dengan ('=') diabaikan.

Sedangkan untuk memakai variabel VARNAME, formatnya adalah: $(VARNAME).


Previous Next Table of Contents