From 85fbb233a734cfb29638459d4fb04fb70a5a093a Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Thu, 25 Jan 2024 21:52:18 +0100 Subject: [PATCH] nix: Build only libpq instead of full postgresql package --- default.nix | 2 +- nix/libpq.nix | 57 +++++++++++++++++++++++++++++ nix/overlays/default.nix | 2 +- nix/overlays/haskell-packages.nix | 9 +++-- nix/overlays/postgresql-default.nix | 5 --- nix/overlays/postgresql-libpq.nix | 6 +++ nix/static.nix | 19 ++-------- 7 files changed, 74 insertions(+), 26 deletions(-) create mode 100644 nix/libpq.nix delete mode 100644 nix/overlays/postgresql-default.nix create mode 100644 nix/overlays/postgresql-libpq.nix diff --git a/default.nix b/default.nix index d7da48e7e..6cf227b66 100644 --- a/default.nix +++ b/default.nix @@ -36,7 +36,7 @@ let allOverlays.build-toolbox allOverlays.checked-shell-script allOverlays.gitignore - allOverlays.postgresql-default + allOverlays.postgresql-libpq allOverlays.postgresql-legacy allOverlays.postgresql-future allOverlays.postgis diff --git a/nix/libpq.nix b/nix/libpq.nix new file mode 100644 index 000000000..6630ce5f8 --- /dev/null +++ b/nix/libpq.nix @@ -0,0 +1,57 @@ +# Creating a separate libpq package is is discussed in +# https://github.com/NixOS/nixpkgs/issues/61580, but nixpkgs has not moved +# forward, yet. +# This package is passed to postgresql-libpq (haskell) which needs to be +# cross-compiled to the static build and possibly other architectures as +# as well. To reduce the number of dependencies that need to be built with +# it, this derivation focuses on building the client libraries only. No +# server, no tests. +{ stdenv +, lib +, openssl +, zlib +, libkrb5 +, icu +, postgresql +, pkg-config +, tzdata +}: + +stdenv.mkDerivation { + pname = "libpq"; + inherit (postgresql) src version; + + configureFlags = [ + "--without-gssapi" + "--without-readline" + "--with-openssl" + "--with-system-tzdata=${tzdata}/share/zoneinfo" + ]; + + nativeBuildInputs = [ pkg-config tzdata ]; + buildInputs = [ openssl zlib ]; + + buildFlags = [ "submake-libpq" "submake-libpgport" ]; + + installPhase = '' + runHook preInstall + + make -C src/bin/pg_config install + make -C src/common install + make -C src/include install + make -C src/interfaces/libpq install + make -C src/port install + + rm -rfv $out/share + + runHook postInstall + ''; + + outputs = [ "out" ]; + + meta = with lib; { + homepage = "https://www.postgresql.org"; + description = "Client API library for PostgreSQL"; + license = licenses.postgresql; + }; +} diff --git a/nix/overlays/default.nix b/nix/overlays/default.nix index 8b0b3af4f..434ccc72d 100644 --- a/nix/overlays/default.nix +++ b/nix/overlays/default.nix @@ -4,7 +4,7 @@ gitignore = import ./gitignore.nix; haskell-packages = import ./haskell-packages.nix; postgis = import ./postgis.nix; - postgresql-default = import ./postgresql-default.nix; + postgresql-libpq = import ./postgresql-libpq.nix; postgresql-legacy = import ./postgresql-legacy.nix; postgresql-future = import ./postgresql-future.nix; slocat = import ./slocat.nix; diff --git a/nix/overlays/haskell-packages.nix b/nix/overlays/haskell-packages.nix index c94db37ed..b8515170f 100644 --- a/nix/overlays/haskell-packages.nix +++ b/nix/overlays/haskell-packages.nix @@ -1,4 +1,4 @@ -{ compiler, extraOverrides ? (final: prev: { }) }: +{ compiler }: self: super: let @@ -41,11 +41,14 @@ let # Marked as broken (?) fuzzyset = lib.markUnbroken prev.fuzzyset; - postgresql-libpq = lib.dontCheck prev.postgresql-libpq_0_10_0_0; + postgresql-libpq = lib.dontCheck + (prev.postgresql-libpq_0_10_0_0.override { + postgresql = super.libpq; + }); hasql-pool = lib.dontCheck prev.hasql-pool_0_10; - } // extraOverrides final prev; + }; in { haskell = diff --git a/nix/overlays/postgresql-default.nix b/nix/overlays/postgresql-default.nix deleted file mode 100644 index 2d379a646..000000000 --- a/nix/overlays/postgresql-default.nix +++ /dev/null @@ -1,5 +0,0 @@ -self: super: -# Overlay that sets the default version of PostgreSQL. -{ - postgresql = super.postgresql_15; -} diff --git a/nix/overlays/postgresql-libpq.nix b/nix/overlays/postgresql-libpq.nix new file mode 100644 index 000000000..c08a07ecb --- /dev/null +++ b/nix/overlays/postgresql-libpq.nix @@ -0,0 +1,6 @@ +self: super: +{ + libpq = super.callPackage ../libpq.nix { + postgresql = super.postgresql_15; + }; +} diff --git a/nix/static.nix b/nix/static.nix index 64a037d1e..636134208 100644 --- a/nix/static.nix +++ b/nix/static.nix @@ -12,21 +12,6 @@ let inherit (pkgsCross) pkgsStatic; inherit (pkgsStatic.haskell) lib; - # postgresql doesn't build in the fully static overlay - but the default - # derivation is built with static libraries anyway. - libpq = (pkgsCross.postgresql.override { - # disable server-side only stuff to improve compilation times - enableSystemd = false; - jitSupport = false; - - # disable gssapi support, because it leads to linking errors - gssSupport = false; - }).overrideAttrs (finalAttrs: prevAttrs: { - dontDisableStatic = true; - # Tests fail for initdb and other server-side code which we don't care about - doCheck = false; - }); - packagesStatic = pkgsStatic.haskell.packages."${compiler}".override (old: { ghc = pkgsStatic.pkgsBuildHost.haskell.compiler."${compiler}".override { @@ -40,7 +25,9 @@ let overrides = pkgs.lib.composeExtensions old.overrides (final: prev: { postgresql-libpq = (prev.postgresql-libpq.override { - postgresql = libpq; + # postgresql doesn't build in the fully static overlay - but the default + # derivation is built with static libraries anyway. + postgresql = pkgsCross.libpq; }).overrideAttrs (finalAttrs: prevAttrs: { # Using use-pkg-config flag, because pg_config won't work when cross-compiling configureFlags = prevAttrs.configureFlags ++ [ "-fuse-pkg-config" ];