1 # Copyright 1999-2020 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
6 PYTHON_COMPAT=( python3_6 )
8 PLOCALES="af cs de en es fa fr hr hu it ko nb pl pt_BR ro ru sk sl sv tr zh_CN
11 inherit flag-o-matic l10n linux-info multilib pam prefix python-single-r1 \
12 systemd user versionator
14 KEYWORDS="~alpha amd64 arm ~arm64 hppa ia64 ~mips ppc ppc64 ~s390 sparc x86 ~ppc-macos ~x86-solaris"
16 SLOT="$(get_version_component_range 1-2)"
18 SRC_URI="https://ftp.postgresql.org/pub/source/v${PV}/postgresql-${PV}.tar.bz2"
20 LICENSE="POSTGRESQL GPL-2"
21 DESCRIPTION="PostgreSQL RDBMS"
22 HOMEPAGE="https://www.postgresql.org/"
24 IUSE="doc kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp
25 python +readline selinux +server systemd ssl static-libs tcl threads uuid
28 REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
31 >=app-eselect/eselect-postgresql-2.0
34 kerberos? ( virtual/krb5 )
35 ldap? ( net-nds/openldap )
37 perl? ( >=dev-lang/perl-5.8:= )
38 python? ( ${PYTHON_DEPS} )
39 readline? ( sys-libs/readline:0= )
41 !libressl? ( >=dev-libs/openssl-0.9.6-r1:0= )
42 libressl? ( dev-libs/libressl:= )
44 tcl? ( >=dev-lang/tcl-8:0= )
45 xml? ( dev-libs/libxml2 dev-libs/libxslt )
46 zlib? ( sys-libs/zlib )
49 # uuid flags -- depend on sys-apps/util-linux for Linux libcs, or if no
50 # supported libc in use depend on dev-libs/ossp-uuid. For BSD systems,
51 # the libc includes UUID functions.
52 UTIL_LINUX_LIBC=( elibc_{glibc,uclibc,musl} )
53 BSD_LIBC=( elibc_{Free,Net,Open}BSD )
57 while [[ ${#} -gt 1 ]]; do
62 echo "${front}${1}${back}"
65 IUSE+=" ${UTIL_LINUX_LIBC[@]} ${BSD_LIBC[@]}"
68 ${UTIL_LINUX_LIBC[@]/%/? ( sys-apps/util-linux )}
69 $(nest_usedep ${UTIL_LINUX_LIBC[@]/#/!} ${BSD_LIBC[@]/#/!} dev-libs/ossp-uuid)
73 !!<sys-apps/sandbox-2.0
76 nls? ( sys-devel/gettext )
77 xml? ( virtual/pkgconfig )
81 !dev-db/postgresql-docs:${SLOT}
82 !dev-db/postgresql-base:${SLOT}
83 !dev-db/postgresql-server:${SLOT}
84 selinux? ( sec-policy/selinux-postgresql )
88 use server && CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup
91 enewuser postgres 70 /bin/sh /var/lib/postgresql postgres
93 use python && python-single-r1_pkg_setup
97 # Work around PPC{,64} compilation bug where bool is already defined
98 sed '/#ifndef __cplusplus/a #undef bool' -i src/include/c.h || die
100 # Set proper run directory
101 sed "s|\(PGSOCKET_DIR\s\+\)\"/tmp\"|\1\"${EPREFIX}/run/postgresql\"|" \
102 -i src/include/pg_config_manual.h || die
104 # Rely on $PATH being in the proper order so that the correct
105 # install program is used for modules utilizing PGXS in both
106 # hardened and non-hardened environments. (Bug #528786)
107 sed 's/@install_bin@/install -c/' -i src/Makefile.global.in || die
109 use server || eapply "${FILESDIR}/${PN}-9.5.5-no-server.patch"
112 sed -e "s/\(#define PGSQL_PAM_SERVICE \"postgresql\)/\1-${SLOT}/" \
113 -i src/backend/libpq/auth.c || \
114 die 'PGSQL_PAM_SERVICE rename failed.'
122 *-darwin*|*-solaris*)
123 use nls && append-libs intl
127 export LDFLAGS_SL="${LDFLAGS}"
128 export LDFLAGS_EX="${LDFLAGS}"
130 local PO="${EPREFIX}"
132 local i uuid_config=""
134 for i in ${UTIL_LINUX_LIBC[@]}; do
135 use ${i} && uuid_config="--with-uuid=e2fs"
137 for i in ${BSD_LIBC[@]}; do
138 use ${i} && uuid_config="--with-uuid=bsd"
140 [[ -z $uuid_config ]] && uuid_config="--with-uuid=ossp"
144 --prefix="${PO}/usr/$(get_libdir)/postgresql-${SLOT}" \
145 --datadir="${PO}/usr/share/postgresql-${SLOT}" \
146 --includedir="${PO}/usr/include/postgresql-${SLOT}" \
147 --mandir="${PO}/usr/share/postgresql-${SLOT}/man" \
148 --sysconfdir="${PO}/etc/postgresql-${SLOT}" \
149 --with-system-tzdata="${PO}/usr/share/zoneinfo" \
150 $(use_enable !alpha spinlocks) \
151 $(use_enable !pg_legacytimestamp integer-datetimes) \
152 $(use_enable threads thread-safety) \
153 $(use_with kerberos gssapi) \
158 $(use_with readline) \
159 $(use_with ssl openssl) \
162 $(use_with xml libxml) \
163 $(use_with xml libxslt) \
165 $(use_enable nls nls "'$(l10n_get_locales)'")
174 emake DESTDIR="${D}" install
175 emake DESTDIR="${D}" install -C contrib
177 dodoc README HISTORY doc/{TODO,bug.template}
179 # man pages are already built, but if we have the target make them,
180 # they'll be generated from source before being installed so we
181 # manually install man pages.
182 # We use ${SLOT} instead of doman for postgresql.eselect
183 insinto /usr/share/postgresql-${SLOT}/man/
184 doins -r doc/src/sgml/man{1,3,7}
185 if ! use server; then
186 # Remove man pages for non-existent binaries
187 for m in {initdb,pg_{controldata,ctl,resetxlog},post{gres,master}}; do
188 rm "${ED}/usr/share/postgresql-${SLOT}/man/man1/${m}.1"
191 docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7}
193 # Create slot specific man pages
194 local bn f mansec slotted_name
195 for mansec in 1 3 7 ; do
196 local rel_manpath="../../postgresql-${SLOT}/man/man${mansec}"
198 mkdir -p "${ED}"/usr/share/man/man${mansec} || die "making man dir"
199 pushd "${ED}"/usr/share/man/man${mansec} > /dev/null || die "pushd failed"
201 for f in "${ED}/usr/share/postgresql-${SLOT}/man/man${mansec}"/* ; do
202 bn=$(basename "${f}")
203 slotted_name=${bn%.${mansec}}${SLOT/.}.${mansec}
206 echo ".so ${rel_manpath}/SELECT.7" > ${slotted_name}
209 echo ".so ${rel_manpath}/${bn}" > ${slotted_name}
217 insinto /etc/postgresql-${SLOT}
218 newins src/bin/psql/psqlrc.sample psqlrc
220 use static-libs || find "${ED}" -name '*.a' -delete
223 for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \
224 -mindepth 1 -maxdepth 1)
226 bn=$(basename "${f}")
227 # Temporarily tack on tmp to workaround a file collision
228 # issue. This is only necessary for 9.7 and earlier. 10 never
230 dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \
231 "/usr/bin/${bn}${SLOT/.}tmp"
236 dodoc doc/src/sgml/html/*
239 dodoc doc/src/sgml/*.{sgml,dsl}
243 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
244 "${FILESDIR}/${PN}.confd-9.3" | newconfd - ${PN}-${SLOT}
246 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
247 "${FILESDIR}/${PN}.init-9.3-r1" | newinitd - ${PN}-${SLOT}
250 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
251 "${FILESDIR}/${PN}.service-9.2" | \
252 systemd_newunit - ${PN}-${SLOT}.service
253 systemd_newtmpfilesd "${FILESDIR}"/${PN}.tmpfiles ${PN}-${SLOT}.conf
256 newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir
258 use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session
261 keepdir /run/postgresql
262 fperms 1775 /run/postgresql
268 # Find all of the slot-specific symlinks, if any, in /usr/bin (e.g.,
269 # /usr/bin/psql96). They may have been created by the
270 # postgresql.eselect module, but they're handled within this ebuild
271 # now. It's alright if we momentarily delete /usr/bin/psql as it
272 # will be recreated by the eselect module in pkg_ppostinst(). This
273 # is only necessary for 9.7 and earlier. 10 and later were never
274 # handled in this manner.
276 if type -p realpath > /dev/null; then
277 canonicalise=realpath
278 elif type -p readlink > /dev/null; then
279 canonicalise='readlink -f'
281 # can't die, subshell
282 die "No readlink nor realpath found, cannot canonicalise"
286 # First remove any symlinks in /usr/bin that may have been created
288 for l in $(find "${ROOT%/}/usr/bin" -mindepth 1 -maxdepth 1 -type l) ; do
289 if [[ $(${canonicalise} "${l}") == *postgresql-${SLOT}* ]] ; then
290 rm "${l}" || ewarn "Couldn't remove ${l}"
294 # Then move the symlinks created by the ebuild to their proper place.
295 for l in "${ED}"/usr/bin/*tmp ; do
296 mv "${l}" "${l%tmp}" \
297 || ewarn "Couldn't rename $(basename ${l}) to $(basename ${l%tmp})"
302 use server && use systemd && systemd_tmpfiles_create ${PN}-${SLOT}.conf
303 postgresql-config update
305 if use alpha && use server ; then
306 ewarn "PostgreSQL 9.5+ no longer has native spinlock support on Alpha platforms."
307 ewarn "As a result, performance will be extremely degraded."
310 elog "If you need a global psqlrc-file, you can place it in:"
311 elog " ${EROOT%/}/etc/postgresql-${SLOT}/"
315 elog "Gentoo specific documentation:"
316 elog "https://wiki.gentoo.org/wiki/PostgreSQL"
318 elog "Official documentation:"
319 elog "https://www.postgresql.org/docs/${SLOT}/static/index.html"
321 elog "The default location of the Unix-domain socket is:"
322 elog " ${EROOT%/}/run/postgresql/"
324 elog "Before initializing the database, you may want to edit PG_INITDB_OPTS"
325 elog "so that it contains your preferred locale in:"
326 elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}"
328 elog "Then, execute the following command to setup the initial database"
330 elog " emerge --config =${CATEGORY}/${PF}"
335 if use server && [[ -z ${REPLACED_BY_VERSION} ]] ; then
336 ewarn "Have you dumped and/or migrated the ${SLOT} database cluster?"
337 ewarn "\thttps://wiki.gentoo.org/wiki/PostgreSQL/QuickStart#Migrating_PostgreSQL"
339 ebegin "Resuming removal in 10 seconds (Control-C to cancel)"
346 postgresql-config update
350 use server || die "USE flag 'server' not enabled. Nothing to configure."
352 [[ -f "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" ]] \
353 && source "${EROOT%/}/etc/conf.d/postgresql-${SLOT}"
354 [[ -z "${PGDATA}" ]] && PGDATA="${EROOT%/}/etc/postgresql-${SLOT}/"
355 [[ -z "${DATA_DIR}" ]] \
356 && DATA_DIR="${EROOT%/}/var/lib/postgresql/${SLOT}/data"
358 # environment.bz2 may not contain the same locale as the current system
359 # locale. Unset and source from the current system locale.
360 if [ -f "${EROOT%/}/etc/env.d/02locale" ]; then
369 source "${EROOT%/}/etc/env.d/02locale"
370 [ -n "${LANG}" ] && export LANG
371 [ -n "${LC_CTYPE}" ] && export LC_CTYPE
372 [ -n "${LC_NUMERIC}" ] && export LC_NUMERIC
373 [ -n "${LC_TIME}" ] && export LC_TIME
374 [ -n "${LC_COLLATE}" ] && export LC_COLLATE
375 [ -n "${LC_MONETARY}" ] && export LC_MONETARY
376 [ -n "${LC_MESSAGES}" ] && export LC_MESSAGES
377 [ -n "${LC_ALL}" ] && export LC_ALL
380 einfo "You can modify the paths and options passed to initdb by editing:"
381 einfo " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}"
383 einfo "Information on options that can be passed to initdb are found at:"
384 einfo " https://www.postgresql.org/docs/${SLOT}/static/creating-cluster.html"
385 einfo " https://www.postgresql.org/docs/${SLOT}/static/app-initdb.html"
387 einfo "PG_INITDB_OPTS is currently set to:"
388 if [[ -z "${PG_INITDB_OPTS}" ]] ; then
391 einfo " ${PG_INITDB_OPTS}"
394 einfo "Configuration files will be installed to:"
397 einfo "The database cluster will be created in:"
401 ebegin "Continuing initialization in 5 seconds (Control-C to cancel)"
405 if [ -n "$(ls -A ${DATA_DIR} 2> /dev/null)" ] ; then
406 eerror "The given directory, '${DATA_DIR}', is not empty."
407 eerror "Modify DATA_DIR to point to an empty directory."
408 die "${DATA_DIR} is not empty."
411 einfo "Creating the data directory ..."
412 if [[ ${EUID} == 0 ]] ; then
413 mkdir -p "${DATA_DIR}"
414 chown -Rf postgres:postgres "${DATA_DIR}"
415 chmod 0700 "${DATA_DIR}"
418 einfo "Initializing the database ..."
420 if [[ ${EUID} == 0 ]] ; then
421 su postgres -c "${EROOT%/}/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb -D \"${DATA_DIR}\" ${PG_INITDB_OPTS}"
423 "${EROOT%/}"/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb -U postgres -D "${DATA_DIR}" ${PG_INITDB_OPTS}
426 if [[ "${DATA_DIR%/}" != "${PGDATA%/}" ]] ; then
427 mv "${DATA_DIR%/}"/{pg_{hba,ident},postgresql}.conf "${PGDATA}"
428 ln -s "${PGDATA%/}"/{pg_{hba,ident},postgresql}.conf "${DATA_DIR%/}"
431 # unix_socket_directory has no effect in postgresql.conf as it's
432 # overridden in the initscript
433 sed '/^#unix_socket_directories/,+1d' -i "${PGDATA%/}"/postgresql.conf
435 cat <<- EOF >> "${PGDATA%/}"/postgresql.conf
436 # This is here because of https://bugs.gentoo.org/show_bug.cgi?id=518522
437 # On the off-chance that you might need to work with UTF-8 encoded
438 # characters in PL/Perl
439 plperl.on_init = 'use utf8; use re; package utf8; require "utf8_heavy.pl";'
442 einfo "The autovacuum function, which was in contrib, has been moved to the main"
443 einfo "PostgreSQL functions starting with 8.1, and starting with 8.4 is now enabled"
444 einfo "by default. You can disable it in the cluster's:"
445 einfo " ${PGDATA%/}/postgresql.conf"
447 einfo "The PostgreSQL server, by default, will log events to:"
448 einfo " ${DATA_DIR%/}/postmaster.log"
451 einfo "The location of the configuration files have moved to:"
453 einfo "To start the server:"
454 einfo " pg_ctl start -D ${DATA_DIR} -o '-D ${PGDATA} --data-directory=${DATA_DIR}'"
456 einfo " pg_ctl stop -D ${DATA_DIR}"
458 einfo "Or move the configuration files back:"
459 einfo "mv ${PGDATA}*.conf ${DATA_DIR}"
461 einfo "You should use the '${EROOT%/}/etc/init.d/postgresql-${SLOT}' script to run PostgreSQL"
462 einfo "instead of 'pg_ctl'."
467 if use server && [[ ${UID} -ne 0 ]] ; then
470 einfo "If you think other tests besides the regression tests are necessary, please"
471 einfo "submit a bug including a patch for this ebuild to enable them."
474 ewarn 'Tests cannot be run without the "server" use flag enabled.'
475 [[ ${UID} -eq 0 ]] || \
476 ewarn 'Tests cannot be run as root. Enable "userpriv" in FEATURES.'