# Makefile for mflux Python 3.10+ project, using 3.11 as recommended Python as of Sep 2024 PYTHON_VERSION = 3.11 VENV_DIR = .venv PYTHON = $(VENV_DIR)/bin/python # Default target .PHONY: all all: install test .PHONY: expect-arm64 expect-arm64: # ๐Ÿ–ฅ๏ธ Checking for compatible machine @if [ "$$(uname -m)" != "arm64" ]; then \ echo "mflux and MLX is not compatible with older Intel Macs. This project does not support your Mac."; \ exit 1; \ fi # we "expect" uv but should not install it for the user, let user *choose* to trust a third party installer .PHONY: expect-uv expect-uv: @if ! /usr/bin/which -s uv; then \ echo "You can use classic python -m venv to setup this project, \nbut we officially support using uv for managing this project's environment.\n"; \ echo "Please install uv to continue:\n https://github.com/astral-sh/uv?tab=readme-ov-file#installation"; \ fi # assume reasonably pre-commit is a safe dependency given its wide support (e.g. GitHub Actions integration) .PHONY: ensure-pre-commit ensure-pre-commit: @if ! /usr/bin/which -s pre-commit; then \ echo "pre-commit required for submitting commits before pull requests. Using uv tool to install pre-commit."; \ uv tool install pre-commit; \ fi # assume reasonably that if user has installed uv, they trust ruff from the same team .PHONY: ensure-ruff ensure-ruff: @if ! /usr/bin/which -s ruff; then \ echo "ruff required for code linting and formatting. Using uv tool to install ruff."; \ uv tool install ruff; \ fi # ensure pytest is available .PHONY: ensure-pytest ensure-pytest: @if ! $(PYTHON) -c "import pytest" 2>/dev/null; then \ echo "pytest required for testing. Installing pytest..."; \ uv pip install pytest; \ fi # Create virtual environment with uv .PHONY: venv-init venv-init: expect-arm64 expect-uv # ๐Ÿ—๏ธ Creating virtual environment with recommended uv tool: uv python install --quiet $(PYTHON_VERSION) uv venv --python $(PYTHON_VERSION) # โœ… "Python $(PYTHON_VERSION) Virtual environment created at $(VENV_DIR)" # Install dependencies .PHONY: install install: venv-init ensure-pre-commit # ๐Ÿ—๏ธ Installing dependencies and pre-commit hooks... uv pip install -e . # โœ… Dependencies installed. pre-commit install # โœ… Pre-commit hooks installed. # Run linters .PHONY: lint lint: ensure-ruff # ๐Ÿ—๏ธ Running linters, your files will not be mutated. # Use 'make check' to auto-apply fixes." ruff check # โœ… Linting complete." # Run formatter (if dev does not do so in their IDE) .PHONY: format format: ensure-ruff # ๐Ÿ—๏ธ Running formatter, your files will be changed to comply to formatting configs. ruff format # display the summaries of diffs in repo, some of these diffs are generated by the formatter git diff --stat # โœ… Formatting complete. Please review your git diffs, if any. # Run ruff auto lint and format via pre-commit hook .PHONY: check check: ensure-ruff # ๐Ÿ—๏ธ Running pre-commit linter and formatters on files... @(pre-commit run --all-files) # Run tests .PHONY: test test: ensure-pytest # ๐Ÿ—๏ธ Running tests... $(PYTHON) -m pytest # โœ… Tests completed # Clean up .PHONY: clean clean: # ๐Ÿงผ Cleaning up venv. rm -rf $(VENV_DIR) # โœ… Cleaned up venv. Run 'make install' to re-generate. # Help message .PHONY: help help: @echo "mflux commands:" @echo " make all - Set up the project and run tests" @echo " make install - Install project dev dependencies" @echo " make lint - Run ruff python linter" @echo " make format - Run ruff code formatter" @echo " make check - Run linters auto fixes *and* style formatter via pre-commit hook" @echo " make test - Run tests" @echo " make clean - Remove the virtual environment" @echo " make help - Show this help message"