# Makefile for Joomla Extensions # Copyright (C) 2026 Moko Consulting # SPDX-License-Identifier: GPL-3.0-or-later # # MokoJoomOpenGraph — Open Graph & social sharing meta tag management # ============================================================================== # CONFIGURATION - Customize these for your extension # ============================================================================== # Extension Configuration EXTENSION_NAME := mokoog 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 validate minify ## Build extension package @echo "$(COLOR_BLUE)Building Joomla extension package...$(COLOR_RESET)" @mkdir -p $(DIST_DIR) $(BUILD_DIR) # Determine package prefix based on extension type @case "$(EXTENSION_TYPE)" in \ module) \ PACKAGE_PREFIX="mod_$(EXTENSION_NAME)"; \ BUILD_TARGET="$(BUILD_DIR)/$$PACKAGE_PREFIX"; \ ;; \ plugin) \ PACKAGE_PREFIX="plg_$(PLUGIN_GROUP)_$(EXTENSION_NAME)"; \ BUILD_TARGET="$(BUILD_DIR)/$$PACKAGE_PREFIX"; \ ;; \ component) \ PACKAGE_PREFIX="com_$(EXTENSION_NAME)"; \ BUILD_TARGET="$(BUILD_DIR)/$$PACKAGE_PREFIX"; \ ;; \ package) \ PACKAGE_PREFIX="pkg_$(EXTENSION_NAME)"; \ BUILD_TARGET="$(BUILD_DIR)/$$PACKAGE_PREFIX"; \ ;; \ template) \ PACKAGE_PREFIX="tpl_$(EXTENSION_NAME)"; \ BUILD_TARGET="$(BUILD_DIR)/$$PACKAGE_PREFIX"; \ ;; \ *) \ echo "$(COLOR_RED)✗ Unknown extension type: $(EXTENSION_TYPE)$(COLOR_RESET)"; \ exit 1; \ ;; \ esac; \ \ mkdir -p "$$BUILD_TARGET"; \ \ echo "Building $$PACKAGE_PREFIX..."; \ \ rsync -av --progress \ --exclude='$(BUILD_DIR)' \ --exclude='$(DIST_DIR)' \ --exclude='.git*' \ --exclude='vendor/' \ --exclude='node_modules/' \ --exclude='tests/' \ --exclude='Makefile' \ --exclude='composer.json' \ --exclude='composer.lock' \ --exclude='package.json' \ --exclude='package-lock.json' \ --exclude='phpunit.xml' \ --exclude='*.md' \ --exclude='.editorconfig' \ . "$$BUILD_TARGET/"; \ \ cd $(BUILD_DIR) && $(ZIP) -r "../$(DIST_DIR)/$${PACKAGE_PREFIX}-$(EXTENSION_VERSION).zip" "$${PACKAGE_PREFIX}"; \ \ echo "$(COLOR_GREEN)✓ Package created: $(DIST_DIR)/$${PACKAGE_PREFIX}-$(EXTENSION_VERSION).zip$(COLOR_RESET)" .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