<!--
  canonical-url: https://www.avonture.be/fr/blog/makefile-using-make
  published:     2023-12-27
  This is a static plain-Markdown mirror generated at build time.
  Visit the canonical URL above for the fully rendered page, with images and interactive components.
-->

# Linux Makefile - Quand utiliser un makefile

> Arrêtez de mémoriser des commandes Docker complexes. Découvrez quand et comment utiliser un makefile Linux avec GNU make pour automatiser la mise en place de votre projet, les logs et la gestion de l'environnement.

---
![Linux Makefile - Quand utiliser un makefile](/img/v2/makefile.webp)

**TL;DR**

Cet article plaide pour l'usage d'un `makefile` de projet (Linux/WSL uniquement) comme endroit unique pour centraliser les commandes difficiles à retenir — transformant par exemple `docker compose up --detach` en `make up` — et montre un fichier de départ basique avec des targets pour les actions Docker courantes, plus une astuce sur l'utilisation de `printf` pour afficher des infos utiles (comme les identifiants) quand une target s'exécute.

Écrire votre propre `makefile` a l'énorme avantage, **terriblement puissant**, de pouvoir centraliser en un seul endroit les commandes que vous utilisez sur votre projet, quelle que soit la nature de celui-ci (php, javascript, nodeJs, markdown, etc.).

La présence d'un fichier nommé `makefile` envoie un message clair à quiconque vient travailler sur le projet : *Hé, regarde ici, tu y trouveras toutes les commandes dont tu as besoin*.

