# ==== Configuration ==========================================================
CC       ?= gcc 
# ?=


CFLAGS   ?= -O2 -std=c11 \
            -Wall \
            -Wpointer-arith -Wcast-qual

# -Wpointer-arith Avertit quand on fait des opérations arithmétiques douteuses sur des pointeurs, ou des opérations sur des pointeurs dont le type est incomplet (comme void*).
# -Wcast-qual Avertit quand un cast supprime un qualificatif const, volatile, ou restrict.

#on peut aussi ajouter  -Wextra -Wpedantic -Wconversion -Wshadow
# -Wconversion : elle avertit dès qu’il y a conversion implicite de type pouvant changer la valeur ou entraîner une perte d’information.
# -Wpedantic Cette option impose une conformité stricte au standard C (C11 ici).
# -Wextra protège contre des erreurs logiques subtiles ou des oublis (paramètre ignoré, boucle infinie, etc.)
# -Wshadow Émet un avertissement lorsqu’une variable locale porte le même nom qu’une autre variable (globale, d’un bloc englobant, ou d’un paramètre) et la "cache".

LDFLAGS  ?=
# Pour changer le seuil de Sobel/seuil : `make THRESHOLD=120`
THRESHOLD ?= 80
#"Si THRESHOLD n’a pas encore été défini (par l’environnement ou en ligne de commande), alors mets-lui 80."
# avec "make THRESHOLD=120", alors "THRESHOLD ?= 80" sera ignoré


CFLAGS   += -DTHRESHOLD=$(THRESHOLD)
#ajoute "-DTHRESHOLD=$(THRESHOLD)" à la fin de CFLAGS

# ==== Cibles ================================================================

#  "TARGET := tests_conv" L'évaluation est faite une fois pour toutes,
#  au moment où make lit la ligne. Sinon, avec "TARGET = tests_conv"
#  l'évaluation est faite au moment de l'usage, pas à la lecture.


TARGET   := tests_conv
OBJS     := conv.o tests_conv.o
DEPS     := conv.h

.PHONY: all clean run debug

all: $(TARGET)

$(TARGET): $(OBJS)
	$(CC) $(OBJS) -o $@ $(LDFLAGS)

conv.o: conv.c $(DEPS)
	$(CC) $(CFLAGS) -c $< -o $@

tests_conv.o: tests_conv.c $(DEPS)
	$(CC) $(CFLAGS) -c $< -o $@

# Build avec symboles et sans optim (utile pour gdb/valgrind)
debug: CFLAGS := -O0 -g -std=c11 -Wall -Wextra -Wpedantic -Wconversion -Wshadow -DTHRESHOLD=$(THRESHOLD)

# Cette ligne debug ne définit pas une recette, elle redéfinit la variable CFLAGS uniquement pour cette cible debug.
#CFLAGS := ... signifie : “Si on construit la cible debug, alors on remplace CFLAGS par cette valeur.”
#Cela permet de désactiver les optimisations (-O0), d’activer les symboles de debug (-g), etc.
#En gros, cette ligne prépare l’environnement de compilation pour le mode débogage.
#la règle (ou recette) debug
# On nettoie les anciens fichiers (make clean)

#On recompile tout (make all)
#... mais cette fois avec les nouveaux CFLAGS définis juste au-dessus
debug: clean all

run: $(TARGET)
	./$(TARGET)

clean:
	$(RM) $(OBJS) $(TARGET)
