我有以下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的最佳实践,那也很棒。
答案 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) > $@