OS :=			$(shell uname)

SDL2 :=			/opt/sdl2
SDL2_INC :=		$(SDL2)/include
SDL2_LIB :=		$(SDL2)/lib

FLAGS :=		-std=c99 -O2 -gdwarf-4

FLAGS_CPU :=	$(FLAGS) -pthread -I cpu -I build

FLAGS_EMU :=	$(FLAGS) -pthread \
				-fno-strict-aliasing -fno-inline -fno-omit-frame-pointer \
				-Wall -Wextra \
				-Wpedantic -Wconversion -Wsign-conversion -Wshadow \
				-Wstrict-prototypes -Wmissing-declarations -Wredundant-decls \
				-I cpu -I emu -I build -I $(SDL2_INC)

ifeq ($(OS), Linux)
FLAGS_LNK :=	$(FLAGS) -pthread -Wall -Wextra
LIBS :=			$(SDL2_LIB)/libSDL2.a -ldl -lm
endif

ifeq ($(OS), Darwin)
FLAGS_LNK :=	$(FLAGS) -Wall -Wextra
LIBS :=			$(SDL2_LIB)/libSDL2.a \
				-framework AppKit \
				-framework AudioToolbox \
				-framework Carbon \
				-framework CoreAudio \
				-framework CoreFoundation \
				-framework CoreGraphics \
				-framework CoreVideo \
				-framework ForceFeedback \
				-framework IOKit \
				-l iconv
endif

HEADERS :=		$(wildcard cpu/*.h) $(wildcard emu/*.h)

all:			buchla

build:
				mkdir build

build/gen:		| build
				gcc $(FLAGS) -o build/gen cpu/m68kmake.c

GEN_C :=		m68kopac.c m68kopdm.c m68kopnz.c m68kops.c
GEN_H :=		m68kops.h

GEN_CP :=		$(GEN_C:%=build/%)
GEN_HP :=		$(GEN_H:%=build/%)

GEN_O :=		$(GEN_C:.c=.o)
GEN_OP :=		$(GEN_O:%=build/%)

$(GEN_CP) $(GEN_HP): \
				build/gen | build
				cd cpu; ../build/gen ../build

build/%.o:		build/%.c $(HEADERS)
				gcc $(FLAGS_CPU) -c -o $@ $<

CPU_C :=		m68kcpu.c m68kdasm.c
CPU_O :=		$(CPU_C:.c=.o)
CPU_OP :=		$(CPU_O:%=build/%)

build/%.o:		cpu/%.c $(HEADERS) $(GEN_HP) | build
				gcc $(FLAGS_CPU) -c -o $@ $<

EMU_C :=		main.c cpu.c sdl.c
EMU_O :=		$(EMU_C:.c=.o)
EMU_OP :=		$(EMU_O:%=build/%)

build/%.o:		emu/%.c $(HEADERS) | build
				gcc $(FLAGS_EMU) -c -o $@ $<

buchla:			$(CPU_OP) $(GEN_OP)	$(EMU_OP)
				gcc $(FLAGS_LNK) -o buchla \
				$(CPU_OP) $(GEN_OP) $(EMU_OP) \
				$(LIBS)

run:			buchla
				./buchla

val:			buchla
				valgrind --leak-resolution=high --track-fds=yes --leak-check=full \
				--show-reachable=yes --suppressions=misc/buchla.supp ./buchla

clean:
				rm -rf build
				rm -f buchla
