參考博文:https://www.cnblogs.com/haoxing990/p/4629454.html
使用make的隐含規則來編譯.c的源檔案。對變量的指派,即使用特殊的符号(:=)
1、wildcard : 擴充通配符
2、notdir : 去除路徑
3、patsubst :替換通配符
1. Makefile中wildcard的介紹
在Makefile規則中,通配符會被自動展開。但在變量的定義和函數引用時,通配符将失效。這種情況下如果需要通配符有效,就需要使用函數“wildcard”,它的用法是:$(wildcard PATTERN...)
在Makefile中,它被展開為已經存在的、使用空格分開的、比對此模式的所有檔案清單。
如果不存在任何符合此模式的檔案,函數會忽略模式字元并傳回空。
一般我們使用“$(wildcard *.c)”來擷取工作目錄下的所有的.c檔案清單。複雜一些用法;可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函數擷取工作目錄下的.c檔案清單;之後将清單中所有檔案名的字尾.c替換為.o。
這樣我們就可以得到在目前目錄可生成的.o檔案清單。是以在一個目錄下可以使用如下内容的Makefile來将工作目錄下的所有的.c檔案進行編譯,并最後連接配接成為一個可執行檔案:
#sample Makefile
objects := $(patsubst %.c,%.o,$(wildcard *.c))
foo : $(objects)
cc -o foo $(objects)
例子:建立一個測試目錄,在測試目錄下建立一個名為sub的子目錄
$ mkdir test
$ cd test
$ mkdir sub
在test下,建立a.c和b.c2個檔案,在sub目錄下,建立sa.c和sb.c2 個檔案
建立一個簡單的Makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )
all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo "end"
執行結果分析:
第一行輸出: a.c b.c ./sub/sa.c ./sub/sb.c
wildcard把 指定目錄 ./ 和 ./sub/ 下的所有字尾是c的檔案全部展開。
第二行輸出: a.c b.c sa.c sb.c
notdir把展開的檔案去除掉路徑資訊
第三行輸出: a.o b.o sa.o sb.o
在$(patsubst %.c,%.o,$(dir) )中,patsubst把$(dir)中的變量符合字尾是.c的全部替換成.o,任何輸出。
或者可以使用 obj=$(dir:%.c=%.o) 效果也是一樣的。
這裡用到makefile裡的替換引用規則,即用您指定的變量替換另一個變量。
它的标準格式是:$(var:a=b) 或 ${var:a=b}
它的含義是把變量var中的每一個值結尾用b替換掉a
編寫個makefile檔案測試patsubst 的作用
1 SRCS := $(wildcard *.c)
2 OBJS := $(patsubst %.c,%.o,$(SRCS) ) //把$(SRCS)中的檔案.c全部換成.o檔案
3 all:
4 @echo "SRCS:" $(SRCS) //@表示這條指令不再文本界面顯示出來
5 @echo "objs:" $(OBJS)