# Semana 4: arreglos dinámicos. Se usa dentro del entorno del curso.
#
#   make           compila los programas de la clase en build/
#   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; 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.
# Lo que mide tiempos se compila con -O2 y sin sanitizers.

CXX = g++
CXXFLAGS = -Wall -Wextra -std=c++20 -g -fsanitize=address,undefined
TIMEFLAGS = -Wall -Wextra -std=c++20 -O2
BUILD = build
LAB_DIR ?= lab
PROGRAMS = capacity_growth growth_count shrink_policies move_or_copy strong_guarantee \
           lifetimes stable_refs vector_facts front_removal ring_trace copy_block claims_tests
LAB_OUT = $(BUILD)/$(LAB_DIR)

.PHONY: all lab test test-lab clean

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

$(BUILD)/%: %.cpp tracked.h growth_math.h | $(BUILD)
	$(CXX) $(CXXFLAGS) -I. $< -o $@

$(BUILD)/growth_time: growth_time.cpp bench.h | $(BUILD)
	$(CXX) $(TIMEFLAGS) -I. $< -o $@

# Las pruebas del laboratorio se compilan desde una copia dentro de build/: así, el
# "vector.h" que incluyen es el de LAB_DIR y no el que está al lado de la prueba.
lab: $(LAB_OUT)/vector_tests $(LAB_OUT)/growth_bench

$(LAB_OUT)/vector_tests: lab/vector_tests.cpp $(LAB_DIR)/vector.h tracked.h | $(LAB_OUT)
	cp lab/vector_tests.cpp $(LAB_OUT)/vector_tests.cpp
	$(CXX) $(CXXFLAGS) -I$(LAB_DIR) -I. $(LAB_OUT)/vector_tests.cpp -o $@

$(LAB_OUT)/growth_bench: lab/growth_bench.cpp $(LAB_DIR)/vector.h tracked.h bench.h | $(LAB_OUT)
	cp lab/growth_bench.cpp $(LAB_OUT)/growth_bench.cpp
	$(CXX) $(TIMEFLAGS) -I$(LAB_DIR) -I. $(LAB_OUT)/growth_bench.cpp -o $@

$(BUILD) $(LAB_OUT):
	mkdir -p $@

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

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

clean:
	rm -rf $(BUILD) __pycache__
