MCPcopy Index your code
hub / github.com/checkmake/checkmake

github.com/checkmake/checkmake @v0.3.2

Chat with this repo
repository ↗ · DeepWiki ↗ · release v0.3.2 ↗ · + Follow
137 symbols 454 edges 29 files 63 documented · 46%
What it actually does AI analysis from the code graph — generated when you open this
loading…
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.

Extension points exported contracts — how you extend this code

Rule (Interface)
Rule defines the interface that all validation rules must implement. Each rule provides: - Name(): a unique identifier [5 …
rules/rules.go
Formatter (Interface)
Formatter is the base interface type to implement for formatters [3 implementers]
formatters/formatters.go

Core symbols most depended-on inside this repo

Parse
called by 17
parser/parser.go
newRootCmd
called by 16
cmd/checkmake/main.go
Debug
called by 9
logger/logger.go
Scan
called by 8
parser/scanner.go
Name
called by 8
rules/rules.go
NewConfigFromFile
called by 7
config/config.go
Text
called by 6
parser/scanner.go
GetConfigValue
called by 6
config/config.go

Shape

Function 85
Method 28
Struct 15
TypeAlias 7
Interface 2

Languages

Go100%

Modules by API surface

cmd/checkmake/main_test.go16 symbols
parser/parser_test.go14 symbols
rules/rules.go13 symbols
parser/parser.go7 symbols
config/config_test.go6 symbols
rules/uniquetargets/uniquetargets.go5 symbols
rules/timestampexpanded/timestampexpanded.go5 symbols
rules/phonydeclared/phonydeclared.go5 symbols
rules/minphony/minphony.go5 symbols
rules/maxbodylength/maxbodylength.go5 symbols
parser/scanner.go5 symbols
logger/logger.go5 symbols

For agents

$ claude mcp add checkmake \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact