#Makefile pour chapitre -4- Spécificités C++ - IFT1166

# Auteur: Mohamed Lokbani

# Date: 29 décembre 2025 Mise en place du Makefile

# Pour exécuter ce fichier, il faudra lancer la commande:
# make
# cette commande va exécuter la première, ici "all".

# Si nous voulons exécuter une cible en particulier:
# make nom_de_la_cible
#

# la compilation de la cible 4_gclasse va générer une erreur.
# le make va s'arrêter avec une erreur. Si vous voulez poursuivre
# l'exécution du makefile malgré l'erreur, faire la commande:
# make -k


# Définir la commande pour effacer un fichier. Linux et Windows n'ont pas la même commande
Effacer = rm
Extension =
# Définir l'extension du programme exécutable. Linux n'ajoute rien alors que Windows ajoute par défaut .exe
EXE :=

ifeq ($(OS), Windows_NT)
EXE := .exe
ifneq ($(MSYSTEM),MINGW64)
$(info ************  Windows ************)
SHELL=cmd.exe
Effacer = del
endif
endif


# Le compilateur C++ à utiliser
CXX := g++

# Les options du compilateur
# -O0 pas d'optimisation
# -Wall -Wextra -pedantic pour écrire du code C++ robuste
# de haute qualité en permettant d'afficher des avertissements étendus
# -std=c++23 pour forcer l'utilisation du standard C++23
CXXFLAGS := -O0 -Wall -Wextra -pedantic -std=c++23

# Définir les fichiers sources
SRCS := $(wildcard *.cpp)

# Définir les fichiers objects en subsitutant l'extension .cpp par l'extension .o
OBJS := $(SRCS:.cpp=.o)

# Définir les noms des programmes exécutables
EXES := $(SRCS:.cpp=$(EXE))

# EXECUTABLES := 01_01_main 01_02_main 01_03_main



# (Optionnel) Désactiver les règles implicites pour éviter les surprises
.SUFFIXES:

# Empêcher la suppression automatique des intermédiaires
.SECONDARY: $(OBJS)



# Définir la cible globale. Il s'agit du point d'entrée du makefile
all: $(EXES)


# Attention, tabulation nécessaire avant chaque commande


# Règle qui permet de lier les fichiers objets au fichier exécutable
# -o pour signifier la production d'un exécutable
%$(EXE): %.o
	$(CXX) $< -o $@

# Règle pour compiler les fichiers .cpp en fichiers .o
# -c pour signifier la compilation et ainsi la production d'un fichier object
# $< indique le prérequis (ici le fichier .cpp)
# $@ est la cible (ici le fichier .o)
%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

04_02_comment_1.o: 04_02_comment.cpp
	$(CXX) $(CXXFLAGS) -DABCD=0 -c $< -o $@

04_02_comment_1: 04_02_comment_1.o
	$(CXX) $< -o $@

04_02_comment_2.o: 04_02_comment.cpp
	$(CXX) $(CXXFLAGS) -DALPHA -DABCD=0 -c $< -o $@

04_02_comment_2: 04_02_comment_2.o
	$(CXX) $< -o $@



# Pour effacer les fichiers générer et recommencer de nouveau

.PHONY: clean

#Test = $(addsuffix $(Extension),$(EXECUTABLES))
#$(info La valeur de Test est: $(Test))
#$(info La valeur de Effacer est: $(Effacer))

clean:
	$(Effacer) $(OBJS) $(EXES)