Install and platforms
One command per platform, what it verifies before it writes anything, and exactly which targets the releases publish today.
Two binaries: molto, the build system, and pickup, the toolchain manager it asks for a
compiler. One command installs both, checks them against the SHA256SUMS published beside the
release, and writes them into a directory you already own. No root, no administrator, nothing to
unpack.
Linux and macOS
curl -fsSL https://moltobuild.dev/install.sh | sh
Installs into ~/.local/bin and prints the export PATH line to add if that directory is not on
your PATH yet. Arguments go after --:
curl -fsSL https://moltobuild.dev/install.sh | sh -s -- --dir /usr/local/bin --no-pickup
| Choice | Flag | Environment variable |
|---|---|---|
| Where to install | --dir <path> |
MOLTO_INSTALL_DIR |
| A specific molto | --molto-version <v> |
MOLTO_VERSION |
| A specific pickup | --pickup-version <v> |
PICKUP_VERSION |
| Install molto only | --no-pickup |
— |
| Install pickup only | --no-molto |
— |
| Turn the colours off | — | NO_COLOR |
On macOS the same line installs both: pickup publishes an arm64 macOS binary since 0.9.4. What pickup finds there is the compiler Xcode’s command line tools ship, so install those first if the Mac does not have them yet:
xcode-select --install
A --pickup-version older than 0.9.4 has no macOS binary, and the install stops at the download
that names it.
Apple Silicon only. An Intel Mac is refused by name rather than handed a binary that would not run.
Windows
irm https://moltobuild.dev/install.ps1 | iex
Installs into %LOCALAPPDATA%\Programs\molto, which needs no administrator rights and, unlike
%APPDATA%, does not roam onto other machines. The directory is added to your user PATH if
it is not there already, so open a new terminal afterwards: a running shell keeps the
environment it started with.
Piping into iex leaves nowhere to put arguments, so that form is configured with environment
variables:
$env:MOLTO_INSTALL_DIR = 'C:\tools\molto'
irm https://moltobuild.dev/install.ps1 | iex
To pass the parameters instead — -Dir, -MoltoVersion, -PickupVersion, -NoPickup,
-NoMolto, -Help — build a scriptblock out of the script:
& ([scriptblock]::Create((irm https://moltobuild.dev/install.ps1))) -NoPickup
Windows PowerShell 5.1 is enough; nothing else has to be installed first.
What the installer verifies
Both scripts do the same three things, in this order, for each binary:
- Resolve the version — the redirect of
/releases/latestnames the newest tag without spending an API call, so a rate-limited GitHub does not break the install. - Download the binary and the
SHA256SUMSpublished beside it in the same release. - Compute the SHA-256 of the file on disk and compare it against the line that names that exact asset.
Only a file that matched is moved into the install directory. A mismatch, or an asset the checksums do not list, aborts before anything is written — and neither script has a flag that skips the check.
Platform status
| Target | Status | What a release publishes |
|---|---|---|
| x86-64 Linux | Supported | A static binary in every release. |
| x86-64 Windows | Supported | An .exe in every release, cross-compiled and then run against the whole test suite on a Windows runner before publishing. |
| arm64 macOS | Supported | A binary in every release, built on a Mac — Darwin cannot be cross-compiled — and run there before publishing. Not static, and unsigned. |
| x86-64 macOS (Intel) | Not measured | Nothing. It is neither tested nor promised. |
Anything not in that table has no published binary. The source builds with any C compiler recent enough, so a platform that is not listed is a matter of nobody having measured it, not of a refusal.
The compiler is not part of this
Installing Molto installs no compiler, and Molto never chooses one. Your manifest states the
capabilities the code needs, pickup answers which local driver provides them,
and it proves each capability by compiling a program that uses it.
If the machine has nothing recent enough, pickup fetches a toolchain into ~/.pickup — again
without root:
pickup doctor # what this machine can build with, and what is missing
pickup install clang # a toolchain of your own, under ~/.pickup
Without pickup, C_COMPILER and CPP_COMPILER name the drivers directly. That
route skips pickup entirely, and with it the verification of requires, so Molto prints a warning
when a compiler was chosen by hand.
macOS: two things worth knowing
The binary is not signed or notarized. If you download it with a browser, macOS
attaches com.apple.quarantine to the file and Gatekeeper refuses to run it. Remove the attribute,
or open it once from the Finder with a right click and Open:
xattr -d com.apple.quarantine molto pickup
Downloading it with curl — which is what the installer does — sets no quarantine attribute, so
this only affects a manual download through a browser.
The macOS binary is not static, unlike the Linux one. It cannot be: Apple ships no static
libSystem and does not support linking one. It links against libSystem instead, which is part
of every macOS, so there is still nothing to install beside it.
After it installs
molto --version
pickup doctor
If the shell answers command not found, the install directory is not on your PATH — the POSIX
installer prints the line to add, and the PowerShell one adds it for you but only for terminals
opened afterwards.