c++ - GNU makefile 中过滤器的必要性
问题描述
我有以下目录结构。
/home/user/
├── Makefile
│
├── easy/
│ └── a.cpp
├── medium/
│ └── b.cpp
└── build/
我的目标是编译所有.cpp
文件,easy
并medium
在build
. 下面的 Makefile 实现了我想要的(省略与我的问题无关的部分)。我不明白的部分是第filter
6 行调用的必要性。
1 SOURCEDIRS = easy medium
2 TARGETDIR = build
3
4 SOURCES = $(foreach dir,$(SOURCEDIRS),$(wildcard $(dir)/*.cpp))
5 $(info $(SOURCES))
6 TARGETS = $(foreach dir,$(SOURCEDIRS),$(patsubst $(dir)/%.cpp,$(TARGETDIR)/%.out,$(filter $(dir)/%,$(SOURCES))))
7 $(info $(TARGETS))
输出:
# content of SOURCES
easy/a.cpp medium/b.cpp
# content of TARGETS
build/a.out build/b.out
具体来说,根据手册patsubst
,我希望调用filter
是多余的。
$(patsubst 模式,替换,文本)
在文本中查找与模式匹配的空格分隔的单词并将它们替换为替换。
例如,我希望以下 Makefile 能够实现我的目标,
1 SOURCEDIRS = easy medium
2 TARGETDIR = build
3
4 SOURCES = $(foreach dir,$(SOURCEDIRS),$(wildcard $(dir)/*.cpp))
5 $(info $(SOURCES))
6 TARGETS = $(foreach dir,$(SOURCEDIRS),$(patsubst $(dir)/%.cpp,$(TARGETDIR)/%.out,$(SOURCES)))
7 $(info $(TARGETS))
虽然内容TARGETS
是
# content of SOURCES
easy/a.cpp medium/b.cpp
# content of TARGETS
build/a.out medium/b.cpp easy/a.cpp build/b.out
我有什么误解?为什么我们需要filter
在这种情况下?
解决方案
patsubst
不会删除与模式不匹配的单词。
$(patsubst easy/%.cpp,build/%.out,easy/a.cpp medium/b.cpp)
不是build/a.out
,是build/a.out medium/b.cpp
推荐阅读
- camera - 统一的多个场景打破了一切
- json - 如何根据属性名称更新 JSONB 数组?
- nested - 无法在嵌套询问中访问自己的 [我自己]
- c# - 带有 SqlDataReader 的 IAsyncEnumerable 和取消令牌在取消时挂起
- c++ - 为什么我的程序不能识别结构中的变量?
- .net - 如何在 AutoCAD 启动时自动加载 .net DLL
- python - 如何在 Python 中修复此 TypeError?
- java - 带有 @OneToMany 和 @ManyToOne 映射的 Hibernate StackOverflowError
- react-native - 本机反应应用程序代码可以转换/回滚到本机移动代码(ios和android)吗?
- sql - SQL 统计推荐系统的好恶,协同过滤 User-Based