浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)
編寫 Makefile 的時候,很多情況下需要對文件名進(jìn)行操作。例如獲取文件的路徑,去除文件的路徑,取出文件前綴或后綴等等。
注意:下面的每個函數(shù)的參數(shù)字符串都會被當(dāng)作或是一個系列的文件名來看待。
1. 取目錄函數(shù) dir
函數(shù)使用格式如下:
$(dir <names>)
函數(shù)說明:函數(shù)的功能是從文件名序列 names 中取出目錄部分,
如果names 中沒有 / ,取出的值為 ./ 。返回值為目錄部分,指的是最后一個反斜杠之前的部分。如果沒有反斜杠將返回 ./。實例:
OBJ=$(dir a/b/c.cpp, aaa.cpp)
all:echo $(OBJ)
執(zhí)行 make 命令,
wohu@ubuntu:~/cpp/func$ make
echo a/b/ ./
a/b/ ./
wohu@ubuntu:~/cpp/func$
2. 取文件函數(shù) notdir
函數(shù)使用格式如下:
$(notdir <names>)
函數(shù)說明:函數(shù)的功能是從文件名序列 names 中取出非目錄的部分。非目錄的部分是最后一個反斜杠之后的部分。返回值為文件非目錄的部分。實例:
OBJ=$(notdir a/b/c.cpp, aaa.cpp)
all:echo $(OBJ)
執(zhí)行 make 命令,
wohu@ubuntu:~/cpp/func$ make
echo c.cpp, aaa.cpp
c.cpp, aaa.cpp
wohu@ubuntu:~/cpp/func$
3. 取后綴名函數(shù) suffix
函數(shù)使用格式如下:
$(suffix <names>)
函數(shù)說明:函數(shù)的功能是從文件名序列中 names 中取出各個文件的后綴名。返回值為文件名序列 names 中的后綴序列,如果文件沒有后綴名,則返回空字符串。實例:
OBJ=$(suffix a/b/c.cpp, demo)
all:echo $(OBJ)
執(zhí)行 make 命令,
wohu@ubuntu:~/cpp/func$ make
echo .cpp,
.cpp,
wohu@ubuntu:~/cpp/func$
4. 取前綴函數(shù) basename
函數(shù)使用格式如下:
$(basename <names>)
函數(shù)說明:函數(shù)的功能是從文件名序列 names 中取出各個文件名的前綴部分。返回值為被取出來的文件的前綴名,如果文件沒有前綴名則返回空的字符串。實例:
OBJ=$(basename a/b/c.cpp, demo.o)
all:echo $(OBJ)
執(zhí)行 make 命令
wohu@ubuntu:~/cpp/func$ make
echo a/b/c demo
a/b/c demo
wohu@ubuntu:~/cpp/func$
5. 添加后綴名函數(shù)
函數(shù)使用格式如下:
$(addsuffix <suffix>,<names>)
函數(shù)說明:函數(shù)的功能是把后綴 suffix 加到 names 中的每個單詞后面。返回值為添加上后綴的文件名序列。實例:
OBJ=$(addsuffix .cpp, c.cpp demo)
all:echo $(OBJ)
執(zhí)行 make 后
wohu@ubuntu:~/cpp/func$ make
echo c.cpp.cpp demo.cpp
c.cpp.cpp demo.cpp
wohu@ubuntu:~/cpp/func$
我們可以看到如果文件名存在后綴名,依然會加上。
6. 添加前綴名函數(shù) addperfix
函數(shù)使用格式如下:
$(addperfix <prefix>,<names>)
函數(shù)說明:函數(shù)的功能是把前綴 prefix 加到 names 中的每個單詞的前面。返回值為添加上前綴的文件名序列。實例:
OBJ=$(addprefix src/, demo1.cpp demo2.cpp)
all:echo $(OBJ)
執(zhí)行 make 命令,
wohu@ubuntu:~/cpp/func$ make
echo src/demo1.cpp src/demo2.cpp
src/demo1.cpp src/demo2.cpp
wohu@ubuntu:~/cpp/func$
可以使用這個函數(shù)給我們的文件添加路徑。
7. 鏈接函數(shù) join
函數(shù)使用格式如下:
$(join <list1>,<list2>)
函數(shù)說明:函數(shù)功能是把 list2 中的單詞對應(yīng)的拼接到 list1 的后面。
如果 list1 的單詞要比 list2 的多,那么,list1 中多出來的單詞將保持原樣,如果 list1 中的單詞要比 list2 中的單詞少,那么 list2 中多出來的單詞將保持原樣。返回值為拼接好的字符串。實例:
OBJ=$(join aa bb, cc dd ee)
all:echo $(OBJ)
執(zhí)行 make 命令,
wohu@ubuntu:~/cpp/func$ make
echo aacc bbdd ee
aacc bbdd ee
wohu@ubuntu:~/cpp/func$
我們可以得到的值是 aacc bbdd ee。很顯然 list1 中的文件名比 list2 的少,所以多出來的保持不變。
8. 獲取匹配模式文件名函數(shù) wildcard
命令使用格式如下:
$(wildcard PATTERN)
函數(shù)說明:函數(shù)的功能是列出當(dāng)前目錄下所有符合模式的 PATTERN 格式的文件名。返回值為空格分隔并且存在當(dāng)前目錄下的所有符合模式 PATTERN 的文件名。實例:
OBJ=$(wildcard *.cpp *.h)
all:echo $(OBJ)
執(zhí)行 make 命令,可以得到當(dāng)前函數(shù)下所有的 .cpp 和 .h 結(jié)尾的文件。
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$
這個函數(shù)通常跟的通配符 * 連用,使用在依賴規(guī)則的描述的時候被展開(在這里我們的例子如果沒有 wildcard 函數(shù),我們的運行結(jié)果也是這樣,echo 屬于 shell 命令,在使用通配符的時通配符自動展開,我們這里只是相要說明一下這個函數(shù)在使用時,如果通過引用變量出現(xiàn)在規(guī)則中要被使用)。
總結(jié)
以上是生活随笔為你收集整理的浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022-2028年中国TAC薄膜行业市
- 下一篇: 2022-2028年中国汽车塑料行业市场