首页 > 解决方案 > 如何在隐式生成文件规则中排除一些文件?

问题描述

我正在构建几个“主要”文件,目前有以下隐含规则:

$(PROJECT_ROOT)build/%.bin: $(PROJECT_ROOT)obj/%.o $(DEPS)
    @mkdir -p $(dir $@)
    @g++ -o $@ $^

现在我需要一些“主要”文件的特殊链接说明。我将异常定义如下:

SPECIAL_TARGET_1 = $(PROJECT_ROOT)build/...
SPECIAL_TARGET_2 = $(PROJECT_ROOT)build/...
SPECIAL_TARGETS = $(SPECIAL_TARGET_1) $(SPECIAL_TARGET_2)

并尝试按如下方式过滤掉它们:

$(filter-out $(SPECIAL_TARGETS), $(PROJECT_ROOT)build/%.bin): $(PROJECT_ROOT)obj/%.o $(DEPS)
    @mkdir -p $(dir $@)
    @g++ -o $@ $^

filter-out没有过滤任何东西。

从隐式规则中排除几个文件的正确方法是什么?

标签: makefilegnu-make

解决方案


filter-out函数用于从列表中删除事物。但是您没有列表:您只有一个文本字符串$(PROJECT_ROOT)build/%.bin

如果要添加新规则:

$(SPECIAL_TARGETS):
    @echo TODO I need to write some special linking instructions for $@

那么这个特定规则将覆盖通用模式匹配规则。


推荐阅读