# Makefile for Joomla Extensions # Copyright (C) 2026 Moko Consulting # SPDX-License-Identifier: GPL-3.0-or-later # # MokoJoomBackup — Full-site backup and restore for Joomla # # Builds and releases are handled by CI workflows (pre-release.yml, # auto-release.yml). This Makefile provides local validation helpers # and workflow dispatch shortcuts. # ============================================================================== # CONFIGURATION # ============================================================================== EXTENSION_NAME := mokobackup EXTENSION_TYPE := package SRC_DIR := src # Gitea GITEA_URL := https://git.mokoconsulting.tech GITEA_ORG := MokoConsulting GITEA_REPO := MokoJoomBackup # Tools PHP := php COMPOSER := composer PHPCS := vendor/bin/phpcs # Coding Standards PHPCS_STANDARD := Joomla # Colors for output COLOR_RESET := \033[0m COLOR_GREEN := \033[32m COLOR_YELLOW := \033[33m COLOR_BLUE := \033[34m COLOR_RED := \033[31m # ============================================================================== # TARGETS # ============================================================================== .PHONY: help help: ## Show this help message @echo "$(COLOR_BLUE)╔════════════════════════════════════════════════════════════╗$(COLOR_RESET)" @echo "$(COLOR_BLUE)║ MokoJoomBackup Makefile ║$(COLOR_RESET)" @echo "$(COLOR_BLUE)╚════════════════════════════════════════════════════════════╝$(COLOR_RESET)" @echo "" @echo "$(COLOR_GREEN)Available targets:$(COLOR_RESET)" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " $(COLOR_BLUE)%-20s$(COLOR_RESET) %s\n", $$1, $$2}' @echo "" # -- Validation ---------------------------------------------------------------- .PHONY: lint lint: ## Run PHP syntax check on all source files @echo "$(COLOR_BLUE)Running PHP linter...$(COLOR_RESET)" @ERROR=0; \ find $(SRC_DIR) -name "*.php" -exec $(PHP) -l {} \; 2>&1 | grep -v "No syntax errors" || true; \ if find $(SRC_DIR) -name "*.php" -exec $(PHP) -l {} \; 2>&1 | grep -q "Parse error"; then \ echo "$(COLOR_RED)✗ Syntax errors found$(COLOR_RESET)"; exit 1; \ fi @echo "$(COLOR_GREEN)✓ PHP linting complete$(COLOR_RESET)" .PHONY: phpcs phpcs: ## Run PHP CodeSniffer (Joomla standards) @echo "$(COLOR_BLUE)Running PHP CodeSniffer...$(COLOR_RESET)" @if [ -f "$(PHPCS)" ]; then \ $(PHPCS) --standard=$(PHPCS_STANDARD) --extensions=php $(SRC_DIR); \ else \ echo "$(COLOR_YELLOW)⚠ PHP CodeSniffer not installed. Run: composer install$(COLOR_RESET)"; \ fi .PHONY: validate validate: lint ## Run all local validation checks @echo "$(COLOR_GREEN)✓ Validation passed$(COLOR_RESET)" .PHONY: validate-xml validate-xml: ## Validate all XML manifests are well-formed @echo "$(COLOR_BLUE)Validating XML manifests...$(COLOR_RESET)" @ERROR=0; \ for f in $$(find $(SRC_DIR) -name "*.xml"); do \ $(PHP) -r "new SimpleXMLElement(file_get_contents('$$f'));" 2>/dev/null \ || { echo "$(COLOR_RED)✗ Invalid XML: $$f$(COLOR_RESET)"; ERROR=1; }; \ done; \ [ $$ERROR -eq 0 ] && echo "$(COLOR_GREEN)✓ All XML manifests valid$(COLOR_RESET)" || exit 1 # -- Dependencies -------------------------------------------------------------- .PHONY: install-deps install-deps: ## Install PHP dependencies via Composer @echo "$(COLOR_BLUE)Installing dependencies...$(COLOR_RESET)" @if [ -f "composer.json" ]; then \ $(COMPOSER) install; \ echo "$(COLOR_GREEN)✓ Composer dependencies installed$(COLOR_RESET)"; \ fi .PHONY: security-check security-check: ## Run security audit on dependencies @echo "$(COLOR_BLUE)Running security checks...$(COLOR_RESET)" @if [ -f "composer.json" ]; then \ $(COMPOSER) audit || echo "$(COLOR_YELLOW)⚠ Vulnerabilities found$(COLOR_RESET)"; \ fi # -- Minify -------------------------------------------------------------------- MOKO_PLATFORM ?= $(or $(wildcard ../moko-platform),$(wildcard $(HOME)/moko-platform),$(wildcard /opt/moko-platform)) MINIFY_SCRIPT := $(MOKO_PLATFORM)/build/minify.js .PHONY: minify minify: ## Minify CSS/JS assets @echo "$(COLOR_BLUE)Minifying assets...$(COLOR_RESET)" @if [ -f "$(MINIFY_SCRIPT)" ]; then \ node "$(MINIFY_SCRIPT)" $(SRC_DIR); \ elif [ -f "scripts/minify.js" ]; then \ node scripts/minify.js; \ else \ echo "$(COLOR_YELLOW)⚠ No minify script found$(COLOR_RESET)"; \ fi # -- Release (CI workflow dispatch) -------------------------------------------- .PHONY: release release: validate validate-xml ## Trigger pre-release build via CI workflow @echo "$(COLOR_BLUE)Triggering pre-release workflow...$(COLOR_RESET)" @if ! command -v curl >/dev/null 2>&1; then \ echo "$(COLOR_RED)✗ curl required$(COLOR_RESET)"; exit 1; \ fi @if [ -z "$$MOKOGITEA_TOKEN" ]; then \ echo "$(COLOR_RED)✗ MOKOGITEA_TOKEN not set$(COLOR_RESET)"; exit 1; \ fi @BRANCH=$$(git rev-parse --abbrev-ref HEAD); \ curl -sf -X POST \ -H "Authorization: token $$MOKOGITEA_TOKEN" \ -H "Content-Type: application/json" \ "$(GITEA_URL)/api/v1/repos/$(GITEA_ORG)/$(GITEA_REPO)/actions/workflows/pre-release.yml/dispatches" \ -d "{\"ref\":\"$$BRANCH\",\"inputs\":{\"stability\":\"development\"}}" \ && echo "$(COLOR_GREEN)✓ Pre-release dispatched on $$BRANCH (development channel)$(COLOR_RESET)" \ || { echo "$(COLOR_RED)✗ Dispatch failed$(COLOR_RESET)"; exit 1; } .PHONY: release-rc release-rc: validate validate-xml ## Trigger release-candidate build via CI workflow @echo "$(COLOR_BLUE)Triggering RC pre-release workflow...$(COLOR_RESET)" @if [ -z "$$MOKOGITEA_TOKEN" ]; then \ echo "$(COLOR_RED)✗ MOKOGITEA_TOKEN not set$(COLOR_RESET)"; exit 1; \ fi @BRANCH=$$(git rev-parse --abbrev-ref HEAD); \ curl -sf -X POST \ -H "Authorization: token $$MOKOGITEA_TOKEN" \ -H "Content-Type: application/json" \ "$(GITEA_URL)/api/v1/repos/$(GITEA_ORG)/$(GITEA_REPO)/actions/workflows/pre-release.yml/dispatches" \ -d "{\"ref\":\"$$BRANCH\",\"inputs\":{\"stability\":\"release-candidate\"}}" \ && echo "$(COLOR_GREEN)✓ Pre-release dispatched on $$BRANCH (release-candidate channel)$(COLOR_RESET)" \ || { echo "$(COLOR_RED)✗ Dispatch failed$(COLOR_RESET)"; exit 1; } # -- Info ---------------------------------------------------------------------- .PHONY: version version: ## Display version from package manifest @VERSION=$$(grep '' $(SRC_DIR)/pkg_mokobackup.xml | sed 's/.*\(.*\)<\/version>.*/\1/'); \ echo "$(COLOR_BLUE)$(EXTENSION_NAME)$(COLOR_RESET) v$$VERSION ($(EXTENSION_TYPE))" # Default target .DEFAULT_GOAL := help