# Makefile du TP de la Seance 1 -- make : tout compiler ; make test : comparer les sorties a tests/ ; make phases :
# fichiers intermediaires de l'etape 1 ; make asan / make ubsan : versions instrumentees ; make clean
CC = gcc
CFLAGS = -std=c17 -Wall -Wextra -O0 -g
PROGS = etape1_phases etape2_transferts etape3_types etape4_releves etape5_saisie

all: $(PROGS)

etape1_phases: etape1_phases.c
	$(CC) $(CFLAGS) $< -o $@
etape2_transferts: etape2_transferts.o frais.o
	$(CC) $^ -o $@
%.o: %.c frais.h
	$(CC) $(CFLAGS) -c $< -o $@
etape3_types: etape3_types.c
	$(CC) $(CFLAGS) $< -o $@
etape4_releves: etape4_releves.c
	$(CC) $(CFLAGS) $< -o $@
etape5_saisie: etape5_saisie.c
	$(CC) $(CFLAGS) $< -o $@

phases: etape1_phases.c
	$(CC) -std=c17 -E $< -o etape1_phases.i
	$(CC) -std=c17 -S $< -o etape1_phases.s
	$(CC) -std=c17 -c $< -o etape1_phases.o
	$(CC) -std=c17 -O2 -S $< -o etape1_phases_O2.s

asan: etape4_releves.c
	$(CC) $(CFLAGS) -fsanitize=address -fno-omit-frame-pointer $< -o etape4_releves_asan
ubsan: etape5_saisie.c
	$(CC) $(CFLAGS) -fsanitize=undefined $< -o etape5_saisie_ubsan

test: all
	-./etape2_transferts | diff - tests/attendu_etape2.txt && echo "etape 2 : ok"
	-./etape4_releves | diff - tests/attendu_etape4.txt && echo "etape 4 : ok"
	-./etape5_saisie < tests/entree5.txt | diff - tests/attendu_etape5.txt && echo "etape 5 : ok"

clean:
	rm -f $(PROGS) *.o *.i *.s *_asan *_ubsan

.PHONY: all phases asan ubsan test clean
