From 5034086fefe2f32bf95319cdd39aa62fc622e4bc Mon Sep 17 00:00:00 2001 From: osmaczko <33099791+osmaczko@users.noreply.github.com> Date: Mon, 27 Apr 2026 12:51:39 +0200 Subject: [PATCH] Chore/make nix build phase configurable (#3826) * nix: parameterize build flags with named args Expose `enablePostgres`, `enableNimDebugDlOpen`, and `chroniclesLogLevel` as arguments on `nix/default.nix`. Defaults preserve today's hardcoded behavior, so `nix build .#liblogosdelivery` with no overrides is a no-op change. Consume the package via `callPackage` in `flake.nix` so consumers can use `.override { ... }` without extra wrapping. * nix: link libstdc++ on Linux so consumers don't need patchelf Append `stdenv.cc.cc.lib` to `buildInputs` on Linux and add `-lstdc++` to the Nim `--passL` flags. Nix stdenv's fixupPhase will auto-inject `${stdenv.cc.cc.lib}/lib` into the output's RUNPATH, so downstream consumers can drop their patchelf step. macOS resolves the C++ stdlib via dyld/libc++ and is unaffected. * nix: bundle librln into the output for a self-contained package Copy the librln shared library (`librln.so` / `librln.dylib`) from the zerokit input into `$out/lib` and rewrite the internal reference in `liblogosdelivery`: - Darwin: set librln's install name to `@rpath/librln.dylib`, change the consumer's reference to match, and add `@loader_path` as an rpath. - Linux: add `$ORIGIN` to the rpath so `librln.so` resolves from the sibling directory, preserving the gcc-lib entry injected by the stdenv fixupPhase for libstdc++. The installed `liblogosdelivery` no longer carries a `/nix/store/...` absolute path to zerokit, so downstream consumers can ship the bundle as-is. --- flake.nix | 11 ++++++----- nix/default.nix | 51 +++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/flake.nix b/flake.nix index 31d5a120c..50b6dc0b5 100644 --- a/flake.nix +++ b/flake.nix @@ -56,13 +56,14 @@ packages = forAllSystems (system: let pkgs = pkgsFor system; - mkPkg = zerokitRln: import ./nix/default.nix { - inherit pkgs zerokitRln; + liblogosdelivery = pkgs.callPackage ./nix/default.nix { + inherit pkgs; src = ./.; + zerokitRln = zerokit.packages.${system}.rln; }; - in rec { - liblogosdelivery = mkPkg zerokit.packages.${system}.rln; - default = liblogosdelivery; + in { + inherit liblogosdelivery; + default = liblogosdelivery; } ); diff --git a/nix/default.nix b/nix/default.nix index 0d1de2ece..a9ea0f598 100644 --- a/nix/default.nix +++ b/nix/default.nix @@ -1,8 +1,22 @@ -{ pkgs, src, zerokitRln }: +{ pkgs +, src +, zerokitRln +, enablePostgres ? true +, enableNimDebugDlOpen ? true +, chroniclesLogLevel ? null +}: let deps = import ./deps.nix { inherit pkgs; }; + nimDefineArgs = pkgs.lib.concatStringsSep " \\\n " ( + [ "--define:disable_libbacktrace" ] + ++ pkgs.lib.optional enablePostgres "--define:postgres" + ++ pkgs.lib.optional enableNimDebugDlOpen "--define:nimDebugDlOpen" + ++ pkgs.lib.optional (chroniclesLogLevel != null) + "--define:chronicles_log_level=${toString chroniclesLogLevel}" + ); + # nat_traversal is excluded from the static pathArgs; it is handled # separately in buildPhase (its bundled C libs must be compiled first). otherDeps = builtins.removeAttrs deps [ "nat_traversal" ]; @@ -32,7 +46,8 @@ pkgs.stdenv.mkDerivation { which ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ pkgs.darwin.cctools ]; - buildInputs = [ zerokitRln ]; + buildInputs = [ zerokitRln ] + ++ pkgs.lib.optionals pkgs.stdenv.isLinux [ pkgs.stdenv.cc.cc.lib ]; buildPhase = '' export HOME=$TMPDIR @@ -60,10 +75,8 @@ pkgs.stdenv.mkDerivation { ${pathArgs} \ --path:$NAT_TRAV \ --path:$NAT_TRAV/src \ - --passL:"-L${zerokitRln}/lib -lrln" \ - --define:disable_libbacktrace \ - --define:postgres \ - --define:nimDebugDlOpen \ + --passL:"-L${zerokitRln}/lib -lrln${pkgs.lib.optionalString pkgs.stdenv.isLinux " -lstdc++"}" \ + ${nimDefineArgs} \ --out:build/liblogosdelivery.${libExt} \ --app:lib \ --threads:on \ @@ -81,10 +94,8 @@ pkgs.stdenv.mkDerivation { ${pathArgs} \ --path:$NAT_TRAV \ --path:$NAT_TRAV/src \ - --passL:"-L${zerokitRln}/lib -lrln" \ - --define:disable_libbacktrace \ - --define:postgres \ - --define:nimDebugDlOpen \ + --passL:"-L${zerokitRln}/lib -lrln${pkgs.lib.optionalString pkgs.stdenv.isLinux " -lstdc++"}" \ + ${nimDefineArgs} \ --out:build/liblogosdelivery.a \ --app:staticlib \ --threads:on \ @@ -97,9 +108,29 @@ pkgs.stdenv.mkDerivation { ''; installPhase = '' + runHook preInstall mkdir -p $out/lib $out/include cp build/liblogosdelivery.${libExt} $out/lib/ 2>/dev/null || true cp build/liblogosdelivery.a $out/lib/ 2>/dev/null || true cp liblogosdelivery/liblogosdelivery.h $out/include/ 2>/dev/null || true + runHook postInstall ''; + + # Bundle librln alongside liblogosdelivery so the output is self-contained. + # Use --add-rpath (not --set-rpath) so fixupPhase's stdenv RUNPATH injection + # for libstdc++ is preserved. + postInstall = + pkgs.lib.optionalString pkgs.stdenv.isDarwin '' + cp ${zerokitRln}/lib/librln.dylib $out/lib/ + chmod +w $out/lib/librln.dylib $out/lib/liblogosdelivery.dylib + install_name_tool -id @rpath/liblogosdelivery.dylib $out/lib/liblogosdelivery.dylib + install_name_tool -id @rpath/librln.dylib $out/lib/librln.dylib + old=$(otool -L $out/lib/liblogosdelivery.dylib | awk 'NR>1{print $1}' | grep librln) + install_name_tool -change "$old" @rpath/librln.dylib $out/lib/liblogosdelivery.dylib + install_name_tool -add_rpath @loader_path $out/lib/liblogosdelivery.dylib + '' + + pkgs.lib.optionalString pkgs.stdenv.isLinux '' + cp ${zerokitRln}/lib/librln.so $out/lib/ + patchelf --add-rpath '$ORIGIN' $out/lib/liblogosdelivery.so + ''; }