Skip to content

checkmake/checkmake

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

352 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

checkmake

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

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 [email protected] . -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/[email protected]

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.