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

DEBUG  ?= 0
ASAN   ?= 0
STATIC ?= 0
FLTO   ?= 0
FPGO   ?= 0
STRIP  ?= 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)
LDFLGS =

ifeq ($(DEBUG),1)
  CONFIG := _g
  CFLAGS += -Og -g
else ifeq ($(ASAN),1)
  CONFIG := _a
  CFLAGS += -O1 -g -fsanitize=address -fno-omit-frame-pointer
else
  CONFIG :=
  CFLAGS += -O3 -DNDEBUG
ifneq ($(FLTO),0)
  CFLAGS += -flto -fuse-linker-plugin
endif
ifneq ($(FPGO),0)
  CFLAGS += -fprofile-$(FPGO)
endif
endif

MACHINE := $(shell $(CC) -dumpmachine)

ifneq ($(filter %mingw32 %-windows-gnu %-cygwin %-cygnus,$(MACHINE)),)
  SUFFIX := .exe
else
  SUFFIX :=
endif

ifeq ($(filter %mingw32 %-windows-gnu,$(MACHINE)),)
  LDFLGS += -lpthread
endif

ifneq ($(STRIP),0)
  LDFLGS += -s
endif

ifeq ($(STATIC),1)
  LDFLGS += -static
endif

ifneq ($(filter %-w64-mingw32 %w64-windows-gnu,$(MACHINE)),)
  LDFLGS += -mconsole -municode
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 %-mingw32 %-windows-gnu %-cygwin %-cygnus,$(MACHINE)),)
  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)/obj/*.gcda $(SUBDIR_APP)/lib/*.a $(SUBDIR_APP)/bin/*$(SUFFIX)
	$(RM) $(SUBDIR_LIB)/obj/*.o $(SUBDIR_LIB)/obj/*.gcda $(SUBDIR_LIB)/lib/*.a $(SUBDIR_LIB)/bin/*$(SUFFIX)