Table des matières

, , , ,

make

make est un programme permettant d'automatiser les différentes étapes de compilation permettant d'aboutir à la création de fichiers binaires exécutables.

Installation

Via le gestionnaire de paquets:

sudo apt-get install make

Makefile

Le programme make lit les instructions qu'il devra exécuter dans le makefile, c'est en fait un simple fichier texte qui par convention est nommé Makefile ou makefile. Invoqué sans argument la commande make cherche un fichier nommé ainsi dans le répertoire courant. Pour spécifier un autre fichier utiliser l'option -f avec l'argument idoine:

$ make -f ./mon_fichier_make

Anatomie du Makefile

Un makefile est un fichier texte respectant une syntaxe. Il se compose d'une ou plusieurs cibles (targets) des dépendances à satisfaire pour la création de chaque cible, et des instructions nécessaires a la création de chaque cible:

Un exemple rudimentaire ci-dessous:

hello: src/main.c
   gcc -Wall src/main.c -o build/hello

La cible est nommée hello. Après le caractère ':' sont listées les dépendances. Ici un seul fichier src/main.c. Une dépendance peut être un fichier ou une autre cible. Enfin en dessous avec indentation, une ou plusieurs instructions. Ce sont les commandes que make exécutera pour construire la cible courante.

Variables

Certaines règles utilisent des valeur identiques, dans ce cas factoriser dans des variables. Dans un Makefile, la définition d'une variable utilise la syntaxe suivante:

$MA_VAR=valeur

Exemple

Un Makefile élémentaire comprenant 3 cibles

Makefile
hello: src/main.c build
        gcc -g -Wall -std=c99 src/main.c -o build/hello
 
build:
        if [ ! -d build ]; then mkdir build; fi
 
clean:
        if [ -d ./build ]; then rm ./build/*; fi
        if [ -d ./build ]; then rmdir ./build; fi

Cibles particulières

Les cibles sans dépendances sont systématiquement exécutées par make tant qu'un fichier/dossier portant le nom de la cible n'existe pas dans le répertoire courant. Pour éviter ce genre de problématique il est préférable de déclarer ces cibles particulières via .PHONY

# Déclaration des cibles particulières
.PHONY: all, install, clean

Références