logo

overlay

My (experimental) gentoo overlay

postgresql-10.6.ebuild (13845B)


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