Nix package for libpure and the vetted Pure modules
The Pure runtime pg_pure embeds (libpure) is not in nixpkgs, and it must be
built from the gburd/pure-lang fork against a recent LLVM. This flake does
that build once, so a host that wants to run pg_pure does not have to maintain
a bespoke LLVM build by hand. (This is the pg.ddx.io evaluation’s top
operational blocker; see pg_pure’s ROADMAP phase 2.A.)
What it provides
packages.libpure– the Pure runtime and interpreter, LLVM 21, with its LLVM symbols hidden so it coexists with a PostgreSQL whose own JIT links a different LLVM (DESIGN.md section 5).packages.pure-gsl– the GSL bindings, includinggsl::linalg::cholesky_solve(the compiled SPD solve pg_pure exposes).packages.pure-with-modules(the default) – libpure and the modules merged into one prefix, which is what you pointPURE_PREFIX/PURELIBat.devShells.default– a shell withpureonPATHandPURELIBset.
Use it
Build the merged prefix:
nix build github:gburd/pg_pure?dir=nix#pure-with-modules
# ./result is a prefix with bin/pure, lib/libpure.so, lib/pure/gsl/...
Try the compiled solve interactively:
nix develop github:gburd/pg_pure?dir=nix
$ echo 'using gsl::linalg; gsl::linalg::cholesky_solve (dmatrix {4.0,1.0;1.0,3.0}) (dmatrix {1.0;2.0});' | pure -i -q
{0.0909090909090909,0.636363636363636}
Build pg_pure against it (from the repo root, with a PostgreSQL’s pg_config):
make PG_CONFIG=/path/to/pg_config PURE_PREFIX="$(nix build --no-link --print-out-paths .#pure-with-modules)"
Notes
- Pin the fork: the
pure-langinput tracks thelibpure-embeddablebranch. Runnix flake update pure-langto move to a newer fork commit, then re-qualify pg_pure against it. - Known cosmetic warning: loading a gsl module prints
gsl/common.pure, line 12: libgsl: cannot open shared object file. This is the fork module’s redundant explicitusing "lib:libgsl"; the module still loads (its gsl.so carries the correct RPATH) and results are correct. The fix belongs in the fork’s common.pure, not here. - Because the libraries are built against the Nix glibc, the cleanest result is when pg_pure is also built under Nix (or at least run against the Nix loader). Mixing a Nix-built libpure with a host-built server can surface a glibc version mismatch; build the whole stack under one toolchain.