edf5af70b276612960131c681ea25deea2a04ebd
[gentoo.git] / dev-db / postgresql / postgresql-9.4.26.ebuild
1 # Copyright 1999-2020 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
3
4 EAPI=7
5
6 PYTHON_COMPAT=( python3_{6,7} )
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
13
14 KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~ppc-macos ~x86-solaris"
15
16 SLOT=$(ver_cut 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="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"
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.4.10-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                 --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) \
155                 $(use_with ldap) \
156                 $(use_with pam) \
157                 $(use_with perl) \
158                 $(use_with python) \
159                 $(use_with readline) \
160                 $(use_with ssl openssl) \
161                 $(use_with tcl) \
162                 ${uuid_config} \
163                 $(use_with xml libxml) \
164                 $(use_with xml libxslt) \
165                 $(use_with zlib) \
166                 $(use_enable nls nls "'$(l10n_get_locales)'")
167 }
168
169 src_compile() {
170         emake
171         emake -C contrib
172 }
173
174 src_install() {
175         emake DESTDIR="${D}" install
176         emake DESTDIR="${D}" install -C contrib
177
178         dodoc README HISTORY doc/{TODO,bug.template}
179
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"
190                 done
191         fi
192         docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7}
193
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}"
198
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"
201
202                 for f in "${ED}/usr/share/postgresql-${SLOT}/man/man${mansec}"/* ; do
203                         bn=$(basename "${f}")
204                         slotted_name=${bn%.${mansec}}${SLOT/.}.${mansec}
205                         case ${bn} in
206                                 TABLE.7|WITH.7)
207                                         echo ".so ${rel_manpath}/SELECT.7" > ${slotted_name}
208                                         ;;
209                                 *)
210                                         echo ".so ${rel_manpath}/${bn}" > ${slotted_name}
211                                         ;;
212                         esac
213                 done
214
215                 popd > /dev/null
216         done
217
218         insinto /etc/postgresql-${SLOT}
219         newins src/bin/psql/psqlrc.sample psqlrc
220
221         # Don't delete libpg{port,common}.a (Bug #571046). They're always
222         # needed by extensions utilizing PGXS.
223         use static-libs || \
224                 find "${ED}" -name '*.a' ! -name libpgport.a ! -name libpgcommon.a \
225                          -delete
226
227         local f bn
228         for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \
229                                         -mindepth 1 -maxdepth 1)
230         do
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
234                 # had this issue.
235                 dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \
236                           "/usr/bin/${bn}${SLOT/.}tmp"
237         done
238
239         if use doc ; then
240                 docinto html
241                 dodoc doc/src/sgml/html/*
242
243                 docinto sgml
244                 dodoc doc/src/sgml/*.{sgml,dsl}
245         fi
246
247         if use server; then
248                 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
249                         "${FILESDIR}/${PN}.confd-9.3" | newconfd - ${PN}-${SLOT}
250
251                 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
252                         "${FILESDIR}/${PN}.init-9.3-r1" | newinitd - ${PN}-${SLOT}
253
254                 if use systemd; then
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
259                 fi
260
261                 newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir
262
263                 use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session
264
265                 if use prefix ; then
266                         keepdir /run/postgresql
267                         fperms 1775 /run/postgresql
268                 fi
269         fi
270 }
271
272 pkg_preinst() {
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.
280         local canonicalise
281         if type -p realpath > /dev/null; then
282                 canonicalise=realpath
283         elif type -p readlink > /dev/null; then
284                 canonicalise='readlink -f'
285         else
286                 # can't die, subshell
287                 die "No readlink nor realpath found, cannot canonicalise"
288         fi
289
290         local l
291         # First remove any symlinks in /usr/bin that may have been created
292         # by the old eselect
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}"
296                 fi
297         done
298
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})"
303         done
304 }
305
306 pkg_postinst() {
307         use server && use systemd && systemd_tmpfiles_create ${PN}-${SLOT}.conf
308         postgresql-config update
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 }