# Variable contenant le nom du compilateur
CC=gcc

# Variable contenant le nom de l'archiveur
AR=ar

# Variable contenant les options passées au compilateur
CFLAGS=-Wall -Werror -std=c99 -pedantic -O2 -g -c
# L'option -Wall affiche tous les messages d'alertes (warnings).
# L'option -Werror traite une simple alerte comme une erreur (stoppant
# ainsi lq compilation).
# L'option -std= permet de fixer la norme ISO du C que le compilateur
# va utiliser pour vérifier la validité du programme.
# L'option -pedantic empeche l'utilisation des extensions et impose de
# se conformer à la version stricte de la norme ISO.
# L'option -O permet de définir le degré d'optimisation appliqué par
# le compilateur (0 est la valeur par défaut, aucune optimisation).
# L'option -g compile le programme en laissant les informations
# nécessaires pour l'utilisation d'un debugger lors de l'exécution.
# L'option -c indique que le compilateur doit se contenter de la
# génération d'un fichier objet. La création d'un exécutable se fera
# si nécessaire dans un second temps.

# Variable contenant les options passées au compilateur pour l'édition
# de liens
LDFLAGS=-lfilemanip  -L.

# Variable contenant la liste des cibles
TARGETS=mon_cp

# all est la cible par défaut (la première cible du fichier).
# On la fait correspondre à l'ensemble des cibles qu'on souhaite exécuter
all: $(TARGETS)

# Cette cible effectue la compilation de notre commande.
# Elle n'est exécutée que si le fichier mon_cp.c est plus recent que
# le fichier exécutable mon_cp.
mon_cp_static: mon_cp.c libfilemanip.a
	# effectue la compilation et produit le fichier objet
	$(CC) $(CFLAGS) mon_cp.c
	# effectue l'édition de lien et produit l'exécutable final
	$(CC)  mon_cp.o $(LDFLAGS) -static -o mon_cp_static

mon_cp: mon_cp.c libfilemanip.so
	# effectue la compilation et produit le fichier objet
	$(CC) $(CFLAGS) -fpic mon_cp.c
	# effectue l'édition de lien et produit l'exécutable final
	$(CC)  mon_cp.o $(LDFLAGS) -dynamic -o mon_cp



# Cette cible effectue la compilation de notre bibiliothèque
libfilemanip.a: file_manip.h file_manip.c
	# effectue la compilation et produit le fichier objet
	$(CC) $(CFLAGS) file_manip.c
	# effectue l'assemblage de la bibliothèque
	$(AR) cr libfilemanip.a file_manip.o

libfilemanip.so: file_manip.h file_manip.c
	# effectue la compilation et produit le fichier objet
	$(CC) $(CFLAGS) -fPIC file_manip.c
	# effectue l'assemblage de la bibliothèque
	$(CC) -shared -o libfilemanip.so file_manip.o


# Cette cible effectue un simple nettoyage des fichiers temporaires
# qui ont pu être générés.
clean:
	rm -f a.out core
	rm -f *.o *.a *.so

# Cette cible effectue un nettoyage complet de tout fichier
# généré. Elle efface notamment les exécutables.
cleanall: clean
	rm -f $(TARGETS) *~
