#
# author: Mamadou Babaei <mamadou@senseglove.com>
#
# (The MIT License)
#
# Copyright (c) 2020 - 2026 SenseGlove
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#

################################################################################
# Generic Settings
################################################################################

SG_PROJECT_NAME	:=	The SenseGlove Unreal Engine Handbook

SG_PROJECT_GIT_REPOSITORY	:=	https://dev.azure.com/SenseGlove/SenseGlove-Unreal/_git/SenseGlove-Unreal

SG_HANDBOOK_ESCAPED_NAME	:=	$(shell echo $(SG_PROJECT_NAME) | tr '[:upper:]' '[:lower:]' | sed 's/ /-/g')

SG_HANDBOOK_DIR						:=	$(CURDIR)
SG_HANDBOOK_SRC_DIR					:=	$(SG_HANDBOOK_DIR)/src
SG_HANDBOOK_TOML_FILE				:=	$(realpath $(SG_HANDBOOK_DIR)/book.toml)
SG_HANDBOOK_CONFIG_HOME_DIR			:=	SenseGlove/ue-handbook
SG_HANDBOOK_DEPLOY_CONFIG_FILENAME	:=	deploy.conf
SG_HANDBOOK_DEPLOY_TEMP_DIR_NAME	:=	unreal-docs-senseglove-com-deploy-XXXXXXXXXX
SG_HANDBOOK_FAVICON_FILE			:=	$(SG_HANDBOOK_SRC_DIR)/favicon.svg

SG_DOT_GIT_DIR			:=	$(realpath $(SG_HANDBOOK_DIR)/../.git)
SG_DOT_GIT_SHALLOW_FILE	:=	$(SG_DOT_GIT_DIR)/shallow

SG_PLUGIN_DIR			:=	$(realpath $(SG_HANDBOOK_DIR)/..)
SG_PLUGIN_RESOURCES_DIR	:=	$(SG_PLUGIN_DIR)/Resources
SG_PLUGIN_FILE			:=	$(SG_PLUGIN_DIR)/SenseGlove.uplugin

SG_DOCUMENTATION_URL			:=	https://unreal.docs.senseglove.com
SG_DOCUMENTATION_DIR			:=	$(SG_PLUGIN_DIR)/Documentation
SG_DOCUMENTATION_HTML_DIR_NAME	:=	html
SG_DOCUMENTATION_HTML_DIR		:=	$(SG_DOCUMENTATION_DIR)/$(SG_DOCUMENTATION_HTML_DIR_NAME)
SG_DOCUMENTATION_PDF_DIR		:=	$(SG_DOCUMENTATION_DIR)/pdf-outline
SG_DOCUMENTATION_PDF_FILE		:=	$(SG_DOCUMENTATION_PDF_DIR)/output.pdf
SG_DOCUMENTATION_EPUB_DIR		:=	$(SG_DOCUMENTATION_DIR)/epub
SG_DOCUMENTATION_EPUB_FILE		:=	$(SG_DOCUMENTATION_EPUB_DIR)/$(SG_PROJECT_NAME).epub
SG_DOCUMENTATION_PACK_DIR_NAME	:=	pack
SG_DOCUMENTATION_PACK_DIR		:=	$(SG_DOCUMENTATION_DIR)/$(SG_DOCUMENTATION_PACK_DIR_NAME)

SG_HANDBOOK_PACKED_HTML_DIR		:=	$(SG_DOCUMENTATION_PACK_DIR)/$(SG_HANDBOOK_ESCAPED_NAME)
SG_HANDBOOK_PACKED_HTML_FILE	:=	$(SG_DOCUMENTATION_PACK_DIR)/$(SG_HANDBOOK_ESCAPED_NAME).zip
SG_HANDBOOK_PACKED_PDF_FILE		:=	$(SG_DOCUMENTATION_PACK_DIR)/$(SG_HANDBOOK_ESCAPED_NAME).pdf
SG_HANDBOOK_PACKED_EPUB_FILE	:=	$(SG_DOCUMENTATION_PACK_DIR)/$(SG_HANDBOOK_ESCAPED_NAME).epub

SG_BROWSER_BINARY_PATH_LINUX	:=	/opt/brave.com/brave/brave
SG_BROWSER_BINARY_PATH_WINDOWS	:=	C:\Program Files\BraveSoftware\Brave-Browser\Application\brave.exe

SG_RSYNC_BIN_PATH_WINDOWS			:=	C:\Program Files\cwrsync\bin
SG_RSYNC_BINARY_PATH_WINDOWS		:=	$(SG_RSYNC_BIN_PATH_WINDOWS)\rsync.exe
SG_RSYNC_SSH_BINARY_PATH_WINDOWS	:=	$(SG_RSYNC_BIN_PATH_WINDOWS)\ssh.exe

################################################################################
# Platform Detection
################################################################################

SG_BUILD_ARCH_AMD64			:=	amd64
SG_BUILD_PLATFORM_LINUX		:=	linux
SG_BUILD_PLATFORM_WINDOWS	:=	windows

ifeq ($(OS),Windows_NT)
SG_BUILD_PLATFORM	:=	$(SG_BUILD_PLATFORM_WINDOWS)
# Running a 32-bit (x86) Command Prompt sets PROCESSOR_ARCHITECTURE to x86,
# and instead defines PROCESSOR_ARCHITEW6432 for 64-bit Windows detection.
ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
SG_BUILD_ARCH		:=	$(SG_BUILD_ARCH_AMD64)
else # ($(PROCESSOR_ARCHITEW6432),AMD64)
ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
SG_BUILD_ARCH		:=	$(SG_BUILD_ARCH_AMD64)
endif # ($(PROCESSOR_ARCHITECTURE),AMD64)
endif # ($(PROCESSOR_ARCHITEW6432),AMD64)
else # ($(OS),Windows_NT)
SG_PLATFORM_UNAME	:=	$(shell uname -s)
ifeq ($(SG_PLATFORM_UNAME),Linux)
SG_BUILD_PLATFORM		:=	$(SG_BUILD_PLATFORM_LINUX)
SG_PLATFORM_UNAME_ARCH	:=	$(shell uname -m)
endif # ($(SG_PLATFORM_UNAME),Linux)
ifeq ($(SG_PLATFORM_UNAME_ARCH),x86_64)
SG_BUILD_ARCH	:=	$(SG_BUILD_ARCH_AMD64)
endif # ($(SG_PLATFORM_UNAME_ARCH),x86_64)
endif # ($(OS),Windows_NT)

################################################################################
# Target Settings - mdbook
################################################################################

SG_MDBOOK_HOST		:=	"localhost"
SG_MDBOOK_PORT		:=	"8000"
SG_MDBOOK_SRC_DIR	:=	"${SG_HANDBOOK_DIR}/src"
SG_MDBOOK_DEST_DIR	:=	"${SG_DOCUMENTATION_DIR}"
SG_MDBOOK_WATCHER	:=	"poll"

SG_PLUGIN_CHANGELOG_FILE							:=	$(SG_PLUGIN_DIR)/CHANGELOG.md
SG_PLUGIN_DIRECTORY_STRUCTURE_FILE					:=	$(SG_PLUGIN_DIR)/DIRECTORY_STRUCTURE.md
SG_PLUGIN_LICENSE_FILE								:=	$(SG_PLUGIN_DIR)/LICENSE.md
SG_PLUGIN_LICENSE_THIRD_PARTY_FILE					:=	$(SG_PLUGIN_DIR)/LICENSE_THIRD_PARTY.md
SG_PLUGIN_PLANNED_FEATURES_COMPLETION_STATUS_FILE	:=	$(SG_PLUGIN_DIR)/PLANNED_FEATURES_COMPLETION_STATUS.md
SG_PLUGIN_PLATFORM_SUPPORT_MATRIX_FILE				:=	$(SG_PLUGIN_DIR)/PLATFORM_SUPPORT_MATRIX.md

################################################################################
# Rust/Cargo Settings
################################################################################

RUST_TOOLCHAIN_VERSION	:=	1.95.0

################################################################################
# Version and Build Information
################################################################################

SG_GIT_TREE_STATE_CLEAN	:=	clean
SG_GIT_TREE_STATE_DIRTY	:=	dirty

SG_GIT_NO	:=	no
SG_GIT_YES	:=	yes

SG_RELEASE_BRANCH_PATTERN	:=	^[0-9]+\.[0-9]+$$

SG_GIT_BRANCH					:=	$(shell git rev-parse --abbrev-ref HEAD 2>/dev/null)
SG_GIT_TAG						:=	$(shell git describe --tags --abbrev=0 2>/dev/null)
SG_GIT_COMMIT					:=	$(shell git rev-parse --short HEAD 2>/dev/null)
SG_GIT_COMMIT_NUMS_SINCE_TAG	:=	$(shell git rev-list --count HEAD ^`git describe --tags --abbrev=0 2>/dev/null` 2>/dev/null)
SG_GIT_TREE_STATE				:=	$(shell test -n "`git status --porcelain 2>/dev/null`" && echo "$(SG_GIT_TREE_STATE_DIRTY)" || echo "$(SG_GIT_TREE_STATE_CLEAN)")
SG_GIT_IS_SHALLOW_CLONE			:=	$(shell [ -d $(SG_DOT_GIT_DIR) ] && [ -f $(SG_DOT_GIT_SHALLOW_FILE) ] && echo "$(SG_GIT_YES)" || echo "$(SG_GIT_NO)")
SG_GIT_LATEST_REMOTE_TAG		:=	$(shell git -c versionsort.suffix=- ls-remote --exit-code --refs --sort=version:refname --tags $(SG_PROJECT_GIT_REPOSITORY) '*.*.*' | tail -n 1 | sed 's/.*refs\/tags\///' 2>/dev/null)

SG_PLUGIN_VERSION	:=	$(shell grep -o '"VersionName": "[^"]*"' ${SG_PLUGIN_FILE} | awk -F'"' '{print "v" $$4}')

ifeq ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),)
SG_GIT_COMMIT_NUMS_SINCE_TAG	:=	0
endif # ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),)

ifneq ($(strip $(SG_GIT_TAG)),)
SG_GIT_VERSION	:=	$(SG_GIT_TAG)
endif # ($(strip $(SG_GIT_TAG)),)

