Files
Plugin/Handbook/GNUmakefile
T

313 lines
12 KiB
Makefile

#
# author: Mamadou Babaei <mamadou@senseglove.com>
#
# (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_HANDBOOK_CONFIG_FILE := $(realpath $(SG_HANDBOOK_DIR)/book.toml)
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}')
SG_HANDBOOK_SITE_URL := $(shell grep '^site-url' $(SG_HANDBOOK_CONFIG_FILE) | sed -n 's|^site-url = "/\(.*\)/"|\1|p')
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)),)
ifeq ($(strip $(SG_HANDBOOK_SITE_URL)),next)
SG_HANDBOOK_REVISION := next
endif # ($(strip $(SG_HANDBOOK_SITE_URL)),next)
endif # ($(strip $(SG_GIT_VERSION)),)
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))))
ifeq ($(SG_IS_GIT_BRANCH_HEAD_OR_MASTER),1)
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)))
ifeq ($(strip $(SG_HANDBOOK_SITE_URL)),$(strip $(SG_PLUGIN_VERSION_MAJOR).$(SG_PLUGIN_VERSION_MINOR)))
SG_HANDBOOK_REVISION := SG_PLUGIN_VERSION_MAJOR.SG_PLUGIN_VERSION_MINOR
endif # ($(strip $(SG_HANDBOOK_SITE_URL)),$(strip $(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 # ($(SG_IS_GIT_BRANCH_HEAD_OR_MASTER),1)
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-pdf --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: