postgresql: implement opt-in JIT support
Closes #150801
Note: I decided against resuming directly on #150801 because the
conflict was too big (and resolving it seemed too error-prone to me).
Also the `this`-refactoring could be done in an easier manner, i.e. by
exposing JIT attributes with the correct configuration. More on that
below.
This patch creates variants of the `postgresql*`-packages with JIT[1]
support. Please note that a lot of the work was derived from previous
patches filed by other contributors, namely dasJ, andir and abbradar,
hence the co-authored-by tags below.
Effectively, the following things have changed:
* For JIT variants an LLVM-backed stdenv with clang is now used as
suggested by dasJ[2]. We need LLVM and CLang[3] anyways to build the
JIT-part, so no need to mix this up with GCC's stdenv. Also, using the
`dev`-output of LLVM and clang's stdenv for building (and adding llvm
libs as build-inputs) seems more cross friendly to me (which will
become useful when cross-building for JIT-variants will actually be
supported).
* Plugins inherit the build flags from the Makefiles in
`$out/lib/pgxs/src` (e.g. `-Werror=unguarded-availability-new`). Since
some of the flags are clang-specific (and stem from the use of the
CLang stdenv) and don't work on gcc, the stdenv of `pkgs.postgresql`
is passed to the plugins. I.e., plugins for non-JIT variants are built
with a gcc stdenv on Linux and plugins for JIT variants with a clang
stdenv.
Since `plv8` hard-codes `gcc` as `$CC` in its Makefile[4], I marked it
as broken for JIT-variants of postgresql only.
* Added a test-matrix to confirm that JIT works fine on each
`pkgs.postgresql_*_jit` (thanks Andi for the original test in
#124804!).
* For each postgresql version, a new attribute
`postgresql_<version>_jit` (and a corresponding
`postgresqlPackages<version>JitPackages`) are now exposed for better
discoverability and prebuilt artifacts in the binary cache.
* In #150801 the `this`-argument was replaced by an internal recursion.
I decided against this approach because it'd blow up the diff even
more which makes the readability way harder and also harder to revert
this if necessary.
Instead, it is made sure that `this` always points to the correct
variant of `postgresql` and re-using that in an additional
`.override {}`-expression is trivial because the JIT-variant is
exposed in `all-packages.nix`.
* I think the changes are sufficiently big to actually add myself as
maintainer here.
* Added `libxcrypt` to `buildInputs` for versions <v13. While
building things with an LLVM stdenv, these versions complained that
the extern `crypt()` symbol can't be found. Not sure what this is
exactly about, but since we want to switch to libxcrypt for `crypt()`
usage anyways[5] I decided to add it. For >=13 it's not relevant
anymore anyways[6].
* 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`.
A common concern of the original approach - with llvm as build input -
was the massive increase of closure size. With the new approach of using
the LLVM stdenv directly and patching out references to the clang drv in
`$out` the effective closure size changes are:
$ nix path-info -Sh $(nix-build -A postgresql_14)
/nix/store/kssxxqycwa3c7kmwmykwxqvspxxa6r1w-postgresql-14.7 306.4M
$ nix path-info -Sh $(nix-build -A postgresql_14_jit)
/nix/store/xc7qmgqrn4h5yr4vmdwy56gs4bmja9ym-postgresql-14.7 689.2M
Most of the increase in closure-size stems from the `lib`-output of
LLVM
$ nix path-info -Sh /nix/store/5r97sbs5j6mw7qnbg8nhnq1gad9973ap-llvm-11.1.0-lib
/nix/store/5r97sbs5j6mw7qnbg8nhnq1gad9973ap-llvm-11.1.0-lib 349.8M
which is why this shouldn't be enabled by default.
While this is quite much because of LLVM, it's still a massive
improvement over the simple approach of adding llvm/clang as
build-inputs and building with `--with-llvm`:
$ nix path-info -Sh $(nix-build -E '
with import ./. {};
postgresql.overrideAttrs ({ configureFlags ? [], buildInputs ? [], ... }: {
configureFlags = configureFlags ++ [ "--with-llvm" ];
buildInputs = buildInputs ++ [ llvm clang ];
})' -j0)
/nix/store/i3bd2r21c6c3428xb4gavjnplfqxn27p-postgresql-14.7 1.6G
Co-authored-by: Andreas Rammhold <andreas@rammhold.de>
Co-authored-by: Janne Heß <janne@hess.ooo>
Co-authored-by: Nikolay Amiantov <ab@fmap.me>
[1] https://www.postgresql.org/docs/current/jit-reason.html
[2] https://github.com/NixOS/nixpkgs/pull/124804#issuecomment-864616931
& https://github.com/NixOS/nixpkgs/pull/150801#issuecomment-1467868321
[3] This fails with the following error otherwise:
```
configure: error: clang not found, but required when compiling --with-llvm, specify with CLANG=
```
[4] https://github.com/plv8/plv8/blob/v3.1.5/Makefile#L14
[5] https://github.com/NixOS/nixpkgs/pull/181764
[6] c45643d618
This commit is contained in:
parent
46c5c6e90f
commit
2282fa73a1
8 changed files with 230 additions and 67 deletions
|
@ -249,6 +249,17 @@ In addition to numerous new and upgraded packages, this release has the followin
|
||||||
|
|
||||||
- `services.chronyd` is now started with additional systemd sandbox/hardening options for better security.
|
- `services.chronyd` is now started with additional systemd sandbox/hardening options for better security.
|
||||||
|
|
||||||
|
- PostgreSQL has opt-in support for [JIT compilation](https://www.postgresql.org/docs/current/jit-reason.html). It can be enabled like this:
|
||||||
|
```nix
|
||||||
|
{
|
||||||
|
services.postgresql = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.postgresql_jit;
|
||||||
|
settings."jit" = "on";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
- `services.dhcpcd` service now don't solicit or accept IPv6 Router Advertisements on interfaces that use static IPv6 addresses.
|
- `services.dhcpcd` service now don't solicit or accept IPv6 Router Advertisements on interfaces that use static IPv6 addresses.
|
||||||
|
|
||||||
- The module `services.headscale` was refactored to be compliant with [RFC 0042](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md). To be precise, this means that the following things have changed:
|
- The module `services.headscale` was refactored to be compliant with [RFC 0042](https://github.com/NixOS/rfcs/blob/master/rfcs/0042-config-option.md). To be precise, this means that the following things have changed:
|
||||||
|
|
|
@ -561,6 +561,7 @@ in {
|
||||||
postfixadmin = handleTest ./postfixadmin.nix {};
|
postfixadmin = handleTest ./postfixadmin.nix {};
|
||||||
postgis = handleTest ./postgis.nix {};
|
postgis = handleTest ./postgis.nix {};
|
||||||
postgresql = handleTest ./postgresql.nix {};
|
postgresql = handleTest ./postgresql.nix {};
|
||||||
|
postgresql-jit = handleTest ./postgresql-jit.nix {};
|
||||||
postgresql-wal-receiver = handleTest ./postgresql-wal-receiver.nix {};
|
postgresql-wal-receiver = handleTest ./postgresql-wal-receiver.nix {};
|
||||||
powerdns = handleTest ./powerdns.nix {};
|
powerdns = handleTest ./powerdns.nix {};
|
||||||
powerdns-admin = handleTest ./powerdns-admin.nix {};
|
powerdns-admin = handleTest ./powerdns-admin.nix {};
|
||||||
|
|
50
nixos/tests/postgresql-jit.nix
Normal file
50
nixos/tests/postgresql-jit.nix
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
{ system ? builtins.currentSystem
|
||||||
|
, config ? {}
|
||||||
|
, pkgs ? import ../.. { inherit system config; }
|
||||||
|
}:
|
||||||
|
|
||||||
|
with import ../lib/testing-python.nix { inherit system pkgs; };
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (pkgs) lib;
|
||||||
|
packages = lib.filter
|
||||||
|
(lib.hasSuffix "_jit")
|
||||||
|
(builtins.attrNames (import ../../pkgs/servers/sql/postgresql pkgs));
|
||||||
|
|
||||||
|
mkJitTest = packageName: makeTest {
|
||||||
|
name = "${packageName}";
|
||||||
|
meta.maintainers = with lib.maintainers; [ ma27 ];
|
||||||
|
nodes.machine = { pkgs, lib, ... }: {
|
||||||
|
services.postgresql = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.${packageName};
|
||||||
|
settings.jit = "on";
|
||||||
|
initialScript = pkgs.writeText "init.sql" ''
|
||||||
|
create table demo (id int);
|
||||||
|
insert into demo (id) select generate_series(1, 5);
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
testScript = ''
|
||||||
|
machine.start()
|
||||||
|
machine.wait_for_unit("postgresql.service")
|
||||||
|
|
||||||
|
with subtest("JIT is enabled"):
|
||||||
|
machine.succeed("sudo -u postgres psql <<<'show jit;' | grep 'on'")
|
||||||
|
|
||||||
|
with subtest("Test JIT works fine"):
|
||||||
|
output = machine.succeed(
|
||||||
|
"cat ${pkgs.writeText "test.sql" ''
|
||||||
|
set jit_above_cost = 1;
|
||||||
|
EXPLAIN ANALYZE SELECT CONCAT('jit result = ', SUM(id)) FROM demo;
|
||||||
|
SELECT CONCAT('jit result = ', SUM(id)) from demo;
|
||||||
|
''} | sudo -u postgres psql"
|
||||||
|
)
|
||||||
|
assert "JIT:" in output
|
||||||
|
assert "jit result = 15" in output
|
||||||
|
|
||||||
|
machine.shutdown()
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.genAttrs packages mkJitTest
|
|
@ -116,4 +116,4 @@ let
|
||||||
};
|
};
|
||||||
|
|
||||||
# Maps the generic function over all attributes of PostgreSQL packages
|
# Maps the generic function over all attributes of PostgreSQL packages
|
||||||
in builtins.listToAttrs (map makePostgresqlWalReceiverTest (builtins.attrNames (import ../../pkgs/servers/sql/postgresql { })))
|
in builtins.listToAttrs (map makePostgresqlWalReceiverTest (builtins.attrNames (import ../../pkgs/servers/sql/postgresql pkgs)))
|
||||||
|
|
|
@ -14,17 +14,28 @@ let
|
||||||
, this, self, newScope, buildEnv
|
, this, self, newScope, buildEnv
|
||||||
|
|
||||||
# source specification
|
# source specification
|
||||||
, version, hash, psqlSchema,
|
, version, hash, psqlSchema
|
||||||
|
|
||||||
# for tests
|
# 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
|
let
|
||||||
atLeast = lib.versionAtLeast version;
|
atLeast = lib.versionAtLeast version;
|
||||||
|
olderThan = lib.versionOlder version;
|
||||||
lz4Enabled = atLeast "14";
|
lz4Enabled = atLeast "14";
|
||||||
zstdEnabled = atLeast "15";
|
zstdEnabled = atLeast "15";
|
||||||
|
|
||||||
in stdenv.mkDerivation rec {
|
stdenv' = if jitSupport then llvmPackages.stdenv else stdenv;
|
||||||
|
in stdenv'.mkDerivation rec {
|
||||||
pname = "postgresql";
|
pname = "postgresql";
|
||||||
inherit version;
|
inherit version;
|
||||||
|
|
||||||
|
@ -33,7 +44,7 @@ let
|
||||||
inherit hash;
|
inherit hash;
|
||||||
};
|
};
|
||||||
|
|
||||||
hardeningEnable = lib.optionals (!stdenv.cc.isClang) [ "pie" ];
|
hardeningEnable = lib.optionals (!stdenv'.cc.isClang) [ "pie" ];
|
||||||
|
|
||||||
outputs = [ "out" "lib" "doc" "man" ];
|
outputs = [ "out" "lib" "doc" "man" ];
|
||||||
setOutputFlags = false; # $out retains configureFlags :-/
|
setOutputFlags = false; # $out retains configureFlags :-/
|
||||||
|
@ -45,18 +56,21 @@ let
|
||||||
libxml2
|
libxml2
|
||||||
icu
|
icu
|
||||||
]
|
]
|
||||||
|
++ lib.optionals (olderThan "13") [ libxcrypt ]
|
||||||
|
++ lib.optionals jitSupport [ llvmPackages.llvm ]
|
||||||
++ lib.optionals lz4Enabled [ lz4 ]
|
++ lib.optionals lz4Enabled [ lz4 ]
|
||||||
++ lib.optionals zstdEnabled [ zstd ]
|
++ lib.optionals zstdEnabled [ zstd ]
|
||||||
++ lib.optionals enableSystemd [ systemd ]
|
++ lib.optionals enableSystemd [ systemd ]
|
||||||
++ lib.optionals gssSupport [ libkrb5 ]
|
++ lib.optionals gssSupport [ libkrb5 ]
|
||||||
++ lib.optionals (!stdenv.isDarwin) [ libossp_uuid ];
|
++ lib.optionals (!stdenv'.isDarwin) [ libossp_uuid ];
|
||||||
|
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
makeWrapper
|
makeWrapper
|
||||||
pkg-config
|
pkg-config
|
||||||
];
|
]
|
||||||
|
++ lib.optionals jitSupport [ llvmPackages.llvm.dev nukeReferences patchelf ];
|
||||||
|
|
||||||
enableParallelBuilding = !stdenv.isDarwin;
|
enableParallelBuilding = !stdenv'.isDarwin;
|
||||||
|
|
||||||
separateDebugInfo = true;
|
separateDebugInfo = true;
|
||||||
|
|
||||||
|
@ -65,7 +79,7 @@ let
|
||||||
env.NIX_CFLAGS_COMPILE = "-I${libxml2.dev}/include/libxml2";
|
env.NIX_CFLAGS_COMPILE = "-I${libxml2.dev}/include/libxml2";
|
||||||
|
|
||||||
# Otherwise it retains a reference to compiler and fails; see #44767. TODO: better.
|
# 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 = [
|
configureFlags = [
|
||||||
"--with-openssl"
|
"--with-openssl"
|
||||||
|
@ -76,11 +90,12 @@ let
|
||||||
"--with-system-tzdata=${tzdata}/share/zoneinfo"
|
"--with-system-tzdata=${tzdata}/share/zoneinfo"
|
||||||
"--enable-debug"
|
"--enable-debug"
|
||||||
(lib.optionalString enableSystemd "--with-systemd")
|
(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 lz4Enabled [ "--with-lz4" ]
|
||||||
++ lib.optionals zstdEnabled [ "--with-zstd" ]
|
++ lib.optionals zstdEnabled [ "--with-zstd" ]
|
||||||
++ lib.optionals gssSupport [ "--with-gssapi" ]
|
++ 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 = [
|
||||||
./patches/disable-resolve_symlinks.patch
|
./patches/disable-resolve_symlinks.patch
|
||||||
|
@ -88,7 +103,7 @@ let
|
||||||
./patches/hardcode-pgxs-path.patch
|
./patches/hardcode-pgxs-path.patch
|
||||||
./patches/specify_pkglibdir_at_runtime.patch
|
./patches/specify_pkglibdir_at_runtime.patch
|
||||||
./patches/findstring.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)
|
(if atLeast "13" then ./patches/socketdir-in-run-13.patch else ./patches/socketdir-in-run.patch)
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -99,6 +114,13 @@ let
|
||||||
postPatch = ''
|
postPatch = ''
|
||||||
# Hardcode the path to pgxs so pg_config returns the path in $out
|
# 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"
|
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 =
|
postInstall =
|
||||||
|
@ -109,27 +131,54 @@ let
|
||||||
moveToOutput "lib/libecpg*" "$out"
|
moveToOutput "lib/libecpg*" "$out"
|
||||||
|
|
||||||
# Prevent a retained dependency on gcc-wrapper.
|
# 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
|
if [ -z "''${dontDisableStatic:-}" ]; then
|
||||||
# Remove static libraries in case dynamic are available.
|
# Remove static libraries in case dynamic are available.
|
||||||
for i in $out/lib/*.a $lib/lib/*.a; do
|
for i in $out/lib/*.a $lib/lib/*.a; do
|
||||||
name="$(basename "$i")"
|
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
|
if [ -e "$lib/lib/''${name%.a}$ext" ] || [ -e "''${i%.a}$ext" ]; then
|
||||||
rm "$i"
|
rm "$i"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
fi
|
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.
|
# initdb needs access to "locale" command from glibc.
|
||||||
wrapProgram $out/bin/initdb --prefix PATH ":" ${glibc.bin}/bin
|
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.
|
# autodetection doesn't seem to able to find this, but it's there.
|
||||||
checkTarget = "check";
|
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)
|
# ! 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:
|
# See also here:
|
||||||
# https://git.alpinelinux.org/aports/tree/main/postgresql/disable-broken-tests.patch?id=6d7d32c12e073a57a9e5946e55f4c1fbb68bd442
|
# 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 \
|
substituteInPlace src/test/regress/parallel_schedule \
|
||||||
--replace "subscription" "" \
|
--replace "subscription" "" \
|
||||||
--replace "object_address" ""
|
--replace "object_address" ""
|
||||||
|
@ -146,13 +195,23 @@ let
|
||||||
|
|
||||||
doInstallCheck = false; # needs a running daemon?
|
doInstallCheck = false; # needs a running daemon?
|
||||||
|
|
||||||
disallowedReferences = [ stdenv.cc ];
|
disallowedReferences = [ stdenv'.cc ];
|
||||||
|
|
||||||
passthru = {
|
passthru = {
|
||||||
inherit readline psqlSchema;
|
inherit readline psqlSchema jitSupport;
|
||||||
|
|
||||||
pkgs = let
|
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;
|
newSelf = self // scope;
|
||||||
newSuper = { callPackage = newScope (scope // this.pkgs); };
|
newSuper = { callPackage = newScope (scope // this.pkgs); };
|
||||||
in import ./packages.nix newSelf newSuper;
|
in import ./packages.nix newSelf newSuper;
|
||||||
|
@ -163,15 +222,33 @@ let
|
||||||
}
|
}
|
||||||
this.pkgs;
|
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; {
|
meta = with lib; {
|
||||||
homepage = "https://www.postgresql.org";
|
homepage = "https://www.postgresql.org";
|
||||||
description = "A powerful, open source object-relational database system";
|
description = "A powerful, open source object-relational database system";
|
||||||
license = licenses.postgresql;
|
license = licenses.postgresql;
|
||||||
maintainers = with maintainers; [ thoughtpolice danbst globin marsam ivan ];
|
maintainers = with maintainers; [ thoughtpolice danbst globin marsam ivan ma27 ];
|
||||||
platforms = platforms.unix;
|
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;
|
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 {
|
postgresql_12 = self.callPackage generic {
|
||||||
version = "11.19";
|
version = "12.14";
|
||||||
psqlSchema = "11.1"; # should be 11, but changing it is invasive
|
psqlSchema = "12";
|
||||||
hash = "sha256-ExCeK3HxE5QFwnIB2jczphrOcu4cIo2cnwMg4GruFMI=";
|
hash = "sha256-eFYQI304LIQtNW40cTjljAb/6uJA5swLUqxevMMNBD4=";
|
||||||
this = self.postgresql_11;
|
this = self.postgresql_12;
|
||||||
thisAttr = "postgresql_11";
|
thisAttr = "postgresql_12";
|
||||||
inherit self;
|
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_15 = self.callPackage generic {
|
||||||
|
version = "15.2";
|
||||||
|
psqlSchema = "15";
|
||||||
|
hash = "sha256-maIXH8PWtbX1a3V6ejy4XVCaOOQnOAXe8jlB7SuEaMc=";
|
||||||
|
this = self.postgresql_15;
|
||||||
|
thisAttr = "postgresql_15";
|
||||||
|
inherit self;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
postgresql_12 = self.callPackage generic {
|
in self:
|
||||||
version = "12.14";
|
let packages = mkPackages self; in
|
||||||
psqlSchema = "12";
|
packages
|
||||||
hash = "sha256-eFYQI304LIQtNW40cTjljAb/6uJA5swLUqxevMMNBD4=";
|
// self.lib.mapAttrs'
|
||||||
this = self.postgresql_12;
|
(attrName: postgres: self.lib.nameValuePair "${attrName}_jit" (postgres.override rec {
|
||||||
thisAttr = "postgresql_12";
|
jitSupport = true;
|
||||||
inherit self;
|
thisAttr = "${attrName}_jit";
|
||||||
};
|
this = self.${thisAttr};
|
||||||
|
}))
|
||||||
postgresql_13 = self.callPackage generic {
|
packages
|
||||||
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_15 = self.callPackage generic {
|
|
||||||
version = "15.2";
|
|
||||||
psqlSchema = "15";
|
|
||||||
hash = "sha256-maIXH8PWtbX1a3V6ejy4XVCaOOQnOAXe8jlB7SuEaMc=";
|
|
||||||
this = self.postgresql_15;
|
|
||||||
thisAttr = "postgresql_15";
|
|
||||||
inherit self;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -138,5 +138,6 @@ stdenv.mkDerivation (finalAttrs: {
|
||||||
maintainers = with maintainers; [ marsam ];
|
maintainers = with maintainers; [ marsam ];
|
||||||
platforms = [ "x86_64-linux" ];
|
platforms = [ "x86_64-linux" ];
|
||||||
license = licenses.postgresql;
|
license = licenses.postgresql;
|
||||||
|
broken = postgresql.jitSupport;
|
||||||
};
|
};
|
||||||
})
|
})
|
||||||
|
|
|
@ -26,7 +26,7 @@ stdenv.mkDerivation rec {
|
||||||
|
|
||||||
buildInputs = [ libxml2 postgresql geos proj gdal json_c protobufc ]
|
buildInputs = [ libxml2 postgresql geos proj gdal json_c protobufc ]
|
||||||
++ lib.optional stdenv.isDarwin libiconv;
|
++ lib.optional stdenv.isDarwin libiconv;
|
||||||
nativeBuildInputs = [ perl pkg-config ];
|
nativeBuildInputs = [ perl pkg-config ] ++ lib.optional postgresql.jitSupport postgresql.llvm;
|
||||||
dontDisableStatic = true;
|
dontDisableStatic = true;
|
||||||
|
|
||||||
# postgis config directory assumes /include /lib from the same root for json-c library
|
# postgis config directory assumes /include /lib from the same root for json-c library
|
||||||
|
|
|
@ -25444,13 +25444,26 @@ with pkgs;
|
||||||
postgresql_13
|
postgresql_13
|
||||||
postgresql_14
|
postgresql_14
|
||||||
postgresql_15
|
postgresql_15
|
||||||
|
|
||||||
|
postgresql_11_jit
|
||||||
|
postgresql_12_jit
|
||||||
|
postgresql_13_jit
|
||||||
|
postgresql_14_jit
|
||||||
|
postgresql_15_jit
|
||||||
;
|
;
|
||||||
postgresql = postgresql_14.override { this = postgresql; };
|
postgresql = postgresql_14.override { this = postgresql; };
|
||||||
|
postgresql_jit = postgresql_14_jit.override { this = postgresql_jit; };
|
||||||
postgresqlPackages = recurseIntoAttrs postgresql.pkgs;
|
postgresqlPackages = recurseIntoAttrs postgresql.pkgs;
|
||||||
|
postgresqlJitPackages = recurseIntoAttrs postgresql_jit.pkgs;
|
||||||
postgresql11Packages = recurseIntoAttrs postgresql_11.pkgs;
|
postgresql11Packages = recurseIntoAttrs postgresql_11.pkgs;
|
||||||
postgresql12Packages = recurseIntoAttrs postgresql_12.pkgs;
|
postgresql12Packages = recurseIntoAttrs postgresql_12.pkgs;
|
||||||
postgresql13Packages = recurseIntoAttrs postgresql_13.pkgs;
|
postgresql13Packages = recurseIntoAttrs postgresql_13.pkgs;
|
||||||
postgresql15Packages = recurseIntoAttrs postgresql_15.pkgs;
|
postgresql15Packages = recurseIntoAttrs postgresql_15.pkgs;
|
||||||
|
postgresql11JitPackages = recurseIntoAttrs postgresql_11_jit.pkgs;
|
||||||
|
postgresql12JitPackages = recurseIntoAttrs postgresql_12_jit.pkgs;
|
||||||
|
postgresql13JitPackages = recurseIntoAttrs postgresql_13_jit.pkgs;
|
||||||
|
postgresql14JitPackages = recurseIntoAttrs postgresql_14_jit.pkgs;
|
||||||
|
postgresql15JitPackages = recurseIntoAttrs postgresql_15_jit.pkgs;
|
||||||
postgresql14Packages = postgresqlPackages;
|
postgresql14Packages = postgresqlPackages;
|
||||||
|
|
||||||
postgresql_jdbc = callPackage ../development/java-modules/postgresql_jdbc { };
|
postgresql_jdbc = callPackage ../development/java-modules/postgresql_jdbc { };
|
||||||
|
|
Loading…
Reference in a new issue