Makefile:匹配多个模式规则

Makefile:匹配多个模式规则,makefile,Makefile,我有这样一个makefile: EXT = .cc BLD = .build all: bin/analyses/test bin/analyses/test: $(BLD)/object.o .SECONDEXPANSION: $(DEPS): $(BLD)/%.d: src/%$(EXT) | $(BLD)/$$(dir %) $(CXX) $(CPPFLAGS) -MM -MT '$(@:.d=.o)' $< -MF $@ $(BLD)/%.o: | $(BLD)

我有这样一个makefile:

EXT = .cc
BLD = .build

all: bin/analyses/test

bin/analyses/test: $(BLD)/object.o

.SECONDEXPANSION:

$(DEPS): $(BLD)/%.d: src/%$(EXT) | $(BLD)/$$(dir %)
    $(CXX) $(CPPFLAGS) -MM -MT '$(@:.d=.o)' $< -MF $@

$(BLD)/%.o: | $(BLD)
    $(CXX) $(CXXFLAGS) -c $(filter %$(EXT),$^) -o $@

bin/%: $(BLD)/%.o | $$(dir bin/%)
    $(CXX) $(LDFLAGS) $(filter %.o,$^) -o $@ $(LDLIBS)

bin/%/ $(BLD)/%/:
    mkdir -p $@
只有bin/%:规则被拾取


如何使多个模式规则与同一目标匹配?

首先,make有时会从目标中删除尾部斜杠,这可能会导致一些混乱。在本例中,它接受您的规则bin/%/$BLD/%/:…,您显然打算将其用于目录,并将其用于文件,至少有时是这样。通过在其他规则中使用mkdir-p,在没有明确的目录规则的情况下很容易做到这一点

第二,Make没有像普通规则那样组合模式规则。它找到一个模式规则并使用它。在这样一个相对简单的情况下,我们可以编写一个规则来做我们想要做的事情:

all: bin/analyses/test

$(BLD)/%.o:
    mkdir -p $(dir $@)
    $(CXX) $(CXXFLAGS) -c $^ -o $@

bin/analyses/%: $(BLD)/analyses/%.o $(BLD)/object.o
    mkdir -p $(dir $@)
    $(CXX) $(LDFLAGS) $^ -o $@ $(LDLIBS)

bin/%: $(BLD)/%.o
    mkdir -p $(dir $@)
    $(CXX) $(LDFLAGS) $^ -o $@ $(LDLIBS)   

在最后两条规则中有一些明显的冗余,我不知道如何在不降低makefile可读性的情况下消除这些冗余,但它按预期工作。

什么是EXE?请提供一个完整的例子。@user657267我已经编辑了这个问题。您的意图还不完全清楚。要链接哪些对象文件以生成可执行文件?bin/analysis/test将由.build/analysis/test.o和.build/object.o生成,并且希望.build/object.o是.build/analysis/中每个文件的先决条件?
all: bin/analyses/test

$(BLD)/%.o:
    mkdir -p $(dir $@)
    $(CXX) $(CXXFLAGS) -c $^ -o $@

bin/analyses/%: $(BLD)/analyses/%.o $(BLD)/object.o
    mkdir -p $(dir $@)
    $(CXX) $(LDFLAGS) $^ -o $@ $(LDLIBS)

bin/%: $(BLD)/%.o
    mkdir -p $(dir $@)
    $(CXX) $(LDFLAGS) $^ -o $@ $(LDLIBS)