# # author: Mamadou Babaei # # (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 "" > "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "Welcome to $(SG_PROJECT_NAME)" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "
" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "
" >> $(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE) @echo "SenseGlove" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "
" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "
" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "

Welcome to the SenseGlove Unreal Engine Handbook

" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "

Please choose a revision to continue!

" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "
* Please note that the next revision is the documentation for the unstable next release of the plugin and subject to change!
" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "
" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "
" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @while read dir; \ do \ echo ""; \ done < $(SG_HANDBOOK_DEPLOY_REVISION_LIST_FILE) >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "
" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "
" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "" >> "$(SG_HANDBOOK_DEPLOY_GENERATED_HOME_INDEX_FILE)" @echo "" >> "$(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)