Bonjour,

A la suite de la lecture sur le cours makefile,
https://gl.developpez.com/tutoriel/outil/makefile/
j'ai plusieurs questions :
La première :
Je ne comprends pas pourquoi dans vos exemples avec vos 2 fichiers sources :
- main.c
- hello.c
Et le fichier d'en tête (header) :
- hello.h

Vous n'incluez pas le fichier header hello.h à la fois dans le main.c et dans hello.c.
Vous ne l'incluez que dans le fichier main.c

Moi j'ai lu dans un livre qu'il fallait impérativement l'inclure dans les 2 fichiers car
le compilateur traite chaque fichier indépendamment les uns des autres.
Et que donc pour faire un contrôle du prototype de la fonction au moment de l'appel dans
main.c. il faut que le fichier header soit doublement inclut (main.c + hello.c)
Sinon ça sert à rien.
Es ce que je raconte des conneries ?

Deuxième question :
Je ne comprends pas cette phrase :
II-B Makefile enrichi
Un tel Makefile ne permet pas de générer plusieurs exécutables distincs.
Mais y a qu’un et un seul exécutable ?
Le reste sont des fichiers objets venant eux mêmes des fichiers sources.
Vu que y a qu'une seule fonction main.

Troisième question :
III-B. Variables internes :
$? <=> la liste des dépendances plus récentes que la cible
Je ne comprends pas cette phrase.
La liste des dépendances est donnés dans le makefile, par exemple :
Code makefile : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
===============
hello: main.o afficher.o
	gcc -o hello main.o afficher.o
...
===============

Quatrième question :
III-B. Variables internes :
$* <=> nom du fichier sans suffixe
Mais de quel fichier il s'agit ? Le fichier CIBLE ?

On a la liste des dépendances pour l'exécutable hello et également pour touts les autres
fichiers.o intermédiaire ?
Donc je comprends pas le mot "plus récent"

Cinquième question :
IX. Les Makefiles conditionnels :
compiler notre projet tantôt en mode debug, tantôt en mode release
Es ce que quelqu'un peut m'expliquer la différence entre le mode debug et le mode release ?
Je comprends rien à cette phrase.

Sixième question :
X. sous-makefile :
Le makefile maitre est situé dans le répertoire principale
Le sous-make est situé dans le répertoire hello (qui est un sous répertoire du répertoire principale)

Code Makefile maitre : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
=================
export CC=gcc
export CFLAGS=-W -Wall -ansi -pedantic
export LDFLAGS=
HELLO_DIR=hello
EXEC=$(HELLO_DIR)/hello
 
all: $(EXEC)
 
$(EXEC):
    @(cd $(HELLO_DIR) && $(MAKE))
 
.PHONY: clean mrproper $(EXEC)
 
clean:
    @(cd $(HELLO_DIR) && $(MAKE) $@)
 
mrproper: clean
    @(cd $(HELLO_DIR) && $(MAKE) $@)
=================
Supposons que j'ai un répertoire master que je nomme MASTER.
Dans ce répertoire il y a un makefile master.
Ce makefile master appelle 3 autres sous makefile.
Chacun de ses makefile est dans un sous un répertoire (juste un et un seul niveau en dessous).
Dans ce cas il faudra que je fasse dans le makefile maitre :
Code Makefile maitre : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
=================
export CC=gcc
export CFLAGS=-W -Wall -ansi -pedantic
export LDFLAGS=
 
HELLO_DIR=hello       # Premier   sous répertoire du makefile fils
AUREVOIR_DIR=aurevoir # Deuxieme  sous répertoire du makefile fils
BONJOUR_DIR=bonjour   # Troisième sous répertoire du makefile fils
 
EXEC_HELLO=$(HELLO_DIR)/hello
EXEC_AUREVOIR=$(AUREVOIR_DIR)/aurevoir
EXEC_BONOUR=$(BONJOUR_DIR)/bonjour
 
all: $(EXEC_HELLO) $(EXEC_AUREVOIR) $(EXEC_BONJOUR)
 
$(EXEC_HELLO):
    @(cd $(HELLO_DIR) && $(MAKE))
 
$(EXEC_AUREVOIR):
    @(cd $(AUREVOIR_DIR) && $(MAKE))
 
$(EXEC_BONJOUR):
    @(cd $(BONJOUR_DIR) && $(MAKE))
 
.PHONY: clean mrproper $(EXEC)
 
clean:
    @(cd $(HELLO_DIR) && $(MAKE) $@)
 
mrproper: clean
    @(cd $(HELLO_DIR) && $(MAKE) $@)
=================
Pouvez vous me le confirmer ?