Docs for the Rust version; benchmarks; build.sh fixes
README, CLAUDE.md, man pages, the user guide and its screenshot script now describe the Rust build and the intentional behaviour changes, which docs/MIGRATION.md lists. Go and Rust micro-benchmarks for the same operations, and scripts/bench.sh for end-to-end comparison. build.sh exports its tree root to the per-target jobs and keeps logs out of the output directory; riscv64 musl builds use getrandom's raw syscall backend, since zig's musl getrandom never reaches the kernel there. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+6
-3
@@ -7,7 +7,9 @@ sandbox path and file owner are shown as /home/sam and "sam sam", key lines
|
||||
are highlighted in amber for the reader, and "moment" frames show a prompt
|
||||
with a cursor, exactly as vault prints it before you type.
|
||||
|
||||
Needs: go, python3, and Chrome or Chromium (set CHROME=/path if not found).
|
||||
Needs: cargo (with the pinned toolchain), cargo-zigbuild and zig for the
|
||||
build screenshot, python3, and Chrome or Chromium (set CHROME=/path if not
|
||||
found).
|
||||
Output: docs/guide/img/*.png
|
||||
"""
|
||||
|
||||
@@ -75,7 +77,8 @@ class Sandbox:
|
||||
self.bin = os.path.join(self.root, "bin")
|
||||
os.makedirs(self.home)
|
||||
os.makedirs(self.bin)
|
||||
subprocess.run(["go", "build", "-o", os.path.join(self.bin, "vault"), "."], cwd=REPO, check=True)
|
||||
subprocess.run(["cargo", "build", "--release", "--locked", "--quiet"], cwd=REPO, check=True)
|
||||
shutil.copy2(os.path.join(REPO, "target", "release", "vault"), os.path.join(self.bin, "vault"))
|
||||
|
||||
def env(self, extra=None):
|
||||
e = {
|
||||
@@ -406,7 +409,7 @@ def main():
|
||||
|
||||
# building, into a temporary OUT so an existing dist/ is left alone
|
||||
rel = tempfile.mkdtemp(prefix="vault-release-")
|
||||
targets = "linux/amd64 linux/arm darwin/arm64 windows/amd64"
|
||||
targets = "linux/amd64 linux/arm64 linux/armv7 windows/amd64"
|
||||
t = Term(box, title="sam@laptop: ~/src/vault")
|
||||
out = subprocess.run(["./build.sh"], cwd=REPO, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
||||
text=True, env=dict(os.environ, TARGETS=targets, OUT=rel)).stdout
|
||||
|
||||
+36
-17
@@ -222,14 +222,17 @@ Linux on ARM64 & Pi 4/5 (64-bit OS), Graviton, Ampere & vault-linux-arm64 \\
|
||||
Raspberry Pi, 32-bit & Pi 2, 3, 4 on a 32-bit OS & vault-linux-armv7 \\
|
||||
Raspberry Pi Zero / 1 & the tiny older ones & vault-linux-armv6 \\
|
||||
Android & in Termux & vault-android-arm64 \\
|
||||
FreeBSD, OpenBSD, NetBSD & amd64, arm64, 386, arm\ldots & vault-freebsd-amd64 etc. \\
|
||||
Something exotic & RISC-V, POWER, s390x, MIPS, LoongArch & see \cmd{dist/} \\
|
||||
FreeBSD, NetBSD & amd64 (FreeBSD also 386) & vault-freebsd-amd64 etc. \\
|
||||
Something exotic & RISC-V, POWER, s390x, LoongArch, illumos, Solaris & see \cmd{dist/} \\
|
||||
\end{vtable}
|
||||
|
||||
\begin{squirrel}
|
||||
The full release covers 43 platform builds, including AIX, Solaris, illumos,
|
||||
Plan~9 and even WebAssembly. Will you ever need \file{vault-plan9-arm}?
|
||||
Almost certainly not. Is it pleasing that it exists? Extremely.
|
||||
The release covers some twenty platforms, from Windows on ARM to IBM
|
||||
mainframes, and even WebAssembly. A few that the older Go builds reached,
|
||||
such as Plan~9, OpenBSD and MIPS, have no stable Rust toolchain yet;
|
||||
\file{docs/PLATFORMS.md} keeps the list. Will you ever need
|
||||
\file{vault-linux-s390x}? Almost certainly not. Is it pleasing that it
|
||||
exists? Extremely.
|
||||
\end{squirrel}
|
||||
|
||||
\begin{headsup}
|
||||
@@ -299,24 +302,29 @@ Run \cmd{vault help}. You should see the full command list:
|
||||
|
||||
\section{Building it yourself}
|
||||
|
||||
Prefer to build from source? You need Go 1.26.6 or newer. Then:
|
||||
Prefer to build from source? You need Rust, through \cmd{rustup}, which
|
||||
fetches the exact compiler version the project pins. Then:
|
||||
|
||||
\begin{shell}
|
||||
$ go build . # just your platform, produces ./vault
|
||||
$ ./build.sh # every platform, into ./dist, with SHA256SUMS
|
||||
$ cargo build --release --locked # just your platform: target/release/vault
|
||||
$ ./build.sh # every platform it can, into ./dist, with SHA256SUMS
|
||||
\end{shell}
|
||||
|
||||
\cmd{build.sh} cross-compiles every target Go supports without C libraries.
|
||||
\cmd{build.sh} cross-compiles Linux and Windows with \cmd{cargo-zigbuild}
|
||||
and \cmd{zig}, macOS on a Mac, and the BSDs, illumos and Solaris with
|
||||
\cmd{cross} and Docker; it says which targets your machine can't build.
|
||||
32-bit ARM Linux gets two builds, armv6 and armv7. Want just a few? Set
|
||||
\env{TARGETS}. Want them somewhere else? Set \env{OUT}.
|
||||
|
||||
\shot{build}{A partial build, followed by checking every binary against SHA256SUMS}
|
||||
|
||||
\begin{whyso}
|
||||
The binaries are \emph{static} and \emph{reproducible}: no C code, no system
|
||||
libraries, file paths stripped, build IDs zeroed. Two people building the same
|
||||
commit get byte-identical files, so you can check a release against your own
|
||||
build.
|
||||
The Linux binaries are \emph{static}: they need no system libraries at all.
|
||||
Every build uses the pinned compiler and the locked versions of every
|
||||
dependency, with build paths stripped, so the result doesn't depend on whose
|
||||
machine or which folder built it. Built with the same compiler for the same
|
||||
target, the same commit should give the same file, so you can check a
|
||||
release against your own build.
|
||||
\end{whyso}
|
||||
|
||||
\begin{pocket}
|
||||
@@ -324,7 +332,7 @@ build.
|
||||
\item One file per platform. Rename it \cmd{vault} and put it on your \env{PATH}.
|
||||
\item Always check the SHA-256 against \file{SHA256SUMS}.
|
||||
\item macOS: clear the quarantine flag after checking.
|
||||
\item \cmd{./build.sh} builds all 43 platform binaries from source.
|
||||
\item \cmd{./build.sh} builds every platform your machine can, from source.
|
||||
\end{pocketlist}
|
||||
\end{pocket}
|
||||
|
||||
@@ -1071,8 +1079,9 @@ who's slow at typing never blocks you.
|
||||
\begin{whyso}
|
||||
\textbf{What if vault crashes while holding the lock?} On Linux, macOS, the
|
||||
BSDs and Windows, the operating system drops the lock the moment the process
|
||||
dies. Nothing to clean up. On Plan~9 and WebAssembly, which have no file
|
||||
locks, vault uses a \file{.lock} file instead. If one's ever left behind,
|
||||
dies. Nothing to clean up. Older Go builds of vault use the very same locks,
|
||||
so mixing versions is safe. On WebAssembly, which has no file locks, vault
|
||||
uses a \file{.lock} file instead. If one's ever left behind,
|
||||
vault tells you after a minute exactly which file to delete.
|
||||
\end{whyso}
|
||||
|
||||
@@ -1326,7 +1335,17 @@ could not read passphrase (set VAULT\_PASSPHRASE\ldots) & No terminal to ask on,
|
||||
agent did not start: \ldots & \cmd{unlock} couldn't start its helper. The reason follows; commands still work, asking for the passphrase. \\
|
||||
nothing was unlocked & \cmd{vault lock} found nothing to lock. Not an error. \\
|
||||
waiting for another vault process to finish & Not an error. Another command is writing; this one continues when it's done. \\
|
||||
vault still locked after a minute\ldots & Plan~9 and WebAssembly only. If nothing else is running, delete the file it names. \\
|
||||
vault still locked after a minute\ldots & WebAssembly only. If nothing else is running, delete the file it names. \\
|
||||
cannot lock the vault: \ldots & The lock file couldn't be opened or locked; the reason follows. Check the vault folder's permissions. \\
|
||||
\ldots\ changed while being added & The file was being written while vault read it. Nothing was stored; try again when it's finished. \\
|
||||
\ldots\ changed after it was stored; not deleting it & \cmd{migrate} stored the file, but it changed before it could be deleted. The original is kept; the vault has the version it read. \\
|
||||
\ldots\ already exists & \cmd{get} never overwrites, not even a symlink. Pick another name with \cmd{-o}. \\
|
||||
\ldots\ refusing to extract through it & \cmd{get -r} found a symlink (or a file) where a folder should be inside the output folder, and stopped rather than follow it. \\
|
||||
cannot lock agent memory \ldots, cannot make the agent undumpable \ldots & \cmd{unlock}'s helper couldn't protect the key in memory, so it refused it. Commands still work, asking for the passphrase. \\
|
||||
vault unlock is not supported on this platform\ldots & Windows: every command asks for the passphrase. \\
|
||||
download exceeds \ldots\ bytes & A download passed its size limit. Raise it with \cmd{--max-bytes} if you meant it. \\
|
||||
redirected to another host: \ldots & \cmd{mirror} only follows redirects within the site it is copying. \\
|
||||
mirror incomplete: stored \ldots, skipped \ldots & Some pages failed; the reasons were printed as they happened. Exit status 3. \\
|
||||
skipping unreadable record \ldots & A catalogue entry is damaged. Everything else still works; restore \file{records/} from backup to recover that file. \\
|
||||
object does not match its catalogue record & The encrypted contents were swapped or damaged. Nothing was written. Restore \file{objects/} from backup. \\
|
||||
object size does not match its catalogue record & Same as above: damage or tampering, caught before any output appeared. \\
|
||||
|
||||
Reference in New Issue
Block a user