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 checkerAlternatively, the image can be built with the make target image-build :
$ BUILDER_NAME='Your Name' BUILDER_EMAIL='your@mail' image-buildBy 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:latestNote 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
golangplugin docs for more information. -
checkmake-systempre-commit will look for
checkmakeon yourPATH. This hook requires you to installcheckmakeseparately, e.g. with your package manager or a prebuilt binary release. Only recommended if it's permissible to require all repository users installcheckmakemanually.
Then, run pre-commit as usual as a part of git commit or explicitly, for example:
pre-commit run --all-filespre-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 MakefileFrom Packages
checkmake is available in many Linux distributions and package managers. See Repology for full list:
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.1Use 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.