CC = gcc
CFLAGS = -Wall -Wextra -std=c99 -D_POSIX_C_SOURCE=200809L -Ilib -fsanitize=thread -g
LDFLAGS = -ljack -lm -lncurses -lpthread

all: jack-looper test_engine test_tui test_gui test_cli test_stress

jack-looper: main.o engine.o tui.o gui.o cli.o transport.o lib/microui.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_engine: test_engine.o engine.o transport.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_tui: test_tui.o engine.o transport.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_gui: test_gui.o gui.o engine.o transport.o lib/microui.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_cli: test_cli.o engine.o cli.o transport.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_double_process: test_double_process.o engine.o transport.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_stress: test_stress.o engine.o transport.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_stress.o: test_stress.c engine.h tui.h transport.h
	$(CC) $(CFLAGS) -c -o $@ $<

main.o: main.c engine.h tui.h transport.h
	$(CC) $(CFLAGS) -c -o $@ $<

engine.o: engine.c engine.h transport.h
	$(CC) $(CFLAGS) -c -o $@ $<

tui.o: tui.c tui.h engine.h transport.h
	$(CC) $(CFLAGS) -c -o $@ $<

gui.o: gui.c gui.h engine.h transport.h lib/microui.h
	$(CC) $(CFLAGS) -c -o $@ $<

lib/microui.o: lib/microui.c lib/microui.h
	$(CC) $(CFLAGS) -c -o $@ $<

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

test_engine.o: test_engine.c engine.h transport.h
	$(CC) $(CFLAGS) -c -o $@ $<

test_tui.o: test_tui.c engine.h tui.h transport.h
	$(CC) $(CFLAGS) -c -o $@ $<

test_gui.o: test_gui.c gui.h engine.h transport.h
	$(CC) $(CFLAGS) -c -o $@ $<

test_cli.o: test_cli.c engine.h transport.h
	$(CC) $(CFLAGS) -c -o $@ $<

test_double_process.o: test_double_process.c engine.h transport.h
	$(CC) $(CFLAGS) -c -o $@ $<

cli.o: cli.c cli.h engine.h transport.h
	$(CC) $(CFLAGS) -c -o $@ $<

.PHONY: all clean test

clean:
	rm -f *.o lib/microui.o jack-looper test_engine test_tui test_gui test_cli test_double_process test_stress

test: test_engine test_tui test_cli test_double_process test_stress
	./test_engine
	./test_tui
	./test_cli
	./test_double_process
	./test_stress
