Da come l'ho sempre capita io, si specificano gli include nelle dipendenze del Makefile per fare sì che, se vengono modificati gli include, anche i target che da essi dipendono tramite inclusione siano marcati come da ricompilare.
In ogni caso, l'ho sempre trovato un sistema tedioso e soggetto ad errori, per cui un giorno ho perso qualche ora per scrivere il "makefile definitivo" (per tutti i progetti universitari), che compila tutti i .cpp della directory corrente, gestendo le dipendenze automaticamente:
codice:
# eseguibile di output
OUTPUT = esercizio.x
# estensione per i file da compilare
CXXEXT = cpp
# flag librerie
LIBS =
# percorsi aggiuntivi per gli header
INCS =
# compilatore C++
CXX = g++
# flag per il compilatore
CXXFLAGS = -O3 -Wall -Wextra -ansi -pedantic
# flag per fargli generare i file delle dipendenze
DEPFLAGS = -MMD -MF $@.d
# sorgenti - di default pesca tutti i .cpp della directory
SRCS = $(wildcard *.${CXXEXT})
# oggetti => ricavati rimpiazzando il .cpp con .o
OBJECTS = $(patsubst %.${CXXEXT},%.o,$(SRCS))
# file di dipendenze => ricavati dagli oggetti aggiungendoci .d
# e verificandone l'esistenza
DEPS = $(wildcard $(foreach f,$(OBJECTS),$(f).d))
# target di default: dipende dall'eseguibile finale
all: $(OUTPUT)
# target compito: richiama il default
compito: $(OUTPUT)
# genera il programma finale, richiedendo tutti gli oggetti
$(OUTPUT): $(OBJECTS)
$(CXX) $(CXXFLAGS) $(OBJECTS) $(LIBS) -o $(OUTPUT)
# elimina gli oggetti, l'output, i file delle dipendenze
clean:
rm -f $(OBJECTS)
rm -f $(OUTPUT)
rm -f $(DEPS)
# crea il .tar
tar: clean
tar -czf ../`basename $(CURDIR)`.tar.gz -C .. `basename $(CURDIR)`
# include i file di dipendenze generati dal compilatore; consente di
# ottenere le dipendenze tra i vari .cpp e i .hpp senza impazzire
include $(DEPS)
# regola generica per generare i .o: dipende dal relativo .cpp e lo compila
# con i flag adeguati
%.o: %.${CXXEXT}
${CXX} ${CXXFLAGS} ${INCS} ${DEPFLAGS} -c -o $@ $<
Per il resto comunque in genere cerco di evitare i Makefile, trovo che altri sistemi (qmake, cmake) siano ben più comodi.