postgresql: replace pg_config with custom script
By replacing upstream's pg_config binary with a shell script, we:
- gain the ability to run pg_config easily when cross-compiling,
- can remove the fake pg_config in the default output,
- can remove the pg_config wrapper script dealing with special cases.
Some 20 years ago, pg_config *was* a shell script upstream, too. It was
changed to a binary, when it was made "relocatable", so it would return
paths depending on the location of the "postgres" binary. However, this
is exactly the thing that just hurts us in nixpkgs - we don't want those
paths to change, we want them to always point at the right outputs. By
writing the script ourselves, this becomes a lot less painful.
This approach means more lines of codes, but all of them are dead simple
and we have a lot less complexity overall.
Additionally, pg_config is now made a separate derivation, only exposed
as "postgresql.pg_config". This has the nice side-effect, that all users
of postgresql and libpq in nixpkgs must be very *explicit* about their
dependency on pg_config. This gives a lot more visibility into the state
of affairs regarding pkg-config support for libpq, which ultimately is
the much better solution.
2025-03-10 19:35:50 +01:00
|
|
|
#!@runtimeShell@
|
2024-11-08 17:45:25 +01:00
|
|
|
set -euo pipefail
|
|
|
|
|
postgresql: replace pg_config with custom script
By replacing upstream's pg_config binary with a shell script, we:
- gain the ability to run pg_config easily when cross-compiling,
- can remove the fake pg_config in the default output,
- can remove the pg_config wrapper script dealing with special cases.
Some 20 years ago, pg_config *was* a shell script upstream, too. It was
changed to a binary, when it was made "relocatable", so it would return
paths depending on the location of the "postgres" binary. However, this
is exactly the thing that just hurts us in nixpkgs - we don't want those
paths to change, we want them to always point at the right outputs. By
writing the script ourselves, this becomes a lot less painful.
This approach means more lines of codes, but all of them are dead simple
and we have a lot less complexity overall.
Additionally, pg_config is now made a separate derivation, only exposed
as "postgresql.pg_config". This has the nice side-effect, that all users
of postgresql and libpq in nixpkgs must be very *explicit* about their
dependency on pg_config. This gives a lot more visibility into the state
of affairs regarding pkg-config support for libpq, which ultimately is
the much better solution.
2025-03-10 19:35:50 +01:00
|
|
|
# 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
|
|
|
|
|
|
|
|
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") ;;
|
2025-05-17 14:19:35 +02:00
|
|
|
--pgxs) show+=("$PGXS") ;;
|
postgresql: replace pg_config with custom script
By replacing upstream's pg_config binary with a shell script, we:
- gain the ability to run pg_config easily when cross-compiling,
- can remove the fake pg_config in the default output,
- can remove the pg_config wrapper script dealing with special cases.
Some 20 years ago, pg_config *was* a shell script upstream, too. It was
changed to a binary, when it was made "relocatable", so it would return
paths depending on the location of the "postgres" binary. However, this
is exactly the thing that just hurts us in nixpkgs - we don't want those
paths to change, we want them to always point at the right outputs. By
writing the script ourselves, this becomes a lot less painful.
This approach means more lines of codes, but all of them are dead simple
and we have a lot less complexity overall.
Additionally, pg_config is now made a separate derivation, only exposed
as "postgresql.pg_config". This has the nice side-effect, that all users
of postgresql and libpq in nixpkgs must be very *explicit* about their
dependency on pg_config. This gives a lot more visibility into the state
of affairs regarding pkg-config support for libpq, which ultimately is
the much better solution.
2025-03-10 19:35:50 +01:00
|
|
|
--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
|
2024-09-12 19:15:29 +02:00
|
|
|
fi
|
|
|
|
|
postgresql: replace pg_config with custom script
By replacing upstream's pg_config binary with a shell script, we:
- gain the ability to run pg_config easily when cross-compiling,
- can remove the fake pg_config in the default output,
- can remove the pg_config wrapper script dealing with special cases.
Some 20 years ago, pg_config *was* a shell script upstream, too. It was
changed to a binary, when it was made "relocatable", so it would return
paths depending on the location of the "postgres" binary. However, this
is exactly the thing that just hurts us in nixpkgs - we don't want those
paths to change, we want them to always point at the right outputs. By
writing the script ourselves, this becomes a lot less painful.
This approach means more lines of codes, but all of them are dead simple
and we have a lot less complexity overall.
Additionally, pg_config is now made a separate derivation, only exposed
as "postgresql.pg_config". This has the nice side-effect, that all users
of postgresql and libpq in nixpkgs must be very *explicit* about their
dependency on pg_config. This gives a lot more visibility into the state
of affairs regarding pkg-config support for libpq, which ultimately is
the much better solution.
2025-03-10 19:35:50 +01:00
|
|
|
# no arguments -> print everything
|
|
|
|
cat <<EOF
|
|
|
|
BINDIR = $PGBINDIR
|
|
|
|
DOCDIR = $DOCDIR
|
|
|
|
HTMLDIR = $HTMLDIR
|
|
|
|
INCLUDEDIR = $INCLUDEDIR
|
|
|
|
PKGINCLUDEDIR = $PKGINCLUDEDIR
|
|
|
|
INCLUDEDIR-SERVER = $INCLUDEDIRSERVER
|
|
|
|
LIBDIR = $LIBDIR
|
|
|
|
PKGLIBDIR = $PKGLIBDIR
|
|
|
|
LOCALEDIR = $LOCALEDIR
|
|
|
|
MANDIR = $MANDIR
|
|
|
|
SHAREDIR = $PGSHAREDIR
|
|
|
|
SYSCONFDIR = $SYSCONFDIR
|
2025-05-17 14:19:35 +02:00
|
|
|
PGXS = $PGXS
|
postgresql: replace pg_config with custom script
By replacing upstream's pg_config binary with a shell script, we:
- gain the ability to run pg_config easily when cross-compiling,
- can remove the fake pg_config in the default output,
- can remove the pg_config wrapper script dealing with special cases.
Some 20 years ago, pg_config *was* a shell script upstream, too. It was
changed to a binary, when it was made "relocatable", so it would return
paths depending on the location of the "postgres" binary. However, this
is exactly the thing that just hurts us in nixpkgs - we don't want those
paths to change, we want them to always point at the right outputs. By
writing the script ourselves, this becomes a lot less painful.
This approach means more lines of codes, but all of them are dead simple
and we have a lot less complexity overall.
Additionally, pg_config is now made a separate derivation, only exposed
as "postgresql.pg_config". This has the nice side-effect, that all users
of postgresql and libpq in nixpkgs must be very *explicit* about their
dependency on pg_config. This gives a lot more visibility into the state
of affairs regarding pkg-config support for libpq, which ultimately is
the much better solution.
2025-03-10 19:35:50 +01:00
|
|
|
CONFIGURE = $CONFIGURE_ARGS
|
|
|
|
CC = $CC
|
|
|
|
CPPFLAGS = $CPPFLAGS
|
|
|
|
CFLAGS = $CFLAGS
|
|
|
|
CFLAGS_SL = $CFLAGS_SL
|
|
|
|
LDFLAGS = $LDFLAGS
|
|
|
|
LDFLAGS_EX = $LDFLAGS_EX
|
|
|
|
LDFLAGS_SL = $LDFLAGS_SL
|
|
|
|
LIBS = $LIBS
|
|
|
|
VERSION = PostgreSQL $PG_VERSION
|
|
|
|
EOF
|