# ---------------------------------------------------------------------------
# Options
# ---------------------------------------------------------------------------

DEBUG ?= 0
MARCH ?= native
MTUNE ?= native

# ---------------------------------------------------------------------------
# Directories
# ---------------------------------------------------------------------------

SUBDIR_APP := frontend
SUBDIR_LIB := libslunkcrypt

# ---------------------------------------------------------------------------
# Flags
# ---------------------------------------------------------------------------

CFLAGS = -I$(SUBDIR_LIB)/include -Wall -Wno-trigraphs -march=$(MARCH) -mtune=$(MTUNE)

ifeq ($(DEBUG),1)
  CFLAGS += -Og -g
  CONFIG := _g
  undefine LDFLGS
else
  CFLAGS += -O3 -DNDEBUG
  undefine CONFIG
  LDFLGS += -static -s
endif

UNAME := $(shell uname)

undefine SUFFIX
ifneq ($(filter MINGW% CYGWIN%,$(UNAME)),)
  SUFFIX := .exe
else
  undefine SUFFIX
endif

ifneq ($(filter MINGW%,$(UNAME)),)
  LDFLGS += -municode -mconsole
endif

# ---------------------------------------------------------------------------
# File names
# ---------------------------------------------------------------------------

OUTNAME_APP := slunkcrypt$(CONFIG)$(SUFFIX)
OUTNAME_LIB := libslunkcrypt$(CONFIG)-1.a

OUTPATH_APP := $(SUBDIR_APP)/bin/$(OUTNAME_APP)
OUTPATH_LIB := $(SUBDIR_LIB)/lib/$(OUTNAME_LIB)

SOURCES_APP := $(wildcard $(SUBDIR_APP)/src/*.c)
OBJECTS_APP := $(patsubst $(SUBDIR_APP)/src/%.c,$(SUBDIR_APP)/obj/%$(CONFIG).o,$(SOURCES_APP))

SOURCES_LIB := $(wildcard $(SUBDIR_LIB)/src/*.c)
OBJECTS_LIB := $(patsubst $(SUBDIR_LIB)/src/%.c,$(SUBDIR_LIB)/obj/%$(CONFIG).o,$(SOURCES_LIB))

ifneq ($(filter MINGW% CYGWIN%,$(UNAME)),)
  RCFILES_APP := $(wildcard $(SUBDIR_APP)/res/*.rc)
  OBJECTS_APP += $(patsubst $(SUBDIR_APP)/res/%.rc,$(SUBDIR_APP)/obj/%.rsrc.o,$(RCFILES_APP))
endif

# ---------------------------------------------------------------------------
# Targets
# ---------------------------------------------------------------------------

.PHONY: all clean

all: $(OUTPATH_APP)

$(OUTPATH_APP): $(OBJECTS_APP) $(OUTPATH_LIB)
	@mkdir -p $(@D)
	$(CC) $(CFLAGS) $^ -o $@ $(LDFLGS)

$(OUTPATH_LIB): $(OBJECTS_LIB)
	@mkdir -p $(@D)
	$(AR) rcs $@ $^

$(SUBDIR_APP)/obj/%$(CONFIG).o: $(SUBDIR_APP)/src/%.c
	@mkdir -p $(@D)
	$(CC) $(CFLAGS) -c $< -o $@

$(SUBDIR_APP)/obj/%.rsrc.o: $(SUBDIR_APP)/res/%.rc
	@mkdir -p $(@D)
	windres -o $@ $<

$(SUBDIR_LIB)/obj/%$(CONFIG).o: $(SUBDIR_LIB)/src/%.c
	@mkdir -p $(@D)
	$(CC) $(CFLAGS) -c $< -o $@

clean:
	$(RM) $(SUBDIR_APP)/obj/*.o $(SUBDIR_APP)/lib/*.a $(SUBDIR_APP)/bin/*$(SUFFIX)
	$(RM) $(SUBDIR_LIB)/obj/*.o $(SUBDIR_LIB)/lib/*.a $(SUBDIR_LIB)/bin/*$(SUFFIX)