Linux Makefile - Ajouter un écran d'aide
Implémentez un écran d'aide clair et élégant dans votre Makefile Linux. Un guide simple pour lister automatiquement toutes les targets, leurs descriptions, et créer des sections groupées.
Traduction automatique
Cet article a plus d'un an, mais il a été relu le 30 juillet 2026 — son contenu est toujours exact.

Cet article montre comment ajouter un écran d'aide auto-documenté à un Makefile : ajoutez une target default: help pour que make seul l'affiche, définissez une target help: qui analyse les commentaires préfixés par ## après chaque nom de target pour en afficher la description, et groupez les targets liées sous des en-têtes ##@ Section Name pour obtenir une liste de commandes propre et catégorisée.
Avec un makefile, comme vous le savez déjà, vous pouvez rassembler au même endroit une foule d'actions comme make bash, make build, make deploy, ... exactement comme je le fais pour ce blog (voyez mon makefile sur https://github.com/cavo789/blog/blob/main/makefile). Pas encore convaincu qu'il vous en faut un ? Lisez d'abord Linux Makefile - Quand utiliser un makefile.
Ce qui est vraiment sympa, c'est de pouvoir taper make en ligne de commande, sans aucune autre option, et d'obtenir un écran avec la liste des commandes existantes et une courte explication d'une ligne.
C'est ce que nous allons voir dans cet article.
Ce que vous allez obtenir
Tapez make, tout seul, et voici l'écran que votre projet affichera à la fin de cet article :
Chaque target, sa description d'une ligne, groupée sous des en-têtes de section — et tout cela lu depuis le makefile lui-même, donc impossible que ce soit un jour désynchronisé des commandes documentées.
Trois ingrédients suffisent : une target default:, une target help: qui analyse le fichier, et un commentaire ## après chaque nom de target.
Le point de départ
Pour la démo, ouvrez un shell Linux et lancez mkdir -p /tmp/makefile && cd $_ pour créer un dossier appelé makefile dans votre dossier temporaire Linux et vous y rendre.
Créez ensuite un nouveau fichier appelé makefile avec ce contenu :
SHELL:=bash
COLOR_YELLOW:=33
.PHONY: bashbash: @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Start an interactive shell in the Docker container; type exit to quit"
.PHONY: codecode: @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Open the blog in Visual Studio Code"
.PHONY: buildbuild: @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Generate a newer version of the build directory"
.PHONY: deploydeploy: build @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Deploy static pages to the web server"
.PHONY: installinstall: @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Generate a newer version of the build directory"
.PHONY: startstart: @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Open the blog (http://localhost:3000)"
.PHONY: watchwatch: @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Run Docusaurus watcher and open the blog on the localhost. When done, just start a browser and surf to http://localhost:3000"Ce Makefile définit une série de cibles (bash, code, build, deploy, install, start, watch) qui affichent des messages d'aide en jaune gras. Chaque cible est marquée comme .PHONY pour indiquer qu'elle n'est pas associée à un fichier réel, et utilise printf pour formatter et colorier les messages destinés à l'utilisateur.
Danger
L'indentation dans un makefile DOIT être faite avec des tabulations et non des espaces, c'est crucial. Donc si votre fichier ne fonctionne pas, vous savez quoi vérifier.
Ce fichier contient quelques targets (= actions) et une simple instruction printf pour afficher un texte. À part écrire quelque chose dans la console, ce makefile ne fait rien.
`make` n'est pas encore installé ?
Nous allons utiliser GNU make, il vous faut donc l'avoir.
Lancez which make dans votre console Linux pour vérifier si make est déjà installé. Si oui, vous obtiendrez par exemple /usr/bin/make comme résultat.
Si vous obtenez make not found, lancez sudo apt-get update && sudo apt-get -y install make pour l'installer.
Ajouter l'action par défaut
Nous sommes prêts à commencer l'implémentation.
Il y a trois choses à faire :
- Ajouter une action
default: help - Ajouter une target
help:(une target est, dans le vocabulaire de Make, une action) - Éditer chaque target et ajouter une petite description.
Étape 1 - Ajouter l'action par défaut
En l'absence d'une action default: définie dans le fichier, comme dans votre exemple, c'est la première action qui sera exécutée.
Donc, pour l'instant, si vous lancez make (sans autre argument), vous obtiendrez le message Start an interactive shell... — c'est le résultat de la target bash:, la première du fichier.
Éditez le fichier et ajoutez la ligne surlignée ci-dessous :
SHELL:=bash
# highlight-next-linedefault: help
COLOR_YELLOW:=33
.PHONY: bashbash: @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Start an interactive shell in the Docker container; type exit to quit"Ce Makefile configure un environnement de développement avec un shell bash par défaut et une cible bash qui lance un shell interactif dans un conteneur Docker avec un message d'aide formaté en jaune.
Étape 2 - Ajouter la target help
Toujours dans votre éditeur, ajoutez le bloc surligné ci-dessous ; l'endroit où vous le collez n'a pas d'importance mais, logiquement, plaçons cette nouvelle action en premier puisque c'est celle qui sera exécutée par défaut.
SHELL:=bash
default: help
COLOR_YELLOW:=33
# highlight-next-line.PHONY: help# highlight-next-linehelp: ## Show the help with the list of commands # highlight-next-line @clear # highlight-next-line @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[0;33m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) # highlight-next-line @echo ""Ce Makefile configure un système d'aide interactif pour les cibles Make. Il définit le shell par défaut, déclare la cible help comme non-fichier, puis implémente une commande help qui affiche les cibles disponibles avec leurs descriptions en texte coloré et formaté.
Maintenant, si vous tapez make dans votre console, vous obtiendrez ceci :
Étape 3 - Ajouter une description pour chaque target
Regardez votre nouvelle target help : la description Show the help with the list of commands est préfixée par un double #. C'est comme cela qu'on ajoute une description.
# highlight-next-linehelp: ## Show the help with the list of commandsCe snippet définit une cible Makefile nommée help qui affiche la documentation des commandes disponibles. C'est un point d'entrée standard pour montrer aux utilisateurs comment interagir avec ce projet.
Il vous reste donc à éditer votre makefile une dernière fois et, pour chaque target, ajouter un texte ## une petite description d'une ligne ; comme ci-dessous, notre fichier final :
SHELL:=bash
COLOR_YELLOW:=33
.PHONY: helphelp: ## Show the help with the list of commands @clear @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[0;33m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) @echo ""
.PHONY: bashbash: ## Open an interactive shell in the Docker container @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Start an interactive shell in the Docker container; type exit to quit"
.PHONY: codecode: ## Open Visual Studio Code @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Open the blog in Visual Studio Code"
.PHONY: buildbuild: ## Generate a newer version of the build directory @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Generate a newer version of the build directory"
.PHONY: deploydeploy: build ## Deploy static pages to the web server @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Deploy static pages to the web server"
.PHONY: installinstall: ## The very first time, after having cloned this blog, you need to install Docusaurus before using it. @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Generate a newer version of the build directory"
.PHONY: startstart: ## Start the local web server and open the webpage @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Open the blog (http://localhost:3000)"
.PHONY: watchwatch: ## Start the Docusaurus watcher. Listen any changes to a .md file and reflect the change onto the website @printf "\e[1;${COLOR_YELLOW}m%s\e[0m\n\n" "Run Docusaurus watcher and open the blog on the localhost. When done, just start a browser and surf to http://localhost:3000"Ce fichier Makefile définit une série de cibles (targets) pour automatiser les tâches courantes d'un projet Docusaurus, comme installer les dépendances, démarrer un serveur local, ou déployer le site. Chaque cible affiche un message informatif en couleur jaune et peut déclencher d'autres cibles comme dépendances — par exemple, deploy déclenche automatiquement build avant de déployer.
Et maintenant, en lançant make, vous obtenez un bel écran d'aide :
Comme vous le voyez, l'ordre des targets respecte l'ordre dans votre fichier. help s'affiche en premier parce que c'est la première target du fichier ; pensez donc à réordonner les targets dans votre fichier selon votre logique (par ordre alphabétique, par exemple).
Étape 4 - Ajouter un sous-titre entre chaque « section principale »
Imaginez que vous ayez des dizaines de targets... Ce serait bien de les grouper en sections : tout ce qui concerne votre application, tout ce qui touche à votre base de données, les actions de type analyse de code, et ainsi de suite.
Pour cela, il suffit d'ajouter une ligne avec cette syntaxe : ##@ My project comme illustré ci-dessous :
SHELL:=bash
COLOR_YELLOW:=33
.PHONY: helphelp: ## Show the help with the list of commands @clear @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-20s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[0;33m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) @echo ""
# highlight-next-line##@ My project Helpers to work with the application
.PHONY: bashbash: ## Open an interactive shell in the Docker container # [...]
# highlight-next-line##@ Data quality Code analysis tools
.PHONY: phanphan: ## Run phan analysis # [...]
.PHONY: php-cs-fixerphp-cs-fixer: ## Run php-cs-fixer # [...]
# highlight-next-line##@ Database management Working with the database
.PHONY: phpmyadminphpmyadmin: ## Run phpmyadmin web interface # [...]Ce fichier Makefile configure un système d'aide automatisé et organise des cibles de commandes regroupées par catégorie. Les lignes 1 et 3 définissent des variables de shell et de couleur, tandis que la cible help (lignes 6-9) génère dynamiquement un menu formaté à partir des commentaires ##@ et ## présents dans le fichier. Le reste du fichier structure les commandes disponibles en sections logiques : My project, Data quality, et Database management.
Et voici le résultat final — l'écran d'aide groupé montré au début de cet article.
Jetez un œil au mien, celui de ce blog
Ce blog est maintenu avec un makefile de ce genre ; vous pouvez en récupérer une copie ici : https://github.com/cavo789/blog/blob/main/makefile
Conclusion
L'écran d'aide n'est pas un gadget, c'est ce qui rend le makefile fiable : une target sans description ## n'apparaît tout simplement pas, donc documenter une commande fait partie de son écriture. Personne n'a à maintenir une section de README séparée qui finit lentement par ne plus correspondre à la réalité.
Envie d'aller plus loin avec Make ? Makefile - Tutoriel et astuces couvre les variables, .PHONY, le passage d'arguments aux targets et quelques autres choses que j'utilise au quotidien.


