CC=gcc
CFLAGS=-std=c11 -Wpedantic -Wall -Werror=vla -Wextra
#sur certains environnements le symbole stdscr utilisé par ncurses est fournis par tinfo et pas ncurses
LDLIBS=-lm -lncurses -ltinfo
RM=rm -f

EXE=donjon
TEST=test_inventaire test_joueur test_salle test_donjon

#Permet de faire un arbre de dépendance en ne listant que les dépendances directes
INVENTAIRE_OBJ=inventaire.o
JOUEUR_OBJ=joueur.o $(INVENTAIRE_OBJ)
ENNEMI_OBJ=ennemi.o $(JOUEUR_OBJ)
SALLE_OBJ=salle.o $(INVENTAIRE_OBJ) $(ENNEMI_OBJ)
DONJON_OBJ=donjon.o $(SALLE_OBJ) $(INVENTAIRE_OBJ) $(ENNEMI_OBJ)
EXPLORE_OBJ=explore.o $(DONJON_OBJ) $(JOUEUR_OBJ) $(SALLE_OBJ) $(INVENTAIRE_OBJ)
SAVE_OBJ=save.o $(DONJON_OBJ) $(JOUEUR_OBJ)
UI_OBJ=ui.o $(DONJON_OBJ) $(JOUEUR_OBJ)
UI_NC_OBJ=ui_nc.o $(DONJON_OBJ) $(JOUEUR_OBJ)
JEU_OBJ=jeu.o $(DONJON_OBJ) $(INVENTAIRE_OBJ) $(JOUEUR_OBJ) $(SALLE_OBJ) $(UI_NC_OBJ) $(ENNEMI_OBJ) $(SAVE_OBJ) $(EXPLORE_OBJ)
OBJ=$(INVENTAIRE_OBJ) $(JOUEUR_OBJ) $(DONJON_OBJ) $(UI_OBJ) $(UI_NC_OBJ) $(JEU_OBJ) $(ENNEMI_OBJ) $(SAVE_OBJ) $(EXPLORE_OBJ)

.PHONY: all test clean

all: $(EXE)

test: $(TEST)

#utilisation des règles implicites pour ne pas avoir à décrire la production de chaques objets
#$(sort A) retire aussi les mots dupliqués de l'expression A
test_inventaire: $(sort $(INVENTAIRE_OBJ))
test_joueur: $(sort $(JOUEUR_OBJ) $(INVENTAIRE_OBJ))
test_salle: $(sort $(SALLE_OBJ) $(INVENTAIRE_OBJ))
test_donjon: $(sort $(DONJON_OBJ) $(UI_OBJ))
donjon: $(sort main.c $(JEU_OBJ))
# $^ désigne les prérequis de la cible et $@ désigne la cible
	$(CC) $(CFLAGS) $^ -o $@ $(LDLIBS)

clean:
	$(RM) $(sort $(EXE) $(TEST) $(OBJ))
