makefile之patsubst,wildcard和notdir

2020-08-11 16:35:56

因爲專案中用到了patsubst,所以記錄一下。

1 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」

2 wildcard: 擴充套件萬用字元

wildcard得到指定目錄下所有的C語言源程式檔名

SRC = $(wildcard *.c)

編譯當前目錄下所有.c檔案,如果還有子目錄,比如子目錄爲inc,則:

SRC = $(wildcard *.c) $(wildcard inc/*.c)

3 notdir: 去除路徑

notdir把展開的檔案去除掉路徑資訊

4 綜合應用

  • 首先建立如下的目錄結構
    在这里插入图片描述
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)

5 擴充套件

Makefile有三個非常有用的變數。分別是@@,^,$<代表的意義分別是:

$@---------------------------目標檔案
$^----------------------------所有的依賴檔案
$<----------------------------第一個依賴檔案

  • 下面 下麪給出傻瓜的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檔案的

參考原地址

https://www.cnblogs.com/baiduboy/p/6849587.html