# -----------------------
#  Compilation options
# -----------------------

RELEASE  := 1
STATIC   := 0

NO_DBG_SYMBOLS := 0

# Enable multi-threading.
# Warning: Experimental feature!!
# invidious is not stable when MT is enabled.
MT := 0


FLAGS ?=
CRYSTAL_BIN ?= crystal
SHARDS_BIN ?= shards

# Build flags configuration
ifeq ($(RELEASE), 1)
  FLAGS += --release
endif

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

ifeq ($(MT), 1)
  FLAGS += -Dpreview_mt
endif

ifeq ($(NO_DBG_SYMBOLS), 1)
  FLAGS += --no-debug
else
  FLAGS += --debug
endif

ifeq ($(API_ONLY), 1)
  FLAGS += -Dapi_only
endif

# Development flags
DEVFLAGS := --progress --stats --time

# Output binary name
BINARY_NAME := invidious
BINARY_DEV := $(BINARY_NAME)-dev

# -----------------------
#  Main
# -----------------------

.DEFAULT_GOAL := all

all: $(BINARY_NAME)

get-libs:
	$(SHARDS_BIN) install --production

# TODO: add support for ARM64 via cross-compilation
$(BINARY_NAME): get-libs
	$(CRYSTAL_BIN) build src/$(BINARY_NAME).cr $(FLAGS) --progress --stats --error-trace

run: $(BINARY_NAME)
	./$(BINARY_NAME)


# -----------------------
#  Development
# -----------------------

format:
	$(CRYSTAL_BIN) tool format --check

test:
	$(CRYSTAL_BIN) spec

verify:
	$(CRYSTAL_BIN) build src/$(BINARY_NAME).cr -Dskip_videojs_download \
	  --no-codegen --progress --stats --error-trace

dev-build: get-libs
	$(CRYSTAL_BIN) build src/$(BINARY_NAME).cr $(DEVFLAGS) -o $(BINARY_DEV)

dev-run: dev-build
	INVIDIOUS_CONFIG_FILE=config/config-dev.yml ./$(BINARY_DEV)

# -----------------------
#  (Un)Install
# -----------------------

PREFIX ?= /usr/local
DESTDIR ?=

install: $(BINARY_NAME)
	install -d $(DESTDIR)$(PREFIX)/bin
	install -m 755 $(BINARY_NAME) $(DESTDIR)$(PREFIX)/bin/

uninstall:
	rm -f $(DESTDIR)$(PREFIX)/bin/$(BINARY_NAME)

# -----------------------
#  Cleaning
# -----------------------

clean:
	rm -f $(BINARY_NAME) $(BINARY_DEV)

distclean: clean
	rm -rf libs
	rm -rf ~/.cache/{crystal,shards}

# -----------------------
#  Help page
# -----------------------

help:
	@echo "Targets available in this Makefile:"
	@echo ""
	@echo "  get-libs         Fetch Crystal libraries"
	@echo "  $(BINARY_NAME)   Build Invidious"
	@echo "  run              Launch Invidious"
	@echo ""
	@echo "  format           Run the Crystal formatter"
	@echo "  test             Run tests"
	@echo "  verify           Just make sure that the code compiles, but without"
	@echo "                   generating any binaries. Useful to search for errors"
	@echo ""
	@echo "  install          Install Invidious to system"
	@echo "  uninstall        Remove Invidious from system"
	@echo ""
	@echo "  clean            Remove build artifacts"
	@echo "  distclean        Remove build artifacts and libraries"
	@echo ""
	@echo ""
	@echo "Build options available for this Makefile:"
	@echo ""
	@echo "  RELEASE          Make a release build            (Default: 1)"
	@echo "  STATIC           Link libraries statically       (Default: 0)"
	@echo ""
	@echo "  API_ONLY         Build invidious without a GUI   (Default: 0)"
	@echo "  NO_DBG_SYMBOLS   Strip debug symbols             (Default: 0)"
	@echo ""
	@echo "Installation options:"
	@echo "  PREFIX           Installation prefix             (Default: /usr/local)"
	@echo "  DESTDIR          Destination directory           (Default: empty)"

# No targets generates an output named after themselves
.PHONY: all get-libs build run
.PHONY: format test verify dev-build dev-run
.PHONY: install uninstall clean distclean help