前言 在上一篇文章中,儘管使用了變數和模式,但還是有不夠好的地方,在Makefile中要指明每一個源文件,我們接下來利用函數對其進行優化,並介紹其他常用的一些函數。 依舊是以fun.c ,main.c 和Makefile三個文件為例,文件內容就不再貼出來了,前兩篇文章中都有。 1.wildcard函 ...
前言
在上一篇文章中,儘管使用了變數和模式,但還是有不夠好的地方,在Makefile中要指明每一個源文件,我們接下來利用函數對其進行優化,並介紹其他常用的一些函數。
依舊是以fun.c ,main.c 和Makefile三個文件為例,文件內容就不再貼出來了,前兩篇文章中都有。
1.wildcard函數
wildcard是通配符函數,通過它可以得到當前工作目錄中滿足 _pattern模式的文件或目錄名列表。
格式為:$(wildcard _pattern)
.PHONY:all
SRC = $(wildcard *.c)
all:
@echo $(SRC)
運行make
fun.c main.c
2.patsubst函數
patsubst 函數被用來將名字列表 _text中符合 _pattern模式的名字替換為 _replacement,並將替換後的名字列表返回。
格式為:$(patsubst _pattern, _replacement , _text)
.PHONY:all
SRC = fun.c main.c
objects := $(patsubst %.c, %.o, $(SRC))
all:
@echo $(objects)
運行make
fun.o main.o
有了這個兩個函數,我們可以對之前的makefile進行優化
優化前
.PHONY:clean
CC = gcc
RM = rm
TARGET = app
OBJS = main.o fun.o
$(TARGET) : $(OBJS)
$(CC) -o $@ $^
%.o : %.c
$(CC) -o $@ -c $^
clean:
$(RM) $(TARGET) $(OBJS)
優化後
.PHONY:clean
CC = gcc
RM = rm
TARGET = app
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))
$(TARGET) : $(OBJS)
$(CC) -o $@ $^
%.o : %.c
$(CC) -o $@ -c $^
clean:
$(RM) $(TARGET) $(OBJS)
3.abspath函數
abspath函數被用於將 _names中的各路徑名轉換成絕對路徑,並將轉換後的結果返回。
格式為:$(abspath _names)
.PHONY:all
ROOT := $(abspath /usr/../lib)
all:
@echo $(ROOT)
運行make
/lib
4.addprefix函數
addprefix函數被用於給名字列表 _names中的每一個名字增加首碼 _prefix,並將增加了首碼的名字列表返回。
格式為:$(addprefix _prefix, _names)
.PHONY:all
without_dir := fun.c main.c
with_dir := $(addprefix objs/, $(without_dir))
all:
@echo $(with_dir)
運行make
objs/fun.c objs/main.c
5.addsuffix函數
addsuffix函數被用於給名字列表 _names中的每一個名字增加尾碼 _suffix,並將增加了尾碼 _suffix的名字列表返回。
格式為:$(addsuffix _suffix, _names)
.PHONY:all
without_suffix := funA funB
with_suffix := $(addsuffix .c, $(without_suffix))
all:
@echo $(with_suffix)
運行make
funA.c funB.c
6.filter函數
filter函數被用於從一個名字列表 _text中根據模式 _pattern得到滿足需要的名字列表並返回。
格式為:$(filter _pattern, _text)
.PHONY:all
sources = fun.c main.c other.o test.h
sources := $(filter %.c %.o, $(sources))
all:
@echo $(sources)
# touch other.o test.h
# ls
fun.c main.c Makefile other.o test.h
運行make,可以看到,調用filter函數後,sources變數中只會有.c和.o的文件, .h文件不符合要求被過濾了
fun.c main.c other.o
7.filter-out函數
filter-out函數被用於從名字列表 _text中根據模式 _pattern濾除一部分名字,並將濾除後的列表返回。
格式為:$(filter-out _pattern, _text)
.PHONY:all
objects = funA.o funB.o fun.c main.c other.o test.h
results = $(filter-out fun%.o, $(objects))
all:
@echo $(results)
利用touch命令新建funA.o,funB.o文件,運行make
fun.c main.c other.o test.h
8.notdir函數
notdir函數被用來從路徑 _names中抽取文件名,並將文件名返回。
格式為:$(notdir _names)
.PHONY:all
file_name := $(notdir code/src/fun.c code/src/main.c)
all:
@echo $(file_name)
運行make
fun.c main.c
9.realpath函數
realpath函數被用於獲取names所對應的真實路徑名。
格式為:$(realpath _names)
.PHONY:all
ROOT := $(realpath ./..)
all:
@echo $(ROOT)
運行make
/mnt/hgfs/Work/Makefile/3.2
10.strip函數
strip函數可以將將 _string 中的多餘空格去除後返回。
格式為:$(strip _string)
.PHONY:all
orginal := fun.c main.c
stripped := $(strip $(orginal))
all:
@echo "original = $(orginal)"
@echo "stripped = $(stripped)"
運行make
original = fun.c main.c
stripped = fun.c main.c
小結
本文介紹了一些常用的函數,只要加以靈活運用,會讓你的Makefile變得高效又智能。
————————————————————————————————
碼字不易,點個贊再走吧!
歡迎關註我的同名公眾號,這裡有更多好料等著你哦!