OS :=			$(shell uname)

ifndef WIN
GCC :=			gcc
SDL2 :=			/opt/sdl2
else
GCC :=			x86_64-w64-mingw32-gcc
SDL2 :=			/opt/sdl2-win
endif

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)

FLAGS_AUX :=	$(FLAGS) -Wall -Wextra \
				-Wpedantic -Wconversion -Wsign-conversion -Wshadow \
				-Wstrict-prototypes -Wmissing-declarations -Wredundant-decls

ifndef WIN
ifeq ($(OS), Linux)
FLAGS_EMU +=	-D EMU_LINUX
FLAGS_LNK :=	$(FLAGS) -pthread -Wall -Wextra
LIBS :=			$(SDL2_LIB)/libSDL2.a \
				$(SDL2_LIB)/libSDL2_net.a \
				$(SDL2_LIB)/libSDL2_ttf.a \
				$(SDL2_LIB)/libfreetype.a \
				-ldl -lm
endif

ifeq ($(OS), Darwin)
FLAGS_EMU +=	-D EMU_OS_X
FLAGS_LNK :=	$(FLAGS) -Wall -Wextra
LIBS :=			$(SDL2_LIB)/libSDL2.a \
				$(SDL2_LIB)/libSDL2_net.a \
				$(SDL2_LIB)/libSDL2_ttf.a \
				$(SDL2_LIB)/libfreetype.a \
				-framework AppKit \
				-framework AudioToolbox \
				-framework Carbon \
				-framework CoreAudio \
				-framework CoreFoundation \
				-framework CoreGraphics \
				-framework CoreVideo \
				-framework ForceFeedback \
				-framework IOKit \
				-l iconv
endif
else
FLAGS_EMU +=	-D EMU_WIN
FLAGS_LNK :=	$(FLAGS) -Wall -Wextra
LIBS :=			-l mingw32 \
				$(SDL2_LIB)/libSDL2.a \
				$(SDL2_LIB)/libSDL2main.a \
				$(SDL2_LIB)/libSDL2_net.a \
				$(SDL2_LIB)/libSDL2_ttf.a \
				$(SDL2_LIB)/libfreetype.a \
				-l gdi32 \
				-l imm32 \
				-l iphlpapi \
				-l ole32 \
				-l oleaut32 \
				-l version \
				-l winmm \
				-l ws2_32
endif

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

all:			buchla buchla.disk

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 vid.c fpu.c tim.c lcd.c ser.c mid.c fdd.c snd.c \
				led.c kbd.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)

mkdisk:			emu/mkdisk.c
				$(GCC) $(FLAGS_AUX) -o mkdisk emu/mkdisk.c

buchla.disk:	mkdisk midas.abs
				./mkdisk

run:			buchla buchla.disk
				./buchla

val:			buchla buchla.disk
				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
				rm -f mkdisk
				rm -f buchla.disk
