CFLAGS = -Wall -Wextra -g
CFLAGS += -O2 -pthread
PROGS  = bench peterson hash list queue
# Las soluciones aún no publicadas (code/.ocultos) no están en el repositorio:
# se omiten los programas sin fuente y sus líneas en las pruebas.
PROGS := $(foreach p,$(PROGS),$(if $(wildcard $(p).c),$(p)))
RUN    = $(if $(wildcard $(1).c),./$(1),@: sin $(1).c)

all: $(PROGS)

bench: bench.c locks.h
	$(CC) $(CFLAGS) -o $@ bench.c

# peterson sin -O2: así el compilador no reordena nada y lo que se ve es
# solo el reordenamiento del procesador.
peterson: peterson.c
	$(CC) -Wall -Wextra -g -O0 -pthread -o $@ peterson.c

hash list queue: %: %.c
	$(CC) $(CFLAGS) -o $@ $<

# Prueba rápida (pocos segundos) de todos los programas.
test: $(PROGS)
	./peterson flag 1000000
	./peterson peterson 1000000
	./peterson fence 1000000
	$(call RUN,bench) nada 4 100000
	$(call RUN,bench) tabla 100000
	./hash global 4
	./hash bucket 4
	./list uno 4
	./list hoh 4
	./queue 4

# Ver las instrucciones atómicas de RISC-V (necesita riscv64-linux-gnu-gcc).
rv: rvatomics.c
	riscv64-linux-gnu-gcc -O2 -S -o rvatomics.s rvatomics.c
	grep -E 'amo|lr\.|sc\.' rvatomics.s

clean:
	rm -f $(PROGS) rvatomics.s

.PHONY: all test rv clean
