Skip to main content

A Python-based Makefile formatter and linter

Project description

🍞 mbake

mbake logo
A Makefile formatter and linter. It only took 50 years!

License: MIT Python 3.9+ PyPI - mbake Code style: black PyPI Downloads

Features

  • Smart formatting: Tabs for recipes, consistent spacing, line continuation cleanup
  • Intelligent .PHONY detection: Automatically identifies and manages phony targets
  • Syntax validation: Ensures Makefiles are valid before and after formatting
  • Configurable rules: Customize behavior via ~/.bake.toml
  • CI/CD ready: Check mode for automated formatting validation
  • VSCode extension: Full editor integration available

Installation

# Install from PyPI
pip install mbake

# Or install VSCode extension
# Search for "mbake Makefile Formatter" in VSCode Extensions

Quick Start

# Format a Makefile
mbake format Makefile

# Check if formatting is needed (CI/CD mode)
mbake format --check Makefile

# Validate Makefile syntax
mbake validate Makefile

# Initialize configuration
mbake init

Usage

Basic Commands

# Format files
mbake format Makefile                   # Format single file
mbake format --check Makefile           # Check formatting (CI/CD)
mbake format --diff Makefile            # Show changes without modifying

# Validate syntax
mbake validate Makefile                 # Check Makefile syntax with GNU make

# Configuration
mbake init                              # Create config file
mbake config                            # Show current settings
mbake update                            # Update to latest version

Key Options

  • --check: Check formatting without making changes (perfect for CI/CD)
  • --diff: Show what changes would be made
  • --backup: Create backup before formatting
  • --validate: Validate syntax after formatting
  • --config: Use custom configuration file

Configuration

Create a config file with mbake init. Key settings:

[formatter]
# Spacing and formatting
space_around_assignment = true          # CC=gcc to CC = gcc
space_after_colon = true                # myapp.o:myapp.c to myapp.o: myapp.c
normalize_line_continuations = true     # Clean up backslash continuations
remove_trailing_whitespace = true       # Remove trailing spaces
fix_missing_recipe_tabs = true          # Convert spaces to tabs in recipes

# Variable alignment
align_variable_assignments = false      # Align consecutive assignments
align_across_comments = false           # Continue alignment across comments

# .PHONY management
auto_insert_phony_declarations = false  # Auto-detect and insert .PHONY
group_phony_declarations = false        # Group multiple .PHONY lines
phony_at_top = false                    # Place .PHONY at file top

Smart .PHONY Detection

mbake intelligently detects phony targets by analyzing recipe commands:

# These are automatically detected as phony
test:
 npm test

clean:
 rm -f *.o

deploy:
 ssh user@server 'systemctl restart app'

# This creates a file, so it's NOT phony
myapp.o: myapp.c
 gcc -c myapp.c -o myapp.o

Enable auto-insertion in your config:

[formatter]
auto_insert_phony_declarations = true

Examples

Before and After

# Before: Inconsistent spacing and indentation
CC:=gcc
CFLAGS= -Wall -g
SOURCES=main.c \
  utils.c \
    helper.c

all: $(TARGET)
    $(CC) $(CFLAGS) -o $@ $^

clean:
    rm -f *.o
# After: Clean, consistent formatting
CC := gcc
CFLAGS = -Wall -g
SOURCES = main.c \
  utils.c \
  helper.c

all: $(TARGET)
	$(CC) $(CFLAGS) -o $@ $^

clean:
	rm -f *.o

Disable Formatting

Use special comments to disable formatting in specific regions:

# bake-format off
CUSTOM_FORMAT= \
      1 \
  45678 \
#bake-format on

CI/CD Integration

# GitHub Actions example
- name: Check Makefile formatting
  run: |
    pip install mbake
    mbake format --check Makefile

Exit codes: 0 (success), 1 (needs formatting), 2 (error)

Contributing

Contributions welcome! See CONTRIBUTING.md for details.

# Development setup
git clone https://github.com/ebodshojaei/bake.git
cd mbake
pip install -e ".[dev]"
pytest  # Run tests

License

MIT License - see LICENSE for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mbake-1.4.6a1.tar.gz (3.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mbake-1.4.6a1-py3-none-any.whl (81.8 kB view details)

Uploaded Python 3

File details

Details for the file mbake-1.4.6a1.tar.gz.

File metadata

  • Download URL: mbake-1.4.6a1.tar.gz
  • Upload date:
  • Size: 3.0 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mbake-1.4.6a1.tar.gz
Algorithm Hash digest
SHA256 2d063a263b0b577111c961bc70d8b66a4e084e8ae0bbd4fe9c6d6085e1a06365
MD5 1f449d32711881fa8d522caa811744f8
BLAKE2b-256 5bf97cf82357fe3759cd6ca039e3cdfe984a0e4a923f1113cb95bdccc20ac4ab

See more details on using hashes here.

File details

Details for the file mbake-1.4.6a1-py3-none-any.whl.

File metadata

  • Download URL: mbake-1.4.6a1-py3-none-any.whl
  • Upload date:
  • Size: 81.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for mbake-1.4.6a1-py3-none-any.whl
Algorithm Hash digest
SHA256 389260f4136ca480bed0f9da57c012d33b6d0ad5a3361c761445f7efc3d59979
MD5 cc540732a8e83c563d6a265a539cfb12
BLAKE2b-256 18c21ef03b35d87e95a3dc88fe96df547a8212009e1e97177e3087d61ee0cc77

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page