ifeq ($(strip $(SG_GIT_VERSION)),)
ifeq ($(strip $(SG_GIT_IS_SHALLOW_CLONE)),$(SG_GIT_YES))
ifneq ($(strip $(SG_GIT_LATEST_REMOTE_TAG)),)
SG_GIT_VERSION	:=	$(SG_GIT_LATEST_REMOTE_TAG)
endif # ($(strip $(SG_GIT_LATEST_REMOTE_TAG)),)
endif # ($(strip $(SG_GIT_IS_SHALLOW_CLONE)),$(SG_GIT_YES))
endif # ($(strip $(SG_GIT_VERSION)),)

SG_GIT_VERSION_MAJOR	:=	$(shell echo $(SG_GIT_VERSION) | cut -d '.' -f 1 | tr -d -c 0-9)
ifeq ($(SG_GIT_VERSION_MAJOR),)
SG_GIT_VERSION_MAJOR	:=	0
endif # ($(SG_GIT_VERSION_MAJOR),)

SG_GIT_VERSION_MINOR	:=	$(shell echo $(SG_GIT_VERSION) | cut -d '.' -f 2 | tr -d -c 0-9)
ifeq ($(SG_GIT_VERSION_MINOR),)
SG_GIT_VERSION_MINOR	:=	0
endif # ($(SG_GIT_VERSION_MINOR),)

SG_GIT_VERSION_PATCH	:=	$(shell echo $(SG_GIT_VERSION) | cut -d '.' -f 3 | tr -d -c 0-9)
ifeq ($(SG_GIT_VERSION_PATCH),)
SG_GIT_VERSION_PATCH	:=	0
endif # ($(SG_GIT_VERSION_PATCH),)

SG_PLUGIN_VERSION_MAJOR	:=	$(shell echo $(SG_PLUGIN_VERSION) | cut -d '.' -f 1 | tr -d -c 0-9)
ifeq ($(SG_PLUGIN_VERSION_MAJOR),)
SG_PLUGIN_VERSION_MAJOR	:=	0
endif

SG_PLUGIN_VERSION_MINOR	:=	$(shell echo $(SG_PLUGIN_VERSION) | cut -d '.' -f 2 | tr -d -c 0-9)
ifeq ($(SG_PLUGIN_VERSION_MINOR),)
SG_PLUGIN_VERSION_MINOR	:=	0
endif # ($(SG_PLUGIN_VERSION_MINOR),)

SG_PLUGIN_VERSION_PATCH	:=	$(shell echo $(SG_PLUGIN_VERSION) | cut -d '.' -f 3 | tr -d -c 0-9)
ifeq ($(SG_PLUGIN_VERSION_PATCH),)
SG_PLUGIN_VERSION_PATCH	:=	0
endif # ($(SG_PLUGIN_VERSION_PATCH),)

SG_BUILD_HOST	:=	$(shell hostname)
SG_BUILD_TIME	:=	$(shell date '+%a %b %d, %Y %H:%M %Z %z')

ifeq ($(strip $(SG_GIT_BRANCH)),dev)
ifeq ($(strip $(SG_GIT_TAG)),)
SG_HANDBOOK_REVISION	:=	next
endif # ($(strip $(SG_GIT_TAG)),)
endif # ($(strip $(SG_GIT_BRANCH)),dev)

SG_IS_GIT_BRANCH_HEAD_OR_MASTER := $(or $(filter HEAD,$(strip $(SG_GIT_BRANCH))),$(filter master,$(strip $(SG_GIT_BRANCH))))

ifneq ($(SG_IS_GIT_BRANCH_HEAD_OR_MASTER),)
ifeq ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),0)
ifeq ($(strip $(SG_GIT_TREE_STATE)),$(SG_GIT_TREE_STATE_CLEAN))
ifeq ($(strip $(SG_GIT_VERSION)),$(strip $(SG_PLUGIN_VERSION)))
SG_HANDBOOK_REVISION	:=	$(SG_PLUGIN_VERSION_MAJOR).$(SG_PLUGIN_VERSION_MINOR)
endif # ($(strip $(SG_GIT_VERSION)),$(strip $(SG_PLUGIN_VERSION)))
endif # ($(strip $(SG_GIT_TREE_STATE)),$(SG_GIT_TREE_STATE_CLEAN))
endif # ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),0)
endif # ($(SG_IS_GIT_BRANCH_HEAD_OR_MASTER),)

ifeq ($(strip $(SG_GIT_IS_SHALLOW_CLONE)),$(SG_GIT_YES))
SG_IS_GIT_BRANCH_RELEASE	:=	$(shell echo $(SG_GIT_BRANCH) | grep -E '$(SG_RELEASE_BRANCH_PATTERN)' || echo "")
ifneq ($(SG_IS_GIT_BRANCH_RELEASE),)
ifeq ($(strip $(SG_GIT_VERSION)),$(strip $(SG_PLUGIN_VERSION)))
SG_HANDBOOK_REVISION	:=	$(SG_PLUGIN_VERSION_MAJOR).$(SG_PLUGIN_VERSION_MINOR)
endif # ($(strip $(SG_GIT_VERSION)),$(strip $(SG_PLUGIN_VERSION)))
endif # ($(SG_IS_GIT_BRANCH_RELEASE),)
endif # ($(strip $(SG_GIT_IS_SHALLOW_CLONE)),$(SG_GIT_YES))

