A tal proposito, agevolo il mio "Makefile dell'uomo pigro", che unisce i vantaggi del metodo "rozzo" gcc *.c (compila tutti i file presenti della directory corrente) a quelli del makefile (gestisce le dipendenze e non vengono ricompilati i file già aggiornati):
codice:
# eseguibile di output
OUTPUT = out #TODO: inserire qui il nome dell'eseguibile di output
# librerie
LIBS = #TODO: inserire i parametri le librerie da linkare
# percorsi aggiuntivi per gli header
INCS = #TODO: inserire i parametri per i percorsi aggiuntivi per gli header
# compilatore C
CC = gcc
# flag per il compilatore
CCFLAGS = -O3 -Wall -Wextra -ansi -pedantic $(LIBS) $(INCS)
# flag per fargli generare i file delle dipendenze
DEPFLAGS = -MMD -MF $@.d
# sorgenti - di default pesca tutti i .c della directory
SRCS = $(wildcard *.c)
# oggetti => ricavati rimpiazzando il .c con .o
OBJECTS = $(patsubst %.c,%.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)

# genera il programma finale, richiedendo tutti gli oggetti
$(OUTPUT): $(OBJECTS)
	$(CC) $(CCFLAGS) $(OBJECTS) -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 .c e i .h senza impazzire
include $(DEPS)

# regola generica per generare i .o: dipende dal relativo .c e lo compila
# con i flag adeguati
%.o: %.c
	${CC} ${CCFLAGS} ${DEPFLAGS} -c -o $@ $<