Skip to content
Latchkey

Earthly vs Make: Reproducible Builds Compared

Pick Make for a ubiquitous, dependency-tracking task runner with zero install on most systems; pick Earthly when you want containerized, reproducible builds with layer caching that behave the same locally and in CI.

Make and Earthly both orchestrate build steps, but at different levels of isolation. Make is the classic, near-universal build tool: a Makefile defines targets and file dependencies, and it runs the minimal set of commands. Earthly runs each build target in a container (using BuildKit) with an Earthfile syntax that blends Dockerfile and Makefile ideas, aiming for builds that are reproducible across machines and CI.

EarthlyMake
IsolationContainers per target (BuildKit)Runs on the host shell
ReproducibilityHigh (pinned base images)Depends on host environment
CachingLayer caching like DockerTimestamp-based on file targets
Install footprintEarthly + Docker/BuildKitUsually preinstalled
SyntaxEarthfile (Docker + Make like)Makefile (tab-sensitive)
PortabilitySame build local and CIVaries with host tooling

Where each genuinely wins

Make wins on ubiquity and simplicity: it is already on most Unix systems, has no container requirement, and its file-dependency model is great for incremental local work. Earthly wins on reproducibility and caching: because each step runs in a container with pinned images, "works on my machine" problems shrink, and BuildKit-style layer caching makes repeated builds fast.

In CI

Earthly is designed to make local and CI builds identical, which reduces the class of failures that only happen on the runner due to environment drift. It can share a build cache across runs to avoid re-doing unchanged layers. Make in CI is lighter (no Docker needed) but you must ensure the runner has the same toolchain versions the Makefile assumes, or builds diverge.

Honest caveats

Earthly requires Docker/BuildKit and adds a container layer, so simple tasks are heavier and startup is slower than plain Make. Make is simpler but its reproducibility depends entirely on the host, and its tab-sensitive syntax and limited error handling frustrate newcomers.

The verdict

Use Make for lightweight, host-native task running where the environment is already controlled. Use Earthly when reproducibility across machines and CI, plus container-style caching, are worth the Docker dependency.

Related guides

Run this faster and cheaper on Latchkey managed runners. Start free →