Add automatic C library input propagation workaround

Automatically adds Nix C library build inputs based on which nix-bindings
crates are dependencies, working around missing native input propagation
in nix-cargo-integration.

The workaround inspects the dreamLock to detect:
- If the crate being built is a nix-bindings crate (adds its own inputs)
- Direct dependencies on nix-bindings crates (adds their inputs)

The mapping is recursive via lazyAttrsOf, so depending on nix-bindings-flake
automatically brings in transitive C library dependencies.

Downstream consumers can extend the mapping for their own multi-crate
workspaces where crate A depends on crate B which depends on nix-bindings.
This commit is contained in:
Robert Hensing 2026-01-13 15:25:57 +01:00
parent dbb00333b1
commit 6110414520
3 changed files with 156 additions and 66 deletions

54
nci.nix
View file

@ -1,24 +1,8 @@
{
perSystem =
{
config,
pkgs,
...
}:
{ config, ... }:
let
cfg = config.nix-bindings-rust;
nixLibs =
if cfg.nixPackage ? libs then
cfg.nixPackage.libs
else
# Fallback for older Nix versions without split libs
{
nix-util-c = cfg.nixPackage;
nix-store-c = cfg.nixPackage;
nix-expr-c = cfg.nixPackage;
nix-fetchers-c = cfg.nixPackage;
nix-flake-c = cfg.nixPackage;
};
in
{
# https://flake.parts/options/nix-cargo-integration
@ -31,7 +15,7 @@
drvConfig = {
imports = [
# Downstream projects import this into depsDrvConfig instead
config.nix-bindings-rust.nciBuildConfig
cfg.nciBuildConfig
];
# Extra settings for running the tests
mkDerivation = {
@ -65,39 +49,5 @@
};
};
};
# Per-crate configuration: only provide the specific Nix libs each crate needs
# FIXME should use propagatedBuildInputs
nci.crates.nix-bindings-bdwgc-sys.drvConfig.mkDerivation.buildInputs = [
pkgs.boehmgc
];
nci.crates.nix-bindings-util-sys.drvConfig.mkDerivation.buildInputs = [
nixLibs.nix-util-c
];
nci.crates.nix-bindings-util.drvConfig.mkDerivation.buildInputs =
config.nci.crates.nix-bindings-util-sys.drvConfig.mkDerivation.buildInputs;
nci.crates.nix-bindings-store-sys.drvConfig.mkDerivation.buildInputs =
config.nci.crates.nix-bindings-util-sys.drvConfig.mkDerivation.buildInputs
++ [ nixLibs.nix-store-c ];
nci.crates.nix-bindings-store.drvConfig.mkDerivation.buildInputs =
config.nci.crates.nix-bindings-store-sys.drvConfig.mkDerivation.buildInputs;
nci.crates.nix-bindings-expr-sys.drvConfig.mkDerivation.buildInputs =
config.nci.crates.nix-bindings-store-sys.drvConfig.mkDerivation.buildInputs
++ [
nixLibs.nix-expr-c
pkgs.boehmgc
];
nci.crates.nix-bindings-expr.drvConfig.mkDerivation.buildInputs =
config.nci.crates.nix-bindings-expr-sys.drvConfig.mkDerivation.buildInputs;
nci.crates.nix-bindings-fetchers-sys.drvConfig.mkDerivation.buildInputs =
config.nci.crates.nix-bindings-expr-sys.drvConfig.mkDerivation.buildInputs
++ [ nixLibs.nix-fetchers-c ];
nci.crates.nix-bindings-fetchers.drvConfig.mkDerivation.buildInputs =
config.nci.crates.nix-bindings-fetchers-sys.drvConfig.mkDerivation.buildInputs;
nci.crates.nix-bindings-flake-sys.drvConfig.mkDerivation.buildInputs =
config.nci.crates.nix-bindings-fetchers-sys.drvConfig.mkDerivation.buildInputs
++ [ nixLibs.nix-flake-c ];
nci.crates.nix-bindings-flake.drvConfig.mkDerivation.buildInputs =
config.nci.crates.nix-bindings-flake-sys.drvConfig.mkDerivation.buildInputs;
};
}