GNU make提供了一系列对文件名进行各种操作的函数:文件名替换、加前缀、去目录等。
1.1dir函数:取路径名的目录
dir函数用来从一个路径名中截取目录的部分。
$(dir NAMES…)
dir函数会从NAMES文件名序列中,取出各个文件路径名中的目录部分并返回
.PHONY: allLIST = /home/wit/banana.c /usr/include/stdio.hall: @echo "LIST = $(LIST)" @echo "dir = $(dir $(LIST))"
执行make命令,运行结果为:
# makeLIST = /home/wit/banana.c /usr/include/stdio.hdir = /home/wit/ /usr/include/
1.2notdir函数:取文件名
notdir函数和dir函数实现完全相反的功能:从一个文件路径名中去文件名,而不是目录。notdir函数的使用方法和dir函数相同。
.PHONY: allLIST = /home/wit/banana.c /usr/include/stdio.hall: @echo "LIST = $(LIST)" @echo "file = $(notdir $(LIST))"
执行make命令,运行结果为:
# makeLIST = /home/wit/banana.c /usr/include/stdio.hfile = banana.c stdio.h
1.3suffix函数:取文件名后缀
suffix函数从一系列文件名序列中,取出各个文件名的后缀。
$(suffix NAMES…)
文件名的后缀是文件名中以点号 . 开始(包括点号)的部分。若文件名没有后缀, suffix函数则返回空。
.PHONY: allLIST = /home/wit/banana.c /usr/include/stdio.hall: @echo "LIST = $(LIST)" @echo "suffix = $(suffix $(LIST))"
执行make命令,运行结果为:
# makeLIST = /home/wit/banana.c /usr/include/stdio.hsuffix = .c .h
1.4basename函数:取文件名前缀
basename函数从一系列文件名序列中,取出各个文件名的前缀部分:
$(basename NAMES…)
如果一个文件名中包括多个点号,basename函数返回最后一个点号之前的文件名部分;如果一个文件名没有前缀,函数返回空字符串。
.PHONY: allLIST = /home/wit/banana.c /usr/include/vmlinux.lds.Sall: @echo "LIST = $(LIST)" @echo "basename = $(basename $(LIST))"
执行make命令,运行结果为:
# makeLIST = /home/wit/banana.c /usr/include/vmlinux.lds.S
1.5addsuffix函数:给文件名加后缀
addsuffix函数的作用是:给文件列表中的每个文件名添加后缀SUFFIX
$(addsuffix SUFFIX, NAMES…)
使用示例:
.PHONY: allLIST = apple banana peachall: @echo "LIST = $(LIST)" @echo "addsuffix = $(addsuffix .c, $(LIST))"
运行结果:
# makeLIST = apple banana peachaddsuffix = apple.c banana.c peach.c
1.6addprefix函数:给文件名加前缀
addprefix函数的作用是:给文件列表中的每个文件名添加一个前缀PREFIX
$(addprefix PREFIX, NAMES…)
使用示例:
.PHONY: allLIST = apple.c banana.c peach.call: @echo "LIST = $(LIST)" @echo "addsuffix = $(addprefix /home/wit/, $(LIST))"
执行make命令,运行结果:
makeLIST = apple.c banana.c peach.caddsuffix = /home/wit/apple.c /home/wit/banana.c /home/wit/peach.c
1.7join函数:单词连接
join函数的作用是:将字符串LIST1和字符串LIST2的各个单词依次连接,合并为新的单词构成的字符串
$(join LIST1,LIST2)
使用示例:
.PHONY: allLIST1 = apple banana peachLIST2 = .c .h .sLIST = $(join $(LIST1), $(LIST2))all: @echo "LIST1 = $(LIST1)" @echo "LIST2 = $(LIST2)" @echo "LIST = $(LIST)"
运行结果:
# makeLIST1 = apple banana peachLIST2 = .c .h .sLIST = apple.c banana.h peach.s
如果两个字符串中的单词个数不相等,则只合并前面的单词,剩下的单词不合并。如下面的Makefi:
.PHONY: allLIST1 = apple banana peachLIST2 = .c .hLIST = $(join $(LIST1), $(LIST2))all: @echo "LIST1 = $(LIST1)" @echo "LIST2 = $(LIST2)" @echo "LIST = $(LIST)"
运行结果:
# makeLIST1 = apple banana peachLIST2 = .c .hLIST = apple.c banana.h peach
因为LIST2中只有2个单词,所以我们可以看到最后一个单词peach没有参与合并,但仍作为一个新的单词合并到LIST变量中。
1.8wildcard函数:列出所有符号匹配模式的文件
wildcard函数的作用是:列出当前目录下所有符合PATTREN模式的文件名
$(wildcard PATTERN)
其中PATTREN可以使用shell能识别的通配符:?、*等。
使用示例:列出当前目录下的所有C文件
.PHONY: allLIST = $(wildcard *.c)all: @echo "LIST = $(LIST)"
执行make命令,运行结果为:
# lsadd.c add.h hello.c main.c makefile sub.c sub.h# makeLIST = hello.c main.c add.c sub.c
标签:banana,文件名,Makefile,LIST,echo,Linux,home,处理函数,函数
From: https://blog.csdn.net/qq_45398836/article/details/142068110