postgresql-9.6.13.ebuild (14771B)
1 # Copyright 1999-2019 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
3
4 EAPI="6"
5
6 PYTHON_COMPAT=( python2_7 python3_{5,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 ~sh ~sparc ~x86 ~amd64-fbsd ~x86-fbsd ~ppc-macos ~x86-solaris"
15
16 SLOT="$(get_version_component_range 1-2)"
17
18 MY_PV=${PV/_/}
19 S="${WORKDIR}/${PN}-${MY_PV}"
20
21 SRC_URI="mirror://postgresql/source/v${MY_PV}/postgresql-${MY_PV}.tar.bz2"
22
23 LICENSE="POSTGRESQL GPL-2"
24 DESCRIPTION="PostgreSQL RDBMS"
25 HOMEPAGE="https://www.postgresql.org/"
26
27 IUSE="doc kerberos kernel_linux ldap libressl nls pam perl -pg_legacytimestamp
28 python +readline selinux +server systemd ssl static-libs tcl threads uuid
29 xml zlib"
30
31 REQUIRED_USE="python? ( ${PYTHON_REQUIRED_USE} )"
32
33 CDEPEND="
34 >=app-eselect/eselect-postgresql-2.0
35 virtual/pager
36 app-misc/editor-wrapper
37 virtual/libintl
38 kerberos? ( virtual/krb5 )
39 ldap? ( net-nds/openldap )
40 pam? ( virtual/pam )
41 perl? ( >=dev-lang/perl-5.8:= )
42 python? ( ${PYTHON_DEPS} )
43 readline? ( sys-libs/readline:0= )
44 ssl? (
45 !libressl? ( >=dev-libs/openssl-0.9.6-r1:0= )
46 libressl? ( dev-libs/libressl:= )
47 )
48 server? ( systemd? ( sys-apps/systemd ) )
49 tcl? ( >=dev-lang/tcl-8:0= )
50 xml? ( dev-libs/libxml2 dev-libs/libxslt )
51 zlib? ( sys-libs/zlib )
52 "
53
54 # uuid flags -- depend on sys-apps/util-linux for Linux libcs, or if no
55 # supported libc in use depend on dev-libs/ossp-uuid. For BSD systems,
56 # the libc includes UUID functions.
57 UTIL_LINUX_LIBC=( elibc_{glibc,uclibc,musl} )
58 BSD_LIBC=( elibc_{Free,Net,Open}BSD )
59
60 nest_usedep() {
61 local front back
62 while [[ ${#} -gt 1 ]]; do
63 front+="${1}? ( "
64 back+=" )"
65 shift
66 done
67 echo "${front}${1}${back}"
68 }
69
70 IUSE+=" ${UTIL_LINUX_LIBC[@]} ${BSD_LIBC[@]}"
71 CDEPEND+="
72 uuid? (
73 ${UTIL_LINUX_LIBC[@]/%/? ( sys-apps/util-linux )}
74 $(nest_usedep ${UTIL_LINUX_LIBC[@]/#/!} ${BSD_LIBC[@]/#/!} dev-libs/ossp-uuid)
75 )"
76
77 DEPEND="${CDEPEND}
78 !!<sys-apps/sandbox-2.0
79 sys-devel/bison
80 sys-devel/flex
81 nls? ( sys-devel/gettext )
82 xml? ( virtual/pkgconfig )
83 "
84
85 RDEPEND="${CDEPEND}
86 !dev-db/postgresql-docs:${SLOT}
87 !dev-db/postgresql-base:${SLOT}
88 !dev-db/postgresql-server:${SLOT}
89 selinux? ( sec-policy/selinux-postgresql )
90 "
91
92 pkg_setup() {
93 use server && CONFIG_CHECK="~SYSVIPC" linux-info_pkg_setup
94
95 enewgroup postgres 70
96 enewuser postgres 70 /bin/sh /var/lib/postgresql postgres
97
98 use python && python-single-r1_pkg_setup
99 }
100
101 src_prepare() {
102 # Work around PPC{,64} compilation bug where bool is already defined
103 sed '/#ifndef __cplusplus/a #undef bool' -i src/include/c.h || die
104
105 # Set proper run directory
106 sed "s|\(PGSOCKET_DIR\s\+\)\"/tmp\"|\1\"${EPREFIX}/run/postgresql\"|" \
107 -i src/include/pg_config_manual.h || die
108
109 # Rely on $PATH being in the proper order so that the correct
110 # install program is used for modules utilizing PGXS in both
111 # hardened and non-hardened environments. (Bug #528786)
112 sed 's/@install_bin@/install -c/' -i src/Makefile.global.in || die
113
114 use server || eapply "${FILESDIR}/${PN}-${SLOT}.3-no-server.patch"
115
116 if use pam ; then
117 sed -e "s/\(#define PGSQL_PAM_SERVICE \"postgresql\)/\1-${SLOT}/" \
118 -i src/backend/libpq/auth.c || \
119 die 'PGSQL_PAM_SERVICE rename failed.'
120 fi
121
122 eapply_user
123 }
124
125 src_configure() {
126 case ${CHOST} in
127 *-darwin*|*-solaris*)
128 use nls && append-libs intl
129 ;;
130 esac
131
132 export LDFLAGS_SL="${LDFLAGS}"
133 export LDFLAGS_EX="${LDFLAGS}"
134
135 local PO="${EPREFIX%/}"
136
137 local i uuid_config=""
138 if use uuid; then
139 for i in ${UTIL_LINUX_LIBC[@]}; do
140 use ${i} && uuid_config="--with-uuid=e2fs"
141 done
142 for i in ${BSD_LIBC[@]}; do
143 use ${i} && uuid_config="--with-uuid=bsd"
144 done
145 [[ -z $uuid_config ]] && uuid_config="--with-uuid=ossp"
146 fi
147
148 econf \
149 --prefix="${PO}/usr/$(get_libdir)/postgresql-${SLOT}" \
150 --datadir="${PO}/usr/share/postgresql-${SLOT}" \
151 --docdir="${PO}/usr/share/doc/${PF}" \
152 --includedir="${PO}/usr/include/postgresql-${SLOT}" \
153 --mandir="${PO}/usr/share/postgresql-${SLOT}/man" \
154 --sysconfdir="${PO}/etc/postgresql-${SLOT}" \
155 --with-system-tzdata="${PO}/usr/share/zoneinfo" \
156 $(use_enable !alpha spinlocks) \
157 $(use_enable !pg_legacytimestamp integer-datetimes) \
158 $(use_enable threads thread-safety) \
159 $(use_with kerberos gssapi) \
160 $(use_with ldap) \
161 $(use_with pam) \
162 $(use_with perl) \
163 $(use_with python) \
164 $(use_with readline) \
165 $(use_with ssl openssl) \
166 $(usex server "$(use_with systemd)" '--without-systemd') \
167 $(use_with tcl) \
168 ${uuid_config} \
169 $(use_with xml libxml) \
170 $(use_with xml libxslt) \
171 $(use_with zlib) \
172 $(use_enable nls nls "'$(l10n_get_locales)'")
173 }
174
175 src_compile() {
176 emake
177 emake -C contrib
178 }
179
180 src_install() {
181 emake DESTDIR="${D}" install
182 emake DESTDIR="${D}" install -C contrib
183
184 dodoc README HISTORY doc/{TODO,bug.template}
185
186 # man pages are already built, but if we have the target make them,
187 # they'll be generated from source before being installed so we
188 # manually install man pages.
189 # We use ${SLOT} instead of doman for postgresql.eselect
190 insinto /usr/share/postgresql-${SLOT}/man/
191 doins -r doc/src/sgml/man{1,3,7}
192 if ! use server; then
193 # Remove man pages for non-existent binaries
194 for m in {initdb,pg_{controldata,ctl,resetxlog},post{gres,master}}; do
195 rm "${ED}/usr/share/postgresql-${SLOT}/man/man1/${m}.1"
196 done
197 fi
198 docompress /usr/share/postgresql-${SLOT}/man/man{1,3,7}
199
200 # Create slot specific man pages
201 local bn f mansec slotted_name
202 for mansec in 1 3 7 ; do
203 local rel_manpath="../../postgresql-${SLOT}/man/man${mansec}"
204
205 mkdir -p "${ED}"/usr/share/man/man${mansec} || die "making man dir"
206 pushd "${ED}"/usr/share/man/man${mansec} > /dev/null || die "pushd failed"
207
208 for f in "${ED}/usr/share/postgresql-${SLOT}/man/man${mansec}"/* ; do
209 bn=$(basename "${f}")
210 slotted_name=${bn%.${mansec}}${SLOT/.}.${mansec}
211 case ${bn} in
212 TABLE.7|WITH.7)
213 echo ".so ${rel_manpath}/SELECT.7" > ${slotted_name}
214 ;;
215 *)
216 echo ".so ${rel_manpath}/${bn}" > ${slotted_name}
217 ;;
218 esac
219 done
220
221 popd > /dev/null
222 done
223
224 insinto /etc/postgresql-${SLOT}
225 newins src/bin/psql/psqlrc.sample psqlrc
226
227 use static-libs || find "${ED}" -name '*.a' -delete
228
229 local f bn
230 for f in $(find "${ED}/usr/$(get_libdir)/postgresql-${SLOT}/bin" \
231 -mindepth 1 -maxdepth 1)
232 do
233 bn=$(basename "${f}")
234 # Temporarily tack on tmp to workaround a file collision
235 # issue. This is only necessary for 9.7 and earlier. 10 never
236 # had this issue.
237 dosym "../$(get_libdir)/postgresql-${SLOT}/bin/${bn}" \
238 "/usr/bin/${bn}${SLOT/.}tmp"
239 done
240
241 if use doc ; then
242 docinto html
243 dodoc doc/src/sgml/html/*
244
245 docinto sgml
246 dodoc doc/src/sgml/*.{sgml,dsl}
247 fi
248
249 if use server; then
250 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
251 "${FILESDIR}/${PN}.confd-9.3" | newconfd - ${PN}-${SLOT}
252
253 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
254 "${FILESDIR}/${PN}.init-9.3-r1" | newinitd - ${PN}-${SLOT}
255
256 if use systemd; then
257 sed -e "s|@SLOT@|${SLOT}|g" -e "s|@LIBDIR@|$(get_libdir)|g" \
258 "${FILESDIR}/${PN}.service-9.6-r1" | \
259 systemd_newunit - ${PN}-${SLOT}.service
260 systemd_newtmpfilesd "${FILESDIR}"/${PN}.tmpfiles ${PN}-${SLOT}.conf
261 fi
262
263 newbin "${FILESDIR}"/${PN}-check-db-dir ${PN}-${SLOT}-check-db-dir
264
265 use pam && pamd_mimic system-auth ${PN}-${SLOT} auth account session
266
267 if use prefix ; then
268 keepdir /run/postgresql
269 fperms 1775 /run/postgresql
270 fi
271 fi
272 }
273
274 pkg_preinst() {
275 # Find all of the slot-specific symlinks, if any, in /usr/bin (e.g.,
276 # /usr/bin/psql96). They may have been created by the
277 # postgresql.eselect module, but they're handled within this ebuild
278 # now. It's alright if we momentarily delete /usr/bin/psql as it
279 # will be recreated by the eselect module in pkg_ppostinst(). This
280 # is only necessary for 9.7 and earlier. 10 and later were never
281 # handled in this manner.
282 local canonicalise
283 if type -p realpath > /dev/null; then
284 canonicalise=realpath
285 elif type -p readlink > /dev/null; then
286 canonicalise='readlink -f'
287 else
288 # can't die, subshell
289 die "No readlink nor realpath found, cannot canonicalise"
290 fi
291
292 local l
293 # First remove any symlinks in /usr/bin that may have been created
294 # by the old eselect
295 for l in $(find "${ROOT%/}/usr/bin" -mindepth 1 -maxdepth 1 -type l) ; do
296 if [[ $(${canonicalise} "${l}") == *postgresql-${SLOT}* ]] ; then
297 rm "${l}" || ewarn "Couldn't remove ${l}"
298 fi
299 done
300
301 # Then move the symlinks created by the ebuild to their proper place.
302 for l in "${ED}"/usr/bin/*tmp ; do
303 mv "${l}" "${l%tmp}" \
304 || ewarn "Couldn't rename $(basename ${l}) to $(basename ${l%tmp})"
305 done
306 }
307
308 pkg_postinst() {
309 use server && use systemd && systemd_tmpfiles_create ${PN}-${SLOT}.conf
310 postgresql-config update
311
312 elog "If you need a global psqlrc-file, you can place it in:"
313 elog " ${EROOT%/}/etc/postgresql-${SLOT}/"
314
315 if use server ; then
316 elog
317 elog "Gentoo specific documentation:"
318 elog "https://wiki.gentoo.org/wiki/PostgreSQL"
319 elog
320 elog "Official documentation:"
321 elog "https://www.postgresql.org/docs/${SLOT}/static/index.html"
322 elog
323 elog "The default location of the Unix-domain socket is:"
324 elog " ${EROOT%/}/run/postgresql/"
325 elog
326 elog "Before initializing the database, you may want to edit PG_INITDB_OPTS"
327 elog "so that it contains your preferred locale in:"
328 elog " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}"
329 elog
330 elog "Then, execute the following command to setup the initial database"
331 elog "environment:"
332 elog " emerge --config =${CATEGORY}/${PF}"
333 fi
334 }
335
336 pkg_prerm() {
337 if use server && [[ -z ${REPLACED_BY_VERSION} ]] ; then
338 ewarn "Have you dumped and/or migrated the ${SLOT} database cluster?"
339 ewarn "\thttps://wiki.gentoo.org/wiki/PostgreSQL/QuickStart#Migrating_PostgreSQL"
340
341 ebegin "Resuming removal in 10 seconds (Control-C to cancel)"
342 sleep 10
343 eend 0
344 fi
345 }
346
347 pkg_postrm() {
348 postgresql-config update
349 }
350
351 pkg_config() {
352 use server || die "USE flag 'server' not enabled. Nothing to configure."
353
354 [[ -f "${EROOT%/}/etc/conf.d/postgresql-${SLOT}" ]] \
355 && source "${EROOT%/}/etc/conf.d/postgresql-${SLOT}"
356 [[ -z "${PGDATA}" ]] && PGDATA="${EROOT%/}/etc/postgresql-${SLOT}/"
357 [[ -z "${DATA_DIR}" ]] \
358 && DATA_DIR="${EROOT%/}/var/lib/postgresql/${SLOT}/data"
359
360 # environment.bz2 may not contain the same locale as the current system
361 # locale. Unset and source from the current system locale.
362 if [ -f "${EROOT%/}/etc/env.d/02locale" ]; then
363 unset LANG
364 unset LC_CTYPE
365 unset LC_NUMERIC
366 unset LC_TIME
367 unset LC_COLLATE
368 unset LC_MONETARY
369 unset LC_MESSAGES
370 unset LC_ALL
371 source "${EROOT%/}/etc/env.d/02locale"
372 [ -n "${LANG}" ] && export LANG
373 [ -n "${LC_CTYPE}" ] && export LC_CTYPE
374 [ -n "${LC_NUMERIC}" ] && export LC_NUMERIC
375 [ -n "${LC_TIME}" ] && export LC_TIME
376 [ -n "${LC_COLLATE}" ] && export LC_COLLATE
377 [ -n "${LC_MONETARY}" ] && export LC_MONETARY
378 [ -n "${LC_MESSAGES}" ] && export LC_MESSAGES
379 [ -n "${LC_ALL}" ] && export LC_ALL
380 fi
381
382 einfo "You can modify the paths and options passed to initdb by editing:"
383 einfo " ${EROOT%/}/etc/conf.d/postgresql-${SLOT}"
384 einfo
385 einfo "Information on options that can be passed to initdb are found at:"
386 einfo " https://www.postgresql.org/docs/${SLOT}/static/creating-cluster.html"
387 einfo " https://www.postgresql.org/docs/${SLOT}/static/app-initdb.html"
388 einfo
389 einfo "PG_INITDB_OPTS is currently set to:"
390 if [[ -z "${PG_INITDB_OPTS}" ]] ; then
391 einfo " (none)"
392 else
393 einfo " ${PG_INITDB_OPTS}"
394 fi
395 einfo
396 einfo "Configuration files will be installed to:"
397 einfo " ${PGDATA}"
398 einfo
399 einfo "The database cluster will be created in:"
400 einfo " ${DATA_DIR}"
401 einfo
402
403 ebegin "Continuing initialization in 5 seconds (Control-C to cancel)"
404 sleep 5
405 eend 0
406
407 if [ -n "$(ls -A ${DATA_DIR} 2> /dev/null)" ] ; then
408 eerror "The given directory, '${DATA_DIR}', is not empty."
409 eerror "Modify DATA_DIR to point to an empty directory."
410 die "${DATA_DIR} is not empty."
411 fi
412
413 einfo "Creating the data directory ..."
414 if [[ ${EUID} == 0 ]] ; then
415 mkdir -p "${DATA_DIR}"
416 chown -Rf postgres:postgres "${DATA_DIR}"
417 chmod 0700 "${DATA_DIR}"
418 fi
419
420 einfo "Initializing the database ..."
421
422 if [[ ${EUID} == 0 ]] ; then
423 su postgres -c "${EROOT%/}/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb -D \"${DATA_DIR}\" ${PG_INITDB_OPTS}"
424 else
425 "${EROOT%/}"/usr/$(get_libdir)/postgresql-${SLOT}/bin/initdb -U postgres -D "${DATA_DIR}" ${PG_INITDB_OPTS}
426 fi
427
428 if [[ "${DATA_DIR%/}" != "${PGDATA%/}" ]] ; then
429 mv "${DATA_DIR%/}"/{pg_{hba,ident},postgresql}.conf "${PGDATA}"
430 ln -s "${PGDATA%/}"/{pg_{hba,ident},postgresql}.conf "${DATA_DIR%/}"
431 fi
432
433 # unix_socket_directory has no effect in postgresql.conf as it's
434 # overridden in the initscript
435 sed '/^#unix_socket_directories/,+1d' -i "${PGDATA%/}"/postgresql.conf
436
437 cat <<- EOF >> "${PGDATA%/}"/postgresql.conf
438 # This is here because of https://bugs.gentoo.org/show_bug.cgi?id=518522
439 # On the off-chance that you might need to work with UTF-8 encoded
440 # characters in PL/Perl
441 plperl.on_init = 'use utf8; use re; package utf8; require "utf8_heavy.pl";'
442 EOF
443
444 einfo "The autovacuum function, which was in contrib, has been moved to the main"
445 einfo "PostgreSQL functions starting with 8.1, and starting with 8.4 is now enabled"
446 einfo "by default. You can disable it in the cluster's:"
447 einfo " ${PGDATA%/}/postgresql.conf"
448 einfo
449 if ! use systemd; then
450 einfo "The PostgreSQL server, by default, will log events to:"
451 einfo " ${DATA_DIR%/}/postmaster.log"
452 einfo
453 fi
454 if use prefix ; then
455 einfo "The location of the configuration files have moved to:"
456 einfo " ${PGDATA}"
457 einfo "To start the server:"
458 einfo " pg_ctl start -D ${DATA_DIR} -o '-D ${PGDATA} --data-directory=${DATA_DIR}'"
459 einfo "To stop:"
460 einfo " pg_ctl stop -D ${DATA_DIR}"
461 einfo
462 einfo "Or move the configuration files back:"
463 einfo "mv ${PGDATA}*.conf ${DATA_DIR}"
464 elif use systemd; then
465 einfo "You should use the 'postgresql-${SLOT}.service' unit to run PostgreSQL"
466 einfo "instead of 'pg_ctl'."
467 else
468 einfo "You should use the '${EROOT%/}/etc/init.d/postgresql-${SLOT}' script to run PostgreSQL"
469 einfo "instead of 'pg_ctl'."
470 fi
471 }
472
473 src_test() {
474 if use server && [[ ${UID} -ne 0 ]] ; then
475 emake check
476
477 einfo "If you think other tests besides the regression tests are necessary, please"
478 einfo "submit a bug including a patch for this ebuild to enable them."
479 else
480 use server || \
481 ewarn 'Tests cannot be run without the "server" use flag enabled.'
482 [[ ${UID} -eq 0 ]] || \
483 ewarn 'Tests cannot be run as root. Enable "userpriv" in FEATURES.'
484
485 ewarn 'Skipping.'
486 fi
487 }