Skip to content

Conversation

@yvan-sraka
Copy link
Collaborator

This change adds crane support to the existing pgrx extension builder, enabling better incremental build performance and caching for pg_jsonschema, pg_graphql, and wrappers extensions. Crane separates dependency builds from main crate builds, allowing dependencies to be cached independently.

The unified buildPgrxExtension.nix now accepts an optional craneLib parameter. When provided, it uses crane's two-phase build (buildDepsOnly + buildPackage). Otherwise, it falls back to rustPlatform.buildRustPackage. Both paths share the same build and install logic, avoiding code duplication.

Two compatibility issues between crane and rustPlatform are handled. First, crane requires Cargo.lock at the source root while rustPlatform accepts external lockFile paths. The builder copies external lock files into the source directory when using crane. Second, crane's vendorCargoDeps uses builtins.fetchGit which only fetches the default branch, failing when git dependencies reference non-default branches. The builder uses rustPlatform.importCargoLock with allowBuiltinFetchGit instead, which searches all refs.

Extensions opt into crane builds by passing useCrane = true to mkPgrxExtension. All existing build parameters remain compatible with both backends.

@yvan-sraka yvan-sraka requested a review from jfroche December 9, 2025 22:11
@yvan-sraka yvan-sraka self-assigned this Dec 9, 2025
@yvan-sraka yvan-sraka force-pushed the feat/use-crane branch 2 times, most recently from 906fbe3 to 8f0dffb Compare December 10, 2025 21:32
@yvan-sraka yvan-sraka closed this Dec 10, 2025
@yvan-sraka yvan-sraka reopened this Dec 10, 2025
@yvan-sraka yvan-sraka force-pushed the feat/use-crane branch 3 times, most recently from d95ecff to 38ead9e Compare December 10, 2025 22:27
jfroche and others added 20 commits December 11, 2025 00:18
These overlay packages will be removed once the extensions are updated
to use the new `buildPgrxExtension` function.
The previously used version was failing to build:

/build/source/src/common/get_check_data.c: In function 'pgr_SPI_getText':
/build/source/src/common/get_check_data.c:307:28: error: passing argument 1 of 'DatumGetCString' makes integer from pointer without a cast [-Wint-conversion]
  307 |     return DatumGetCString(SPI_getvalue(*tuple, *tupdesc, info.colNumber));
      |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      |                            |
      |                            char *
In file included from /build/source/include/c_common/postgres_connection.h:29,
                 from /build/source/src/common/get_check_data.c:27:
/nix/store/nn6vpjqlsxxmynwcrsib9agb3hpr5cqj-postgresql-17.4/include/server/postgres.h:335:23: note: expected 'Datum' {aka 'long unsigned int'} but argument is of type 'char *'
  335 | DatumGetCString(Datum X)
      |                 ~~~~~~^
make[2]: *** [src/common/CMakeFiles/common.dir/build.make:149: src/common/CMakeFiles/common.dir/get_check_data.c.o] Error 1
We cannot use nodejs.libv8 as it is too new for plv8 3.1.
We will be able to use it with plv8 3.2.
dbmate 2.27 is now using a varchar for the version column in the
schema_migrations table.

See amacneil/dbmate#641
yvan-sraka and others added 22 commits December 11, 2025 00:18
Updated postgis.nix to use nixpkgs sfcgal instead of our custom package,
eliminating the need to maintain a separate sfcgal build definition.
pg_net requires an older version of curl (pinned from nixpkgs commit
a76c4553d7e741e17f289224eda135423de0491d) to resolve build compatibility issues.
Updated cargo-pgrx buildPgrxExtension with rustc wrapper to handle empty
postmaster_stub.rs files that cause duplicate symbol errors.
(first two filenames are `` and
`/build/tmp.*/postmaster_stubs/nix/store/*/bin/postmaster_stub.rs`)

pg_jsonschema cargo checks fails on specific versions (0.2.0, 0.3.1, 0.3.3).
Remove deprecated functions that were removed in newer pgrouting versions
(_pgr_betweennesscentrality and _pgr_contractionhierarchies).
Improves reproducibility and avoids evaluation-time network access by
using a proper flake input instead of fetchTarball for the older nixpkgs
needed by pg_net and plv8.
…64-darwin