ifeq ($(strip $(SG_HANDBOOK_REVISION)),)
SG_HANDBOOK_REVISION	:=	mismatched
endif # ($(strip $(SG_HANDBOOK_REVISION)),)

ifneq ($(strip $(SG_HANDBOOK_REVISION)),mismatched)
SG_MDBOOK_HTML_SITE_URL		:=	$(SG_HANDBOOK_REVISION)
SG_HANDBOOK_REVISION_URL	:=	$(SG_DOCUMENTATION_URL)/$(SG_HANDBOOK_REVISION)
SG_HANDBOOK_RELEASE_NAME	:=	$(shell echo $(SG_PROJECT_NAME)-$(SG_HANDBOOK_REVISION) | tr '[:upper:]' '[:lower:]' | sed 's/ /-/g')
SG_HANDBOOK_PDF_URL			:=	$(SG_HANDBOOK_REVISION_URL)/$(SG_HANDBOOK_RELEASE_NAME).pdf
SG_HANDBOOK_EPUB_URL		:=	$(SG_HANDBOOK_REVISION_URL)/$(SG_HANDBOOK_RELEASE_NAME).epub
endif # ($(strip $(SG_HANDBOOK_REVISION)),mismatched)

################################################################################
# mdbook-pdf Configuration
################################################################################

ifneq ($(strip $(SG_HANDBOOK_REVISION)),mismatched)
SG_MDBOOK_HTML_SITE_URL	:=	/$(SG_HANDBOOK_REVISION)/
endif # ($(strip $(SG_HANDBOOK_REVISION)),mismatched)

ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
SG_MDBOOK_PDF_BROWSER_BINARY_PATH	:=	$(SG_BROWSER_BINARY_PATH_LINUX)
else ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_WINDOWS))
SG_MDBOOK_PDF_BROWSER_BINARY_PATH	:=	$(SG_BROWSER_BINARY_PATH_WINDOWS)
else # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
$(error The target operating system is not supported!)
endif # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))

ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
SG_LINUX_PYTHON_VENV_DIR		:=	$(shell mktemp -d)/sg-ue-handbook-venv
SG_LINUX_PYTHON_VENV_BIN_DIR	:=	$(SG_LINUX_PYTHON_VENV_DIR)/bin
export PATH			:=	$(SG_LINUX_PYTHON_VENV_BIN_DIR):$(PATH)
export PWD			:=	$(SG_LINUX_PYTHON_VENV_BIN_DIR)
export VIRTUAL_ENV	:=	$(SG_LINUX_PYTHON_VENV_DIR)
else ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_WINDOWS))
SG_DIST_DIR						:=	$(SG_HANDBOOK_DIR)/dist
SG_WINPYTHON_DIR				:=	$(SG_DIST_DIR)/winpython
SG_WINPYTHON_BIN_DIR			:=	$(SG_WINPYTHON_DIR)//python-3.12.4.amd64
SG_WINPYTHON_BIN_SCRIPTS_DIR	:=	$(SG_WINPYTHON_BIN_DIR)/Scripts
SG_WINPYTHON_SCRIPTS_DIR		:=	$(SG_WINPYTHON_DIR)/scripts
export PATH	:=	$(SG_WINPYTHON_SCRIPTS_DIR);$(PATH)
export PATH	:=	$(SG_WINPYTHON_BIN_SCRIPTS_DIR);$(PATH)
export PATH	:=	$(SG_WINPYTHON_BIN_DIR);$(PATH)
export PATH	:=	$(SG_RSYNC_BIN_PATH_WINDOWS);$(PATH)
else # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
$(error The target operating system is not supported!)
endif # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))

################################################################################
# Deployment Configuration
################################################################################

ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
SG_HANDBOOK_DEPLOY_CONFIG_FILE	:= $(shell echo ~/.config/$(SG_HANDBOOK_CONFIG_HOME_DIR)/$(SG_HANDBOOK_DEPLOY_CONFIG_FILENAME))
else ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_WINDOWS))
SG_HANDBOOK_DEPLOY_CONFIG_FILE	:=	$(shell cygpath -u $(LOCALAPPDATA)/$(SG_HANDBOOK_CONFIG_HOME_DIR)/$(SG_HANDBOOK_DEPLOY_CONFIG_FILENAME))
else # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
$(error The target operating system is not supported!)
endif # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))

################################################################################
# Deployment Temporary Directory Setup
################################################################################

$(info Setting up a deployment temporary directory '$(SG_HANDBOOK_DEPLOY_TEMP_DIR_NAME)')
SG_HANDBOOK_DEPLOY_TEMP_DIR	:=	$(shell mktemp -d -t $(SG_HANDBOOK_DEPLOY_TEMP_DIR_NAME))
$(info Temporary directory has been set up at '$(SG_HANDBOOK_DEPLOY_TEMP_DIR)')

SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE	:=	$(SG_HANDBOOK_DEPLOY_TEMP_DIR)/$(SG_HANDBOOK_RELEASE_NAME).pdf
SG_HANDBOOK_DEPLOY_GENERATED_EPUB_FILE	:=	$(SG_HANDBOOK_DEPLOY_TEMP_DIR)/$(SG_HANDBOOK_RELEASE_NAME).epub

SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE	:=	$(SG_HANDBOOK_DEPLOY_TEMP_DIR)/revisions.txt

SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE	:=	$(SG_HANDBOOK_DEPLOY_TEMP_DIR)/index.html

################################################################################
# Env Configuration Functions
################################################################################

define load_env
    $(eval ENV_FILE := $(1))
    @echo "Loading configuration file '$(ENV_FILE)'..."
    $(eval include $(ENV_FILE))
    $(eval export)
endef

################################################################################
# Make Targets - All
################################################################################

.PHONY: all
all: help

################################################################################
# Make Targets - Misc
################################################################################

.PHONY: help
help:
	@echo ""
	@echo "Available make targets:"
	@echo ""
	@echo "  - make build"
	@echo "  - make clean"
	@echo "  - make deploy"
	@echo "  - make help"
	@echo "  - make info"
	@echo "  - make pack"
	@echo "  - make serve"
	@echo ""

.PHONY: info
info:
	@echo ""
	@echo "$(SG_PROJECT_NAME) build information:"
	@echo ""
	@echo "  - Handbook Revision     :  $(SG_HANDBOOK_REVISION)"
	@echo "  - Handbook Revision URL :  $(SG_HANDBOOK_REVISION_URL)"
	@echo "  - Handbook PDF URL      :  $(SG_HANDBOOK_PDF_URL)"
	@echo "  - Handbook ePub URL     :  $(SG_HANDBOOK_EPUB_URL)"
	@echo "  - Git Branch            :  $(SG_GIT_BRANCH)"
	@echo "  - Git Tag               :  $(SG_GIT_TAG)"
	@echo "  - Git Commit            :  $(SG_GIT_COMMIT)"
	@echo "  - Git Commits Since Tag :  $(SG_GIT_COMMIT_NUMS_SINCE_TAG)"
	@echo "  - Git Tree State        :  $(SG_GIT_TREE_STATE)"
	@echo "  - Git Is Shallow Clone  :  $(SG_GIT_IS_SHALLOW_CLONE)"
	@echo "  - Git Latest Remote Tag :  $(SG_GIT_LATEST_REMOTE_TAG)"
	@echo "  - Git Version           :  $(SG_GIT_VERSION)"
	@echo "  - Git Version Major     :  $(SG_GIT_VERSION_MAJOR)"
	@echo "  - Git Version Minor     :  $(SG_GIT_VERSION_MINOR)"
	@echo "  - Git Version Patch     :  $(SG_GIT_VERSION_PATCH)"
	@echo "  - Plugin Version        :  $(SG_PLUGIN_VERSION)"
	@echo "  - Plugin Version Major  :  $(SG_PLUGIN_VERSION_MAJOR)"
	@echo "  - Plugin Version Minor  :  $(SG_PLUGIN_VERSION_MINOR)"
	@echo "  - Plugin Version Patch  :  $(SG_PLUGIN_VERSION_PATCH)"
	@echo "  - Build Host            :  $(SG_BUILD_HOST)"
	@echo "  - Build Time            :  $(SG_BUILD_TIME)"
	@echo ""

.PHONY: clean
clean:
	@echo "Cleaning up $(SG_PROJECT_NAME)..."
	@rm -rf "$(SG_MDBOOK_DEST_DIR)"
	@echo "$(SG_PROJECT_NAME) has been cleaned up successfully!"

.PHONY: install-build-deps
install-build-deps:
	@echo "Installing build dependencies if they have not already been installed..."
	@rustup install $(RUST_TOOLCHAIN_VERSION)
	@rustup override set $(RUST_TOOLCHAIN_VERSION)
	@cargo install mdbook --version "0.5.2" --locked
	@cargo install xq --vers "^0.5" --locked
	@cargo install mdbook-pdf --vers "0.1.13" --locked
ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@echo "Installing mdbook-pdf-outline..."
	@python -m venv $(VIRTUAL_ENV) \
		&& . $(SG_LINUX_PYTHON_VENV_BIN_DIR)/activate \
		&& pip install mdbook-pdf-outline 2>/dev/null
endif # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@cargo install --git https://github.com/Michael-F-Bryan/mdbook-epub --rev 21a1c8134134201a2d555313447c96e56e2a8996 --locked

################################################################################
# Make Targets - mdBook
################################################################################

.PHONY: prepare
prepare:
	@echo "Preparing the handbook $(SG_HANDBOOK_DIR)..."
prepare: prepare-src
prepare: prepare-dest

.PHONY: prepare-dest
prepare-dest:
	@echo "Preparing the handbook target dir $(SG_MDBOOK_DEST_DIR)..."

.PHONY: prepare-src
prepare-src:
	@echo "Preparing the handbook source dir $(SG_MDBOOK_SRC_DIR)..."

.PHONY: verify-handbook-revision
verify-handbook-revision:
ifeq ($(SG_HANDBOOK_REVISION), next)
	@echo "Building an unstable handbook for the next release..."
