Makefile 通配符问题
Makefile wildcard issue
我正在尝试编写一个 makefile 以有选择地包含某个文件。
我已经设法让它与以下项目一起工作:
OBJS := $(filter-out ./build/./src/class_1.cpp.o, $(OBJS))
OBJS := $(filter-out ./build/./src/class_2.cpp.o, $(OBJS))
OBJS_1 :=./build/./src/class_1.cpp.o $(OBJS)
OBJS_2 := ./build/./src/class_2.cpp.o $(OBJS)
但我想让它更通用并使用通配符。
我的理解是以下应该有效:
OBJS := $(filter-out $(wildcard ./build/./src/*), $(OBJS))
我也试过了
OBJS := $(filter-out $(wildcard \./build/\./src/*), $(OBJS))
但不确定问题是出在特殊符号上还是只是基本理解。
然而它会抱怨主要功能太多(class 1 和 class 2)。
我对 make 中的通配符和过滤器的理解有什么遗漏吗?
如果我用两种不同的方法打印出 $(OBJS) 的值,这些值是相同的,所以我不确定为什么一个解决方案可以工作而另一个解决方案失败。
但是,由于某些原因,OBJS_1
似乎没有得到应用于 $(OBJS)
的过滤器
$(wildcard ...)
函数查找文件系统中实际存在的文件(部分或全部 .o 文件可能在 make 执行期间创建,因此结果会因最后一条命令而异)。这肯定不是你想要的。
在您的情况下,您只需执行字符串替换,make 中字符串的 'match-all' 模式是百分号。所以应该是:
OBJS:=$(filter-out ./build/./src/%,$(OBJS))
另请注意,makefile 中的空格可能很重要。例如,$(filter a, b)
表示第二个参数是“b”,而不仅仅是 "b"。即使在您的情况下无关紧要,您也应该更加谨慎地使用空格。
我正在尝试编写一个 makefile 以有选择地包含某个文件。
我已经设法让它与以下项目一起工作:
OBJS := $(filter-out ./build/./src/class_1.cpp.o, $(OBJS))
OBJS := $(filter-out ./build/./src/class_2.cpp.o, $(OBJS))
OBJS_1 :=./build/./src/class_1.cpp.o $(OBJS)
OBJS_2 := ./build/./src/class_2.cpp.o $(OBJS)
但我想让它更通用并使用通配符。
我的理解是以下应该有效:
OBJS := $(filter-out $(wildcard ./build/./src/*), $(OBJS))
我也试过了
OBJS := $(filter-out $(wildcard \./build/\./src/*), $(OBJS))
但不确定问题是出在特殊符号上还是只是基本理解。
然而它会抱怨主要功能太多(class 1 和 class 2)。
我对 make 中的通配符和过滤器的理解有什么遗漏吗?
如果我用两种不同的方法打印出 $(OBJS) 的值,这些值是相同的,所以我不确定为什么一个解决方案可以工作而另一个解决方案失败。
但是,由于某些原因,OBJS_1
似乎没有得到应用于 $(OBJS)
$(wildcard ...)
函数查找文件系统中实际存在的文件(部分或全部 .o 文件可能在 make 执行期间创建,因此结果会因最后一条命令而异)。这肯定不是你想要的。
在您的情况下,您只需执行字符串替换,make 中字符串的 'match-all' 模式是百分号。所以应该是:
OBJS:=$(filter-out ./build/./src/%,$(OBJS))
另请注意,makefile 中的空格可能很重要。例如,$(filter a, b)
表示第二个参数是“b”,而不仅仅是 "b"。即使在您的情况下无关紧要,您也应该更加谨慎地使用空格。