checkmake is a tool for linting and checking Makefiles. It may not do what you want it to.
% checkmake Makefile
% checkmake Makefile foo.mk bar.mk baz.mk
% checkmake --help
checkmake scans Makefiles and reports potential issues according to configurable rules.
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 Output format as a Go text/template template
-h, --help help for checkmake
-v, --version version for checkmake
Use "checkmake [command] --help" for more information about a command.
% 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.
Build the image, or pull it:
docker build --build-arg BUILDER_NAME='Your Name' --build-arg BUILDER_EMAIL=your.name@example.com . -t checker
Then run it with your Makefile attached, below is an example of it assuming the Makefile is in your current working directory:
docker run -v "$PWD"/Makefile:/Makefile checker
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 yourPATH
. This hook requires you to installcheckmake
separately, e.g. with your package manager or a prebuilt binary release. Only recommended if it's permissible to require all repository users installcheckmake
manually.
Then, run pre-commit
as usual as a part of git commit
or explicitly, for example:
pre-commit run --all-files
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
The pandoc document converter utility is required to run checkmake. You can find out if you have it via which pandoc
. Install pandoc if the command was not found.
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
There are packages for linux up on packagecloud.io or build it yourself with the steps below.
To build checkmake you will need to have golang installed. Once you have Go installed, you can simply clone the repo and build the binary and man page yourself with the following commands.
git clone https://github.com/checkmake/checkmake
cd checkmake
make
checkmake is natively embedded within MegaLinter
To install it, run npx mega-linter-runner --install
(requires Node.js)
This is totally inspired by an idea by Dan Buch.