DESKTOP_APP  ?= mmdvm-display_desktop
REMOTE_APP   ?= mmdvm-display_remote
BUILD_DIR    ?= .
CXX          ?= g++
SDL2_DIR     ?=

EXE_EXT :=

ifeq ($(OS),Windows_NT)
  EXE_EXT := .exe

  ifeq ($(strip $(SDL2_DIR)),)
    ifneq ($(findstring i686,$(notdir $(CXX))),)
      SDL2_DIR := C:/msys64/mingw32
    else
      SDL2_DIR := C:/msys64/mingw64
    endif
  endif

  ifneq ($(findstring sh,$(notdir $(SHELL))),)
    NULLDEV = /dev/null
    MKDIR_P = mkdir -p "$(BUILD_DIR)"
    RM_F = rm -f
    RUN_PREFIX = ./
  else
    NULLDEV = NUL
    MKDIR_P = if not exist "$(BUILD_DIR)" mkdir "$(BUILD_DIR)"
    RM_F = del /Q
    RUN_PREFIX =
  endif

  SDL2_CFLAGS ?= -I$(SDL2_DIR)/include -DSDL_MAIN_HANDLED
  SDL2_LIBS   ?= -L$(SDL2_DIR)/lib -lSDL2
  DESKTOP_NET_LIBS ?= -lwininet -lz -lws2_32
  REMOTE_PLATFORM_LIBS ?= -lws2_32 -lgdi32 -luser32 -lgdiplus -lole32
  REMOTE_USE_OPENCV ?= 0
  OPENCV_ROOT ?= C:/devcpp/i686-w64-mingw32
  OPENCV_VERSION_SUFFIX ?= 410
  OPENCV_CFLAGS ?= -I$(OPENCV_ROOT)/include
  OPENCV_LIBS ?= -L$(OPENCV_ROOT)/lib -lopencv_imgcodecs$(OPENCV_VERSION_SUFFIX) -lopencv_imgproc$(OPENCV_VERSION_SUFFIX) -lopencv_core$(OPENCV_VERSION_SUFFIX)

  MINGW_REMOTE_CRT_SHIM ?= 1
else
  NULLDEV = /dev/null
  SDL2_PREFIX ?= $(shell pkg-config --variable=prefix sdl2 2>$(NULLDEV) || sdl2-config --prefix 2>$(NULLDEV) || echo /usr)
  SDL2_CFLAGS ?= -I$(SDL2_PREFIX)/include -DSDL_MAIN_HANDLED $(shell pkg-config --cflags-only-other sdl2 2>$(NULLDEV))
  SDL2_LIBS   ?= $(shell pkg-config --libs sdl2 2>$(NULLDEV) || sdl2-config --libs 2>$(NULLDEV) || echo -lSDL2)
  DESKTOP_NET_LIBS ?=
  REMOTE_PLATFORM_LIBS ?= -lX11 -lXinerama -pthread
  REMOTE_USE_OPENCV ?= 1

  MKDIR_P = mkdir -p "$(BUILD_DIR)"
  RM_F = rm -f
  RUN_PREFIX = ./
endif

ifndef OPENCV_CFLAGS
OPENCV_CFLAGS := $(shell pkg-config --cflags opencv4 2>$(NULLDEV) || pkg-config --cflags opencv 2>$(NULLDEV))
endif
ifndef OPENCV_LIBS
OPENCV_LIBS := $(shell pkg-config --libs opencv4 2>$(NULLDEV) || pkg-config --libs opencv 2>$(NULLDEV) || echo -lopencv_imgcodecs -lopencv_imgproc -lopencv_core)
endif

CXXFLAGS ?= -std=gnu++17 -O0 -g -Wall -Wextra -fno-strict-aliasing
CPPFLAGS ?=
LDFLAGS  ?=
LDLIBS   ?=

DESKTOP_TARGET := $(BUILD_DIR)/$(DESKTOP_APP)$(EXE_EXT)
REMOTE_TARGET  := $(BUILD_DIR)/$(REMOTE_APP)$(EXE_EXT)

DESKTOP_CPPFLAGS := $(CPPFLAGS) -DUSE_DESKTOP -I. $(SDL2_CFLAGS)
DESKTOP_LDLIBS   := $(LDLIBS) $(SDL2_LIBS) $(DESKTOP_NET_LIBS)

REMOTE_CPPFLAGS  := $(CPPFLAGS) -I.
REMOTE_LDLIBS    := $(LDLIBS) $(REMOTE_PLATFORM_LIBS)
ifneq ($(REMOTE_USE_OPENCV),0)
  REMOTE_CPPFLAGS += $(OPENCV_CFLAGS) -DMMDVM_REMOTE_USE_OPENCV=1
  REMOTE_LDLIBS   += $(OPENCV_LIBS)
endif
ifeq ($(OS),Windows_NT)
  ifeq ($(MINGW_REMOTE_CRT_SHIM),1)
    REMOTE_CPPFLAGS += -DMMDVM_REMOTE_MINGW_CRT_SHIM=1
  endif
endif

.PHONY: all desktop remote run run-remote clean print-config

all: desktop remote

desktop: $(DESKTOP_TARGET)

remote: $(REMOTE_TARGET)

$(DESKTOP_TARGET): desktop.cpp mmdvm-display/mmdvm-display.ino desktop.h desktop_json.h | $(BUILD_DIR)
	$(CXX) $(DESKTOP_CPPFLAGS) $(CXXFLAGS) $< -o $@ $(LDFLAGS) $(DESKTOP_LDLIBS)

$(REMOTE_TARGET): desktop_remote.cpp | $(BUILD_DIR)
	$(CXX) $(REMOTE_CPPFLAGS) $(CXXFLAGS) $< -o $@ $(LDFLAGS) $(REMOTE_LDLIBS)

$(BUILD_DIR):
	$(MKDIR_P)

run: desktop
	@echo Running $(RUN_PREFIX)$(DESKTOP_TARGET)
	$(RUN_PREFIX)$(DESKTOP_TARGET)

run-remote: remote
	@echo Running $(RUN_PREFIX)$(REMOTE_TARGET)
	$(RUN_PREFIX)$(REMOTE_TARGET)

print-config:
	@echo DESKTOP_APP=$(DESKTOP_APP)
	@echo REMOTE_APP=$(REMOTE_APP)
	@echo BUILD_DIR=$(BUILD_DIR)
	@echo DESKTOP_TARGET=$(DESKTOP_TARGET)
	@echo REMOTE_TARGET=$(REMOTE_TARGET)
	@echo CXX=$(CXX)
	@echo CXXFLAGS=$(CXXFLAGS)
	@echo CPPFLAGS=$(CPPFLAGS)
	@echo SDL2_DIR=$(SDL2_DIR)
	@echo SDL2_CFLAGS=$(SDL2_CFLAGS)
	@echo SDL2_LIBS=$(SDL2_LIBS)
	@echo OPENCV_CFLAGS=$(OPENCV_CFLAGS)
	@echo OPENCV_LIBS=$(OPENCV_LIBS)
	@echo DESKTOP_NET_LIBS=$(DESKTOP_NET_LIBS)
	@echo REMOTE_PLATFORM_LIBS=$(REMOTE_PLATFORM_LIBS)
	@echo MINGW_REMOTE_CRT_SHIM=$(MINGW_REMOTE_CRT_SHIM)
	@echo REMOTE_USE_OPENCV=$(REMOTE_USE_OPENCV)

clean:
	$(RM_F) "$(DESKTOP_TARGET)" "$(REMOTE_TARGET)"
