To jest mój obecny plik Makefile.Dlaczego ten plik Makefile wykonuje cel na "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)
Działa doskonale z jednym wyjątkiem. Jeśli katalog jest już czysty (nie * .d, * .o) i uruchomić „make clean”, to ponownie tworzy zależności, a następnie usuwa je natychmiast:
[[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]$
Nie rozumiem dlaczego drugie "wyczyść" spowoduje ponowne wygenerowanie plików zależności. Jak mogę tego uniknąć? To nie jest wielka sprawa dla tego zmyślonego przykładu, ale dla dużego projektu może to być dość czasochłonne.
Dzięki.
Czasami warto czytać http://mad-scientist.net/make/autodep.html, który opisuje rozwiązanie do śledzenia obejmują zależności, które pozwala uniknąć tego problemu, jak również zaskakująco wiele innych powikłań. – slowdog