# Semana 3: el modelo de entornos e imágenes PGM. Se usa dentro del entorno del curso.
#
#   make           compila los programas de la clase en build/
#   make gdb       compila los programas de frames para gdb en build/gdb/ (-g -O0, sin sanitizers)
#   make lab       compila el laboratorio en build/lab/
#   make test      corre las pruebas de los ejemplos y de los apuntes
#   make test-lab  prueba su laboratorio (lab/filters.c y lab/filter_tests.c); 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
GDBFLAGS = -Wall -Wextra -std=c17 -g -O0
BUILD = build
PROGRAMS = frames blocks static_counter global_constant by_value array_param struct_copy
FRAMES = frames_calls frames_static frames_array
MODULE = lab/image.c lab/image.h
LAB_PROGRAMS = filter_tests filter_demo

.PHONY: all gdb lab test test-lab clean

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

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

$(BUILD)/image_demo: image_demo.c $(MODULE) | $(BUILD)
	$(CC) $(CFLAGS) image_demo.c lab/image.c -o $@

$(BUILD)/show_sun: show_sun.c $(MODULE) | $(BUILD)
	$(CC) $(CFLAGS) show_sun.c lab/image.c -o $@

$(BUILD)/gdb/%: lab/%.c | $(BUILD)/gdb
	$(CC) $(GDBFLAGS) $< -o $@

$(BUILD)/lab/filter_tests: lab/filter_tests.c lab/filters.c lab/filters.h $(MODULE) | $(BUILD)/lab
	$(CC) $(CFLAGS) -Ilab lab/filter_tests.c lab/filters.c lab/image.c -o $@

$(BUILD)/lab/filter_demo: lab/filter_demo.c lab/filters.c lab/filters.h $(MODULE) | $(BUILD)/lab
	$(CC) $(CFLAGS) -Ilab lab/filter_demo.c lab/filters.c lab/image.c -o $@

$(BUILD)/solution/filter_tests: solution/filter_tests.c solution/filters.c lab/filters.h $(MODULE) | $(BUILD)/solution
	$(CC) $(CFLAGS) -Ilab solution/filter_tests.c solution/filters.c lab/image.c -o $@

$(BUILD)/solution/filter_demo: lab/filter_demo.c solution/filters.c lab/filters.h $(MODULE) | $(BUILD)/solution
	$(CC) $(CFLAGS) -Ilab lab/filter_demo.c solution/filters.c lab/image.c -o $@

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

gdb: $(FRAMES:%=$(BUILD)/gdb/%)

lab: $(LAB_PROGRAMS:%=$(BUILD)/lab/%)

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

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

clean:
	rm -rf $(BUILD) __pycache__
