UNAME_M := $(shell uname -m)

ifeq ($(UNAME_M),x86_64)
	ARCH := ARCHITECTURE_X64
else ifneq ($(filter $(UNAME_M),i686,i386),)
	ARCH := ARCHITECTURE_X86
else ifneq ($(filter $(UNAME_M),aarch64 arm64),)
	ARCH := ARCHITECTURE_ARM64
else ifneq ($(filter $(UNAME_M),armv7l armv6l),)
	ARCH := ARCHITECTURE_ARM32
endif

UNAME_S := $(shell uname -s)

ifeq ($(UNAME_S),Darwin)
	OS := OS_MACOS
else ifeq ($(UNAME_S),Linux)
	OS := OS_LINUX
endif

CC = clang

ifeq ($(CC),clang)
	COMP := COMPILER_CLANG
else ifeq ($(CC),gcc)
	COMP := COMPILER_GCC
endif

# -ansi -pedantic -pedantic-errors
CFLAGS = -Wno-long-long -Wall -Wextra \
		 -Wincompatible-pointer-types \
		 -Wint-conversion -Wimplicit-int-float-conversion -Wformat \
		 -Wno-strict-prototypes -Wno-missing-field-initializers \
		 -Wno-unused-function -Wno-unused-parameter -Wno-unused-variable \
		 -Wno-unused-but-set-variable \
		 -fno-caret-diagnostics -fno-show-column

ifeq ($(OS),OS_MACOS)
	FLAGS = -glldb
	INCLUDE = -I./libs/include/
	LIBS = ./libs/lib/arm-macos/libSDL3.a -lm
	FRAMEWORKS = -framework Cocoa -framework IOKit -framework CoreAudio \
				 -framework AudioToolbox -framework ForceFeedback \
				 -framework Carbon -framework GameController \
				 -framework Metal -framework QuartzCore \
				 -framework CoreHaptics
else ifeq ($(OS),OS_LINUX)
	FLAGS = -ggdb -D_POSIX_C_SOURCE=200809L -no-pie
	INCLUDE = -I./libs/include/
	LIBS = ./libs/lib/x86_64-linux/libSDL3.a -lm -lX11
	FRAMEWORKS =
endif

EXE=handmadehero

default: libhandmade $(EXE)

libhandmade: handmade.c
	$(CC) $(CFLAGS) $(FLAGS) \
		-D$(ARCH)=1 -D$(OS)=1 -D$(COMP)=1 \
 		-fPIC -shared $(INCLUDE) $^ $(LIBS) \
		$(FRAMEWORKS) -o libhandmade.so

$(EXE): sdl_handmade.c libhandmade
	$(CC) $(CFLAGS) $(FLAGS) \
		-D$(ARCH)=1 -D$(OS)=1 -D$(COMP)=1 \
		$(INCLUDE) $< $(LIBS) \
		$(FRAMEWORKS) -o $@ $(ifneq $(filter $(OS), OS_MACOS OS_LINUX), \
		/link /FORCE:MULTIPLE)

watch:
	@ while true; do \
		inotifywait -q -q -e 'modify' . && clear && make -B; \
	done

run:
	@ ./$(EXE)

clean:
	@ rm -rf $(EXE) $(EXE).dSYM libhandmade.so libhandmade.so.dSYM
