# Makefile for Joomla Extensions # Copyright (C) 2026 Moko Consulting # SPDX-License-Identifier: GPL-3.0-or-later # # MokoJoomGallery — Photo gallery management for Joomla # ============================================================================== # CONFIGURATION - Customize these for your extension # ============================================================================== # Extension Configuration EXTENSION_NAME := mokojoomgallery EXTENSION_TYPE := package # Options: module, plugin, component, package, template EXTENSION_VERSION := 1.0.0 # Module Configuration (for modules only) MODULE_TYPE := site # Options: site, admin # Plugin Configuration (for plugins only) PLUGIN_GROUP := system # Options: system, content, user, authentication, etc. # Directories SRC_DIR := src BUILD_DIR := build DIST_DIR := dist DOCS_DIR := docs # Joomla Installation (for local testing - customize paths) JOOMLA_ROOT := /var/www/html/joomla JOOMLA_VERSION := 4 # Tools PHP := php COMPOSER := composer NPM := npm PHPCS := vendor/bin/phpcs PHPCBF := vendor/bin/phpcbf PHPUNIT := vendor/bin/phpunit ZIP := zip # 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)║ Joomla Extension Makefile ║$(COLOR_RESET)" @echo "$(COLOR_BLUE)╚════════════════════════════════════════════════════════════╝$(COLOR_RESET)" @echo "" @echo "Extension: $(EXTENSION_NAME) ($(EXTENSION_TYPE)) v$(EXTENSION_VERSION)" @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 "" .PHONY: install-deps install-deps: ## Install all dependencies (Composer + npm) @echo "$(COLOR_BLUE)Installing dependencies...$(COLOR_RESET)" @if [ -f "composer.json" ]; then \ $(COMPOSER) install; \ echo "$(COLOR_GREEN)✓ Composer dependencies installed$(COLOR_RESET)"; \ fi .PHONY: lint lint: ## Run PHP linter (syntax check) @echo "$(COLOR_BLUE)Running PHP linter...$(COLOR_RESET)" @find . -name "*.php" ! -path "./vendor/*" ! -path "./node_modules/*" ! -path "./$(BUILD_DIR)/*" \ -exec $(PHP) -l {} \; | grep -v "No syntax errors" || true @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 --ignore=vendor,node_modules,$(BUILD_DIR) .; \ else \ echo "$(COLOR_YELLOW)⚠ PHP CodeSniffer not installed. Run: make install-deps$(COLOR_RESET)"; \ fi .PHONY: validate validate: lint phpcs ## Run all validation checks @echo "$(COLOR_GREEN)✓ All validation checks passed$(COLOR_RESET)" .PHONY: clean clean: ## Clean build artifacts @echo "$(COLOR_BLUE)Cleaning build artifacts...$(COLOR_RESET)" @rm -rf $(BUILD_DIR) $(DIST_DIR) @echo "$(COLOR_GREEN)✓ Build artifacts cleaned$(COLOR_RESET)" 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 "Minifying assets..." @if [ -f "$(MINIFY_SCRIPT)" ]; then \ node "$(MINIFY_SCRIPT)" $(SRC_DIR); \ elif [ -f "scripts/minify.js" ]; then \ node scripts/minify.js; \ else \ echo "No minify script found"; \ fi .PHONY: build build: clean minify ## Build extension package @echo "$(COLOR_BLUE)Building Joomla package extension...$(COLOR_RESET)" @mkdir -p $(DIST_DIR) $(BUILD_DIR)/packages @# --- Build each sub-extension as a separate ZIP --- @for EXT_DIR in $(SRC_DIR)/packages/*/; do \ EXT_NAME=$$(basename "$$EXT_DIR"); \ [ "$$EXT_NAME" = "index.html" ] && continue; \ echo " Packaging $$EXT_NAME..."; \ cd "$$EXT_DIR" && $(ZIP) -r "$(CURDIR)/$(BUILD_DIR)/packages/$${EXT_NAME}.zip" . \ -x "*.git*" -x "*/index.html" 2>/dev/null; \ cd "$(CURDIR)"; \ done @# --- Build the outer package ZIP --- @echo " Assembling pkg_$(EXTENSION_NAME)..." @cp $(SRC_DIR)/pkg_mokojoomgallery.xml $(BUILD_DIR)/pkg_mokojoomgallery.xml @cp $(SRC_DIR)/script.php $(BUILD_DIR)/script.php @[ -d "$(SRC_DIR)/language" ] && cp -r $(SRC_DIR)/language $(BUILD_DIR)/language || true @cd $(BUILD_DIR) && $(ZIP) -r "$(CURDIR)/$(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip" \ pkg_mokojoomgallery.xml script.php language/ packages/ @echo "$(COLOR_GREEN)✓ Package created: $(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip$(COLOR_RESET)" @echo " Contents:" @unzip -l "$(DIST_DIR)/pkg_$(EXTENSION_NAME)-$(EXTENSION_VERSION).zip" | tail -n +4 | head -20 .PHONY: package package: build ## Alias for build @echo "$(COLOR_GREEN)✓ Package ready for distribution$(COLOR_RESET)" .PHONY: release release: validate build ## Create a release (validate + build) @echo "$(COLOR_GREEN)✓ Release package ready$(COLOR_RESET)" .PHONY: version version: ## Display version information @echo "$(COLOR_BLUE)Extension Information:$(COLOR_RESET)" @echo " Name: $(EXTENSION_NAME)" @echo " Type: $(EXTENSION_TYPE)" @echo " Version: $(EXTENSION_VERSION)" .PHONY: security-check security-check: ## Run security checks 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 .PHONY: all all: install-deps validate build ## Run complete build pipeline @echo "$(COLOR_GREEN)✓ Complete build pipeline finished$(COLOR_RESET)" # Default target .DEFAULT_GOAL := help