我有一组目录中的源列表
SOURCES = $(wildcard src/**/*.cpp)
举例来说,我们有一个这样的目录
src
|- dir_one
| |- file_one.cpp
| `- file_two.cpp
|
|- dir_two
| |- file_three.cpp
| `- file_four.cpp
|
`- dir_three
`-file_five.cpp
那么
$(SOURCES)
等于
src/dir_one/file_one.cpp
src/dir_one/file_two.cpp
src/dir_two/file_three.cpp
src/dir_two/file_four.cpp
src/dir_three/file_five.cpp
我想使用 Makefile 函数来获取仅包含文件名称的列表,但我不知道有哪些目录。例如我想要得到
NAMES = <some makefile functions>
所以 $(NAMES) 等于
file_one file_two file_three file_four file_five
首先,请注意 GNU make 的通配符函数对于
**
并不像某些 shell 那样具有任何特殊含义。使用 $(wildcard src/**/*.cpp)
的行为与使用 $(wildcard src/*/*.cpp)
相同; “匹配零个或多个字符”(*
) 和“匹配零个或多个字符后跟零个或多个字符”(**
) 之间没有区别。
其次,有很多 GNU Make 函数可以处理文件名;它们都显示在手册中。
您可以使用:
NAMES := $(patsubst %.cpp,%,$(notdir $(SOURCES)))