diff --git a/doc/languages-frameworks/ruby.section.md b/doc/languages-frameworks/ruby.section.md index 31f696bd6427..41985e755188 100644 --- a/doc/languages-frameworks/ruby.section.md +++ b/doc/languages-frameworks/ruby.section.md @@ -154,7 +154,7 @@ let defaultGemConfig = pkgs.defaultGemConfig // { pg = attrs: { buildFlags = - [ "--with-pg-config=${lib.getDev pkgs."postgresql_${pg_version}"}/bin/pg_config" ]; + [ "--with-pg-config=${pkgs."postgresql_${pg_version}".pg_config}/bin/pg_config" ]; }; }; }; @@ -172,7 +172,7 @@ let gemConfig = pkgs.defaultGemConfig // { pg = attrs: { buildFlags = - [ "--with-pg-config=${lib.getDev pkgs."postgresql_${pg_version}"}/bin/pg_config" ]; + [ "--with-pg-config=${pkgs."postgresql_${pg_version}".pg_config}/bin/pg_config" ]; }; }; }; @@ -190,7 +190,7 @@ let defaultGemConfig = super.defaultGemConfig // { pg = attrs: { buildFlags = [ - "--with-pg-config=${lib.getDev pkgs."postgresql_${pg_version}"}/bin/pg_config" + "--with-pg-config=${pkgs."postgresql_${pg_version}".pg_config}/bin/pg_config" ]; }; }; diff --git a/doc/release-notes/rl-2505.section.md b/doc/release-notes/rl-2505.section.md index e386ead66797..99f18a300480 100644 --- a/doc/release-notes/rl-2505.section.md +++ b/doc/release-notes/rl-2505.section.md @@ -11,6 +11,8 @@ - `squid` has been updated to version 7, this release includes multiple breaking changes, like ESI removal. For more information, [check the release notes](https://github.com/squid-cache/squid/releases/tag/SQUID_7_0_1). +- `postgresql` and `libpq` don't provide `pg_config` by default anymore. Instead, `pg_config` is available via `postgresql.pg_config` or `libpq.pg_config`. This allowed implementing it as a shell script, which can be build for both the build and host systems when cross-compiling. If your build fails to find `pg_config`, add `postgresql.pg_config` or `libpq.pg_config` to `nativeBuildInputs`. + - The [`no-broken-symlinks` hook](https://nixos.org/manual/nixpkgs/unstable/#no-broken-symlinks.sh) was added to catch builds containing dangling or reflexive symlinks, as these are indicative of problems with packaging. The hook can be disabled by providing `dontCheckForBrokenSymlinks = true;` as an argument to `mkDerivation`. For more information, [check the docs](https://nixos.org/manual/nixpkgs/unstable/#no-broken-symlinks.sh) or [see this PR](https://github.com/NixOS/nixpkgs/pull/370750). diff --git a/pkgs/by-name/ds/dspam/package.nix b/pkgs/by-name/ds/dspam/package.nix index 84563996a026..2c7dd35ef952 100644 --- a/pkgs/by-name/ds/dspam/package.nix +++ b/pkgs/by-name/ds/dspam/package.nix @@ -59,7 +59,10 @@ stdenv.mkDerivation rec { ++ lib.optional withPgSQL libpq ++ lib.optional withSQLite sqlite ++ lib.optional withDB db; - nativeBuildInputs = [ makeWrapper ]; + nativeBuildInputs = [ + libpq.pg_config + makeWrapper + ]; # patch out libmysql >= 5 check, since mariadb-connector is at 3.x postPatch = '' sed -i 's/atoi(m) >= 5/1/g' configure m4/mysql_drv.m4 @@ -87,8 +90,7 @@ stdenv.mkDerivation rec { ++ lib.optionals withMySQL [ "--with-mysql-includes=${mariadb-connector-c.dev}/include/mysql" "--with-mysql-libraries=${mariadb-connector-c.out}/lib/mysql" - ] - ++ lib.optional withPgSQL "--with-pgsql-libraries=${libpq}/lib"; + ]; # Workaround build failure on -fno-common toolchains like upstream # gcc-10. Otherwise build fails as: diff --git a/pkgs/by-name/in/inspircd/package.nix b/pkgs/by-name/in/inspircd/package.nix index d9861ccd0e3f..8a2c58b9c81a 100644 --- a/pkgs/by-name/in/inspircd/package.nix +++ b/pkgs/by-name/in/inspircd/package.nix @@ -159,6 +159,9 @@ stdenv.mkDerivation rec { nativeBuildInputs = [ perl pkg-config + ] + ++ lib.optionals (lib.elem "pgsql" extraModules) [ + libpq.pg_config ]; buildInputs = extraInputs; diff --git a/pkgs/by-name/ke/kea/package.nix b/pkgs/by-name/ke/kea/package.nix index aa8a8a762ecd..4fb430c84f04 100644 --- a/pkgs/by-name/ke/kea/package.nix +++ b/pkgs/by-name/ke/kea/package.nix @@ -54,7 +54,7 @@ stdenv.mkDerivation rec { "--localstatedir=/var" "--with-openssl=${lib.getDev openssl}" ] - ++ lib.optional withPostgres "--with-pgsql=${lib.getDev libpq}/bin/pg_config" + ++ lib.optional withPostgres "--with-pgsql=${libpq.pg_config}/bin/pg_config" ++ lib.optional withMysql "--with-mysql=${lib.getDev libmysqlclient}/bin/mysql_config"; postConfigure = '' diff --git a/pkgs/by-name/pg/pg_checksums/package.nix b/pkgs/by-name/pg/pg_checksums/package.nix index a52513a5f805..19806488fa7f 100644 --- a/pkgs/by-name/pg/pg_checksums/package.nix +++ b/pkgs/by-name/pg/pg_checksums/package.nix @@ -18,7 +18,10 @@ stdenv.mkDerivation rec { sha256 = "sha256-joGaCoRMGpEqq7pnT4Qd7XySjZ5wlZPW27WfOv1UFF4="; }; - nativeBuildInputs = [ libxslt.bin ]; + nativeBuildInputs = [ + libxslt.bin + postgresql.pg_config + ]; buildInputs = [ postgresql ]; diff --git a/pkgs/by-name/pg/pgcopydb/package.nix b/pkgs/by-name/pg/pgcopydb/package.nix index 9cf2992b28ba..5e9ca01c8e8f 100644 --- a/pkgs/by-name/pg/pgcopydb/package.nix +++ b/pkgs/by-name/pg/pgcopydb/package.nix @@ -26,6 +26,7 @@ stdenv.mkDerivation (finalAttrs: { nativeBuildInputs = [ pkg-config + postgresql.pg_config ]; buildInputs = diff --git a/pkgs/by-name/pg/pgmanage/package.nix b/pkgs/by-name/pg/pgmanage/package.nix index 801c4bd00f64..5fc3468dae44 100644 --- a/pkgs/by-name/pg/pgmanage/package.nix +++ b/pkgs/by-name/pg/pgmanage/package.nix @@ -33,6 +33,10 @@ stdenv.mkDerivation { openssl ]; + nativeBuildInputs = [ + libpq.pg_config + ]; + passthru.tests.sign-in = nixosTests.pgmanage; meta = with lib; { diff --git a/pkgs/by-name/sp/spatialite-gui/package.nix b/pkgs/by-name/sp/spatialite-gui/package.nix index df336adc0bfa..552912624773 100644 --- a/pkgs/by-name/sp/spatialite-gui/package.nix +++ b/pkgs/by-name/sp/spatialite-gui/package.nix @@ -35,6 +35,7 @@ stdenv.mkDerivation rec { }; nativeBuildInputs = [ + libpq.pg_config pkg-config ] ++ lib.optional stdenv.hostPlatform.isDarwin desktopToDarwinBundle; diff --git a/pkgs/by-name/tn/tntdb/package.nix b/pkgs/by-name/tn/tntdb/package.nix index 16e7857ace28..19602b64fa58 100644 --- a/pkgs/by-name/tn/tntdb/package.nix +++ b/pkgs/by-name/tn/tntdb/package.nix @@ -24,6 +24,7 @@ stdenv.mkDerivation rec { nativeBuildInputs = [ autoreconfHook + libpq.pg_config ]; buildInputs = [ diff --git a/pkgs/by-name/vi/virtualpg/package.nix b/pkgs/by-name/vi/virtualpg/package.nix index 3174eb547e81..a32c0d46f1c6 100644 --- a/pkgs/by-name/vi/virtualpg/package.nix +++ b/pkgs/by-name/vi/virtualpg/package.nix @@ -19,7 +19,7 @@ stdenv.mkDerivation rec { nativeBuildInputs = [ validatePkgConfig - libpq # for pg_config + libpq.pg_config ]; buildInputs = [ diff --git a/pkgs/development/libraries/libgda/5.x.nix b/pkgs/development/libraries/libgda/5.x.nix index 3972c44c0f39..d2afa53c52eb 100644 --- a/pkgs/development/libraries/libgda/5.x.nix +++ b/pkgs/development/libraries/libgda/5.x.nix @@ -58,6 +58,7 @@ stdenv.mkDerivation rec { gtk-doc autoconf-archive yelp-tools + libpq.pg_config ]; buildInputs = diff --git a/pkgs/development/libraries/librdf/redland.nix b/pkgs/development/libraries/librdf/redland.nix index e97125015879..3391a8cf6ee6 100644 --- a/pkgs/development/libraries/librdf/redland.nix +++ b/pkgs/development/libraries/librdf/redland.nix @@ -33,7 +33,7 @@ stdenv.mkDerivation rec { nativeBuildInputs = [ perl pkg-config - ]; + ] ++ lib.optional withPostgresql libpq.pg_config; buildInputs = [ diff --git a/pkgs/development/octave-modules/database/default.nix b/pkgs/development/octave-modules/database/default.nix index 3bd6adb5d112..b5a5c0e9eca6 100644 --- a/pkgs/development/octave-modules/database/default.nix +++ b/pkgs/development/octave-modules/database/default.nix @@ -23,6 +23,10 @@ buildOctavePackage rec { libpq ]; + nativeBuildInputs = [ + libpq.pg_config + ]; + requiredOctavePackages = [ struct ]; diff --git a/pkgs/development/python-modules/psycopg/default.nix b/pkgs/development/python-modules/psycopg/default.nix index 6d8e4f769a47..2e5174552fce 100644 --- a/pkgs/development/python-modules/psycopg/default.nix +++ b/pkgs/development/python-modules/psycopg/default.nix @@ -73,8 +73,7 @@ let nativeBuildInputs = [ cython - # needed to find pg_config with strictDeps - libpq + libpq.pg_config setuptools tomli ]; diff --git a/pkgs/development/python-modules/psycopg2/default.nix b/pkgs/development/python-modules/psycopg2/default.nix index 4ffb1ab4b9cf..cbc3923dd126 100644 --- a/pkgs/development/python-modules/psycopg2/default.nix +++ b/pkgs/development/python-modules/psycopg2/default.nix @@ -38,7 +38,7 @@ buildPythonPackage rec { # some linker flags are added but the linker ignores them because they're incompatible # https://github.com/psycopg/psycopg2/blob/89005ac5b849c6428c05660b23c5a266c96e677d/setup.py substituteInPlace setup.py \ - --replace-fail "self.pg_config_exe = self.build_ext.pg_config" 'self.pg_config_exe = "${lib.getDev buildPackages.libpq}/bin/pg_config"' + --replace-fail "self.pg_config_exe = self.build_ext.pg_config" 'self.pg_config_exe = "${libpq.pg_config}/bin/pg_config"' ''; nativeBuildInputs = [ diff --git a/pkgs/development/python-modules/psycopg2cffi/default.nix b/pkgs/development/python-modules/psycopg2cffi/default.nix index c787f7cb3bc1..723c803cf621 100644 --- a/pkgs/development/python-modules/psycopg2cffi/default.nix +++ b/pkgs/development/python-modules/psycopg2cffi/default.nix @@ -31,8 +31,7 @@ buildPythonPackage rec { ''; buildInputs = [ libpq ]; - # To find pg_config - nativeBuildInputs = [ libpq ]; + nativeBuildInputs = [ libpq.pg_config ]; build-system = [ setuptools diff --git a/pkgs/development/r-modules/default.nix b/pkgs/development/r-modules/default.nix index 34f38d1feba8..1851729f3ba2 100644 --- a/pkgs/development/r-modules/default.nix +++ b/pkgs/development/r-modules/default.nix @@ -483,7 +483,7 @@ let RODBC = [ pkgs.libiodbc ]; rpanel = [ pkgs.tclPackages.bwidget ]; Rpoppler = [ pkgs.poppler ]; - RPostgreSQL = with pkgs; [ libpq ]; + RPostgreSQL = with pkgs; [ libpq.pg_config ]; RProtoBuf = [ pkgs.protobuf ]; RSclient = [ pkgs.openssl.dev ]; Rserve = [ pkgs.openssl ]; diff --git a/pkgs/development/ruby-modules/gem-config/default.nix b/pkgs/development/ruby-modules/gem-config/default.nix index a6fcb8102a4e..e02a6246686c 100644 --- a/pkgs/development/ruby-modules/gem-config/default.nix +++ b/pkgs/development/ruby-modules/gem-config/default.nix @@ -669,7 +669,7 @@ in # Force pkg-config lookup for libpq. # See https://github.com/ged/ruby-pg/blob/6629dec6656f7ca27619e4675b45225d9e422112/ext/extconf.rb#L34-L55 # - # Note that setting --with-pg-config=${lib.getDev postgresql}/bin/pg_config would add + # Note that setting --with-pg-config=${postgresql.pg_config}/bin/pg_config would add # an unnecessary reference to the entire postgresql package. buildFlags = [ "--with-pg-config=ignore" ]; nativeBuildInputs = [ pkg-config ]; diff --git a/pkgs/development/tools/rust/cargo-pgrx/buildPgrxExtension.nix b/pkgs/development/tools/rust/cargo-pgrx/buildPgrxExtension.nix index 504ad1a0bbdf..bcde00af753b 100644 --- a/pkgs/development/tools/rust/cargo-pgrx/buildPgrxExtension.nix +++ b/pkgs/development/tools/rust/cargo-pgrx/buildPgrxExtension.nix @@ -93,7 +93,7 @@ let preBuildAndTest = '' export PGRX_HOME="$(mktemp -d)" export PGDATA="$PGRX_HOME/data-${pgrxPostgresMajor}/" - cargo-pgrx pgrx init "--pg${pgrxPostgresMajor}" ${lib.getDev postgresql}/bin/pg_config + cargo-pgrx pgrx init "--pg${pgrxPostgresMajor}" ${postgresql.pg_config}/bin/pg_config # unix sockets work in sandbox, too. export PGHOST="$(mktemp -d)" @@ -140,7 +140,7 @@ let PGRX_BUILD_FLAGS="--frozen -j $NIX_BUILD_CORES ${builtins.concatStringsSep " " cargoBuildFlags}" \ ${lib.optionalString stdenv.hostPlatform.isDarwin ''RUSTFLAGS="''${RUSTFLAGS:+''${RUSTFLAGS} }-Clink-args=-Wl,-undefined,dynamic_lookup"''} \ cargo pgrx package \ - --pg-config ${lib.getDev postgresql}/bin/pg_config \ + --pg-config ${postgresql.pg_config}/bin/pg_config \ ${maybeDebugFlag} \ --features "${builtins.concatStringsSep " " buildFeatures}" \ --out-dir "$out" diff --git a/pkgs/servers/http/openresty/default.nix b/pkgs/servers/http/openresty/default.nix index bd26b5796dcd..1ac92426e20d 100644 --- a/pkgs/servers/http/openresty/default.nix +++ b/pkgs/servers/http/openresty/default.nix @@ -34,7 +34,10 @@ callPackage ../nginx/generic.nix args rec { --replace "b/" "b/bundle/nginx-${nginxVersion}/" ''; - nativeBuildInputs = [ perl ]; + nativeBuildInputs = [ + libpq.pg_config + perl + ]; buildInputs = [ libpq ]; diff --git a/pkgs/servers/monitoring/zabbix/proxy.nix b/pkgs/servers/monitoring/zabbix/proxy.nix index 7b60782669d5..2c0b946e7f34 100644 --- a/pkgs/servers/monitoring/zabbix/proxy.nix +++ b/pkgs/servers/monitoring/zabbix/proxy.nix @@ -32,14 +32,6 @@ assert sqliteSupport -> !mysqlSupport && !postgresqlSupport; let inherit (lib) optional optionalString; - fake_pg_config = buildPackages.writeShellScript "pg_config" '' - if [[ "$1" == "--version" ]]; then - $PKG_CONFIG libpq --modversion - else - $PKG_CONFIG libpq --variable="''${1//--/}" - fi - ''; - fake_mysql_config = buildPackages.writeShellScript "mysql_config" '' if [[ "$1" == "--version" ]]; then $PKG_CONFIG mysqlclient --modversion @@ -60,7 +52,9 @@ import ./versions.nix ( inherit hash; }; - nativeBuildInputs = [ pkg-config ]; + nativeBuildInputs = [ + pkg-config + ] ++ optional postgresqlSupport libpq.pg_config; buildInputs = [ curl @@ -93,7 +87,7 @@ import ./versions.nix ( ++ optional sqliteSupport "--with-sqlite3=${sqlite.dev}" ++ optional sshSupport "--with-ssh2=${libssh2.dev}" ++ optional mysqlSupport "--with-mysql=${fake_mysql_config}" - ++ optional postgresqlSupport "--with-postgresql=${fake_pg_config}"; + ++ optional postgresqlSupport "--with-postgresql"; prePatch = '' find database -name data.sql -exec sed -i 's|/usr/bin/||g' {} + diff --git a/pkgs/servers/monitoring/zabbix/server.nix b/pkgs/servers/monitoring/zabbix/server.nix index d3edb9d1b733..a38031739e98 100644 --- a/pkgs/servers/monitoring/zabbix/server.nix +++ b/pkgs/servers/monitoring/zabbix/server.nix @@ -50,7 +50,7 @@ import ./versions.nix ( nativeBuildInputs = [ autoreconfHook pkg-config - ]; + ] ++ optional postgresqlSupport libpq.pg_config; buildInputs = [ curl diff --git a/pkgs/servers/sql/postgresql/ext/postgis.nix b/pkgs/servers/sql/postgresql/ext/postgis.nix index ceeebabe76d7..d8a71e8ef708 100644 --- a/pkgs/servers/sql/postgresql/ext/postgis.nix +++ b/pkgs/servers/sql/postgresql/ext/postgis.nix @@ -76,6 +76,7 @@ postgresqlBuildExtension (finalAttrs: { dontDisableStatic = true; nativeCheckInputs = [ + postgresql postgresqlTestHook cunit libxslt @@ -93,6 +94,7 @@ postgresqlBuildExtension (finalAttrs: { ''; configureFlags = [ + "--with-pgconfig=${postgresql.pg_config}/bin/pg_config" "--with-gdalconfig=${gdal}/bin/gdal-config" "--with-jsondir=${json_c.dev}" "--disable-extension-upgrades-install" diff --git a/pkgs/servers/sql/postgresql/generic.nix b/pkgs/servers/sql/postgresql/generic.nix index 3af2abd7dd92..4df87ec87429 100644 --- a/pkgs/servers/sql/postgresql/generic.nix +++ b/pkgs/servers/sql/postgresql/generic.nix @@ -42,6 +42,7 @@ let # passthru buildEnv, + buildPackages, newScope, nixosTests, postgresqlTestHook, @@ -126,8 +127,6 @@ let ) else stdenv; - - pg_config = writeShellScriptBin "pg_config" (builtins.readFile ./pg_config.sh); in stdenv'.mkDerivation (finalAttrs: { inherit version; @@ -341,8 +340,7 @@ let postPatch = '' substituteInPlace "src/Makefile.global.in" --subst-var out - # Hardcode the path to pgxs so pg_config returns the path in $dev - substituteInPlace "src/common/config_info.c" --subst-var dev + cat ${./pg_config.env.mk} >> src/common/Makefile ''; postInstall = @@ -350,12 +348,9 @@ let moveToOutput "bin/ecpg" "$dev" moveToOutput "lib/pgxs" "$dev" - # Pretend pg_config is located in $out/bin to return correct paths, but - # actually have it in -dev to avoid pulling in all other outputs. See the - # pg_config.sh script's comments for details. - moveToOutput "bin/pg_config" "$dev" - install -c -m 755 "${pg_config}"/bin/pg_config "$out/bin/pg_config" - wrapProgram "$dev/bin/pg_config" --argv0 "$out/bin/pg_config" + 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" # postgres exposes external symbols get_pkginclude_path and similar. Those # can't be stripped away by --gc-sections/LTO, because they could theoretically @@ -458,6 +453,8 @@ let postgresql = this; }; + pg_config = buildPackages.callPackage ./pg_config.nix { inherit (finalAttrs) finalPackage; }; + tests = { postgresql = nixosTests.postgresql.postgresql.passthru.override finalAttrs.finalPackage; @@ -519,6 +516,7 @@ let passthru = { inherit installedExtensions; inherit (postgresql) + pg_config psqlSchema version ; diff --git a/pkgs/servers/sql/postgresql/libpq.nix b/pkgs/servers/sql/postgresql/libpq.nix index 5c66248d54c9..cf31421ba41d 100644 --- a/pkgs/servers/sql/postgresql/libpq.nix +++ b/pkgs/servers/sql/postgresql/libpq.nix @@ -18,6 +18,7 @@ # passthru / meta postgresql, + buildPackages, # GSSAPI gssSupport ? with stdenv.hostPlatform; !isWindows && !isStatic, @@ -107,29 +108,19 @@ stdenv.mkDerivation (finalAttrs: { ./patches/socketdir-in-run-13+.patch ]; + postPatch = '' + cat ${./pg_config.env.mk} >> src/common/Makefile + ''; + installPhase = '' runHook preInstall - make -C src/bin/pg_config install - make -C src/common install + make -C src/common install pg_config.env make -C src/include install make -C src/interfaces/libpq install make -C src/port install - # Pretend pg_config is located in $out/bin to return correct paths, but - # actually have it in -dev to avoid pulling in all other outputs. - moveToOutput bin/pg_config "$dev" - wrapProgram "$dev/bin/pg_config" --argv0 "$out/bin/pg_config" - - # To prevent a "pg_config: could not find own program executable" error, we fake - # pg_config in the default output. - mkdir -p "$out/bin" - cat << EOF > "$out/bin/pg_config" && chmod +x "$out/bin/pg_config" - #!${stdenv.shell} - echo The real pg_config can be found in the -dev output. - exit 1 - EOF - + install -D src/common/pg_config.env "$dev/nix-support/pg_config.env" moveToOutput "lib/*.a" "$dev" rm -rfv $out/share @@ -150,6 +141,10 @@ stdenv.mkDerivation (finalAttrs: { doCheck = false; + passthru.pg_config = buildPackages.callPackage ./pg_config.nix { + inherit (finalAttrs) finalPackage; + }; + meta = { inherit (postgresql.meta) homepage diff --git a/pkgs/servers/sql/postgresql/pg_config.env.mk b/pkgs/servers/sql/postgresql/pg_config.env.mk new file mode 100644 index 000000000000..48e836049b90 --- /dev/null +++ b/pkgs/servers/sql/postgresql/pg_config.env.mk @@ -0,0 +1,13 @@ +# Everything that pg_config normally returns is put into pg_config.env, so +# that we can read it from our own pg_config script later on. +pg_config.env: $(top_builddir)/src/port/pg_config_paths.h | $(top_builddir)/src/include/pg_config.h + echo "CC=\"$(CC)\"" >$@ + echo "CPPFLAGS=\"$(STD_CPPFLAGS)\"" >>$@ + echo "CFLAGS=\"$(CFLAGS)\"" >>$@ + echo "CFLAGS_SL=\"$(CFLAGS_SL)\"" >>$@ + echo "LDFLAGS=\"$(STD_LDFLAGS)\"" >>$@ + echo "LDFLAGS_EX=\"$(LDFLAGS_EX)\"" >>$@ + echo "LDFLAGS_SL=\"$(LDFLAGS_SL)\"" >>$@ + echo "LIBS=\"$(LIBS)\"" >>$@ + cat $(top_builddir)/src/port/pg_config_paths.h $(top_builddir)/src/include/pg_config.h \ + | sed -nE 's/^#define ([^ ]+) ("?)(.*)\2$$/\1="\3"/p' >>$@ diff --git a/pkgs/servers/sql/postgresql/pg_config.nix b/pkgs/servers/sql/postgresql/pg_config.nix new file mode 100644 index 000000000000..04b71f6935af --- /dev/null +++ b/pkgs/servers/sql/postgresql/pg_config.nix @@ -0,0 +1,18 @@ +{ + lib, + replaceVarsWith, + runtimeShell, + # PostgreSQL package + finalPackage, +}: + +replaceVarsWith { + name = "pg_config"; + src = ./pg_config.sh; + dir = "bin"; + isExecutable = true; + replacements = { + inherit runtimeShell; + postgresql-dev = lib.getDev finalPackage; + }; +} diff --git a/pkgs/servers/sql/postgresql/pg_config.sh b/pkgs/servers/sql/postgresql/pg_config.sh index d6293999a12d..d56f8ca3dd61 100644 --- a/pkgs/servers/sql/postgresql/pg_config.sh +++ b/pkgs/servers/sql/postgresql/pg_config.sh @@ -1,37 +1,122 @@ +#!@runtimeShell@ set -euo pipefail -# The real pg_config needs to be in the same path as the "postgres" binary -# to return proper paths. However, we want it in the -dev output to prevent -# cyclic references and to prevent blowing up the runtime closure. Thus, we -# have wrapped -dev/bin/pg_config to fake its argv0 to be in the default -# output. Unfortunately, pg_config tries to be smart and tries to find itself - -# which will then fail with: -# pg_config: could not find own program executable -# To counter this, we're creating *this* fake pg_config script and put it into -# the default output. The real pg_config is happy. -# Some extensions, e.g. timescaledb, use the reverse logic and look for pg_config -# in the same path as the "postgres" binary to support multi-version-installs. -# Thus, they will end up calling this script during build, even though the real -# pg_config would be available on PATH, provided by nativeBuildInputs. To help -# this case, we're redirecting the call to pg_config to the one found in PATH, -# iff we can be convinced that it belongs to our -dev output. +# This replacement script for the pg_config binary is based on the original pg_config +# shell script, which was removed from PostgreSQL's codebase in 2004: +# https://github.com/postgres/postgres/commit/cc07f8cfe73f56fce1ddda4ea25d7b0b6c4f0ae9 +# +# The main reason for removal was the ability to relocate an existing installation, which +# is exactly the one feature that we are trying to work around in nixpkgs. +# Going back to a shell script is much better for cross compiling. +# +# This file is a combination of the following two files: +# 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 -# Avoid infinite recursion -if [[ ! -v PG_CONFIG_CALLED ]]; then - # compares "path of *this* script" with "path, which pg_config on PATH believes it is in" - if [[ "$(readlink -f -- "$0")" == "$(PG_CONFIG_CALLED=1 pg_config --bindir)/pg_config" ]]; then - # The pg_config in PATH returns the same bindir that we're actually called from. - # This means that the pg_config in PATH is the one from "our" -dev output. - # This happens when the -dev output has been put in native build - # inputs and allows us to call the real pg_config without referencing - # the -dev output itself. - exec pg_config "$@" - fi +source @postgresql-dev@/nix-support/pg_config.env + +help=" +pg_config provides information about the installed version of PostgreSQL. + +Usage: + pg_config [OPTION]... + +Options: + --bindir show location of user executables + --docdir show location of documentation files + --htmldir show location of HTML documentation files + --includedir show location of C header files of the client + interfaces + --pkgincludedir show location of other C header files + --includedir-server show location of C header files for the server + --libdir show location of object code libraries + --pkglibdir show location of dynamically loadable modules + --localedir show location of locale support files + --mandir show location of manual pages + --sharedir show location of architecture-independent support files + --sysconfdir show location of system-wide configuration files + --pgxs show location of extension makefile + --configure show options given to \"configure\" script when + PostgreSQL was built + --cc show CC value used when PostgreSQL was built + --cppflags show CPPFLAGS value used when PostgreSQL was built + --cflags show CFLAGS value used when PostgreSQL was built + --cflags_sl show CFLAGS_SL value used when PostgreSQL was built + --ldflags show LDFLAGS value used when PostgreSQL was built + --ldflags_ex show LDFLAGS_EX value used when PostgreSQL was built + --ldflags_sl show LDFLAGS_SL value used when PostgreSQL was built + --libs show LIBS value used when PostgreSQL was built + --version show the PostgreSQL version + -?, --help show this help, then exit + +With no arguments, all known items are shown. + +Report bugs to <${PACKAGE_BUGREPORT}>. +${PACKAGE_NAME} home page: <${PACKAGE_URL}>" + +show=() + +for opt; do + case "$opt" in + --bindir) show+=("$PGBINDIR") ;; + --docdir) show+=("$DOCDIR") ;; + --htmldir) show+=("$HTMLDIR") ;; + --includedir) show+=("$INCLUDEDIR") ;; + --pkgincludedir) show+=("$PKGINCLUDEDIR") ;; + --includedir-server) show+=("$INCLUDEDIRSERVER") ;; + --libdir) show+=("$LIBDIR") ;; + --pkglibdir) show+=("$PKGLIBDIR") ;; + --localedir) show+=("$LOCALEDIR") ;; + --mandir) show+=("$MANDIR") ;; + --sharedir) show+=("$PGSHAREDIR") ;; + --sysconfdir) show+=("$SYSCONFDIR") ;; + --pgxs) show+=("@postgresql-dev@/lib/pgxs/src/makefiles/pgxs.mk") ;; + --configure) show+=("$CONFIGURE_ARGS") ;; + --cc) show+=("$CC") ;; + --cppflags) show+=("$CPPFLAGS") ;; + --cflags) show+=("$CFLAGS") ;; + --cflags_sl) show+=("$CFLAGS_SL") ;; + --ldflags) show+=("$LDFLAGS") ;; + --ldflags_ex) show+=("$LDFLAGS_EX") ;; + --ldflags_sl) show+=("$LDFLAGS_SL") ;; + --libs) show+=("$LIBS") ;; + --version) show+=("PostgreSQL $PG_VERSION") ;; + --help|-\?) echo "$help" + exit 0 ;; + *) >&2 echo "pg_config: invalid argument: $opt" + >&2 echo "Try \"pg_config --help\" for more information." + exit 1 ;; + esac +done + +if [ ${#show[@]} -gt 0 ]; then + printf '%s\n' "${show[@]}" + exit 0 fi -# This will happen in one of these cases: -# - *this* script is the first on PATH -# - np pg_config on PATH -# - some other pg_config on PATH, not from our -dev output -echo The real pg_config can be found in the -dev output. -exit 1 +# no arguments -> print everything +cat <