Ramblings of an aging IT geek
← Ramblings of an aging IT geek
tooling

a makefile is a fine task runner, actually

Why I keep reaching for plain make to drive builds, linting and deploys on projects that contain no C whatsoever.

A keyboard and terminal

Every project I touch eventually grows a pile of "how do I run the thing" commands. Build, lint, test, generate, deploy. People reach for a shell script, then a second shell script, then a bespoke Node or Python runner with its own dependency tree. I keep reaching for make, and it keeps being enough.

The trick is to stop thinking of it as a C build tool and start thinking of it as a memo of commands with a dependency graph attached. That's all it is. A Go service, a static site, a Terraform repo: each one has a handful of verbs I always forget the exact flags for, and make build remembers them so I don't have to.

.PHONY: build test lint
build:
	go build -o bin/app ./cmd/app
test:
	go test ./...
lint:
	golangci-lint run

The catches are real, mind. Tabs not spaces, every recipe line runs in its own shell, and .PHONY exists because make genuinely believes test is a file you're trying to create. Once those are in muscle memory it gets out of the way. No new runtime, no lockfile, installed everywhere already. For task running that aren't C, it's still the lowest-friction option I've found.