summaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2025-11-04 08:17:12 -0600
committerCraig Jennings <c@cjennings.net>2025-11-04 08:17:12 -0600
commitcec43573a5f533086d1b3705a78d6f1846b7d250 (patch)
tree7e1ab84cf12248cfff06fceb05dc7f8fae28f668 /Makefile
parent49ca3f8ba754e879133bba47536cad7fe91d4691 (diff)
feat:Makefile: Add Makefile for build and test automation
Introduce a Makefile to automate common tasks for the wttrin project. This includes running tests (unit and integration), validating and compiling the main file, linting, and cleaning up generated files.
Diffstat (limited to 'Makefile')
-rw-r--r--Makefile218
1 files changed, 218 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..1073e1d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,218 @@
+# Makefile for wttrin
+#
+# Usage:
+# make help - Show this help message
+# make test - Run all tests
+# make test-unit - Run unit tests only
+# make test-file FILE=test-foo.el - Run specific test file
+# make test-name TEST=test-foo-* - Run tests matching pattern
+# make validate-parens - Check for unbalanced parentheses
+# make validate - Load wttrin.el to verify it compiles
+# make compile - Byte-compile wttrin.el
+# make lint - Run all linters (checkdoc, package-lint, elisp-lint)
+# make clean - Remove test artifacts and compiled files
+# make clean-compiled - Remove .elc/.eln files only
+# make clean-tests - Remove test artifacts only
+
+# Emacs binary to use (override with: make EMACS=emacs29 test)
+EMACS ?= emacs
+
+# Directories
+TEST_DIR = tests
+PROJECT_ROOT = .
+
+# Test files
+UNIT_TESTS = $(filter-out $(TEST_DIR)/test-integration-%.el, $(wildcard $(TEST_DIR)/test-*.el))
+INTEGRATION_TESTS = $(wildcard $(TEST_DIR)/test-integration-%.el)
+ALL_TESTS = $(UNIT_TESTS) $(INTEGRATION_TESTS)
+
+# Source files
+MAIN_FILE = wttrin.el
+TEST_UTIL_FILES = $(wildcard $(TEST_DIR)/testutil-*.el)
+
+# Emacs batch flags
+EMACS_BATCH = $(EMACS) --batch --no-site-file --no-site-lisp
+EMACS_TEST = $(EMACS_BATCH) -L $(PROJECT_ROOT) -L $(TEST_DIR)
+
+# Colors for output
+COLOR_GREEN = \033[0;32m
+COLOR_RED = \033[0;31m
+COLOR_BLUE = \033[0;34m
+COLOR_YELLOW = \033[0;33m
+COLOR_RESET = \033[0m
+
+.PHONY: help test test-all test-unit test-integration test-file test-name \
+ validate-parens validate compile lint \
+ clean clean-compiled clean-tests
+
+# Default target
+.DEFAULT_GOAL := help
+
+help:
+ @echo "wttrin Makefile Targets:"
+ @echo ""
+ @echo " $(COLOR_BLUE)Testing:$(COLOR_RESET)"
+ @echo " make test - Run all tests ($(words $(ALL_TESTS)) files)"
+ @echo " make test-unit - Run unit tests only ($(words $(UNIT_TESTS)) files)"
+ @echo " make test-integration - Run integration tests only ($(words $(INTEGRATION_TESTS)) files)"
+ @echo " make test-file FILE=<filename> - Run specific test file"
+ @echo " make test-name TEST=<pattern> - Run tests matching pattern"
+ @echo ""
+ @echo " $(COLOR_BLUE)Validation:$(COLOR_RESET)"
+ @echo " make validate-parens - Check for unbalanced parentheses"
+ @echo " make validate - Load wttrin.el to verify it compiles"
+ @echo " make compile - Byte-compile wttrin.el"
+ @echo " make lint - Run all linters (checkdoc, package-lint, elisp-lint)"
+ @echo ""
+ @echo " $(COLOR_BLUE)Utilities:$(COLOR_RESET)"
+ @echo " make clean - Remove test artifacts and compiled files"
+ @echo " make clean-compiled - Remove .elc/.eln files only"
+ @echo " make clean-tests - Remove test artifacts only"
+ @echo ""
+ @echo "Examples:"
+ @echo " make test-file FILE=test-wttrin--build-url.el"
+ @echo " make test-name TEST=test-wttrin--build-url-*"
+ @echo " make EMACS=emacs29 test # Use specific Emacs version"
+
+# ============================================================================
+# Testing Targets
+# ============================================================================
+
+test: test-all
+
+test-all:
+ @echo "$(COLOR_BLUE)Running all tests ($(words $(ALL_TESTS)) files)...$(COLOR_RESET)"
+ @$(MAKE) test-unit
+ @if [ $(words $(INTEGRATION_TESTS)) -gt 0 ]; then \
+ $(MAKE) test-integration; \
+ fi
+ @echo "$(COLOR_GREEN)✓ All tests complete$(COLOR_RESET)"
+
+test-unit:
+ @echo "$(COLOR_BLUE)Running unit tests ($(words $(UNIT_TESTS)) files)...$(COLOR_RESET)"
+ @failed=0; \
+ for test in $(UNIT_TESTS); do \
+ echo " Testing $$test..."; \
+ $(EMACS_TEST) -l ert -l $$test -f ert-run-tests-batch-and-exit || failed=$$((failed + 1)); \
+ done; \
+ if [ $$failed -eq 0 ]; then \
+ echo "$(COLOR_GREEN)✓ All unit tests passed$(COLOR_RESET)"; \
+ else \
+ echo "$(COLOR_RED)✗ $$failed unit test file(s) failed$(COLOR_RESET)"; \
+ exit 1; \
+ fi
+
+test-integration:
+ @if [ $(words $(INTEGRATION_TESTS)) -eq 0 ]; then \
+ echo "$(COLOR_YELLOW)No integration tests found$(COLOR_RESET)"; \
+ exit 0; \
+ fi
+ @echo "$(COLOR_BLUE)Running integration tests ($(words $(INTEGRATION_TESTS)) files)...$(COLOR_RESET)"
+ @failed=0; \
+ for test in $(INTEGRATION_TESTS); do \
+ echo " Testing $$test..."; \
+ $(EMACS_TEST) -l ert -l $$test -f ert-run-tests-batch-and-exit || failed=$$((failed + 1)); \
+ done; \
+ if [ $$failed -eq 0 ]; then \
+ echo "$(COLOR_GREEN)✓ All integration tests passed$(COLOR_RESET)"; \
+ else \
+ echo "$(COLOR_RED)✗ $$failed integration test file(s) failed$(COLOR_RESET)"; \
+ exit 1; \
+ fi
+
+test-file:
+ifndef FILE
+ @echo "$(COLOR_RED)Error: FILE parameter required$(COLOR_RESET)"
+ @echo "Usage: make test-file FILE=test-wttrin--build-url.el"
+ @exit 1
+endif
+ @echo "$(COLOR_BLUE)Running tests in $(FILE)...$(COLOR_RESET)"
+ @$(EMACS_TEST) -l ert -l $(TEST_DIR)/$(FILE) -f ert-run-tests-batch-and-exit
+ @echo "$(COLOR_GREEN)✓ Tests in $(FILE) complete$(COLOR_RESET)"
+
+test-name:
+ifndef TEST
+ @echo "$(COLOR_RED)Error: TEST parameter required$(COLOR_RESET)"
+ @echo "Usage: make test-name TEST=test-wttrin--build-url-*"
+ @exit 1
+endif
+ @echo "$(COLOR_BLUE)Running tests matching pattern: $(TEST)...$(COLOR_RESET)"
+ @$(EMACS_TEST) \
+ -l ert \
+ $(foreach test,$(ALL_TESTS),-l $(test)) \
+ --eval '(ert-run-tests-batch-and-exit "$(TEST)")'
+ @echo "$(COLOR_GREEN)✓ Tests matching '$(TEST)' complete$(COLOR_RESET)"
+
+# ============================================================================
+# Validation Targets
+# ============================================================================
+
+validate-parens:
+ @echo "$(COLOR_BLUE)Checking for unbalanced parentheses...$(COLOR_RESET)"
+ @echo " Checking $(MAIN_FILE)..."; \
+ $(EMACS_BATCH) --eval "(condition-case err \
+ (progn \
+ (find-file \"$(MAIN_FILE)\") \
+ (check-parens) \
+ (kill-emacs 0)) \
+ (error (progn \
+ (message \"ERROR: %s\" err) \
+ (kill-emacs 1))))" 2>&1 > /dev/null && \
+ echo "$(COLOR_GREEN)✓ $(MAIN_FILE) has balanced parentheses$(COLOR_RESET)" || \
+ (echo "$(COLOR_RED)✗ $(MAIN_FILE) has unbalanced parentheses$(COLOR_RESET)" && exit 1)
+
+validate:
+ @echo "$(COLOR_BLUE)Loading wttrin.el to verify compilation...$(COLOR_RESET)"
+ @$(EMACS_BATCH) -L $(PROJECT_ROOT) \
+ --eval "(condition-case err \
+ (progn \
+ (load-file \"$(MAIN_FILE)\") \
+ (message \"OK: %s\" \"$(MAIN_FILE)\")) \
+ (error (progn \
+ (message \"ERROR loading %s: %s\" \"$(MAIN_FILE)\" err) \
+ (kill-emacs 1))))" && \
+ echo "$(COLOR_GREEN)✓ $(MAIN_FILE) loaded successfully$(COLOR_RESET)" || \
+ (echo "$(COLOR_RED)✗ $(MAIN_FILE) failed to load$(COLOR_RESET)" && exit 1)
+
+compile:
+ @echo "$(COLOR_BLUE)Byte-compiling wttrin.el...$(COLOR_RESET)"
+ @$(EMACS_BATCH) -L $(PROJECT_ROOT) \
+ --eval "(progn \
+ (setq byte-compile-error-on-warn nil) \
+ (batch-byte-compile))" $(MAIN_FILE)
+ @echo "$(COLOR_GREEN)✓ Compilation complete$(COLOR_RESET)"
+
+lint:
+ @echo "$(COLOR_BLUE)Running linters on wttrin.el...$(COLOR_RESET)"
+ @echo "$(COLOR_YELLOW)Note: checkdoc, package-lint, and elisp-lint must be installed$(COLOR_RESET)"
+ @$(EMACS_BATCH) -L $(PROJECT_ROOT) \
+ --eval "(progn \
+ (require 'checkdoc nil t) \
+ (require 'package-lint nil t) \
+ (require 'elisp-lint nil t) \
+ (find-file \"$(MAIN_FILE)\") \
+ (when (featurep 'checkdoc) \
+ (checkdoc-current-buffer t)) \
+ (when (featurep 'package-lint) \
+ (package-lint-current-buffer)) \
+ (when (featurep 'elisp-lint) \
+ (elisp-lint-file \"$(MAIN_FILE)\")))" && \
+ echo "$(COLOR_GREEN)✓ All linting checks passed$(COLOR_RESET)" || \
+ echo "$(COLOR_YELLOW)⚠ Linting issues found$(COLOR_RESET)"
+
+# ============================================================================
+# Utility Targets
+# ============================================================================
+
+clean: clean-tests clean-compiled
+ @echo "$(COLOR_GREEN)✓ Clean complete$(COLOR_RESET)"
+
+clean-compiled:
+ @echo "$(COLOR_BLUE)Removing compiled files (.elc, .eln)...$(COLOR_RESET)"
+ @find $(PROJECT_ROOT) -type f \( -name "*.eln" -o -name "*.elc" \) -delete
+ @echo "$(COLOR_GREEN)✓ Compiled files removed$(COLOR_RESET)"
+
+clean-tests:
+ @echo "$(COLOR_BLUE)Removing test artifacts...$(COLOR_RESET)"
+ @rm -rf $(HOME)/.temp-emacs-tests
+ @echo "$(COLOR_GREEN)✓ Test artifacts removed$(COLOR_RESET)"