Makefile:匹配多个模式规则
我有这样一个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)
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)