Vous pouvez donc définir une commande `up` (c'est vous qui choisissez le nom) qui lancera toutes les actions nécessaires au démarrage du projet ; vous pourriez avoir `down` pour l'inverse, `check` pour vérifier que le projet est valide (par exemple lancer des contrôles statiques de la qualité de votre code, comme dans [Python - Code Quality tools](/blog/python-qa)), et ainsi de suite.

## Un mot au lieu de cette commande {#one-word-instead-of-that-command}

Voici un appel `make phpmyadmin` et, juste en dessous, la commande Docker qu'il remplace :

```bash
$ make phpmyadmin
User is root and password is example. Please open http://127.0.0.1:8089 to open phpmyadmin.

$ docker run --name phpmyadmin -d --link joomladb:db --network kingsbridge_default -p 8089:80 phpmyadmin
a0c37edd9f8c139556f1f0a6b028ec5102362f16233efbc05f56d184edfb83c9
```

Un mot à gauche. Cent vingt caractères de `--link`, `--network` et `-p` à droite — le genre de ligne que personne ne tape de mémoire et que tout le monde finit par chercher dans son historique de shell.

Et remarquez la deuxième ligne de la sortie : les identifiants et l'URL sont affichés aussi, comme ça vous n'avez pas à les chercher non plus.

## Ce que contient le makefile {#whats-inside-the-makefile}

Tout ce comportement vient d'un simple fichier texte à la racine du projet :

**makefile**

```
adminer:
  @printf "\e[1;033m%s\e[0m\n\n" "User is root and password is example. Please open http://127.0.0.1:8088?server=joomladb&username=root&db=joomla_db to open Adminer."
  @printf "\e[1;033m%s\e[0m\n\n" "Starting adminer. If the browser didn't open automatically, please surf to http://127.0.0.1:8088?server=joomladb&username=root&db=joomla_db to open adminer."
  docker run -d --rm --name adminer --link joomladb:db --network kingsbridge_default -p 8088:8080 adminer
  -sensible-browser http://localhost:8088 &

bash:
  @printf "\e[1;033m%s\e[0m\n\n" "Start an interactive shell in the Joomla Docker container; type exit to quit"
  docker compose exec joomla /bin/sh

code:
  code .

down:
  docker compose down

explorer:
  explorer.exe .

kill:
  docker compose kill

logs:
  docker compose logs --follow

start:
  @printf "\e[1;033m%s\e[0m\n\n" "Starting your website. If the browser didn't open automatically, please surf to http://127.0.0.1:8080 to open your site."
  -sensible-browser http://localhost:8080 &

up:
  docker compose up --detach

phpmyadmin:
  @printf "\e[1;033m%s\e[0m\n\n" "User is root and password is example. Please open http://127.0.0.1:8089 to open phpmyadmin."
  @printf "\e[1;033m%s\e[0m\n\n" "Starting phpmyadmin. If the browser didn't open automatically, please surf to http://127.0.0.1:8089 to open phpmyadmin."
  docker run --name phpmyadmin -d --link joomladb:db --network kingsbridge_default -p 8089:80 phpmyadmin
  -sensible-browser http://localhost:8089 &
```

Les lignes comme `adminer:` ou `bash:` s'appellent des `targets` ; ce sont vos commandes. Regardez la target `up:` : vous y trouverez une seule commande, `docker compose up --detach`. Donc au lieu de retenir `docker compose up --detach` pour lancer votre application, vous exécutez simplement `make up`. Pour ouvrir le navigateur et parcourir votre site, ce sera `make start`.

Les identifiants montrés plus haut sont affichés par un appel `printf` dans cette target — une bonne habitude pour tout ce que vous devriez sinon aller rechercher.

> **Danger:**
>
> L'indentation dans un makefile **DOIT** se faire avec des tabulations et pas des espaces, c'est crucial. Alors assurez-vous de ce point : si votre fichier ne fonctionne pas, vous savez quoi faire.

> **Ce fichier est spécifique à chaque projet, pas global.:**
>
> Le `makefile`, créé dans le répertoire de votre projet, peut contenir des instructions pour ce projet précis. Vous pouvez avoir un `makefile` par projet.

## Pourquoi s'embêter {#why-bother}

Dans l'article [Créez votre site Joomla avec Docker](/blog/docker-joomla), nous avons vu beaucoup de commandes Docker.

Par ordre alphabétique :

* `docker compose down`,
* `docker compose exec joomla /bin/sh`,
* `docker compose kill`,
* `docker compose logs --follow`,
* `docker compose up --detach`,
* `docker container list`,
* `docker image list`,
* `docker network list`,
* et bien d'autres

Ce n'est certainement pas facile de toutes les retenir — et il est beaucoup plus simple de se souvenir d'une commande du type `make quelquechose` (et ça peut être n'importe quoi, pas seulement du Docker).

**`make` n'est pas encore installé ?**

Nous utilisons [GNU make](https://www.gnu.org/software/make/) pour cela.

Lancez d'abord `which make` dans votre console Linux pour vérifier si `make` est installé. Si c'est le cas, vous obtiendrez par exemple `/usr/bin/make` comme résultat. Si vous obtenez `make not found`, exécutez `sudo apt-get update && sudo apt-get -y install make` pour l'installer.

Le `makefile` lui-même est du texte pur, vous pouvez donc utiliser l'éditeur que vous voulez. De mon côté, j'ai maintenant mes habitudes avec Visual Studio Code. Assurez-vous que l'indentation utilise des tabulations, pas des espaces.

> **Uniquement pour Linux / WSL (pas pour DOS/PowerShell):**
>
> Ce chapitre concerne uniquement Linux puisque DOS/PowerShell ne supporte pas la commande GNU make.

## Conclusion {#conclusion}

Un `makefile` à la racine d'un projet est un message pour la prochaine personne qui l'ouvrira — vous compris, dans six mois : *tout ce dont tu as besoin pour faire tourner ce truc est ici*. Les commandes cessent de vivre dans votre historique de shell et commencent à vivre dans le repository, versionnées à côté du code sur lequel elles agissent.

L'étape suivante évidente est de rendre cette liste auto-documentée : [Linux Makefile - Adding a help screen](/blog/makefile-help) montre comment un simple `make` peut afficher chaque target disponible avec sa description. Et une fois convaincu, [Makefile - Tutorial and Tips & Tricks](/blog/makefile_tips) rassemble tout ce que j'ai appris depuis l'écriture de mon premier.
