1 # Copyright 1999-2020 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
6 PYTHON_COMPAT=( python3_{6,7} )
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 \
14 KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~ppc-macos ~x86-solaris"
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="debug doc kerberos kernel_linux ldap libressl nls pam perl
25 -pg_legacytimestamp python +readline selinux +server systemd ssl
26 static-libs tcl threads uuid xml zlib"
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.4.10-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 --docdir="${PO}/usr/share/doc/${PF}" \
147 --includedir="${PO}/usr/include/postgresql-${SLOT}" \
148 --mandir="${PO}/usr/share/postgresql-${SLOT}/man" \
149 --sysconfdir="${PO}/etc/postgresql-${SLOT}" \
150 --with-system-tzdata="${PO}/usr/share/zoneinfo" \
151 $(use_enable !pg_legacytimestamp integer-datetimes) \
152 $(use_enable debug) \
153 $(use_enable threads thread-safety) \
154 $(use_with kerberos gssapi) \
159 $(use_with readline) \
160 $(use_with ssl openssl) \
163 $(use_with xml libxml) \
164 $(use_with xml libxslt) \
166 $(use_enable nls nls "'$(l10n_get_locales)'")
175 emake DESTDIR="${D}" install
176 emake DESTDIR="${D}" install -C contrib
178 dodoc README HISTORY doc/{TODO,bug.template}
180 # man pages are already built, but if we have the target make them,
181 # they'll be generated from source before being installed so we
182 # manually install man pages.
183 # We use ${SLOT} instead of doman for postgresql.eselect
184 insinto /usr/share/postgresql-${SLOT}/man/
185 doins -r doc/src/sgml/man{1,3,7}
186 if ! use server; then
187 # Remove man pages for non-existent binaries
188 for m in {initdb,pg_{controldata,ctl,resetxlog},post{gres,master}}; do
189 rm "${ED}/usr/share/postgresql-${SLOT}/man/man1/${m}.1"
192 docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7}
194 # Create slot specific man pages
195 local bn f mansec slotted_name
196 for mansec in 1 3 7 ; do
197 local rel_manpath="../../postgresql-${SLOT}/man/man${mansec}"
199 mkdir -p "${ED}"/usr/share/man/man${mansec} || die "making man dir"
200 pushd "${ED}"/usr/share/man/man${mansec} > /dev/null || die "pushd failed"
202 for f in "${ED}/usr/share/postgresql-${SLOT}/man/man${mansec}"/* ; do
203 bn=$(basename "${f}")
204 slotted_name=${bn%.${mansec}}${SLOT/.}.${mansec}
207 echo ".so ${rel_manpath}/SELECT.7" > ${slotted_name}
210 echo ".so ${rel_manpath}/${bn}" > ${slotted_name}
218 insinto /etc/postgresql-${SLOT}
219 newins src/bin/psql/psqlrc.sample psqlrc
221 # Don't delete libpg{port,common}.a (Bug #571046). They're always
222 # needed by extensions utilizing PGXS.
224 find "${ED}" -name '*.a' ! -name libpgport.a ! -name libpgcommon.a \
228 for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \
229 -mindepth 1 -maxdepth 1)
231 bn=$(basename "${f}")
232 # Temporarily tack on tmp to workaround a file collision
233 # issue. This is only necessary for 9.7 and earlier. 10 never
235 dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \
236 "/usr/bin/${bn}${SLOT/.}tmp"
241 dodoc doc/src/sgml/html/*
244 dodoc doc/src/sgml/*.{sgml,dsl}
248 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
249 "${FILESDIR}/${PN}.confd-9.3" | newconfd - ${PN}-${SLOT}
251 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
252 "${FILESDIR}/${PN}.init-9.3-r1" | newinitd - ${PN}-${SLOT}
255 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
256 "${FILESDIR}/${PN}.service-9.2" | \
257 systemd_newunit - ${PN}-${SLOT}.service
258 systemd_newtmpfilesd "${FILESDIR}"/${PN}.tmpfiles ${PN}-${SLOT}.conf
261 newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir
263 use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session
266 keepdir /run/postgresql
267 fperms 1775 /run/postgresql
273 # Find all of the slot-specific symlinks, if any, in /usr/bin (e.g.,
274 # /usr/bin/psql96). They may have been created by the
275 # postgresql.eselect module, but they're handled within this ebuild
276 # now. It's alright if we momentarily delete /usr/bin/psql as it
277 # will be recreated by the eselect module in pkg_ppostinst(). This
278 # is only necessary for 9.7 and earlier. 10 and later were never
279 # handled in this manner.
281 if type -p realpath > /dev/null; then
282 canonicalise=realpath
283 elif type -p readlink > /dev/null; then
284 canonicalise='readlink -f'
286 # can't die, subshell
287 die "No readlink nor realpath found, cannot canonicalise"
291 # First remove any symlinks in /usr/bin that may have been created
293 for l in $(find "${ROOT}/usr/bin" -mindepth 1 -maxdepth 1 -type l) ; do
294 if [[ $(${canonicalise} "${l}") == *postgresql-${SLOT}* ]] ; then
295 rm "${l}" || ewarn "Couldn't remove ${l}"
299 # Then move the symlinks created by the ebuild to their proper place.
300 for l in "${ED}"/usr/bin/*tmp ; do
301 mv "${l}" "${l%tmp}" \
302 || ewarn "Couldn't rename $(basename ${l}) to $(basename ${l%tmp})"
307 use server && use systemd && systemd_tmpfiles_create ${PN}-${SLOT}.conf
308 postgresql-config update
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.'