💾 Archived View for unbon.cafe › lejun › posts › 20221231_make.gmi captured on 2024-08-24 at 23:55:10. Gemini links have been rewritten to link to archived content

View Raw

More Information

⬅️ Previous capture (2023-07-10)

-=-=-=-=-=-=-

Make

2022-12-31

Les fichiers Makefile reposent sur la commande `make` très répandue afin de traiter une entrée en une sortie.

Bases

.POSIX:
cible: dépendances
	commandes shell % L’indentation par tabulation est indispensable

Un fichier makefile basique est composé de 4 éléments : une « cible » à produire – fonction ou nom de fichier –, des dépendances et les commandes. Chaque « règle » permet ainsi d’expliciter une arborescence de « cibles » avec les sorties en extrémité. L’arborescence entière est mise en mémoire avant son exécution de manière à rendre le processus indépendant de l’ordre des règles, par défaut la première cible est implicite lorsqu’aucune cible n’est désignée explicitement. Selon la spécification standard,la première ligne doit être `.POSIX:` de sorte à avoir un comportement prévisible.

Commandes

La commande `make` utilise un lot de règles implicites par défaut, ajouter `.SUFFIXES` en en-tête permet de les écraser. Chaque ligne est indépendante ; attention aux `cd`.

À la manière de git[1], make est capable de détecter la modification d’un fichier et ne créera que les éléments qui en dépendent. Ce fonctionnement explique la convention de définir une cible `all` de manière à pouvoir utiliser la commande `make all` et reconstruire l’ensemble d’un projet. De la même manière, une cible `clean` est généralement utilisée comme alias de `rm` de sorte à supprimer les fichiers intermédiaires via `make clean`.

Toujours par convention, il est d’usage de créer des cibles `install` et `uninstall` avec les macros `PREFIX` et `DESTDIR` pour installer un programme et ses composants.

Macros

Des macros peuvent être définis en amont pour être réutilisés plusieurs fois dans un fichier. Par convention, ces variables sont définies en entête de document pour être appelés par la suite via de $(…).

CC=cc
$(CC)

[1] Système git, LeJun 2022