# Semana 2: repaso de datos y lectura de código. Se usa dentro del entorno del curso.
#
#   make             compila los programas de la clase en build/
#   make test        corre las pruebas de los ejemplos y de los apuntes
#   make test-grades corre las pruebas en C de su laboratorio (lab/test_grades.c)
#   make test-lab    prueba todo su laboratorio; falla hasta que lo terminen
#   make clean       borra lo generado
#
# Los programas de errors/ tienen errores a propósito. No se compilan con make:
# los compilan las pruebas, y ustedes, con los comandos de los apuntes.

CC = gcc
CFLAGS = -Wall -Wextra -std=c17 -g -fsanitize=address,undefined
BUILD = build
PROGRAMS = array_review string_review struct_review file_review trips test_trips \
           trips_total test_trips_total

.PHONY: all lab solution test test-grades test-lab clean

all: $(PROGRAMS:%=$(BUILD)/%)

# Los programas de pruebas incluyen al programa que prueban.
$(BUILD)/test_trips: trips.c
$(BUILD)/test_trips_total: trips_total.c

$(BUILD)/%: %.c | $(BUILD)
	$(CC) $(CFLAGS) $< -o $@

$(BUILD)/lab/test_grades: lab/test_grades.c lab/grades.c | $(BUILD)/lab
	$(CC) $(CFLAGS) $< -o $@

$(BUILD)/lab/grades: lab/grades.c | $(BUILD)/lab
	$(CC) $(CFLAGS) $< -o $@

$(BUILD)/solution/test_grades: solution/test_grades.c solution/grades.c | $(BUILD)/solution
	$(CC) $(CFLAGS) $< -o $@

$(BUILD)/solution/grades: solution/grades.c | $(BUILD)/solution
	$(CC) $(CFLAGS) $< -o $@

$(BUILD) $(BUILD)/lab $(BUILD)/solution:
	mkdir -p $@

lab: $(BUILD)/lab/grades $(BUILD)/lab/test_grades

solution: $(BUILD)/solution/grades $(BUILD)/solution/test_grades

# Si existe solution/, también se comprueba la solución del laboratorio.
test: all
	@if [ -d solution ]; then $(MAKE) --no-print-directory solution; fi
	python3 -m unittest discover -p 'test_*.py'

test-grades: lab
	cd lab && ../$(BUILD)/lab/test_grades

test-lab: all lab
	LAB_DIR=lab python3 -m unittest -v test_lab

clean:
	rm -rf $(BUILD) __pycache__
