c'est pourtant assez direct:
les règles sont de la forme suivante:
cible : dependances ...
action
action...
make est appelé avec une ou plusieurs cible(s) à construire. Si on en lui en donne pas, c'est la première qui est utilisée.
C'est pour cela qu'en général la première règle est all.
Une règle définit la manière de produire une chose, et est considérée comme "a exécuter" si la chose en question est plus ancienne que l'une de ses dépendances.
Tu as mis la regle suivante
$(OBJDIR)/%.o: src/%.c
@mkdir -p $(dir $@)
$(CC) $(CFLAGS) -c $< -o $@
Elle se lit ainsi:
pour chaque fichier correspondant à $(OBJDIR)/%.o, c'est-à-dire, dans ton cas, obj/%.o, autrement dit, ceux listés par ls obj/*.o
ce fichier dépend de src/%.c, c'est-à-dire le fichier équivalent, mais trouvé dans src
pour générer ce fichier:
executer (sans l'afficher car il y a un @) la commande mkdir -p $(dir $@)
afficher et executer la commande $(CC) $(CFLAGS) -c $< -o $@
Bien sur c'est encore un peu mystique.
$(...) est la notation de makefile pour substituer une variable ou appeler une sous-commande.
les autres $ sont des choses particulières de make
- la première commande equivaut en bash à mkdir -p `dir $@`
- la seconde commande equivaut en bash à gcc -W -Wall -Werror -I inc/ -c $< -o $@
J'en viens à $@ et $<. le premier est la cible de la règle (à gauche du :), et $< à sa première dépendance (le premier nom à droite du :).
la règle signifie donc:
pour tout fichier .o dont j'aurai besoin dans le dossier obj
ce fichier dépend d'un fichier de même nom mais avec l'extension .c et trouvé dans le dossier src
pour générer ce fichier:
on crée le dossier obj, en créant les dossiers intermédiaires si nécessaire (option -p)
on execute gcc -W -Wall -Werror -I inc/ -c "le fichier .c" -o "le fichier .o"
La règle indique comment produire un fichier .o dans obj/.
Elle est utilisé parce que les dépendances de $(NAME) sont justement $(OBJ), qui sont dans $(OBJDIR)
Au passage, je t'invite à ajouter -Wextra à ta compilation, cela active des warnings sur des problèmes qui sont potentiellement dangereux.
Auquel cas, tu peux éventuellement supprimer -Werror pour ne pas arreter la compilation pour un warning.
Edit:
Nous avons un petit tuto sur make et ses Makefiles, n'hésite pas à le consulter
Partager