# # author: Mamadou Babaei # # (The MIT License) # # Copyright (c) 2020 - 2024 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_HANDBOOK_DIR := $(CURDIR) SG_HANDBOOK_SRC_DIR := $(SG_HANDBOOK_DIR)/src 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_DIR := $(SG_PLUGIN_DIR)/Documentation ################################################################################ # 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 ################################################################################ # Version and Build Information ################################################################################ SG_GIT_TREE_STATE_DIRTY := dirty 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 "dirty" || echo "clean") 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)),) SG_GIT_VERSION_MAJOR := $(shell echo $(SG_GIT_TAG) | 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_TAG) | 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_TAG) | 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_VERSION)),) SG_HANDBOOK_REVISION := next endif # ($(strip $(SG_GIT_VERSION)),) endif # ($(strip $(SG_GIT_BRANCH)),dev) ifeq ($(strip $(SG_GIT_BRANCH)),HEAD) ifeq ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),0) ifeq ($(strip $(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)),clean) endif # ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),0) endif # ($(strip $(SG_GIT_BRANCH)),HEAD) ifeq ($(strip $(SG_GIT_BRANCH)),master) ifeq ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),0) ifeq ($(strip $(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)),clean) endif # ($(strip $(SG_GIT_COMMIT_NUMS_SINCE_TAG)),0) endif # ($(strip $(SG_GIT_BRANCH)),master) ifeq ($(strip $(SG_HANDBOOK_REVISION)),) SG_HANDBOOK_REVISION := mismatched endif # ($(strip $(SG_HANDBOOK_REVISION)),) ################################################################################ # 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 serve" @echo "" .PHONY: info info: @echo "" @echo "Building $(SG_PROJECT_NAME)..." @echo "" @echo " - Handbook Revision : $(SG_HANDBOOK_REVISION)" @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 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..." @cargo install mdbook --vers "^0.4" --locked @cargo install xq --locked @cargo install mdbook-alerts --locked #@cargo install mdbook-linkcheck --locked @cargo install --git https://github.com/typst/typst typst-cli --locked @cargo install mdbook-typst --locked @cargo install mdbook-epub --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 "" @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: @echo "Serving $(SG_HANDBOOK_DIR)..." @env SG_PROJECT_NAME='$(SG_PROJECT_NAME)' \ SG_HANDBOOK_REVISION='$(SG_HANDBOOK_REVISION)' \ 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_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 serve \ -n $(SG_MDBOOK_HOST) \ -p $(SG_MDBOOK_PORT) \ --watcher $(SG_MDBOOK_WATCHER) \ --dest-dir $(SG_MDBOOK_DEST_DIR) .PHONY: build build: info build: install-build-deps build: prepare build: verify-handbook-revision build: .PHONY: deploy deploy: clean deploy: build deploy: