# Copyright 1999-2017 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 EAPI="5" POSTGRES_COMPAT=( 9.{1,2,3,4,5} ) inherit autotools eutils versionator MY_PV=$(replace_version_separator 3 '') MY_P="${PN}-${MY_PV}" S="${WORKDIR}/${MY_P}" DESCRIPTION="Geographic Objects for PostgreSQL" HOMEPAGE="http://postgis.net" SRC_URI="http://download.osgeo.org/postgis/source/${MY_P}.tar.gz" LICENSE="GPL-2" SLOT="0" KEYWORDS="amd64 ppc x86 ~amd64-linux ~x86-linux" IUSE="doc gtk static-libs test" RDEPEND=" || ( dev-db/postgresql:9.4[server] dev-db/postgresql:9.3[server] dev-db/postgresql:9.2[server] dev-db/postgresql:9.1[server] ) dev-libs/json-c dev-libs/libxml2:2 >=sci-libs/geos-3.4.2 >=sci-libs/proj-4.6.0 >=sci-libs/gdal-1.10.0:= gtk? ( x11-libs/gtk+:2 ) " DEPEND="${RDEPEND} doc? ( app-text/docbook-xsl-stylesheets app-text/docbook-xml-dtd:4.5 dev-libs/libxslt virtual/imagemagick-tools[png] ) virtual/pkgconfig test? ( dev-util/cunit ) " PGIS="$(get_version_component_range 1-2)" REQUIRED_USE="test? ( doc )" # Needs a running psql instance, doesn't work out of the box RESTRICT="test" MAKEOPTS+=' -j1' # These modules are built using the same *FLAGS that were used to build # dev-db/postgresql. The right thing to do is to ignore the current # *FLAGS settings. QA_FLAGS_IGNORED="usr/lib(64)?/(rt)?postgis-${PGIS}\.so" postgres_check_slot() { if ! declare -p POSTGRES_COMPAT &>/dev/null; then die 'POSTGRES_COMPAT not declared.' fi # Don't die because we can't run postgresql-config during pretend. [[ "$EBUILD_PHASE" = "pretend" \ && -z "$(which postgresql-config 2> /dev/null)" ]] && return 0 local res=$(echo ${POSTGRES_COMPAT[@]} \ | grep -c $(postgresql-config show 2> /dev/null) 2> /dev/null) if [[ "$res" -eq "0" ]] ; then eerror "PostgreSQL slot must be set to one of: " eerror " ${POSTGRES_COMPAT[@]}" return 1 fi return 0 } pkg_setup() { postgres_check_slot || die export PGSLOT="$(postgresql-config show)" } src_prepare() { epatch "${FILESDIR}/${PN}-2.1-ldflags.patch" \ "${FILESDIR}/${PN}-2.0-arflags.patch" \ "${FILESDIR}/${PN}-2.1.4-pkgconfig-json.patch" local AT_M4DIR="macros" eautoreconf } src_configure() { local myargs="" use gtk && myargs+=" --with-gui" econf \ --with-pgconfig="/usr/lib/postgresql-${PGSLOT}/bin/pg_config" \ ${myargs} } src_compile() { emake emake -C topology if use doc ; then emake comments emake cheatsheets emake -C doc html fi } src_install() { emake DESTDIR="${D}" install use doc && emake DESTDIR="${D}" comments-install emake -C topology DESTDIR="${D}" install dobin ./utils/postgis_restore.pl dodoc CREDITS TODO loader/README.* doc/*txt use doc && dohtml -r doc/html/* docinto topology dodoc topology/{TODO,README} insinto /etc doins "${FILESDIR}/postgis_dbs" use static-libs || find "${ED}" -name '*.a' -delete } pkg_postinst() { postgresql-config update elog "To finish installing or updating PostGIS edit:" elog " ${EROOT%/}/etc/postgis_dbs" elog elog "Then, run:" elog " emerge --config =${CATEGORY}/${PF}" } pkg_config(){ source "${EROOT%/}/etc/conf.d/postgresql-${PGSLOT}" source "${EROOT%/}/etc/postgis_dbs" local postgis_path="${EROOT%/}/usr/share/postgresql-${PGSLOT}/contrib/postgis-${PGIS}" if [[ -n ${configured} ]] ; then einfon "Password for PostgreSQL user '${pguser}': " read -s PGPASSWORD export PGPASSWORD echo else eerror "You must edit:" eerror " ${EROOT%/}/etc/postgis_dbs" eerror "Before running 'emerge --config =${CATEGORY}/${PF}'" eerror die "Edit postgis_dbs" fi # The server we work with must be the same slot we built against. local server_match server_match=$(psql -U ${pguser} -d postgres -p ${PGPORT} \ -Aqwtc 'SELECT version()' 2> /dev/null | grep -c "PostgreSQL ${PGSLOT}") if [[ $? = 0 ]] ; then if [[ $server_match -ne 1 ]] ; then unset PGPASSWORD eerror "Server version must be ${PGSLOT}.x" die "Server version isn't ${PGSLOT}.x" fi else unset PGPASSWORD eerror "Is the server running?" die "Couldn't connect to server." fi local retval safe_exit() { unset PGPASSWORD sed -e 's/\(configured\)/#\1/' -i "${EROOT%/}/etc/postgis_dbs" eend $retval eerror "All actions could not be performed." eerror "Read above to see what failed." eerror "Once you fix the issue, you'll need to edit:" eerror " ${EROOT%/}/etc/postgis_dbs" eerror "As some things may have succeeded." eerror die "All actions could not be performed" } local db for db in ${databases[@]} ; do ebegin "Performing CREATE LANGUAGE on ${db}" createlang -U ${pguser} -p ${PGPORT} plpgsql ${db} retval=$? # In this case, only error code 1 is fatal [[ $retval == 1 ]] && safe_exit || eend 0 ebegin "Enabling PostGIS on ${db}" psql -q -U ${pguser} -p ${PGPORT} -d ${db} \ -f "${postgis_path}/postgis.sql" retval=$? [[ $retval == 0 ]] && eend 0 || safe_exit done for db in ${templates[@]} ; do ebegin "Creating template database '${db}'" createdb -p ${PGPORT} -U ${pguser} -O ${pguser} -T ${from_template} \ ${db} "PostGIS Template" retval=$? [[ $retval != 0 ]] && safe_exit psql -q -U ${pguser} -p ${PGPORT} -c \ "UPDATE pg_database \ SET datistemplate = TRUE, datallowconn = TRUE \ WHERE datname = '${db}'" retval=$? [[ $retval != 0 ]] && safe_exit createlang -U ${pguser} -p ${PGPORT} plpgsql ${db} retval=$? # In this case, only error code 1 is fatal [[ $retval == 1 ]] && safe_exit psql -q -U ${pguser} -p ${PGPORT} -d ${db} \ -f "${postgis_path}/postgis.sql" retval=$? [[ $retval == 0 ]] && eend 0 || safe_exit done for db in ${epsg_databases[@]} ; do ebegin "Adding EPSG to ${db}" psql -q -U ${pguser} -p ${PGPORT} -d ${db} \ -f "${postgis_path}/spatial_ref_sys.sql" retval=$? [[ $retval == 0 ]] && eend 0 || safe_exit done for db in ${comment_databases[@]} ; do ebegin "Adding comments on ${db}" local comment_file for comment_file in "${postgis_path}"/*_comments.sql ; do psql -q -U ${pguser} -p ${PGPORT} -d ${db} -f "${comment_file}" retval=$? [[ $retval == 0 ]] && continue || safe_exit done eend 0 done for db in ${upgrade_from_1_3[@]} ; do ebegin "Upgrading from PostGIS 1.3 to ${PGIS} on ${db}" psql -q -U ${pguser} -p ${PGPORT} -d ${db} \ -f "${postgis_path}/postgis_upgrade_13_to_${PGIS//.}.sql" retval=$? [[ $retval == 0 ]] && eend 0 || safe_exit done for db in ${upgrade_from_1_4[@]} ; do ebegin "Upgrading from PostGIS 1.4 to ${PGIS} on ${db}" psql -q -U ${pguser} -p ${PGPORT} -d ${db} \ -f "${postgis_path}/postgis_upgrade_14_to_${PGIS//.}.sql" retval=$? [[ $retval == 0 ]] && eend 0 || safe_exit done for db in ${upgrade_from_1_5[@]} ; do ebegin "Minor upgrade for PostGIS ${PGIS} on ${db}" psql -q -U ${pguser} -p ${PGPORT} -d ${db} \ -f "${postgis_path}/postgis_upgrade_${PGIS//.}_minor.sql" retval=$? [[ $retval == 0 ]] && eend 0 || safe_exit done # Clean up and make it so the user has to edit postgis_dbs again that # way this script won't step on any toes due to user error. unset PGPASSWORD sed -e 's/\(configured\)/#\1/' -i "${EROOT%/}/etc/postgis_dbs" einfo "PostgreSQL ${PGSLOT} is now PostGIS enabled." einfo einfo "Currently, only one PostgreSQL slot at a time can be PostGIS enabled." }