diff options
Diffstat (limited to 'pkgs/servers/sql')
-rw-r--r-- | pkgs/servers/sql/postgresql/default.nix | 211 | ||||
-rw-r--r-- | pkgs/servers/sql/postgresql/ext/plv8/default.nix | 1 | ||||
-rw-r--r-- | pkgs/servers/sql/postgresql/ext/postgis.nix | 2 |
3 files changed, 151 insertions, 63 deletions
diff --git a/pkgs/servers/sql/postgresql/default.nix b/pkgs/servers/sql/postgresql/default.nix index 38f3dfb96f2a..1177024b53db 100644 --- a/pkgs/servers/sql/postgresql/default.nix +++ b/pkgs/servers/sql/postgresql/default.nix @@ -14,17 +14,28 @@ let , this, self, newScope, buildEnv # source specification - , version, hash, psqlSchema, + , version, hash, psqlSchema # for tests - nixosTests, thisAttr + , nixosTests, thisAttr + + # JIT + , jitSupport ? false + , nukeReferences, patchelf, llvmPackages + , makeRustPlatform, buildPgxExtension, rustPlatform + + # detection of crypt fails when using llvm stdenv, so we add it manually + # for <13 (where it got removed: https://github.com/postgres/postgres/commit/c45643d618e35ec2fe91438df15abd4f3c0d85ca) + , libxcrypt }: let atLeast = lib.versionAtLeast version; + olderThan = lib.versionOlder version; lz4Enabled = atLeast "14"; zstdEnabled = atLeast "15"; - in stdenv.mkDerivation rec { + stdenv' = if jitSupport then llvmPackages.stdenv else stdenv; + in stdenv'.mkDerivation rec { pname = "postgresql"; inherit version; @@ -33,7 +44,7 @@ let inherit hash; }; - hardeningEnable = lib.optionals (!stdenv.cc.isClang) [ "pie" ]; + hardeningEnable = lib.optionals (!stdenv'.cc.isClang) [ "pie" ]; outputs = [ "out" "lib" "doc" "man" ]; setOutputFlags = false; # $out retains configureFlags :-/ @@ -45,18 +56,21 @@ let libxml2 icu ] + ++ lib.optionals (olderThan "13") [ libxcrypt ] + ++ lib.optionals jitSupport [ llvmPackages.llvm ] ++ lib.optionals lz4Enabled [ lz4 ] ++ lib.optionals zstdEnabled [ zstd ] ++ lib.optionals enableSystemd [ systemd ] ++ lib.optionals gssSupport [ libkrb5 ] - ++ lib.optionals (!stdenv.isDarwin) [ libossp_uuid ]; + ++ lib.optionals (!stdenv'.isDarwin) [ libossp_uuid ]; nativeBuildInputs = [ makeWrapper pkg-config - ]; + ] + ++ lib.optionals jitSupport [ llvmPackages.llvm.dev nukeReferences patchelf ]; - enableParallelBuilding = !stdenv.isDarwin; + enableParallelBuilding = !stdenv'.isDarwin; separateDebugInfo = true; @@ -65,7 +79,7 @@ let env.NIX_CFLAGS_COMPILE = "-I${libxml2.dev}/include/libxml2"; # Otherwise it retains a reference to compiler and fails; see #44767. TODO: better. - preConfigure = "CC=${stdenv.cc.targetPrefix}cc"; + preConfigure = "CC=${stdenv'.cc.targetPrefix}cc"; configureFlags = [ "--with-openssl" @@ -76,11 +90,12 @@ let "--with-system-tzdata=${tzdata}/share/zoneinfo" "--enable-debug" (lib.optionalString enableSystemd "--with-systemd") - (if stdenv.isDarwin then "--with-uuid=e2fs" else "--with-ossp-uuid") + (if stdenv'.isDarwin then "--with-uuid=e2fs" else "--with-ossp-uuid") ] ++ lib.optionals lz4Enabled [ "--with-lz4" ] ++ lib.optionals zstdEnabled [ "--with-zstd" ] ++ lib.optionals gssSupport [ "--with-gssapi" ] - ++ lib.optionals stdenv.hostPlatform.isRiscV [ "--disable-spinlocks" ]; + ++ lib.optionals stdenv'.hostPlatform.isRiscV [ "--disable-spinlocks" ] + ++ lib.optionals jitSupport [ "--with-llvm" ]; patches = [ ./patches/disable-resolve_symlinks.patch @@ -88,7 +103,7 @@ let ./patches/hardcode-pgxs-path.patch ./patches/specify_pkglibdir_at_runtime.patch ./patches/findstring.patch - ] ++ lib.optionals stdenv.isLinux [ + ] ++ lib.optionals stdenv'.isLinux [ (if atLeast "13" then ./patches/socketdir-in-run-13.patch else ./patches/socketdir-in-run.patch) ]; @@ -99,6 +114,13 @@ let postPatch = '' # Hardcode the path to pgxs so pg_config returns the path in $out substituteInPlace "src/common/config_info.c" --replace HARDCODED_PGXS_PATH "$out/lib" + + ${lib.optionalString jitSupport '' + # Force lookup of jit stuff in $out instead of $lib + substituteInPlace src/backend/jit/jit.c --replace pkglib_path \"$out/lib\" + substituteInPlace src/backend/jit/llvm/llvmjit.c --replace pkglib_path \"$out/lib\" + substituteInPlace src/backend/jit/llvm/llvmjit_inline.cpp --replace pkglib_path \"$out/lib\" + ''} ''; postInstall = @@ -109,27 +131,54 @@ let moveToOutput "lib/libecpg*" "$out" # Prevent a retained dependency on gcc-wrapper. - substituteInPlace "$out/lib/pgxs/src/Makefile.global" --replace ${stdenv.cc}/bin/ld ld + substituteInPlace "$out/lib/pgxs/src/Makefile.global" --replace ${stdenv'.cc}/bin/ld ld if [ -z "''${dontDisableStatic:-}" ]; then # Remove static libraries in case dynamic are available. for i in $out/lib/*.a $lib/lib/*.a; do name="$(basename "$i")" - ext="${stdenv.hostPlatform.extensions.sharedLibrary}" + ext="${stdenv'.hostPlatform.extensions.sharedLibrary}" if [ -e "$lib/lib/''${name%.a}$ext" ] || [ -e "''${i%.a}$ext" ]; then rm "$i" fi done fi + + ${lib.optionalString jitSupport '' + # Move the bitcode and libllvmjit.so library out of $lib; otherwise, every client that + # depends on libpq.so will also have libLLVM.so in its closure too, bloating it + moveToOutput "lib/bitcode" "$out" + moveToOutput "lib/llvmjit*" "$out" + + # In the case of JIT support, prevent a retained dependency on clang-wrapper + substituteInPlace "$out/lib/pgxs/src/Makefile.global" --replace ${self.llvmPackages.stdenv.cc}/bin/clang clang + nuke-refs $out/lib/llvmjit_types.bc $(find $out/lib/bitcode -type f) + + # Stop out depending on the default output of llvm + substituteInPlace $out/lib/pgxs/src/Makefile.global \ + --replace ${self.llvmPackages.llvm.out}/bin "" \ + --replace '$(LLVM_BINPATH)/' "" + + # Stop out depending on the -dev output of llvm + substituteInPlace $out/lib/pgxs/src/Makefile.global \ + --replace ${self.llvmPackages.llvm.dev}/bin/llvm-config llvm-config \ + --replace -I${self.llvmPackages.llvm.dev}/include "" + + # Stop lib depending on the -dev output of llvm + rpath=$(patchelf --print-rpath $out/lib/llvmjit.so) + nuke-refs -e $out $out/lib/llvmjit.so + # Restore the correct rpath + patchelf $out/lib/llvmjit.so --set-rpath "$rpath" + ''} ''; - postFixup = lib.optionalString (!stdenv.isDarwin && stdenv.hostPlatform.libc == "glibc") + postFixup = lib.optionalString (!stdenv'.isDarwin && stdenv'.hostPlatform.libc == "glibc") '' # initdb needs access to "locale" command from glibc. wrapProgram $out/bin/initdb --prefix PATH ":" ${glibc.bin}/bin ''; - doCheck = !stdenv.isDarwin; + doCheck = !stdenv'.isDarwin; # autodetection doesn't seem to able to find this, but it's there. checkTarget = "check"; @@ -138,7 +187,7 @@ let # ! ERROR: could not load library "/build/postgresql-11.5/tmp_install/nix/store/...-postgresql-11.5-lib/lib/libpqwalreceiver.so": Error loading shared library libpq.so.5: No such file or directory (needed by /build/postgresql-11.5/tmp_install/nix/store/...-postgresql-11.5-lib/lib/libpqwalreceiver.so) # See also here: # https://git.alpinelinux.org/aports/tree/main/postgresql/disable-broken-tests.patch?id=6d7d32c12e073a57a9e5946e55f4c1fbb68bd442 - if stdenv.hostPlatform.isMusl then '' + if stdenv'.hostPlatform.isMusl then '' substituteInPlace src/test/regress/parallel_schedule \ --replace "subscription" "" \ --replace "object_address" "" @@ -146,13 +195,23 @@ let doInstallCheck = false; # needs a running daemon? - disallowedReferences = [ stdenv.cc ]; + disallowedReferences = [ stdenv'.cc ]; passthru = { - inherit readline psqlSchema; + inherit readline psqlSchema jitSupport; pkgs = let - scope = { postgresql = this; }; + scope = { + postgresql = this; + stdenv = stdenv'; + buildPgxExtension = buildPgxExtension.override { + stdenv = stdenv'; + rustPlatform = makeRustPlatform { + stdenv = stdenv'; + inherit (rustPlatform.rust) rustc cargo; + }; + }; + }; newSelf = self // scope; newSuper = { callPackage = newScope (scope // this.pkgs); }; in import ./packages.nix newSelf newSuper; @@ -163,15 +222,33 @@ let } this.pkgs; - tests.postgresql = nixosTests.postgresql-wal-receiver.${thisAttr}; + tests = { + postgresql = nixosTests.postgresql-wal-receiver.${thisAttr}; + } // lib.optionalAttrs jitSupport { + postgresql-jit = nixosTests.postgresql-jit.${thisAttr}; + }; + } // lib.optionalAttrs jitSupport { + inherit (llvmPackages) llvm; }; meta = with lib; { homepage = "https://www.postgresql.org"; description = "A powerful, open source object-relational database system"; license = licenses.postgresql; - maintainers = with maintainers; [ thoughtpolice danbst globin marsam ivan ]; + maintainers = with maintainers; [ thoughtpolice danbst globin marsam ivan ma27 ]; platforms = platforms.unix; + + # JIT support doesn't work with cross-compilation. It is attempted to build LLVM-bytecode + # (`%.bc` is the corresponding `make(1)`-rule) for each sub-directory in `backend/` for + # the JIT apparently, but with a $(CLANG) that can produce binaries for the build, not the + # host-platform. + # + # I managed to get a cross-build with JIT support working with + # `depsBuildBuild = [ llvmPackages.clang ] ++ buildInputs`, but considering that the + # resulting LLVM IR isn't platform-independent this doesn't give you much. + # In fact, I tried to test the result in a VM-test, but as soon as JIT was used to optimize + # a query, postgres would coredump with `Illegal instruction`. + broken = jitSupport && (stdenv.hostPlatform != stdenv.buildPlatform); }; }; @@ -204,50 +281,60 @@ let passthru.psqlSchema = postgresql.psqlSchema; }; -in self: { + mkPackages = self: { + postgresql_11 = self.callPackage generic { + version = "11.19"; + psqlSchema = "11.1"; # should be 11, but changing it is invasive + hash = "sha256-ExCeK3HxE5QFwnIB2jczphrOcu4cIo2cnwMg4GruFMI="; + this = self.postgresql_11; + thisAttr = "postgresql_11"; + inherit self; + }; - postgresql_11 = self.callPackage generic { - version = "11.19"; - psqlSchema = "11.1"; # should be 11, but changing it is invasive - hash = "sha256-ExCeK3HxE5QFwnIB2jczphrOcu4cIo2cnwMg4GruFMI="; - this = self.postgresql_11; - thisAttr = "postgresql_11"; - inherit self; - }; + postgresql_12 = self.callPackage generic { + version = "12.14"; + psqlSchema = "12"; + hash = "sha256-eFYQI304LIQtNW40cTjljAb/6uJA5swLUqxevMMNBD4="; + this = self.postgresql_12; + thisAttr = "postgresql_12"; + inherit self; + }; - postgresql_12 = self.callPackage generic { - version = "12.14"; - psqlSchema = "12"; - hash = "sha256-eFYQI304LIQtNW40cTjljAb/6uJA5swLUqxevMMNBD4="; - this = self.postgresql_12; - thisAttr = "postgresql_12"; - inherit self; - }; + postgresql_13 = self.callPackage generic { + version = "13.10"; + psqlSchema = "13"; + hash = "sha256-W7z1pW2FxE86iwWPtGhi/0nLyRg00H4pXQLm3jwhbfI="; + this = self.postgresql_13; + thisAttr = "postgresql_13"; + inherit self; + }; - postgresql_13 = self.callPackage generic { - version = "13.10"; - psqlSchema = "13"; - hash = "sha256-W7z1pW2FxE86iwWPtGhi/0nLyRg00H4pXQLm3jwhbfI="; - this = self.postgresql_13; - thisAttr = "postgresql_13"; - inherit self; - }; + postgresql_14 = self.callPackage generic { + version = "14.7"; + psqlSchema = "14"; + hash = "sha256-zvYPAJj6gQHBVG9CVORbcir1QxM3lFs3ryBwB2MNszE="; + this = self.postgresql_14; + thisAttr = "postgresql_14"; + inherit self; + }; - postgresql_14 = self.callPackage generic { - version = "14.7"; - psqlSchema = "14"; - hash = "sha256-zvYPAJj6gQHBVG9CVORbcir1QxM3lFs3ryBwB2MNszE="; - this = self.postgresql_14; - thisAttr = "postgresql_14"; - inherit self; + postgresql_15 = self.callPackage generic { + version = "15.2"; + psqlSchema = "15"; + hash = "sha256-maIXH8PWtbX1a3V6ejy4XVCaOOQnOAXe8jlB7SuEaMc="; + this = self.postgresql_15; + thisAttr = "postgresql_15"; + inherit self; + }; }; - postgresql_15 = self.callPackage generic { - version = "15.2"; - psqlSchema = "15"; - hash = "sha256-maIXH8PWtbX1a3V6ejy4XVCaOOQnOAXe8jlB7SuEaMc="; - this = self.postgresql_15; - thisAttr = "postgresql_15"; - inherit self; - }; -} +in self: + let packages = mkPackages self; in + packages + // self.lib.mapAttrs' + (attrName: postgres: self.lib.nameValuePair "${attrName}_jit" (postgres.override rec { + jitSupport = true; + thisAttr = "${attrName}_jit"; + this = self.${thisAttr}; + })) + packages diff --git a/pkgs/servers/sql/postgresql/ext/plv8/default.nix b/pkgs/servers/sql/postgresql/ext/plv8/default.nix index 931a5deb40f1..be743401f2c9 100644 --- a/pkgs/servers/sql/postgresql/ext/plv8/default.nix +++ b/pkgs/servers/sql/postgresql/ext/plv8/default.nix @@ -138,5 +138,6 @@ stdenv.mkDerivation (finalAttrs: { maintainers = with maintainers; [ marsam ]; platforms = [ "x86_64-linux" ]; license = licenses.postgresql; + broken = postgresql.jitSupport; }; }) diff --git a/pkgs/servers/sql/postgresql/ext/postgis.nix b/pkgs/servers/sql/postgresql/ext/postgis.nix index 154cdf0c5a2f..18ac6bfc2a0f 100644 --- a/pkgs/servers/sql/postgresql/ext/postgis.nix +++ b/pkgs/servers/sql/postgresql/ext/postgis.nix @@ -26,7 +26,7 @@ stdenv.mkDerivation rec { buildInputs = [ libxml2 postgresql geos proj gdal json_c protobufc ] ++ lib.optional stdenv.isDarwin libiconv; - nativeBuildInputs = [ perl pkg-config ]; + nativeBuildInputs = [ perl pkg-config ] ++ lib.optional postgresql.jitSupport postgresql.llvm; dontDisableStatic = true; # postgis config directory assumes /include /lib from the same root for json-c library |