Makefile文件中的wildcard、patsubst、notdir、obj=(dir:%.c=%.o)的用法學習

1、今天在看Makefile文件的時候看到了一個BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) ,不太明白這個具體是什麼含義。在網上找了一下根據前人的分享,自己也記錄一下:

   BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) ,這句代碼的意思將變量LSRCS中所有的以.c結尾的文件都用目錄BUILD_DIR下的.o替換。

另外:wildcard可以後面跟多個路徑,使用方法如下:

  假如我在當前目錄下創建一個test目錄,在test 目錄下創建兩個文件1.c和2.c;再test目錄再新建一個子目錄sub,在子目錄sub下新建sub1.c和sub2.c。我們在test目錄下使用Makefile可以這樣寫:

 src=$(wildcard *.c ./sub/*.c)

all: 

     @echo $(src)

這樣就會輸出

1.c 2.c ./sub/sub1.c ./sub/sub2.c

使用@echo 這樣終端輸出的信息就是命令之後的結果,而不會在終端上把命令也打印出來。即如果去掉@ 終端打印的信息就是:

echo a.c b.c ./sub/sub1.c ./sub/sub2.c

1.c 2.c ./sub/sub1.c ./sub/sub2.c

這樣一個結果。

如果在輸出的結果中不想帶./sub/這個路徑的話,可以使用notdir,使用方法:

 dir=$(notdir $(src))

這樣輸出出來就是:1.c 2.c sub1.c sub2.c了。

obj=$(patsubst %.c,%.o,$(dir)),把上面$(dir)變量裏面以.c結尾的文件全部替換爲.o結尾。

跟這個等效的一句程序是上面那句: BUILD_SO = $(LSRCS:%.c=$(BUILD_DIR)/%.o) 類似,

obj=$(dir:%.c=%.o);

他的標準格式應該是:
$(var:a=b) 或 ${var:a=b}
它的含義是把變量var中的每一個值結尾用b替換掉a。

--------------------------------------------------------------------------------------------------------------------

補充:

1、Makefiel中foreach的使用:

通用表達式: $(foreach  <var>,<list>,<text>)

這個的意思就是:把list中遍歷一遍,取出其中的每一個單詞放到 var中,最後按照執行text的表達式。執行text表達式的時候,每次返回一個字符串,然後以空格隔開,最後text返回的每個字符串組成的整個字符都將是foreach函數的返回值。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章