Version 0.19.5 has a dangling pointer issue in src/core.c:177 that causes
compilation to fail on aarch64-darwin with newer clang versions. This adds
-Wno-error=dangling-assignment to allow compilation to proceed.

The flag is restricted to aarch64-darwin only since GCC on Linux doesn't
recognize this warning option.
Add -headerpad_max_install_names linker flag to prevent 'install_name_tool:
changing install names or rpaths can't be redone' errors on macOS. This
allocates sufficient header space for install_name_tool to modify the
shared library during post-install processing.
… extensions

Test assertions were inconsistent: expecting {version}.so and {extension_name}-{version}.so
patterns while actual libraries use {lib_name}-{version}.so (e.g. pg_partman_bgw-5.3.1.so,
timescaledb-loader-2.16.1.so). Updated PostgresExtensionTest to accept Optional[str] lib_name
parameter and use consistent {lib_name}-{version}.so assertions throughout.

Added missing timescaledb-loader.so symlink creation and updated the switch script to
maintain both symlinks when switching versions.

Fixes 'Expected timescaledb version 2.16.1, but found timescaledb-loader-2.16.1.so' and
'Expected pg_partman version 5.3.1, but found pg_partman_bgw-5.3.1.so' test failures.
Use text instead of character varying since varchar without length
constraint is equivalent to text in PostgreSQL and provides better
semantic meaning.
Use overlay instead of passing full nixpkgs-oldstable to avoid exposing
entire old nixpkgs attribute set. Now provides specific packages
(curl_8_4, v8_oldstable) through overlay.
Keep revision support that was accidentally simplified during nixpkgs update.
Restores conditional logic to support building orioledb from specific git
revision hashes instead of only tags.
These files were moved to subdirectories and the old .nix files should be
removed since they were moved to new directory structure with default.nix files.
Remove nixpkgs-go124 dependency since current nixpkgs has Go 1.25.4
which is sufficient for packer. Remove nix-fast-build input as unused
and add follows directives to resolve duplicate dependencies.
Run flake-linter to eliminate duplicate dependencies, and remove unused
cargo-pgrx / rustc versions hashes.
Move pgrouting.nix to pgrouting/default.nix and groonga package to
pgroonga/groonga.nix. Update imports and fix relative paths for versions.json
and patch files.
Replace inline bash script generation with writeShellScriptBin for rustc
wrapper that filters empty postmaster_stub.rs arguments. Apply wrapper only
for pgrx < 0.12 since issue was fixed upstream in pgrx#1435 and pgrx#1441.
Move nixpkgs-oldstable import to a let binding to avoid importing it
three times...
Remove supabase-groonga from global flake packages and import it locally
in pgroonga extension instead. Other components access groonga via
pgroonga.passthru.groonga since groonga is only used by pgroonga.
@yvan-sraka yvan-sraka force-pushed the feat/use-crane branch 3 times, most recently from 655ece0 to 4665a3f Compare December 11, 2025 10:29
This change adds crane support to the existing pgrx extension builder, enabling
better incremental build performance and caching. The unified buildPgrxExtension.nix
accepts an optional craneLib parameter and uses crane's two-phase build pattern
(buildDepsOnly + buildPackage) when available, falling back to rustPlatform otherwise.

The key insight was that crane's modifiedSrc derivations created platform-specific
builds during evaluation, causing IFD cross-compilation failures. The solution removes
unnecessary source modifications and relies on extensions' existing postPatch mechanisms
to handle external Cargo.lock files. This prevents IFD issues while maintaining
crane's incremental build benefits.

For wrappers extension, the preConfigure script was enhanced to handle both legacy
table-style and modern inline Cargo.toml dependency formats, and conditionally skips
git URL modifications when using cargoVendorDir to prevent networking issues in
sandboxed builds.

pg_jsonschema and wrappers now use crane successfully, while pg_graphql remains on
rustPlatform due to git dependency versioning complexities that can be addressed
separately.
@yvan-sraka yvan-sraka force-pushed the update-nixpkgs branch 2 times, most recently from 4f0a68d to 328f4db Compare December 11, 2025 19:19
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.

4 participants