Mardi 28 Mai 2019

Cher Journal,

Nul besoin de s'inquiéter pour l'avenir, avec un terminal !

$ make me a sandwich
What?  Make it yourself.
$ sudo make me a sandwich
Okay.

Cet extrait de Makefile est librement inspiré du XKCD numéro 149 :

me:
	@ true
a:
	@ [ "root" =  "$(USER)" ] && echo "Okay." || true
sandwich:
	@ [ "root" != "$(USER)" ] && echo "What?  Make it yourself." || true

Bon, pour être tout à fait honnête, ce n'est qu'un extrait de mon Makefile principal, à la racine de mon répertoire home. Pour une raison qui m'échappe, peut-être le caractère purement déclaratif du langage, ce fichier est la bête noire des développeurs. Bon, ce peut aussi être lié au fait de devoir gérer de la complexité, comme les miliers d'options dont disposent les compilateurs, ou la définition correcte de leur environnement de travail, dans un domaine qui n'est pas strictement séquentiel. Ou tout simplement, le problème vient de devoir différencier à coup sûr les espaces des tabulations, ce qui peut être sioux lorsque les éditeurs de texte sont configurés pour changer les tailles par défaut de tabulations de 8 vers 4 caractères, ou que ces tabulations sont automatiquement converties en séquences d'espaces.

De mon point de vue, make permet de se définir des ensembles de fonctions contextuelles, dépendantes de mon répertoire de travail, et pouvant éventuellement être mises en relation de dépendance. Le cas d'école est la séparation entre la compilation d'un fichier de code source, et l'édition de liens entre fichiers objets pour construire un exécutable. Sauf que comme tout cas d'école, ce n'est pas forcément passionnant. Par contre pour opérations de la vie quotidienne, comme, au hasard, procéder à la sauvegarde du jour, et bien certaines propriétés de make sont bien pratiques. Considérons qu'un peu de ménage soit bienvenu avant de faire une sauvegarde, la recette pour procéder à une sauvegarde serait :

backup: clean
	@ do_backup

backup est la cible, indiquant quelle recette du Makefile doit être sélectionnée pour exécution. do_backup est le programme qui sera appelé pour réaliser la recette de backup. Le symbole @ est purement cosmétique et sert à cacher la ligne qui est exécutée lors de la réalisation de la recette. Enfin clean est la recette dont dépend backup pour être réalisée; cette recette clean doit être préalablement construite pour pouvoir démarrer la réalisation de backup. Bien sûr, cette dépendance doit aussi être définie dans ce ficher Makefile. Admettons que faire le ménage consiste à parcourir tous les projets de code source, et à en évacuer tous les fichiers objets, la recette pourrait ressembler à :

clean:
	@ echo 'Cleaning up:'
	@ find src/ -xdev -type f -name '*.o' -delete -print

L'audience est invitée à consulter le manuel de find(1) pour plus de détails sur le fonctionnement de cette commande. Lancer make backup renverrait alors une sortie qui pourrait ressembler à :

$ make backup
Cleaning up:
src/prog.o
Backing up, please wait...
...done.

Cette entrée de journal présente très, trop, succinctement make. Beaucoup de choses peuvent encore être rédigées à ce sujet, par exemple les cibles et les dépendances sont conçues pour être des fichiers à produire. Leur date de dernière modification fait foi quant à déterminer si une recette est à jour ou doit être reconstruite. Si des pseudo cibles sont utilisées, c'est-à-dire ne produisant en réalité pas de fichier homonyme, alors ces recettes doivent être déclarées dans la recette intégrée .PHONY, afin que le jour où un fichier portant le nom d'une pseudo cible apparait dans l'arborescence, alors le mécanisme de mises à jour conditionnelles ne se met pas en route au détriment du comportement attendu, à savoir préparer la recette de manière inconditionnelle. À l'opposé, certains fichier intermédiaires peuvent être détruits par les mécanismes d'optimisation de make, tandis que garder ces fichiers pour différents usages pourrait être souhaitable, par exemple à fins de débug. Dans ce cas, ces recettes intermédiaires peuvent être déclarées comme dépendances de la pseudo cible intégrée .PRECIOUS.

Le manuel de référence de make est publié sur le site web du projet GNU:

[ICO]NameLast modifiedSize
[PARENTDIR]Parent Directory  -

  —