Este es mi archivo MAKE actual.¿Por qué este archivo MAKE ejecuta un objetivo en 'make clean'
CXX = g++
CXXFLAGS = -Wall -O3
LDFLAGS =
TARGET = testcpp
SRCS = main.cpp object.cpp foo.cpp
OBJS = $(SRCS:.cpp=.o)
DEPS = $(SRCS:.cpp=.d)
.PHONY: clean all
all: $(TARGET)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $(TARGET)
.cpp.o:
$(CXX) $(CXXFLAGS) -c $< -o [email protected]
%.d: %.cpp
$(CXX) -M $(CXXFLAGS) $< > [email protected]
clean:
rm -f $(OBJS) $(DEPS) $(TARGET)
-include $(DEPS)
Funciona perfectamente con una excepción. Si el directorio ya está limpia (sin * .d, * .o) y ejecute 'make clean', que recrea las dependencias, a continuación, los elimina de inmediato:
[[email protected] proj]$ make
g++ -M -Wall -O3 foo.cpp > foo.d
g++ -M -Wall -O3 object.cpp > object.d
g++ -M -Wall -O3 main.cpp > main.d
g++ -Wall -O3 -c main.cpp -o main.o
g++ -Wall -O3 -c object.cpp -o object.o
g++ -Wall -O3 -c foo.cpp -o foo.o
g++ -Wall -O3 main.o object.o foo.o -o testcpp
[[email protected] proj]$ make clean
rm -f main.o object.o foo.o main.d object.d foo.d testcpp
[[email protected] proj]$ make clean
g++ -M -Wall -O3 foo.cpp > foo.d
g++ -M -Wall -O3 object.cpp > object.d
g++ -M -Wall -O3 main.cpp > main.d
rm -f main.o object.o foo.o main.d object.d foo.d testcpp
[[email protected] proj]$
No entiendo por qué el el segundo 'make clean' generaría de nuevo los archivos de dependencia. ¿Cómo puedo evitar esto? Esto no es un gran problema para este ejemplo artificial, pero para un proyecto grande, puede llevar bastante tiempo.
Gracias.
Es posible que desee leer http://mad-scientist.net/make/autodep.html, que describe una solución para el seguimiento incluyen dependencias que evita este problema, así como los sorprendentemente muchas otras complicaciones. – slowdog