else # ($(SG_HANDBOOK_REVISION), next)
ifeq ($(SG_HANDBOOK_REVISION), mismatched)
	@echo ""
	@echo "Failed to verify the handbook build due to some discrepancies. Please verify the following:"
	@echo ""
	@echo "If you're building a release handbook:"
	@echo "    - You are either on a release tag, e.g. v2.1.0, or on the master branch."
	@echo "    - No commit has been made since the targeted tag."
	@echo "    - The Git tree state is clean."
	@echo "    - The Git version and plugin version match each other."
	@echo ""
	@echo "If you're building an unstable handbook for the next release:"
	@echo "    - You're building from the dev branch."
	@echo "    - The Git version value evaluates to empty."
	@echo ""
	@echo "If you're packaging the handbook:"
	@echo "    - You're on a release branch."
	@echo "    - You're shallow cloning."
	@echo "    - The remorte Git repository contains releae tags."
	@echo ""
	@exit 1
else # ($(SG_HANDBOOK_REVISION), mismatched)
	@echo "Building a release handbook: $(SG_HANDBOOK_REVISION)..."
endif # ($(SG_HANDBOOK_REVISION), mismatched)
endif # ($(SG_HANDBOOK_REVISION), next)

.PHONY: serve
serve: info
serve: install-build-deps
serve: prepare
serve: _mdbook_serve

.PHONY: build
build: info
build: install-build-deps
build: prepare
build: verify-handbook-revision
build: _mdbook_build

.PHONY: pack
pack: info
pack: install-build-deps
pack: prepare
pack: verify-handbook-revision
pack: _mdbook_build
pack: _pack

.PHONY: deploy
deploy: info
deploy: install-build-deps
deploy: clean
deploy: prepare
deploy: verify-handbook-revision
deploy: _mdbook_build
deploy: _deploy

.PHONY: _mdbook_serve
_mdbook_serve:
	@echo "Serving $(SG_HANDBOOK_DIR)..."
	@env SG_PROJECT_NAME='$(SG_PROJECT_NAME)' \
		SG_HANDBOOK_REVISION='$(SG_HANDBOOK_REVISION)' \
		SG_HANDBOOK_REVISION_URL='$(SG_HANDBOOK_REVISION_URL)' \
		SG_HANDBOOK_PDF_URL='$(SG_HANDBOOK_PDF_URL)' \
		SG_HANDBOOK_EPUB_URL='$(SG_HANDBOOK_EPUB_URL)' \
		SG_GIT_BRANCH='$(SG_GIT_BRANCH)' \
		SG_GIT_TAG='$(SG_GIT_TAG)' \
		SG_GIT_COMMIT='$(SG_GIT_COMMIT)' \
		SG_GIT_COMMIT_NUMS_SINCE_TAG='$(SG_GIT_COMMIT_NUMS_SINCE_TAG)' \
		SG_GIT_TREE_STATE='$(SG_GIT_TREE_STATE)' \
		SG_GIT_IS_SHALLOW_CLONE='$(SG_GIT_IS_SHALLOW_CLONE)' \
		SG_GIT_LATEST_REMOTE_TAG='$(SG_GIT_LATEST_REMOTE_TAG)' \
		SG_GIT_VERSION='$(SG_GIT_VERSION)' \
		SG_GIT_VERSION_MAJOR='$(SG_GIT_VERSION_MAJOR)' \
		SG_GIT_VERSION_MINOR='$(SG_GIT_VERSION_MINOR)' \
		SG_GIT_VERSION_PATCH='$(SG_GIT_VERSION_PATCH)' \
		SG_PLUGIN_VERSION='$(SG_PLUGIN_VERSION)' \
		SG_PLUGIN_VERSION_MAJOR='$(SG_PLUGIN_VERSION_MAJOR)' \
		SG_PLUGIN_VERSION_MINOR='$(SG_PLUGIN_VERSION_MINOR)' \
		SG_PLUGIN_VERSION_PATCH='$(SG_PLUGIN_VERSION_PATCH)' \
		SG_BUILD_HOST='$(SG_BUILD_HOST)' \
		SG_BUILD_TIME='$(SG_BUILD_TIME)' \
		MDBOOK_output__html__site_url='$(SG_MDBOOK_HTML_SITE_URL)' \
		MDBOOK_output__pdf__browser_binary_path='$(SG_MDBOOK_PDF_BROWSER_BINARY_PATH)' \
			mdbook serve \
				-n $(SG_MDBOOK_HOST) \
				-p $(SG_MDBOOK_PORT) \
				--watcher $(SG_MDBOOK_WATCHER) \
				--dest-dir $(SG_MDBOOK_DEST_DIR)

