checkmake

module
v0.3.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 10, 2026 License: MIT

README

checkmake

Build Status Coverage Status Code Climate Go Report Card Packagecloud MIT license

Overview

checkmake is a linter for Makefiles. It scans Makefiles for potential issues based on configurable rules.

Usage

% checkmake Makefile
% checkmake Makefile foo.mk bar.mk baz.mk

checkmake analyzes one or more Makefiles and reports potential issues according to configurable rules.

Command-line options
Usage:
  checkmake [flags] [makefile...]
  checkmake [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  list-rules  List registered rules

Flags:
      --config string   Configuration file to read (default "checkmake.ini")
      --debug           Enable debug mode
      --format string   Custom Go template for text output (ignored in JSON mode)
  -h, --help            help for checkmake
  -o, --output string   Output format: 'text' (default) or 'json' (mutually exclusive with --format) (default "text")
  -v, --version         version for checkmake

Use "checkmake [command] --help" for more information about a command.
Example output
% checkmake fixtures/missing_phony.make
      RULE                 DESCRIPTION                      FILE NAME            LINE NUMBER
  minphony        Missing required phony target    fixtures/missing_phony.make   21
                  "all"
  minphony        Missing required phony target    fixtures/missing_phony.make   21
                  "test"
  phonydeclared   Target "all" should be           fixtures/missing_phony.make   16
                  declared PHONY.

Container usage

building or running a container image can be done with docker and podman.

building an image

docker build --build-arg BUILDER_NAME='Your Name' --build-arg BUILDER_EMAIL=your.name@example.com . -t checker

Alternatively, the image can be built with the make target image-build :

$ BUILDER_NAME='Your Name' BUILDER_EMAIL='your@mail' image-build

By default, the image tag is constructed as IMAGE_REGISTRY/checkmake/checkmake:IMAGE_VERSION_TAG

The image registry defaults to quay.io but can be overridden by the IMAGE_REGISTRY make variable.

The image version tag defaults to latest and can be overridden with the make variable IMAGE_VERSION_TAG.

The container command used for building (docker or podman) is auto-detected with a preference for podman but can be overridden by the make variable CONTAINER_CMD.

publishing an image

The locally built image can be published with a make image-pushcommand corresponding to the previously described make image-buildcommand or alrenatively directly using docker push or podman push

published images on quay

Official images are published on quay.io

running checkmake in container

Then checkmake can be run in a contaner based on a locally built or pulled image with a Makefile attached. below is an example of it assuming the Makefile is in the current working directory:

docker run --workdir / -v "$PWD"/Makefile:/Makefile quay.io/checkmake/checkmake:latest 

Variant for using an additional config file:

docker run --workdir / -v "$PWD"/Makefile:/Makefile -v "$PWD"/checkmake.ini:/checkmake.ini  quay.io/checkmake/checkmake:latest

Note that this uses the default config file name checkmake.ini in the CWD so that it will be picked up by checkmake automatically.

pre-commit usage

This repo includes a pre-commit hook, which you may choose to use in your own repos. Simply add a .pre-commit-config.yaml to your repo's top-level directory

repos:
-   repo: https://github.com/checkmake/checkmake.git
    # Or another commit hash or version
    rev: 0.2.2
    hooks:
    # Use this hook to let pre-commit build checkmake in its sandbox
    -   id: checkmake
    # OR Use this hook to use a pre-installed checkmake executable
    # -   id: checkmake-system

There are two hooks available:

  • checkmake (Recommended)

    pre-commit will set up a Go environment from scratch to compile and run checkmake. See the pre-commit golang plugin docs for more information.

  • checkmake-system

    pre-commit will look for checkmake on your PATH. This hook requires you to install checkmake separately, e.g. with your package manager or a prebuilt binary release. Only recommended if it's permissible to require all repository users install checkmake manually.

Then, run pre-commit as usual as a part of git commit or explicitly, for example:

pre-commit run --all-files
pre-commit in GitHub Actions

You may also choose to run this as a GitHub Actions workflow. To do this, add a .github/workflows/pre-commit.yml workflow to your repo:

name: pre-commit

on:
  pull_request:
    branches:
      - master
      - main
    paths:
      - '.pre-commit-config.yaml'
      - '.pre-commit-hooks.yaml'
      - 'Makefile'
      - 'makefile'
      - 'GNUmakefile'
      - '**.mk'
      - '**.make'
  push:
    paths:
      - '.pre-commit-config.yaml'
      - '.pre-commit-hooks.yaml'
      - 'Makefile'
      - 'makefile'
      - 'GNUmakefile'
      - '**.mk'
      - '**.make'

jobs:
  pre-commit:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-python@v3
    - name: Set up Go 1.17
      uses: actions/setup-go@v2
      with:
        go-version: 1.17
      id: go
    - uses: pre-commit/action@v2.0.3

Installation

With Go

With go 1.16 or higher:

go install github.com/checkmake/checkmake/cmd/checkmake@latest
checkmake Makefile

Or alternatively, run it directly:

go run github.com/checkmake/checkmake/cmd/checkmake@latest Makefile
From Packages

checkmake is available in many Linux distributions and package managers. See Repology for full list:

Repology

Packages are also available on packagecloud.io.

Build

You'll need Go installed.

git clone https://github.com/checkmake/checkmake
cd checkmake
make checkmake

To build the man page (optional), install pandoc and run:

make checkmake.1

Use in CI

MegaLinter

checkmake is natively embedded within MegaLinter

To install it, run npx mega-linter-runner --install (requires Node.js)

Inspiration

This is totally inspired by an idea by Dan Buch.

Directories

Path Synopsis
cmd
checkmake command
Package config deals with loading and parsing configuration from disk
Package config deals with loading and parsing configuration from disk
Package formatters provides the base interface type for different output formatters to implement
Package formatters provides the base interface type for different output formatters to implement
Package logger provides a super simple way for logging on different levels
Package logger provides a super simple way for logging on different levels
Package parser implements all the parser functionality for Makefiles.
Package parser implements all the parser functionality for Makefiles.
Package rules contains specific rules as subpackages to check a Makefile against
Package rules contains specific rules as subpackages to check a Makefile against
maxbodylength
Package maxbodylength implements the ruleset for making sure target bodies are kept short and thus hopefully somewhat not complex.
Package maxbodylength implements the ruleset for making sure target bodies are kept short and thus hopefully somewhat not complex.
minphony
Package minphony implements the ruleset for making sure required minimum phony targets are present
Package minphony implements the ruleset for making sure required minimum phony targets are present
phonydeclared
Package phonydeclared implements the ruleset for making sure all targets that don't have a rule body are marked PHONY
Package phonydeclared implements the ruleset for making sure all targets that don't have a rule body are marked PHONY
timestampexpanded
Package timestampexpanded implements the ruleset for making sure a variable that likely represents a timestamp is simply expanded so it doesn't change in between rule executions.
Package timestampexpanded implements the ruleset for making sure a variable that likely represents a timestamp is simply expanded so it doesn't change in between rule executions.
uniquetargets
Package uniquetargets implements the ruleset ensuring no target is repeated.
Package uniquetargets implements the ruleset ensuring no target is repeated.
Package validator holds the basic engine that runs rule based checks against a Makefile struct
Package validator holds the basic engine that runs rule based checks against a Makefile struct

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL