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 $@ $<