{{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