Write Fancy Makefile

1 minute read

很多人常常寫出恐怖的makefile, 包含我自己, 對它內建的macro等語法感到陌生, GNU的官方manual 更是長到可怕,為了寫出好的makefile,參考了 java makefieTetralet的blog ,才產生了這麼fancy的makefile !

以下用C makefile做範例:

# 變數宣告,要注意 := 跟= 是不一樣的,在這裡沒差故僅使用 =
COMPILER = clang
CFLAGS = -std=c99 -O2 -Wall

# 清除 make 預設處理 *.c 檔案的行為
.SUFFIXES: .c

# 剛剛清除預設行為了,當然要定義一下囉,語法是 [target][dependency]
# 這裡因為 *.c 編譯出來沒有副檔名所以留白
# 例如: java的話要這樣寫
# " .java.class "
#  然後 $* 是built-in macro,會把prefix(檔名去掉副檔名)拿出來
.c:
	$(COMPILER) $(CFLAGS) $*.c -o $*

# 假目標,告訴make這並不會真的產生檔案,它只是指令
.PHONY: all clean remake

# input source file,記得換行要加backslash(\)
src = a.c \
			b.c

# output binary file,這個語法是字串的replace
# 這裡一樣因為 *.c 編譯出來沒有副檔名所以留白
# 例如:要把.java換成.class的話
# "$(src:.java=.class)"
bin = $(src:.c=)

# 預設會 run 第一個目標,也就是make = make all
all: $(bin)

clean:
	rm -f $(bin) 

remake: clean all

最後切記makefile裡面是tab不是space…….