Makefile目标被调用两次

时间:2018-04-17 21:21:00

标签: makefile gnu-make

我有以下Makefile:

app/Resources

当我运行 VERSION = 0.1.1 CC = g++ CFLAGS = -Wall -g -DVERSION=\"$(VERSION)\" LDFLAGS = -lm DEPFILE = .dep SOURCES := ${wildcard *.cpp} HEADERS := ${wildcard *.h} OBJECTS := ${SOURCES:.cpp=.o} BINARY = main.exe .PHONY: all dep clean all: $(BINARY) $(BINARY): $(DEPFILE) $(OBJECTS) $(CC) $(CFLAGS) -o $(BINARY) $(OBJECTS) $(LDFLAGS) %.o: %.cpp $(CC) $(CFLAGS) -c $< dep: $(DEPFILE) $(DEPFILE): $(SOURCES) $(HEADERS) $(CC) -MM $(SOURCES) > $(DEPFILE) -include $(DEPFILE) clean: rm -vf $(BINARY) $(OBJECTS) $(DEPFILE) 时,我得到了

make dep

好像g++ -MM Monomial.cpp main.cpp Variable.cpp > .dep make: Nothing to be done for 'dep'. 被调用了两次。那是为什么?

我在Cygwin下使用GNU Make 4.2.1。

如果您发现一些糟糕的设计模式(除了dep的双重调用之外),如果你能给我一些Makefile的最佳实践,那也很棒。

1 个答案:

答案 0 :(得分:1)

您的makefile包含include指令:

-include $(DEPFILE)

因此,当Make开始时,在它甚至考虑你要求它构建的目标之前,它会尝试重建要包含在makefile中的文件。完成重建.dep后,它就可以处理您要求的文件... .dep

你可能不必明确make dep

根据这一事实以及automatic variables的有用性,您可以简化一些规则:

$(BINARY): $(OBJECTS)
    $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

$(DEPFILE): $(SOURCES) $(HEADERS)
    $(CC) -MM $(SOURCES) > $@
相关问题