天天看點

Makefile 中的常用函數說明:wildcard,notdir,patsubst

參考博文: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)