# This file is part of the Vitis project.
#
# Distributed under the GNU All-Permissive License.
# Copying and distribution of this file, with or without modification,
# are permitted in any medium without royalty provided the copyright
# notice and this notice are preserved.
# This file is offered as-is, without any warranty.

PROJECT   = vitis
VITIS_BIN = build/vitis
DESTDIR   =
PREFIX    = usr/local

VITIS_SRC := $(wildcard source/*.d source/*/*.d)

DC             = ldc2
PHOBOS_LINKING = dynamic
EXTLIB_LINKING = dynamic

PHOBOS_OPTS   := $(shell ./mh.sh $(DC) phobos_options $(PHOBOS_LINKING))
AMALTHEA_OPTS := $(shell ./mh.sh $(DC) amalthea_options $(EXTLIB_LINKING))
OXFUSE_OPTS   := $(shell ./mh.sh $(DC) oxfuse_options $(EXTLIB_LINKING))
EXTLIB_OPTS   := $(AMALTHEA_OPTS) $(OXFUSE_OPTS)
LIB_OPTS      := $(PHOBOS_OPTS) $(EXTLIB_OPTS)
RELEASE_OPTS  := $(shell ./mh.sh $(DC) release_options)
DEBUG_OPTS    := $(shell ./mh.sh $(DC) debug_options)
OTHER_OPTS    := $(shell ./mh.sh $(DC) other_options)
DC_VERSION    := $(shell ./mh.sh $(DC) compiler_version)
BUILD_MODE    ?= debug
ifeq ($(BUILD_MODE),release)
	BUILD_OPTS := $(RELEASE_OPTS) $(OTHER_OPTS) $(LIB_OPTS)
else
	BUILD_OPTS := $(DEBUG_OPTS) $(OTHER_OPTS) $(LIB_OPTS)
endif


DOC_DIR := $(shell ./mh.sh $(DC) doc_dir)/$(PROJECT)

OUT = -of
AC_OPTS = -shared
ifeq ($(DC),gdc)
	OUT = -o 
	AC_OPTS = -shared -fPIC
endif


.PHONY: all dub vitis install uninstall clean unittests debug release

debug:
	$(MAKE) BUILD_MODE=debug all

release:
	$(MAKE) BUILD_MODE=release all

all: vitis ac-handlers

vitis: $(VITIS_BIN)


$(VITIS_BIN): $(VITIS_SRC)
	mkdir -p build/
	@echo MODE=$(BUILD_MODE)
	@echo "$(DC_VERSION)"
	$(DC) $^ $(BUILD_OPTS) $(OUT)$@

unittests: $(VITIS_SRC)
	mkdir -p build/
	$(DC) $^ $(OTHER_OPTS) $(LIB_OPTS) $(OUT)build/$@ $(DEBUG_OPTS) -unittest
	./build/unittests
	@rm ./build/unittests*
	

EXT_AC_OPTS := $(PHOBOS_OPTS) $(AC_OPTS)
OTH_AC_OPTS := $(EXT_AC_OPTS) $(AMALTHEA_OPTS)
extension-ac: auto/extension-ac/extension-ac.d
	mkdir -p build/ach/
	$(DC) $^ $(OUT)build/ach/extension-ac.so $(EXT_AC_OPTS)
format-ac: auto/format-ac/format-ac.d
	mkdir -p build/ach/
	$(DC) $^ $(OUT)build/ach/format-ac.so $(OTH_AC_OPTS)
group-ac: auto/group-ac/group-ac.d
	mkdir -p build/ach/
	$(DC) $^ $(OUT)build/ach/group-ac.so $(OTH_AC_OPTS)

ac-handlers: extension-ac format-ac group-ac

dub:
	dub build --compiler=$(DC) --force
	cd auto/extension-ac ; dub build --compiler=$(DC) --force
	cd auto/format-ac ; dub build --compiler=$(DC) --force
	cd auto/group-ac ; dub build --compiler=$(DC) --force


INST_BINDIR      := $(DESTDIR)/$(PREFIX)/bin/
INST_BASHCOMPDIR := $(DESTDIR)/$(PREFIX)/share/bash-completion/completions/
INST_DOCDIR      := $(DESTDIR)/$(PREFIX)/$(DOC_DIR)/
INST_HELPDIR_EN  := $(DESTDIR)/$(PREFIX)/share/help/en_US/$(PROJECT)/
INST_HELPDIR_RU  := $(DESTDIR)/$(PREFIX)/share/help/ru_RU/$(PROJECT)/
AC_DIR           := $(DESTDIR)/$(PREFIX)/libexec/vitis-ac/

install:
	mkdir -p "$(INST_BINDIR)" "$(INST_BASHCOMPDIR)" "$(INST_DOCDIR)"
	install "$(VITIS_BIN)" "${INST_BINDIR}"
	install -m 755 contrib/bash-completion "$(INST_BASHCOMPDIR)/$(PROJECT)"
	install -m 644 copyright $(INST_DOCDIR)
	mkdir -p "$(INST_HELPDIR_EN)" "$(INST_HELPDIR_RU)"
	cp -r share/help/en_US/vitis/* "$(INST_HELPDIR_EN)"
	cp -r share/help/ru_RU/vitis/* "$(INST_HELPDIR_RU)"
	mkdir -p $(AC_DIR)
	install -m 755 build/ach/extension-ac.so $(AC_DIR)
	install -m 755 build/ach/format-ac.so $(AC_DIR)
	install -m 755 build/ach/group-ac.so $(AC_DIR)

uninstall:
	rm -f $(INST_BINDIR)/vitis
	rm -f $(INST_BASHCOMPDIR)/$(PROJECT)
	rm -rf $(INST_DOCDIR)
	rm -rf $(INST_HELPDIR_EN) $(INST_HELPDIR_RU)
	rm -rf $(AC_DIR)

appimage:
	./make-appimage.sh $(DC)

clean:
	rm -rf build/ dub.selections.json res/ac/dub.selections.json
	find . -type d -name "*cache*" | xargs rm -rf
	rm -f *.log

include tests.mk
