[M8] reusable libraries: install layout + cargoxx-path deps

This commit is contained in:
2026-05-17 18:13:15 +00:00
parent fdf97861a4
commit e6c39914b3
25 changed files with 932 additions and 21 deletions

View File

@@ -60,6 +60,7 @@
lock = builtins.fromTOML (builtins.readFile (src + "/Cargoxx.lock"));
isDep = p: p ? linkdb_source;
isRoot = p: !(isDep p);
isCargoxxSource = p: (p.source_kind or "") != "";
root = builtins.head (builtins.filter isRoot lock.package);
depPkgs = builtins.filter isDep lock.package;
pname = if name != null then name else root.name;
@@ -68,11 +69,17 @@
(builtins.getFlake "github:NixOS/nixpkgs/${rev}")
.legacyPackages.${system};
# cargoxx-path deps recurse into buildCppPackage on the sibling
# source tree; the result joins buildInputs so the consumer's
# find_package(<dep> CONFIG REQUIRED) resolves via CMAKE_PREFIX_PATH.
evalDep = p:
let rev = if (p ? nixpkgs_rev) && (p.nixpkgs_rev != "")
then p.nixpkgs_rev
else lock.nixpkgs_rev;
in (pkgsAt rev).${p.nixpkgs_attr};
if (p.source_kind or "") == "cargoxx-path" then
buildCppPackage { src = src + ("/" + p.source_path); }
else
let rev = if (p ? nixpkgs_rev) && (p.nixpkgs_rev != "")
then p.nixpkgs_rev
else lock.nixpkgs_rev;
in (pkgsAt rev).${p.nixpkgs_attr};
depInputs = map evalDep depPkgs;
@@ -87,12 +94,18 @@
mkDepTomlEntry = p:
let
derivation = evalDep p;
rev = if (p ? nixpkgs_rev) && (p.nixpkgs_rev != "")
# For cargoxx-source deps we don't have a nixpkgs rev/attr — the
# vendor.toml entry just needs a name + store_path so cargoxx's
# offline pathway can find the dep's installed prefix.
isPath = (p.source_kind or "") == "cargoxx-path";
attr = if isPath then "" else p.nixpkgs_attr;
rev = if isPath then ""
else if (p ? nixpkgs_rev) && (p.nixpkgs_rev != "")
then p.nixpkgs_rev else lock.nixpkgs_rev;
in ''
[[dep]]
name = "${p.name}"
nixpkgs_attr = "${p.nixpkgs_attr}"
nixpkgs_attr = "${attr}"
nixpkgs_rev = "${rev}"
store_path = "${derivation}"
'';
@@ -121,9 +134,7 @@
cargoxx build --release --offline --vendor ${vendorToml}
'';
installPhase = ''
mkdir -p $out/bin
cp build/release/${pname} $out/bin/ 2>/dev/null || \
cp build/release/${pname}_bin $out/bin/${pname}
cmake --install build/release --prefix $out
'';
hardeningDisable = [ "all" ];
};