# Semana 15: qué hacer con un problema difícil. Poda, aproximación y heurísticas sobre las capitales
# regionales del Perú. Se usa dentro del entorno del curso.
#
#   make        compila los ejemplos en build/
#   make test   corre las pruebas de los ejemplos, con sanitizers
#   make bench  corre las mediciones de tiempo y de memoria, con -O2
#   make clean  borra lo generado
#
# Los problemas de lab/ tienen su propio Makefile y no entran aquí.

CXX = g++
CXXFLAGS = -Wall -Wextra -std=c++20 -g -fsanitize=address,undefined
BENCHFLAGS = -Wall -Wextra -std=c++20 -O2
BUILD = build
HEADERS = geo.h tour.h bound.h cover.h ../week-10/held_karp.h

PROGRAMS = metric_demo cover_demo double_tree_demo hamilton_demo test_examples
# Estos hacen muchas cuentas: van con -O2 aunque no midan tiempos.
FAST = two_opt_demo bound_demo compare_bench bound_bench memory_bench

.PHONY: all test bench clean

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

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

$(FAST:%=$(BUILD)/%): $(BUILD)/%: %.cpp $(HEADERS) | $(BUILD)
	$(CXX) $(BENCHFLAGS) $< -o $@

$(BUILD):
	mkdir -p $@

test: $(BUILD)/test_examples
	$(BUILD)/test_examples

bench: $(BUILD)/compare_bench $(BUILD)/bound_bench $(BUILD)/memory_bench
	$(BUILD)/compare_bench
	$(BUILD)/bound_bench
	$(BUILD)/memory_bench

clean:
	rm -rf $(BUILD)
