Makefile通配符问题

时间:2019-04-09 03:53:22

标签: makefile wildcard

我正在尝试编写一个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))

但不确定问题出在特殊符号还是仅仅是基本理解。

然后它抱怨主要功能太多(1类和2类)。

我对make中的通配符和过滤器的了解是否缺少一些东西?

如果我用两种不同的方法打印出$(OBJS)的值,那么它们的值是相同的,所以我不确定为什么一个解决方案可以工作而另一个解决方案却失败了。

但是,由于某些原因,OBJS_1似乎没有获得应用于$(OBJS)的过滤器

1 个答案:

答案 0 :(得分:1)

$(wildcard ...)函数查找文件系统中实际存在的文件(在make执行过程中可能会创建一些或全部.o文件,因此,根据最后一个命令,结果将有所不同)。当然,这不是您想要的。

在您的情况下,您只需要执行字符串替换,make中字符串的“ match-all”模式是一个百分号。所以应该是:

OBJS:=$(filter-out ./build/./src/%,$(OBJS))

还要注意,makefile中的空格可能具有重要性。例如,$(filter a, b)表示第二个参数是“ b”,而不仅仅是“ b”。即使这对您来说并不重要,您也应该对空格保持谨慎。