*/*: Discontinue Gentoo SuperH port
[gentoo.git] / dev-db / postgresql / postgresql-9.5.17.ebuild
1 # Copyright 1999-2020 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
3
4 EAPI="6"
5
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
9                   zh_TW"
10
11 inherit flag-o-matic l10n linux-info multilib pam prefix python-single-r1 \
12                 systemd user versionator
13
14 KEYWORDS="~alpha amd64 arm ~arm64 hppa ia64 ~mips ppc ppc64 ~s390 sparc x86 ~ppc-macos ~x86-solaris"
15
16 SLOT="$(get_version_component_range 1-2)"
17
18 SRC_URI="https://ftp.postgresql.org/pub/source/v${PV}/postgresql-${PV}.tar.bz2"
19
20 LICENSE="POSTGRESQL GPL-2"
21 DESCRIPTION="PostgreSQL RDBMS"
22 HOMEPAGE="https://www.postgresql.org/"
23
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
26           xml zlib"
27
28 REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
29
30 CDEPEND="
31 >=app-eselect/eselect-postgresql-2.0
32 sys-apps/less
33 virtual/libintl
34 kerberos? ( virtual/krb5 )
35 ldap? ( net-nds/openldap )
36 pam? ( sys-libs/pam )
37 perl? ( >=dev-lang/perl-5.8:= )
38 python? ( ${PYTHON_DEPS} )
39 readline? ( sys-libs/readline:0= )
40 ssl? (
41         !libressl? ( >=dev-libs/openssl-0.9.6-r1:0= )
42         libressl? ( dev-libs/libressl:= )
43 )
44 tcl? ( >=dev-lang/tcl-8:0= )
45 xml? ( dev-libs/libxml2 dev-libs/libxslt )
46 zlib? ( sys-libs/zlib )
47 "
48
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 )
54
55 nest_usedep() {
56         local front back
57         while [[ ${#} -gt 1 ]]; do
58                 front+="${1}? ( "
59                 back+=" )"
60                 shift
61         done
62         echo "${front}${1}${back}"
63 }
64
65 IUSE+=" ${UTIL_LINUX_LIBC[@]} ${BSD_LIBC[@]}"
66 CDEPEND+="
67 uuid? (
68         ${UTIL_LINUX_LIBC[@]/%/? ( sys-apps/util-linux )}
69         $(nest_usedep ${UTIL_LINUX_LIBC[@]/#/!} ${BSD_LIBC[@]/#/!} dev-libs/ossp-uuid)
70 )"
71
72 DEPEND="${CDEPEND}
73 !!<sys-apps/sandbox-2.0
74 sys-devel/bison
75 sys-devel/flex
76 nls? ( sys-devel/gettext )
77 xml? ( virtual/pkgconfig )
78 "
79
80 RDEPEND="${CDEPEND}
81 !dev-db/postgresql-docs:${SLOT}
82 !dev-db/postgresql-base:${SLOT}
83 !dev-db/postgresql-server:${SLOT}
84 selinux? ( sec-policy/selinux-postgresql )
85 "
86
87 pkg_setup() {
88         use server && CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup
89
90         enewgroup postgres 70
91         enewuser postgres 70 /bin/sh /var/lib/postgresql postgres
92
93         use python && python-single-r1_pkg_setup
94 }
95
96 src_prepare() {
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
99
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
103
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
108
109         use server || eapply "${FILESDIR}/${PN}-9.5.5-no-server.patch"
110
111         if use pam ; then
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.'
115         fi
116
117         eapply_user
118 }
119
120 src_configure() {
121         case ${CHOST} in
122                 *-darwin*|*-solaris*)
123                         use nls && append-libs intl
124                         ;;
125         esac
126
127         export LDFLAGS_SL="${LDFLAGS}"
128         export LDFLAGS_EX="${LDFLAGS}"
129
130         local PO="${EPREFIX}"
131
132         local i uuid_config=""
133         if use uuid; then
134                 for i in ${UTIL_LINUX_LIBC[@]}; do
135                         use ${i} && uuid_config="--with-uuid=e2fs"
136                 done
137                 for i in ${BSD_LIBC[@]}; do
138                         use ${i} && uuid_config="--with-uuid=bsd"
139                 done
140                 [[ -z $uuid_config ]] && uuid_config="--with-uuid=ossp"
141         fi
142
143         econf \
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) \
154                 $(use_with ldap) \
155                 $(use_with pam) \
156                 $(use_with perl) \
157                 $(use_with python) \
158                 $(use_with readline) \
159                 $(use_with ssl openssl) \
160                 $(use_with tcl) \
161                 ${uuid_config} \
162                 $(use_with xml libxml) \
163                 $(use_with xml libxslt) \
164                 $(use_with zlib) \
165                 $(use_enable nls nls "'$(l10n_get_locales)'")
166 }
167
168 src_compile() {
169         emake
170         emake -C contrib
171 }
172
173 src_install() {
174         emake DESTDIR="${D}" install
175         emake DESTDIR="${D}" install -C contrib
176
177         dodoc README HISTORY doc/{TODO,bug.template}
178
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"
189                 done
190         fi
191         docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7}
192
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}"
197
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"
200
201                 for f in "${ED}/usr/share/postgresql-${SLOT}/man/man${mansec}"/* ; do
202                         bn=$(basename "${f}")
203                         slotted_name=${bn%.${mansec}}${SLOT/.}.${mansec}
204                         case ${bn} in
205                                 TABLE.7|WITH.7)
206                                         echo ".so ${rel_manpath}/SELECT.7" > ${slotted_name}
207                                         ;;
208                                 *)
209                                         echo ".so ${rel_manpath}/${bn}" > ${slotted_name}
210                                         ;;
211                         esac
212                 done
213
214                 popd > /dev/null
215         done
216
217         insinto /etc/postgresql-${SLOT}
218         newins src/bin/psql/psqlrc.sample psqlrc
219
220         use static-libs || find "${ED}" -name '*.a' -delete
221
222         local f bn
223         for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \
224                                         -mindepth 1 -maxdepth 1)
225         do
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
229                 # had this issue.
230                 dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \
231                           "/usr/bin/${bn}${SLOT/.}tmp"
232         done
233
234         if use doc ; then
235                 docinto html
236                 dodoc doc/src/sgml/html/*
237
238                 docinto sgml
239                 dodoc doc/src/sgml/*.{sgml,dsl}
240         fi
241
242         if use server; then
243                 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
244                         "${FILESDIR}/${PN}.confd-9.3" | newconfd - ${PN}-${SLOT}
245
246                 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
247                         "${FILESDIR}/${PN}.init-9.3-r1" | newinitd - ${PN}-${SLOT}
248
249                 if use systemd; then
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
254                 fi
255
256                 newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir
257
258                 use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session
259
260                 if use prefix ; then
261                         keepdir /run/postgresql
262                         fperms 1775 /run/postgresql
263                 fi
264         fi
265 }
266
267 pkg_preinst() {
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.
275         local canonicalise
276         if type -p realpath > /dev/null; then
277                 canonicalise=realpath
278         elif type -p readlink > /dev/null; then
279                 canonicalise='readlink -f'
280         else
281                 # can't die, subshell
282                 die "No readlink nor realpath found, cannot canonicalise"
283         fi
284
285         local l
286         # First remove any symlinks in /usr/bin that may have been created
287         # by the old eselect
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}"
291                 fi
292         done
293
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})"
298         done
299 }
300
301 pkg_postinst() {
302         use server && use systemd && systemd_tmpfiles_create ${PN}-${SLOT}.conf
303         postgresql-config update
304
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."
308         fi
309
310         elog "If you need a global psqlrc-file, you can place it in:"
311         elog "    ${EROOT%/}/etc/postgresql-${SLOT}/"
312
313         if use server ; then
314                 elog
315                 elog "Gentoo specific documentation:"
316                 elog "https://wiki.gentoo.org/wiki/PostgreSQL"
317                 elog
318                 elog "Official documentation:"
319                 elog "https://www.postgresql.org/docs/${SLOT}/static/index.html"
320                 elog
321                 elog "The default location of the Unix-domain socket is:"
322                 elog "    ${EROOT%/}/run/postgresql/"
323                 elog
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}"
327                 elog
328                 elog "Then, execute the following command to setup the initial database"
329                 elog "environment:"
330                 elog "    emerge --config =${CATEGORY}/${PF}"
331         fi
332 }
333
334 pkg_prerm() {
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"
338
339                 ebegin "Resuming removal in 10 seconds (Control-C to cancel)"
340                 sleep 10
341                 eend 0
342         fi
343 }
344
345 pkg_postrm() {
346         postgresql-config update
347 }
348
349 pkg_config() {
350         use server || die "USE flag 'server' not enabled. Nothing to configure."
351
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"
357
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
361                 unset LANG
362                 unset LC_CTYPE
363                 unset LC_NUMERIC
364                 unset LC_TIME
365                 unset LC_COLLATE
366                 unset LC_MONETARY
367                 unset LC_MESSAGES
368                 unset LC_ALL
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
378         fi
379
380         einfo "You can modify the paths and options passed to initdb by editing:"
381         einfo "    ${EROOT%/}/etc/conf.d/postgresql-${SLOT}"
382         einfo
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"
386         einfo
387         einfo "PG_INITDB_OPTS is currently set to:"
388         if [[ -z "${PG_INITDB_OPTS}" ]] ; then
389                 einfo "    (none)"
390         else
391                 einfo "    ${PG_INITDB_OPTS}"
392         fi
393         einfo
394         einfo "Configuration files will be installed to:"
395         einfo "    ${PGDATA}"
396         einfo
397         einfo "The database cluster will be created in:"
398         einfo "    ${DATA_DIR}"
399         einfo
400
401         ebegin "Continuing initialization in 5 seconds (Control-C to cancel)"
402         sleep 5
403         eend 0
404
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."
409         fi
410
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}"
416         fi
417
418         einfo "Initializing the database ..."
419
420         if [[ ${EUID} == 0 ]] ; then
421                 su postgres -c "${EROOT%/}/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb -D \"${DATA_DIR}\" ${PG_INITDB_OPTS}"
422         else
423                 "${EROOT%/}"/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb -U postgres -D "${DATA_DIR}" ${PG_INITDB_OPTS}
424         fi
425
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%/}"
429         fi
430
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
434
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";'
440         EOF
441
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"
446         einfo
447         einfo "The PostgreSQL server, by default, will log events to:"
448         einfo "    ${DATA_DIR%/}/postmaster.log"
449         einfo
450         if use prefix ; then
451                 einfo "The location of the configuration files have moved to:"
452                 einfo "    ${PGDATA}"
453                 einfo "To start the server:"
454                 einfo "    pg_ctl start -D ${DATA_DIR} -o '-D ${PGDATA} --data-directory=${DATA_DIR}'"
455                 einfo "To stop:"
456                 einfo "    pg_ctl stop -D ${DATA_DIR}"
457                 einfo
458                 einfo "Or move the configuration files back:"
459                 einfo "mv ${PGDATA}*.conf ${DATA_DIR}"
460         else
461                 einfo "You should use the '${EROOT%/}/etc/init.d/postgresql-${SLOT}' script to run PostgreSQL"
462                 einfo "instead of 'pg_ctl'."
463         fi
464 }
465
466 src_test() {
467         if use server && [[ ${UID} -ne 0 ]] ; then
468                 emake check
469
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."
472         else
473                 use server || \
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.'
477
478                 ewarn 'Skipping.'
479         fi
480 }