# Semana 3: selección en tiempo lineal, Karatsuba y el par más cercano.
# Se usa dentro del entorno del curso.
#
#   make           compila los programas de la clase en build/
#   make test      corre las pruebas de los ejemplos, con sanitizers
#   make bench     corre las mediciones, con -O2 y sin sanitizers
#   make clean     borra lo generado
#
# El laboratorio está en lab/closest_pair y tiene su propio Makefile: estas reglas no lo tocan.

CXX = g++
CXXFLAGS = -Wall -Wextra -std=c++20 -g -fsanitize=address,undefined
BENCHFLAGS = -Wall -Wextra -std=c++20 -O2
BUILD = build
PROGRAMS = quickselect_trace mom_trace pivot_bound karatsuba_trace strip_demo
TESTS = test_select test_karatsuba test_strip
COUNTS = recurrence_table karatsuba_count
BENCHES = select_bench karatsuba_bench
HEADERS = select.h karatsuba.h strip.h bench.h

.PHONY: all test bench clean

all: $(PROGRAMS:%=$(BUILD)/%) $(TESTS:%=$(BUILD)/%) $(COUNTS:%=$(BUILD)/%) $(BENCHES:%=$(BUILD)/%)

$(PROGRAMS:%=$(BUILD)/%) $(TESTS:%=$(BUILD)/%): $(BUILD)/%: %.cpp $(HEADERS) | $(BUILD)
	$(CXX) $(CXXFLAGS) $< -o $@

# Las mediciones y los conteos grandes van con -O2 y sin sanitizers.
$(COUNTS:%=$(BUILD)/%) $(BENCHES:%=$(BUILD)/%): $(BUILD)/%: %.cpp $(HEADERS) | $(BUILD)
	$(CXX) $(BENCHFLAGS) $< -o $@

$(BUILD):
	mkdir -p $@

test: $(TESTS:%=$(BUILD)/%) $(PROGRAMS:%=$(BUILD)/%)
	@for t in $(TESTS); do $(BUILD)/$$t || exit 1; done
	@echo "Todas las pruebas pasaron."

bench: $(BENCHES:%=$(BUILD)/%)
	$(BUILD)/select_bench
	$(BUILD)/karatsuba_bench

clean:
	rm -rf $(BUILD)
