Skip to content

Package for Nix, NixOS, and Guix, and document installing from them - #8

Merged
UnbreakableMJ merged 1 commit into
mainfrom
feature/nix-guix-packaging
Aug 6, 2026
Merged

Package for Nix, NixOS, and Guix, and document installing from them#8
UnbreakableMJ merged 1 commit into
mainfrom
feature/nix-guix-packaging

Conversation

@UnbreakableMJ

Copy link
Copy Markdown
Contributor

None of the three packaging definitions could build. Each fetches a v0.1.0 git tag that does not exist, with lib.fakeHash / all-zero base32 placeholders — so Vacuum could not be installed from a package on any system. There was no flake, and the README offered only cargo install --path.

One package definition, two entry points

packaging/default.nix now takes optional src and version arguments and reads its dependencies from the committed Cargo.lock. The flake passes src = self, so a checkout builds today without waiting for a release tag, and there is no cargoHash to regenerate on every dependency bump. One definition serves both the flake and a release build, rather than the two drifting apart.

The flake exposes packages, apps, checks, devShells (default + docs), and nixosModules.default with programs.vacuum.enable. The default shell supplies the toolchain from nixpkgs rather than rustup — rustup would download a second complete toolchain (~1.5 GB) for a pin this workspace does not need. This is not hypothetical: on the maintainer's NixOS host every rustup toolchain fails with cannot execute: required file not found, so the devShell is the only working way to build here.

Guix

manifest.scm gives Guix users the same environment, naming packages by specification so it need not track which module each currently lives in. packaging/guix.scm grows the Texinfo build and install-info step that Standard §8.6 requires.

It still cannot build, and says so plainly in the file, the README, and the manual rather than leaving someone to discover it: cargo-build-system resolves dependencies through #:cargo-inputs, and this workspace locks 191 crates — a list generated with guix import crate -r vacuum at release time. The Guix instructions therefore lead with the route that works today, guix shell -m manifest.scm -- cargo install --path crates/vacuum-cli.

Docs and CI

README and manual gain installation sections for Nix, NixOS, Guix System, Arch, and source — including a warning that cargo install vacuum fetches an unrelated crate of the same name (a spaceflight CLI). CI gains a nix flake check job that also smoke-tests the built binary.

Verification

nix build produces a working binary plus the Info manual; nix flake check passes; nix develop carries the full toolchain; the NixOS module was verified by evaluating it in a real nixosSystem, not by inspection.

Guix is not installed on this host, so manifest.scm and packaging/guix.scm are syntax-checked only — parsed with guile with the gexp reader extensions registered, matching a known-good sibling file structurally. Their package and module names have not been exercised against a real Guix.

Note the release path remains blocked until a v0.1.0 tag is cut and the real hashes filled in; that is deliberate and marked TODO(release).

🤖 Generated with Claude Code

https://claude.ai/code/session_01FCJbPm4FWS99y9utbUe13z

None of the three packaging definitions could build. Each fetches a v0.1.0 git
tag that does not exist, with placeholder hashes, so Vacuum could not be
installed from a package on any system. There was no flake, and the README
offered only `cargo install --path`.

packaging/default.nix now takes optional src and version arguments and reads
its dependencies from the committed Cargo.lock. The flake passes src = self, so
a checkout builds today without waiting for a release tag, and there is no
vendor hash to regenerate on every dependency bump. One definition serves both
the flake and a release build rather than the two drifting apart.

The flake exposes the package, an app, a check, development shells, and a NixOS
module offering programs.vacuum.enable. The default shell supplies rustc, cargo,
clippy, rustfmt, rust-analyzer, mold, reuse, and texinfo from nixpkgs rather
than rustup, which would download a second complete toolchain for a pin this
workspace does not need; a docs shell adds TeX Live for `make pdf` only.

manifest.scm gives Guix users the same environment. It names packages by
specification so it does not have to track which module each currently lives in.
packaging/guix.scm grows the Texinfo manual build and install-info step that
Standard section 8.6 requires, but it still cannot build: cargo-build-system
resolves dependencies through #:cargo-inputs and this workspace locks 191
crates, a list generated with `guix import crate -r vacuum` at release time.
That limitation is stated in the file, the README, and the manual rather than
left for someone to discover, and the Guix instructions lead with the route that
works today.

The README and the manual gain installation sections for Nix, NixOS, Guix,
Arch, and source, including a warning that `cargo install vacuum` fetches an
unrelated crate of the same name. CI gains a job running `nix flake check` and
smoke-testing the built binary.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FCJbPm4FWS99y9utbUe13z
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@UnbreakableMJ
UnbreakableMJ merged commit fdd1363 into main Aug 6, 2026
3 checks passed
@UnbreakableMJ
UnbreakableMJ deleted the feature/nix-guix-packaging branch August 6, 2026 11:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant