postgresql.pg_config: make overrideable

This allows `postgresql.withPackages` to easily override the paths to
the default and man outputs for `pg_config`. It avoids all
`buildEnv`-dev-output hackery, which it didn't properly support, and
separates the logic cleanly.

Changed files
+87 -73
pkgs
+71 -70
pkgs/servers/sql/postgresql/generic.nix
···
"$out/bin/pg_config" > "$dev/nix-support/pg_config.expected"
''
+ ''
-
rm "$out/bin/pg_config"
-
make -C src/common pg_config.env
-
install -D src/common/pg_config.env "$dev/nix-support/pg_config.env"
+
rm "$out/bin/pg_config"
+
make -C src/common pg_config.env
+
substituteInPlace src/common/pg_config.env \
+
--replace-fail "$out" "@out@" \
+
--replace-fail "$man" "@man@"
+
install -D src/common/pg_config.env "$dev/nix-support/pg_config.env"
# postgres exposes external symbols get_pkginclude_path and similar. Those
# can't be stripped away by --gc-sections/LTO, because they could theoretically
···
postgresql = this;
};
-
pg_config = buildPackages.callPackage ./pg_config.nix { inherit (finalAttrs) finalPackage; };
+
pg_config = buildPackages.callPackage ./pg_config.nix {
+
inherit (finalAttrs) finalPackage;
+
outputs = {
+
out = lib.getOutput "out" finalAttrs.finalPackage;
+
man = lib.getOutput "man" finalAttrs.finalPackage;
+
};
+
};
tests = {
postgresql = nixosTests.postgresql.postgresql.passthru.override finalAttrs.finalPackage;
···
f:
let
installedExtensions = f postgresql.pkgs;
-
finalPackage =
-
(buildEnv {
-
name = "${postgresql.pname}-and-plugins-${postgresql.version}";
-
paths = installedExtensions ++ [
-
# consider keeping in-sync with `postBuild` below
-
postgresql
-
postgresql.man # in case user installs this into environment
-
];
+
finalPackage = buildEnv {
+
name = "${postgresql.pname}-and-plugins-${postgresql.version}";
+
paths = installedExtensions ++ [
+
# consider keeping in-sync with `postBuild` below
+
postgresql
+
postgresql.man # in case user installs this into environment
+
];
-
pathsToLink = [
-
"/"
-
"/bin"
-
"/share/postgresql/extension"
-
# Unbreaks Omnigres' build system
-
"/share/postgresql/timezonesets"
-
"/share/postgresql/tsearch_data"
-
];
+
pathsToLink = [
+
"/"
+
"/bin"
+
"/share/postgresql/extension"
+
# Unbreaks Omnigres' build system
+
"/share/postgresql/timezonesets"
+
"/share/postgresql/tsearch_data"
+
];
-
nativeBuildInputs = [ makeBinaryWrapper ];
-
postBuild =
-
let
-
args = lib.concatMap (ext: ext.wrapperArgs or [ ]) installedExtensions;
-
in
-
''
-
wrapProgram "$out/bin/postgres" ${lib.concatStringsSep " " args}
+
nativeBuildInputs = [ makeBinaryWrapper ];
+
postBuild =
+
let
+
args = lib.concatMap (ext: ext.wrapperArgs or [ ]) installedExtensions;
+
in
+
''
+
wrapProgram "$out/bin/postgres" ${lib.concatStringsSep " " args}
+
'';
+
+
passthru = {
+
inherit installedExtensions;
+
inherit (postgresql)
+
pkgs
+
psqlSchema
+
version
+
;
-
mkdir -p "$dev/nix-support"
-
substitute "${lib.getDev postgresql}/nix-support/pg_config.env" "$dev/nix-support/pg_config.env" \
-
--replace-fail "${postgresql}" "$out" \
-
--replace-fail "${postgresql.man}" "$out"
-
'';
+
pg_config = postgresql.pg_config.override {
+
outputs = {
+
out = finalPackage;
+
man = finalPackage;
+
};
+
};
-
passthru = {
-
inherit installedExtensions;
-
inherit (postgresql)
-
pkgs
-
psqlSchema
-
version
+
withJIT = postgresqlWithPackages {
+
inherit
+
buildEnv
+
lib
+
makeBinaryWrapper
+
postgresql
+
;
+
} (_: installedExtensions ++ [ postgresql.jit ]);
+
withoutJIT = postgresqlWithPackages {
+
inherit
+
buildEnv
+
lib
+
makeBinaryWrapper
+
postgresql
;
-
-
pg_config = postgresql.pg_config.override { inherit finalPackage; };
+
} (_: lib.remove postgresql.jit installedExtensions);
-
withJIT = postgresqlWithPackages {
-
inherit
-
buildEnv
-
lib
-
makeBinaryWrapper
-
postgresql
-
;
-
} (_: installedExtensions ++ [ postgresql.jit ]);
-
withoutJIT = postgresqlWithPackages {
+
withPackages =
+
f':
+
postgresqlWithPackages {
inherit
buildEnv
lib
makeBinaryWrapper
postgresql
;
-
} (_: lib.remove postgresql.jit installedExtensions);
-
-
withPackages =
-
f':
-
postgresqlWithPackages {
-
inherit
-
buildEnv
-
lib
-
makeBinaryWrapper
-
postgresql
-
;
-
} (ps: installedExtensions ++ f' ps);
-
};
-
}).overrideAttrs
-
{
-
# buildEnv doesn't support passing `outputs`, so going via overrideAttrs.
-
outputs = [
-
"out"
-
"dev"
-
];
-
};
+
} (ps: installedExtensions ++ f' ps);
+
};
+
};
in
finalPackage;
+6
pkgs/servers/sql/postgresql/libpq.nix
···
make -C src/interfaces/libpq install
make -C src/port install
+
substituteInPlace src/common/pg_config.env \
+
--replace-fail "$out" "@out@"
+
install -D src/common/pg_config.env "$dev/nix-support/pg_config.env"
moveToOutput "lib/*.a" "$dev"
···
passthru.pg_config = buildPackages.callPackage ./pg_config.nix {
inherit (finalAttrs) finalPackage;
+
outputs = {
+
out = lib.getOutput "out" finalAttrs.finalPackage;
+
};
};
meta = {
+9 -2
pkgs/servers/sql/postgresql/pg_config.nix
···
stdenv,
# PostgreSQL package
finalPackage,
+
# PostgreSQL package's outputs
+
outputs,
}:
replaceVarsWith {
···
isExecutable = true;
replacements = {
inherit runtimeShell;
-
postgresql-dev = lib.getDev finalPackage;
+
"pg_config.env" = replaceVarsWith {
+
name = "pg_config.env";
+
src = "${lib.getDev finalPackage}/nix-support/pg_config.env";
+
replacements = outputs;
+
};
};
nativeCheckInputs = [
diffutils
];
-
postCheck = ''
+
# The expected output only matches when outputs have *not* been altered by postgresql.withPackages.
+
postCheck = lib.optionalString (outputs.out == lib.getOutput "out" finalPackage) ''
if [ -e ${lib.getDev finalPackage}/nix-support/pg_config.expected ]; then
diff ${lib.getDev finalPackage}/nix-support/pg_config.expected <($out/bin/pg_config)
fi
+1 -1
pkgs/servers/sql/postgresql/pg_config.sh
···
# https://github.com/postgres/postgres/blob/7510ac6203bc8e3c56eae95466feaeebfc1b4f31/src/bin/pg_config/pg_config.sh
# https://github.com/postgres/postgres/blob/master/src/bin/pg_config/pg_config.c
-
source @postgresql-dev@/nix-support/pg_config.env
+
source @pg_config.env@
help="
pg_config provides information about the installed version of PostgreSQL.