From 4d129e98a6217b869e4dd104c6ade7c2d0915dcb Mon Sep 17 00:00:00 2001 From: Orestis <orestis.malaspinas@pm.me> Date: Tue, 9 Mar 2021 09:44:25 +0100 Subject: [PATCH] begining of slides for adv make --- slides/make_avance.md | 184 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 slides/make_avance.md diff --git a/slides/make_avance.md b/slides/make_avance.md new file mode 100644 index 0000000..497dd87 --- /dev/null +++ b/slides/make_avance.md @@ -0,0 +1,184 @@ +--- +title: Plus de Makefiles +date: 2021-03-03 +--- + +# `make` avancé + +## Rappel: utilité + +- Automatiser le processus de conversion d'un type de fichier à un autre, en *gérant les dépendances*. +- Effectue la conversion des fichiers qui ont changé uniquement. +- Utilisé pour la compilation: + - Création du code objet à partir des sources. + - Création de l'exécutable à partir du code objet. +- Tout "gros" projet utilise `make` (pas uniquement en `C`). + +# Utilisation de `make` + +## `Makefile` simple + +:::::::::::::: {.columns} +::: {.column width="60%"} + +```bash +# Les commentaires commencent +# par # + +# exemple est la cible, example.o +# la dépendance +example: example.o +# ligne exécuté à l'appel de +# `make` (`make example`) + gcc -o example example.o + +# exemple.o est la cible, example.c +# et example.h les dépendances +exmaple.o: exmaple.c example.h +# ligne exécuté à l'appel de +# `make example.o` + gcc -c example.c +``` + +::: +::: {.column width="40%"} + +## Terminal + +```bash +$ make +gcc -c example.c +gcc -o example example.o +``` +::: +:::::::::::::: + +# `Makefile` plus complexe (1/3) + +```makefile +# Un Makefile typique + +# Le compilateur +CC = gcc + +# La variable CFLAGS contient les flags de compilation: +# -g compile avec les infos de debug +# -Wall Plein de warning +# -Wextra Encore plus de warnings +# -pedantic Warning lvl archimage +# -O0 Option d'optimisation (0,1,2,3) +# -std=c11 Utilisation du standard c11 +# -fsanitize=address Utilisation du standard c11 +CFLAGS = -g -Wall -O0 -std=c11 +``` + +# `Makefile` plus complexe (2/3) + +```makefile +# La variable LDFLAGS contient les flags pour l'éditeur +# de liens: -lm dit d'éditer les liens avec la lib math +LDFLAGS = -lm + +# Définition des sources +SOURCES = galaxy.c stars.c vec.c +# OBJECTS contient SOURCES avec .c -> .o +OBJECTS = $(SOURCES:.c=.o) +# galaxy sera l'exécutable (galaxy.c contient le main) +TARGET = galaxy +# Jusqu'ici on a aucune cible. +``` + +# `Makefile` plus complexe (3/3) + +```makefile +# TARGET est la première cible et sera donc exécuté à l'invocation de `make` +# Elle dépend de OBJECTS +$(TARGET) : $(OBJECTS) + $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) +# $@ : la cible, $ˆ : la liste des dépendances + +# PHONY signifie qu'on ne crée rien avec les cibles mentionnées +# Ici clean est la cible utilisée pour enlever tous les fichier .o +# et l'exécutable + +.PHONY: clean + +clean: # aucune dépendance + rm -f $(TARGET) $(OBJECTS) +``` + +# Gestion implicites (1/2) + +## Question + +Comment cela se fait-il qu'on ait pas besoin de générer les `OBJECTS` +dans le `Makefile` précédent? + +## Réponse + +`make` possède une série de règles implicites (voir [ce lien](https://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html#SEC95) pour une liste). + +## Fonctionnement + +Quand `make` rencontre une dépendance sans règle, il va voir dans sa liste de règles implicites pour la générer. +Ainsi + +```makefile +foo: foo.o bar.o + gcc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS) +# implicitement pour foo.c et bar.c + $(CC) -c $(CPPFLAGS) $(CFLAGS) +``` + +# Gestion implicites (2/2) + +## Question + +Et pour les dépendances des cibles implicites ça se passe comment? + +## Réponse + +On peut définir individuellement les + +## Fonctionnement + +Quand `make` rencontre une dépendance sans règle, il va voir dans sa liste de règles implicites pour la générer. +Ainsi + +```makefile +foo: foo.o bar.o + gcc -o foo foo.o bar.o $(CFLAGS) $(LDFLAGS) +# implicitement pour foo.c et bar.c + $(CC) -c $(CPPFLAGS) $(CFLAGS) +``` + + + +# Macros + +## Les macros + +- Assignation + + ```make + CC = gcc + CFLAGS = -g -Wall -Wextra -pedantic -O0 -std=c11 + LDFLAGS = -lm + ``` +- Utilisation + + ```bash + $(CC) + ``` +- Déclaration à la ligne de commande + + ```bash + make CFLAGS="-O3 -Wall" + ``` + +## Variables internes + +- `$@` : la cible +- `$^` : la liste des dépendances +- `$<` : la première dépendance +- `$*` : le nom de la cible sans extension -- GitLab