因爲專案中用到了patsubst,所以記錄一下。
格式:$(patsubst <pattern>,<replacement>,<text> )
- 名稱:模式字串替換函數——patsubst。
- 功能:查詢text中的單詞(單詞以「空格」、「Tab」或「回車」「換行」分隔)是否符合模式pattern,如果匹配的話,則以替換。
這裏,pattern可以包括萬用字元「%」,表示任意長度的字串。如果replacement中也包含「%」,那麼,replacement中的這個「%」將是pattern中的那個「%」所代表的字串。
(可以用「\」來跳脫,以「%」來表示真實含義的「%」字元)- 返回:函數返回被替換過後的字串。
$(patsubst %.c,%.o, 1.c 2.c)
把字串「1.c,2.c」符合模式[%.c]的單詞替換成[%.o],返回結果是「1.o 2.o」
wildcard得到指定目錄下所有的C語言源程式檔名
SRC = $(wildcard *.c)
編譯當前目錄下所有.c檔案,如果還有子目錄,比如子目錄爲inc,則:
SRC = $(wildcard *.c) $(wildcard inc/*.c)
notdir把展開的檔案去除掉路徑資訊
src = $(wildcard *.c ./sub/*.c)
dir = $(notdir $(src))
obj = $(patsubst %.c,%.o,$(dir) )
all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo "end"
wildcard把 指定目錄 ./ 和 ./sub/ 下的所有後綴是c的檔案全部展開。
notdir把展開的檔案去除掉路徑資訊
patsubst把$(dir)中的變數符合後綴是.c的全部替換成.o
第三句相當於obj=$(dir:%.c=%.o)
Makefile有三個非常有用的變數。分別是^,$<代表的意義分別是:
$@---------------------------目標檔案
$^----------------------------所有的依賴檔案
$<----------------------------第一個依賴檔案
main:main.o 1.o 2.o
gcc -o main main.o 1.o 2.o
main.o:main.c 1.h 2.h
gcc -c main.c
1.o:1.c 1.h
gcc -c 1.c
2.o:2.c 2.h
gcc -c 2.c
main:main.o 1.o 2.o
gcc -o $@ $^
main.o:main.c 1.h 2.h
gcc -c $<
1.o:1.c 1.h
gcc -c $<
2.o:2.c 2.h
gcc -c $<
main:main.o 1.o 2.o
gcc -o $@ $^
.c.o:
gcc -c $<
表示所有的 .o檔案都是依賴與相應的.c檔案的