Skip to content

Instantly share code, notes, and snippets.

@roukmoute
Last active August 23, 2023 10:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save roukmoute/a1e75a1deca4ada7b0b0f6bb096e06d7 to your computer and use it in GitHub Desktop.
Save roukmoute/a1e75a1deca4ada7b0b0f6bb096e06d7 to your computer and use it in GitHub Desktop.
Ajouter une cible "help" à un Makefile qui permettra à toutes les cibles d'être auto-documentées

Voici une description détaillée de ce que fait cette ligne :

@fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -n 's/^\(.*\):.*##\s*\(.*\)/\1:\2/p' | awk -F: '{ gsub(/^[ \t]+/, "", $$2); printf " $(GREEN)%-10s$(NC) %s\n", $$1, $$2 }'
  1. fgrep -h "##" $(MAKEFILE_LIST) :

    • fgrep: Recherche des chaînes fixes (plus rapide que grep pour des chaînes simples).
    • -h: N'affiche pas les noms des fichiers où les chaînes sont trouvées (utile lors de la recherche dans plusieurs fichiers).
    • "##": La chaîne à rechercher.
    • $(MAKEFILE_LIST): Une variable interne de make qui contient le nom du Makefile en cours d'exécution (et tout autre fichier inclus).
  2. fgrep -v fgrep: Filtre pour éliminer les lignes contenant le mot fgrep pour éviter les faux positifs. Utile surtout si cette ligne est dans le Makefile et que vous recherchez les commentaires "##".

  3. sed -e 's/\\$$//': Supprime les fins de ligne d'échappement (comme \\) qui pourraient être présentes.

  4. sed -n 's/^\(.*\):.*##\s*\(.*\)/\1:\2/p': Capture les règles et leurs descriptions :

    • ^\(.*\):: Capture tout avant le :.
    • .*##\s*: Capture et ignore tout entre le : et le ## ainsi que les espaces après le ##.
    • \1:\2: Récupère et reformate les règles et leurs descriptions pour avoir rule:description.
  5. awk -F: '{ gsub(/^[ \t]+/, "", $$2); printf " $(GREEN)%-10s$(NC) %s\n", $$1, $$2 }': Formate et colore la sortie :

    • -F:: Définit le caractère : comme séparateur de champs pour awk.
    • gsub(/^[ \t]+/, "", $$2): Supprime les espaces au début des descriptions.
    • printf " $(GREEN)%-10s$(NC) %s\n", $$1, $$2: Affiche les règles en vert (ou une autre couleur de votre choix) et les aligne, puis affiche la description.
# Variables
DOCKER_COMPOSE = docker compose
GREEN=\033[0;32m
NC=\033[0m # Pas de couleur
help:
@echo "Utilisation : make [commande]"
@echo ""
@echo "Commandes :"
@fgrep -h "##" $(MAKEFILE_LIST) | fgrep -v fgrep | sed -e 's/\\$$//' | sed -n 's/^\(.*\):.*##\s*\(.*\)/\1:\2/p' | awk -F: '{ gsub(/^[ \t]+/, "", $$2); printf " $(GREEN)%-5s$(NC) %s\n", $$1, $$2 }'
start: stop ## Lance l'environnement Docker en arrière-plan
@$(DOCKER_COMPOSE) up --detach --remove-orphans
stop: ## Arrête l'environnement Docker
@$(DOCKER_COMPOSE) stop
$ make
Utilisation : make [commande]
Commandes :
start Lance l'environnement Docker en arrière-plan
stop Arrête l'environnement Docker
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment