{{tag>dev c make makefile compilation}}
====== 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
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 =====
* http://ftp.traduc.org/doc-vf/gazette-linux/html/2002/083/lg83-B.html
* https://openclassrooms.com/courses/compilez-sous-gnu-linux