# 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