Un générateur de site statique - retour accueil
git clone git://bebou.netlib.re/catium
Log | Files | Refs | README |
commit 47baaa3e3c15807f4c6d995aeb3e0458d5d29750 parent e930de819ac2031ae1c8d5c403a023d5f689146a Auterice: Arthur Pons <arthur.pons@unistra.fr> Date: Sun, 3 Mar 2024 11:49:24 +0100 Recommentage du makefile Tellement verbeux, peut-être qu'il faudra plutôt le déplacer dans de la documentation Diffstat:
M | makefile | | | 113 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------- |
1 file changed, 82 insertions(+), 31 deletions(-)
diff --git a/makefile b/makefile @@ -1,44 +1,95 @@ +# Si une erreur survient dans l'exécution d'une règle alors le fichier concerné +# est supprimé .DELETE_ON_ERROR: +############################################################# +# On liste les fichiers avec lesquels on veut faire des trucs +############################################################# + # On créé des variables contenant la liste des fichiers qui nous intéressent -# Dans sources les md à transformer en html -# Dans annexfiles le reste des fichiers -sources != find contents -type f -name '*.sh' -annexfiles != find contents -type f -not -name '*.sh' - -# On construit dynamiquement les règles à invoquer avec des substitutions de -# chaînes de caractères -# Ex: Pour pages on prend tous les chemins de fichiers récupérés dans sources -# On substitue contents/ par public/ et l'extension md par html -# Le fichier source "contents/truc/bidule.sh" donnera donc +# Dans sources les sh à transformer en html +# Dans annexes le reste des fichiers +sources != find contents -type f -name '*.sh' +annexes != find contents -type f -not -name '*.sh' + +######################### +# Construction des cibles +######################### + +# On construit les chemins des fichiers à produire correspondant +# aux fichiers listés dans sources et annexes +# On appelle les chemins créés ainsi des "cibles" +# On le fait à l'aide de la fonction patsubst invoquée via la +# syntaxe des "substitution references" (voir +# https://www.gnu.org/software/make/manual/html_node/Text-Functions.html#index-patsubst-1) +# Ex: Pour pageshtml on prend tous les chemins de fichiers récupérés dans sources puis +# contents/ devient public/ et .sh devient .html +# Le fichier source "contents/truc/bidule.sh" donnera donc la page html # "public/truc/bidule.html" -# Même mécanique pour les raw et les fichiers annexes -pages = ${sources:contents/%.sh=public/%.html} -annexrules = ${annexfiles:contents/%=public/%} - -# On appelle toutes les cibles pour produire tous les fichiers -# nécessaires -# Pour chacune make va tenter de trouver une règle correspondante dans la liste -# qui suit -all: exec ${pages} ${annexrules} - -# Règle permettant de vider public si besoin -# Faire make clean pour l'appeler -clean:; rm -r public/* +# Même mécanique pour les fichiers annexes +pageshtml = ${sources:contents/%.sh=public/%.html} +annexescibles = ${annexfiles:contents/%=public/%} +# Les "substitution references" semblent ne pas fonctionner avec gmake <3.8 +# ce qui force les personnes sur macos à installer une version plus récente +# de gmake +# Il faudrait tester l'appel direct à patsubst +# TODO -exec:; chmod +x ${sources} +######## +# Règles +######## + +# Explication sommaire du fonctionnement de make # Syntaxe générale d'une règle : # cible : liste dépendances ; commandes -# +# ou +# cible : list dépendances +# commandes + +# Pour chacun des chemins de cibles construits précédemment make va chercher +# une règle permettant de construire le fichier en question. Pour cela il +# cherche une règle ayant pour cible un chemin correspondant. +# Une fois qu'il a trouvé une règle qui correspond, il vérifie si la cible +# existe. +# Si elle n'existe pas il cherche à construire toutes ses dépendances puis +# exécute la commande. +# Si le cible existe déjà et que les dépendances existent il vérifie si ses +# dépendances ont été modifiées après sa dernière modification. Si oui alors on +# suppose que la cible n'est pas à jour (ses sources sont plus récentes qu'elle +# même) et make relance la commande. + +# Make cherche à créer les cibles qu'on lui passe en argument +# `make public/index.html` construira la cible `public/index.html`. +# Par défaut sans argument make cherche à construire la première règle qu'il +# trouve, d'où : + +# On créer une "fausse" règle (phony en anglais) all pour qu'exécuter make sans +# argument construise tout le site. Puisque cette règle ne créer pas de fichier +# all, elle sera toujours exécutée et toutes ses dépendances avec. Si l'on liste +# toutes les cibles du site cela revient à créer tout le site. Par convention +# cette règle se nomme "all" mais elle pourrait s'appeler "toto". +all: exec ${pageshtml} ${annexescibles} + +# Une autre "fausse" règle pour nettoyer le dossier public. Faire `make clean` +# pour l'appeler. +clean:; rm -r public/* + +# Une troisième fausse règle pour rendre exécutable toutes les sources .sh +exec:; chmod +x ${sources} + # Règles pour générer les fichiers -# Chaque cible requiert des dépendances après le ":" -# Si l'un des ses dépendances est plus récent que la cible -# alors la cible est reconstruite + # Ce que % match dans la cible sera substitué à la place de % dans les -# dépendances -# make substitue la variable $@ avec le chemin de la cible et $< avec le -# chemin de la première dépendance de la règle +# dépendances. make substitue la variable $@ avec le chemin de la cible et $< +# avec le chemin de la première dépendance de la règle. +# Ex: +# public/%.html : contents/%.sh +# $< > $@ +# +# matchera pour la cible public/index.html et la dépendance contents/index.sh +# et exécutera la commande +# contents/index.sh > public/index.html # Règle pour la génération des pages html public/%.html : contents/%.sh page layouts/html