我有以下Makefile:
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'.
好像dep
被叫了两次。这是为什么?
我正在Cygwin下使用GNU Make 4.2.1。
如果您发现一些不良的设计模式(而不是两次调用dep),还可以给我一些Makefile最佳实践的话,那也很好。
您的makefile包含一个include
指令:
-include $(DEPFILE)
因此,在启动Make时,它甚至不会考虑您要求其构建的目标,它会尝试重建将包含在makefile中的文件。一旦完成重建.dep
,它会工作的要求您提供的文件......这是.dep
。
您可能make dep
永远不必显式地。
根据这一事实以及自动变量的有用性质,您可以简化几个规则:
$(BINARY): $(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
$(DEPFILE): $(SOURCES) $(HEADERS)
$(CC) -MM $(SOURCES) > $@
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句