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
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)
.