.PHONY: _mdbook_build
_mdbook_build:
	@echo "Building $(SG_HANDBOOK_DIR)..."
	@env SG_PROJECT_NAME='$(SG_PROJECT_NAME)' \
		SG_HANDBOOK_REVISION='$(SG_HANDBOOK_REVISION)' \
		SG_HANDBOOK_REVISION_URL='$(SG_HANDBOOK_REVISION_URL)' \
		SG_HANDBOOK_PDF_URL='$(SG_HANDBOOK_PDF_URL)' \
		SG_HANDBOOK_EPUB_URL='$(SG_HANDBOOK_EPUB_URL)' \
		SG_GIT_BRANCH='$(SG_GIT_BRANCH)' \
		SG_GIT_TAG='$(SG_GIT_TAG)' \
		SG_GIT_COMMIT='$(SG_GIT_COMMIT)' \
		SG_GIT_COMMIT_NUMS_SINCE_TAG='$(SG_GIT_COMMIT_NUMS_SINCE_TAG)' \
		SG_GIT_TREE_STATE='$(SG_GIT_TREE_STATE)' \
		SG_GIT_IS_SHALLOW_CLONE='$(SG_GIT_IS_SHALLOW_CLONE)' \
		SG_GIT_LATEST_REMOTE_TAG='$(SG_GIT_LATEST_REMOTE_TAG)' \
		SG_GIT_VERSION='$(SG_GIT_VERSION)' \
		SG_GIT_VERSION_MAJOR='$(SG_GIT_VERSION_MAJOR)' \
		SG_GIT_VERSION_MINOR='$(SG_GIT_VERSION_MINOR)' \
		SG_GIT_VERSION_PATCH='$(SG_GIT_VERSION_PATCH)' \
		SG_PLUGIN_VERSION='$(SG_PLUGIN_VERSION)' \
		SG_PLUGIN_VERSION_MAJOR='$(SG_PLUGIN_VERSION_MAJOR)' \
		SG_PLUGIN_VERSION_MINOR='$(SG_PLUGIN_VERSION_MINOR)' \
		SG_PLUGIN_VERSION_PATCH='$(SG_PLUGIN_VERSION_PATCH)' \
		SG_BUILD_HOST='$(SG_BUILD_HOST)' \
		SG_BUILD_TIME='$(SG_BUILD_TIME)' \
		MDBOOK_output__html__site_url='$(SG_MDBOOK_HTML_SITE_URL)' \
		MDBOOK_output__pdf__browser_binary_path='$(SG_MDBOOK_PDF_BROWSER_BINARY_PATH)' \
			mdbook build \
				--dest-dir $(SG_MDBOOK_DEST_DIR)

.PHONY: _pack
_pack:
	@echo "Packing '$(SG_HANDBOOK_DIR)'..."
	@echo "Cleaning up the pack directory '$(SG_DOCUMENTATION_PACK_DIR)'..."
	@rm -rf "$(SG_DOCUMENTATION_PACK_DIR)"
	@echo "Creating the pack directory '$(SG_DOCUMENTATION_PACK_DIR)'..."
	@mkdir -p "$(SG_DOCUMENTATION_PACK_DIR)"
	@echo "Moving '$(SG_DOCUMENTATION_HTML_DIR)' to '$(SG_HANDBOOK_PACKED_HTML_DIR)'..."
ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@mv "$(SG_DOCUMENTATION_HTML_DIR)" "$(SG_HANDBOOK_PACKED_HTML_DIR)"
else # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@powershell -Command "Move-Item '$(SG_DOCUMENTATION_HTML_DIR)' '$(SG_HANDBOOK_PACKED_HTML_DIR)'"
endif # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@echo "Compressing '$(SG_HANDBOOK_PACKED_HTML_DIR)' to '$(SG_HANDBOOK_PACKED_HTML_FILE)'..."
ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@cd "$(SG_DOCUMENTATION_PACK_DIR)" \
		&& zip $(SG_HANDBOOK_PACKED_HTML_FILE) -r $(SG_HANDBOOK_ESCAPED_NAME)
else # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@cd "$(SG_DOCUMENTATION_PACK_DIR)" \
		&& powershell Compress-Archive $(SG_HANDBOOK_ESCAPED_NAME) $(SG_HANDBOOK_PACKED_HTML_FILE)
endif # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@echo "Moving '$(SG_DOCUMENTATION_PDF_FILE)' to '$(SG_HANDBOOK_PACKED_PDF_FILE)'..."
ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@mv "$(SG_DOCUMENTATION_PDF_FILE)" "$(SG_HANDBOOK_PACKED_PDF_FILE)"
else # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@powershell -Command "Move-Item '$(SG_DOCUMENTATION_PDF_FILE)' '$(SG_HANDBOOK_PACKED_PDF_FILE)'"
endif # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@echo "Moving '$(SG_DOCUMENTATION_EPUB_FILE)' to '$(SG_HANDBOOK_PACKED_EPUB_FILE)'..."
ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@mv "$(SG_DOCUMENTATION_EPUB_FILE)" "$(SG_HANDBOOK_PACKED_EPUB_FILE)"
else # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@powershell -Command "Move-Item '$(SG_DOCUMENTATION_EPUB_FILE)' '$(SG_HANDBOOK_PACKED_EPUB_FILE)'"
endif # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))

.PHONY: _deploy
_deploy:
	@echo "Deploying '$(SG_HANDBOOK_DIR)'..."
	@echo "Loading the Handbook deployment configuration file..."
	@$(call load_env, $(SG_HANDBOOK_DEPLOY_CONFIG_FILE))
	@echo "Deploying '$(SG_HANDBOOK_DIR)' to '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)'..."
ifeq ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@rsync \
		-avze "ssh -p $(SG_HANDBOOK_SSH_PORT)" \
		--perms \
		--chmod=u+rwx,g+rx,o+rx,g-w,o-wx \
		--delete $(SG_DOCUMENTATION_HTML_DIR)/ \
		$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)
else # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@cd "$(SG_DOCUMENTATION_DIR)" \
		&& "$(SG_RSYNC_BINARY_PATH_WINDOWS)" \
			-avze "\"$(SG_RSYNC_SSH_BINARY_PATH_WINDOWS)\" -p $(SG_HANDBOOK_SSH_PORT)" \
			--perms \
			--chmod=u+rwx,g+rx,o+rx,g-w,o-wx \
			--delete $(SG_DOCUMENTATION_HTML_DIR_NAME)/ \
			$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)
endif # ($(SG_BUILD_PLATFORM),$(SG_BUILD_PLATFORM_LINUX))
	@echo "Copying '$(SG_DOCUMENTATION_PDF_FILE)' to '$(SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE)'..."
	@cp -v "$(SG_DOCUMENTATION_PDF_FILE)" "$(SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE)"
	@echo "Uploading '$(SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE)' to '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)'..."
	@scp \
		-P $(SG_HANDBOOK_SSH_PORT) \
		"$(SG_HANDBOOK_DEPLOY_GENERATED_PDF_FILE)" \
		$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)
	@echo "Copying '$(SG_DOCUMENTATION_EPUB_FILE)' to '$(SG_HANDBOOK_DEPLOY_GENERATED_EPUB_FILE)'..."
	@cp -v "$(SG_DOCUMENTATION_EPUB_FILE)" "$(SG_HANDBOOK_DEPLOY_GENERATED_EPUB_FILE)"
	@echo "Uploading '$(SG_HANDBOOK_DEPLOY_GENERATED_EPUB_FILE)' to '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)'..."
	@scp \
		-P $(SG_HANDBOOK_SSH_PORT) \
		"$(SG_HANDBOOK_DEPLOY_GENERATED_EPUB_FILE)" \
		$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)/$(SG_HANDBOOK_REVISION)
	@echo "Retrieving the list of deployed handbook revisions from '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_PORT)/$(SG_HANDBOOK_SSH_REMOTE_DIR)'..."
	@ssh \
		-p $(SG_HANDBOOK_SSH_PORT) $(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST) \
		"mkdir -p $(SG_HANDBOOK_SSH_REMOTE_DIR)"
	@ssh \
		-p $(SG_HANDBOOK_SSH_PORT) $(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST) \
		"find $(SG_HANDBOOK_SSH_REMOTE_DIR) -maxdepth 1 -type d ! -path $(SG_HANDBOOK_SSH_REMOTE_DIR) -exec basename {} \; | sort -r" \
		> $(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE)
	@{ \
		grep -i 'next' $(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE); \
		grep -vi 'next' $(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE) \
		| sort -r; \
	} > "$(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE).tmp"
	@mv "$(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE).tmp" "$(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE)"
	@echo "Revisions list saved to '$(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE)'!"
	@echo "Current revisions:"
	@sed 's/^/ - /' "$(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE)"
	@echo "Generating '$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)'..."
	@echo "<html>" > "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<head>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<title>Welcome to $(SG_PROJECT_NAME)</title>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<link rel='icon' href='favicon.svg'>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<link rel='shortcut icon' href='favicon.svg'>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<style>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "body {" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "font-family: Arial, sans-serif;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "background-color: #003070;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "color: #fff;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "margin: 0;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "padding: 0;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "}" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo ".container {" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "padding: 2.0em;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "}" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo ".logo-container {" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "text-align: center;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "}" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo ".logo-container img {" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "max-width: 100%;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "height: auto;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "}" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo ".title-container {" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "text-align: center;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "}" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo ".revisions-container {" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "display: table;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "width: 300px;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "margin: 0 auto;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "padding: 20px;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "}" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo ".row {" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "display: table-row;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "}" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo ".cell {" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "display: table-cell;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "background-color: #004890;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "border-radius: 5px;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "margin: 10px;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "padding: 20px;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "text-align: center;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "transition: transform 0.2s;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "}" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo ".cell:hover {" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "transform: scale(1.05);" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "}" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo ".cell a {" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "display: block;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "height: 100%;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "width: 100%;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "text-decoration: none;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "color: #fff;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "font-weight: bold;" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "}" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "</style>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "</head>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<body>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<div class='container'>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<div class='logo-container'>" >>  $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)
	@echo "<img src="favicon.svg" alt='SenseGlove' />" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "</div>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<div class='title-container'>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<h1>Welcome to the SenseGlove Unreal Engine Handbook</h1>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<h3>Please choose a revision to continue!</h3>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<h5>* Please note that the next revision is the documentation for the unstable next release of the plugin and subject to change!</h5>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "</div>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "<div class='revisions-container'>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@while read dir; \
		do \
			echo "<div class='row'><div class='cell'><a href=\"$$dir\">$$dir</a></div></div>"; \
		done < $(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE) >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "</div>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "</div>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "</body>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "</html>" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)"
	@echo "Uploading '$(SG_HANDBOOK_FAVICON_FILE)' to '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)'"
	@scp \
		-P $(SG_HANDBOOK_SSH_PORT) \
		"$(SG_HANDBOOK_FAVICON_FILE)" \
		$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)
	@echo "Uploading '$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)' to '$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)'"
	@scp \
		-P $(SG_HANDBOOK_SSH_PORT) \
		"$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" \
		$(SG_HANDBOOK_SSH_USER)@$(SG_HANDBOOK_SSH_HOST):$(SG_HANDBOOK_SSH_REMOTE_DIR)