# Makefile for lumbda C interpreter
# Targets: all, test, bench, clean

CC = gcc
CFLAGS = -O2 -Wall -Wextra -Wno-unused-parameter -std=c11 -D_POSIX_C_SOURCE=200809L -D_GNU_SOURCE
LDFLAGS = -lm

# Boehm GC autodetect — enable when /usr/include/gc.h is present.
# Without GC, every allocation leaks (ul_free is a no-op in our header);
# small REPL snippets work but anything iterating past a few thousand
# allocations OOMs the process. The named-let + per-iteration user-fn
# call pattern in tests/regression/named-let-gc.lsp pins this down.
# Override with USE_GC=0 to force the malloc-only path for diagnostics.
USE_GC ?= $(shell test -f /usr/include/gc.h && echo 1 || echo 0)
ifeq ($(USE_GC),1)
CFLAGS  += -DUSE_BOEHM_GC
LDFLAGS += -lgc
GC_SRCS  = gc.c
else
GC_SRCS  =
endif

SRCS = types.c bignum.c reader.c printer.c eval.c builtins.c vm.c jit.c portal.c $(GC_SRCS)
OBJS = $(SRCS:.c=.o)

.PHONY: all clean test bench

all: lumbda

lumbda: main.o $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test: test_runner
	./test_runner

test_runner: test.c $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

bench: bench_runner lumbda
	ulimit -s 65536 && ./bench_runner

bench_runner: bench.c $(OBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

%.o: %.c lumbda.h
	$(CC) $(CFLAGS) -c -o $@ $<

clean:
	rm -f *.o lumbda test_runner bench_runner
