编写 Makefile
的时候,很多情况下需要对文件名进行操作。例如获取文件的路径,去除文件的路径,取出文件前缀或后缀等等。
注意:下面的每个函数的参数字符串都会被当作或是一个系列的文件名来看待。
1. 取目录函数 dir
函数使用格式如下:
$(dir <names>)
函数说明:函数的功能是从文件名序列 names
中取出目录部分,
如果names 中没有 /
,取出的值为 ./
。返回值为目录部分,指的是最后一个反斜杠之前的部分。如果没有反斜杠将返回 ./
。实例:
OBJ=$(dir a/b/c.cpp, aaa.cpp)
all:
echo $(OBJ)
执行 make
命令,
wohu@ubuntu:~/cpp/func$ make
echo a/b/ ./
a/b/ ./
wohu@ubuntu:~/cpp/func$
2. 取文件函数 notdir
函数使用格式如下:
$(notdir <names>)
函数说明:函数的功能是从文件名序列 names
中取出非目录的部分。非目录的部分是最后一个反斜杠之后的部分。返回值为文件非目录的部分。实例:
OBJ=$(notdir a/b/c.cpp, aaa.cpp)
all:
echo $(OBJ)
执行 make 命令,
wohu@ubuntu:~/cpp/func$ make
echo c.cpp, aaa.cpp
c.cpp, aaa.cpp
wohu@ubuntu:~/cpp/func$
3. 取后缀名函数 suffix
函数使用格式如下:
$(suffix <names>)
函数说明:函数的功能是从文件名序列中 names
中取出各个文件的后缀名。返回值为文件名序列 names
中的后缀序列,如果文件没有后缀名,则返回空字符串。实例:
OBJ=$(suffix a/b/c.cpp, demo)
all:
echo $(OBJ)
执行 make
命令,
wohu@ubuntu:~/cpp/func$ make
echo .cpp,
.cpp,
wohu@ubuntu:~/cpp/func$
4. 取前缀函数 basename
函数使用格式如下:
$(basename <names>)
函数说明:函数的功能是从文件名序列 names
中取出各个文件名的前缀部分。返回值为被取出来的文件的前缀名,如果文件没有前缀名则返回空的字符串。实例:
OBJ=$(basename a/b/c.cpp, demo.o)
all:
echo $(OBJ)
执行 make
命令
wohu@ubuntu:~/cpp/func$ make
echo a/b/c demo
a/b/c demo
wohu@ubuntu:~/cpp/func$
5. 添加后缀名函数
函数使用格式如下:
$(addsuffix <suffix>,<names>)
函数说明:函数的功能是把后缀 suffix
加到 names
中的每个单词后面。返回值为添加上后缀的文件名序列。实例:
OBJ=$(addsuffix .cpp, c.cpp demo)
all:
echo $(OBJ)
执行 make
后
wohu@ubuntu:~/cpp/func$ make
echo c.cpp.cpp demo.cpp
c.cpp.cpp demo.cpp
wohu@ubuntu:~/cpp/func$
我们可以看到如果文件名存在后缀名,依然会加上。
6. 添加前缀名函数 addprefix
函数使用格式如下:
$(addprefix <prefix>,<names>)
函数说明:函数的功能是把前缀 prefix
加到 names
中的每个单词的前面。返回值为添加上前缀的文件名序列。实例:
OBJ=$(addprefix src/, demo1.cpp demo2.cpp)
all:
echo $(OBJ)
执行 make
命令,
wohu@ubuntu:~/cpp/func$ make
echo src/demo1.cpp src/demo2.cpp
src/demo1.cpp src/demo2.cpp
wohu@ubuntu:~/cpp/func$
可以使用这个函数给我们的文件添加路径。
7. 链接函数 join
函数使用格式如下:
$(join <list1>,<list2>)
函数说明:函数功能是把 list2
中的单词对应的拼接到 list1
的后面。
如果 list1
的单词要比 list2
的多,那么,list1
中多出来的单词将保持原样,如果 list1
中的单词要比 list2
中的单词少,那么 list2
中多出来的单词将保持原样。返回值为拼接好的字符串。实例:
OBJ=$(join aa bb, cc dd ee)
all:
echo $(OBJ)
执行 make
命令,
wohu@ubuntu:~/cpp/func$ make
echo aacc bbdd ee
aacc bbdd ee
wohu@ubuntu:~/cpp/func$
我们可以得到的值是 aacc bbdd ee
。很显然 list1
中的文件名比 list2
的少,所以多出来的保持不变。
8. 获取匹配模式文件名函数 wildcard
命令使用格式如下:
$(wildcard PATTERN)
函数说明:函数的功能是列出当前目录下所有符合模式的 PATTERN
格式的文件名。返回值为空格分隔并且存在当前目录下的所有符合模式 PATTERN
的文件名。实例:
OBJ=$(wildcard *.cpp *.h)
all:
echo $(OBJ)
执行 make
命令,可以得到当前函数下所有的 .cpp
和 .h
结尾的文件。
wohu@ubuntu:~/cpp/func$ ls
demo.cpp demo.h Makefile
wohu@ubuntu:~/cpp/func$ make
echo demo.cpp demo.h
demo.cpp demo.h
wohu@ubuntu:~/cpp/func$
这个函数通常跟的通配符 *
连用,使用在依赖规则的描述的时候被展开(在这里我们的例子如果没有 wildcard
函数,我们的运行结果也是这样,echo
属于 shell
命令,在使用通配符的时通配符自动展开,我们这里只是相要说明一下这个函数在使用时,如果通过引用变量出现在规则中要被使用)。