Make

Da Andreabont's Wiki.

Make è un basilare sistema di build su sistemi linux. Le regole di compilazione sono inserite nel file Makefile presente insieme ai file sorgenti. Di solito si utilizza per i linguaggi C e C++, ma può essere usato anche per altri. Make è progettato per gestire dei sotto-passi di compilazione in modo indipendente, questo permette sia la parallelizzazione sia l'ottimizzazione dei tempi di compilazione, in quanto possono essere eseguiti solo i passi necessari (per esempio in una ricompilazione dopo una modifica, saranno compilati solo i file modificati).

Goal

I Makefile contengono dei goal, ovvero delle regole che scattano se sono soddisfatte delle dipendenze e servono per eseguire uno step della compilazione. Un goal può scattare per una modifica dei prerequisiti, oppure se espressamente chiamato nel comando make.

target: prerequistito
    istruzioni

Goal espliciti

Un goal esplicito interessa un singolo file come target.

main: main.c
    gcc main.c –o main

clean:
    rm -rf main

Quando sarà eseguito il comando make controllerà la mancanza del file main oppure la data di modifica del file di dipendenza main.c es eseguirà il comando per compilare. il goal clean invece non sarà eseguito perchè mancano le dipendenze. Per eseguirlo è necessario specificare il goal da linea di comando make clean.

Goal impliciti

I goal impliciti invece interessano una classe di file, ovvero un gruppo di file che soddisfano una regola definita come target.

%.o: %.c
    gcc –c –g $< -o $@

Nell'esempio vediamo che il goal è generico per ogni file .c associa un file .o, questo avviene attraverso la variabile %, chiamata stem, la quale assume il valore del mach della regola. Per esempio, nel caso del file main.c, lo stem sarà %=main, e il target sarà main.o.

Nei comandi possiamo usare le seguenti variabili speciali:

Variabile speciale Significato
$@ Assume il valore del target
$< Assume il valore del primo prerequisito
$? Assume il valore di tutti i prerequisiti recenti
$^ Assume il valore di tutti i prerequisiti
$* Assume il valore dello stem %

Variabili

Nei Makefile è possibile usare delle variabili. Molte sono predefinite, ma possono essere sovrascritte.

CC=gcc # Variabile che indica il compilatore da usare
%.o: %.c
    $(CC) –c –g $< -o $@