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

all: jack-looper test_engine test_tui test_gui test_cli test_stress test_wav_io test_audio_routing

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

test_engine: test_engine.o engine.o transport.o wav_io.o dispatcher.o carla.o fs.o logging.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_tui: test_tui.o engine.o transport.o wav_io.o dispatcher.o carla.o fs.o logging.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_gui: test_gui.o gui.o engine.o transport.o lib/microui.o wav_io.o dispatcher.o carla.o fs.o logging.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_cli: test_cli.o engine.o cli.o transport.o wav_io.o dispatcher.o carla.o fs.o logging.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_stress: test_stress.o engine.o wav_io.o dispatcher.o carla.o fs.o logging.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_wav_io: test_wav_io.o wav_io.o logging.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

test_audio_routing: test_audio_routing.o logging.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)


test_stress.o: test_stress.c dispatcher.h engine.h wav_io.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 wav_io.h carla.h
	$(CC) $(CFLAGS) -c -o $@ $<

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

tui.o: tui.c tui.h engine.h transport.h carla.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 $@ $<

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

dispatcher.o: dispatcher.c dispatcher.h carla.h fs.h
	$(CC) $(CFLAGS) -c -o $@ $<

fs.o: fs.c fs.h dispatcher.h wav_io.h
	$(CC) $(CFLAGS) -c -o $@ $<

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

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

test_tui.o: test_tui.c engine.h tui.h transport.h dispatcher.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 dispatcher.h
	$(CC) $(CFLAGS) -c -o $@ $<


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

test_audio_routing.o: test_audio_routing.c
	$(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 wav_io.o jack-looper test_engine test_tui test_gui test_cli test_stress test_wav_io

test: jack-looper test_engine test_tui test_cli test_wav_io test_audio_routing
	./test_engine
	./test_tui
	./test_cli
	./test_wav_io
	./test_audio_routing
