make e Makefile

Al crescere della complessità del software, la compilazione dei programmi utilizzando singoli comandi o script di compilazione non è la soluzione migliore del problema.
Sarebbe bello (utopia ?) compilare tutto con un solo comando:

> make

Vogliamo che in qualche modo questa procedura di compilazione sia in grado di conoscere le relazioni di dipendenza fra file. Come fare?

Dipendenza implicita

Esistono ricette di validità generale per passare da file con un certo suffisso
.SUFFIXES : .out .a .ln .o .c .cc .C .p .f .F .r .y .l .s .S \
            .mod .sym .def .h .info .dvi .tex .texinfo .texi \
            .txinfo .w .ch .web .sh .elc .el
a file di tipo diverso, con un suffisso diverso. Make conosce una serie di queste regole (si vedono con make -p). Ad esempio:
.c.o:   ; $(CC) $(CFLAGS) -c $<

oppure

.f.o: ;   $(FC) $(FFLAGS) -c $<
.o.out: ; $(CC) $(LDFLAGS) $(CFLAGS) $< $(LOADLIBES) -o $@
.f.out: ; $(FC) $(LDFLAGS) $(FFLAGS) $< $(LOADLIBES) -o $@

Attenzione: la terza direttiva non è superflua! Make non "sa" che queste regole sono transitive.

Dipendenza esplicita

Le dipendenze specifiche dei singoli file di un pacchetto da altri file possono essere descritte nel Makefile (che può chiamarsi anche makefile, o MAKEFILE). Ad esempio:

program : model1.o model2.o ; 
       $(F77) $(FFLAGS) -o $@ model1.o model2.o

model1.o : model1.f ;     $(F77) $(FFLAGS) -c $?

model2.o : model2.f ;     $(F77) $(FFLAGS) -c $?

Terminologia:

Prima dei due punti:Target
Fra i due punti e il punto e virgola:Dependency list(Lista di dipendenza?)
Dopo il punto e virgola:Comandi (eseguiti da una shell)

I comandi vengono eseguiti se deve essere prodotto il target.
Se target è un file, i comandi vengono eseguiti solo se almeno uno dei file della dependency list è "più giovane" di target, cioè se è stato modificato dopo target.

Variabili pre-definite più usate:

$@Target in corso di elaborazione
$?File (nella dependency list) che sono stati modificati dopo il target
$<Solo in regole implicite: Nome del file "originale" (con il primo suffisso).
$*Solo in regole implicite: Nome del file senza suffisso.
$$Se si vuole inserire il segno $.

Altri elementi del Makefile

In un Makefile "vero"


Queste sono le funzionalità di Make che troviamo su qualunque sistema Unix. Gmake (che è il make standard su Linux) ha molta funzionalità in più. Il manuale non dovrebbe mancare in nessuna biblioteca. Una copia omaggio si trova in gmake.ps.
In particolare: