pg_buildext 5.51 KB
Newer Older
1
#!/bin/sh
2
#
3
# build a PostgreSQL module based on PGXS for given list of supported major
4 5
# versions
#
6
# (C) 2010 Dimitri Fontaine <dfontaine@hi-media.com>
7
# (C) 2011-2014 Christoph Berg <myon@debian.org>
8 9 10 11 12 13 14 15 16 17
#
#  This program is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
18

19 20
set -e

21 22 23 24 25 26 27 28 29 30 31
VENVARGS=""
while getopts "c:i:o:s" opt ; do
    case $opt in
	c|i|o) VENVARGS="$VENVARGS -$opt $OPTARG" ;;
	s) VENVARGS="$VENVARGS -$opt" ;;
	*) exit 1 ;;
    esac
done
# shift away args
shift $(($OPTIND - 1))

32
action="$1"
33
if [ -d "$2" ] && [ "$3" ]; then # compat mode: $2 is source directory
34 35 36 37 38 39 40
    srcdir="$2"
    shift
else
    srcdir="$PWD"
fi
target="$2"
opt="$3"
41

42 43 44 45 46
die() {
    echo "`basename $0`: error: $*" >&2
    exit 1
}

47
prepare_env() {
48
    version=$1
49
    vtarget=`echo $target | sed -e "s:%v:$version:g"`
50
    pgc="/usr/lib/postgresql/$version/bin/pg_config"
51
    [ -e "$pgc" ] || die "$pgc does not exist"
52 53 54 55 56 57 58 59
}

configure() {
    prepare_env $1
    confopts=`echo $opt | sed -e "s:%v:$version:g"`

    mkdir -p $vtarget
    ( echo "calling configure in $vtarget" &&
60
      cd $vtarget && $srcdir/configure $confopts DESTDIR="$srcdir/debian/$package" PG_CONFIG="$pgc" VPATH="$srcdir" )
61 62
}

63
build() {
64
    prepare_env $1
65
    cflags="`$pgc --cflags` `echo $opt | sed -e "s:%v:$version:g"`"
66 67

    mkdir -p $vtarget
68 69
    # if a Makefile was created by configure, use it, else the top level Makefile
    [ -f $vtarget/Makefile ] || makefile="-f $srcdir/Makefile"
70
    make -C $vtarget $makefile CFLAGS="$cflags" DESTDIR="$srcdir/debian/$package" PG_CONFIG="$pgc" VPATH="$srcdir" srcdir="$srcdir" USE_PGXS=1
71 72 73 74 75 76 77 78 79
}

install() {
    prepare_env $1
    package=`echo $opt | sed -e "s:%v:$version:g"`

    mkdir -p $vtarget
    # if a Makefile was created by configure, use it, else the top level Makefile
    [ -f $vtarget/Makefile ] || makefile="-f $srcdir/Makefile"
80
    make -C $vtarget $makefile install DESTDIR="$srcdir/debian/$package" PG_CONFIG="$pgc" VPATH="$srcdir" srcdir="$srcdir" USE_PGXS=1
81 82
}

83
clean() {
84
    prepare_env $1
85 86 87

    # if a Makefile was created by configure, use it, else the top level Makefile
    [ -f $vtarget/Makefile ] || makefile="-f $srcdir/Makefile"
88
    [ -d $vtarget ] && make -C $vtarget clean $makefile DESTDIR="$srcdir/debian/$package" PG_CONFIG="$pgc" VPATH="$srcdir" srcdir="$srcdir" USE_PGXS=1
89 90 91
    rm -rf $vtarget
}

92 93 94 95 96 97 98 99 100 101 102 103 104 105
loop() {
    echo "### $1 ###"
    prepare_env $1
    package=$(echo $target | sed -e "s:%v:$version:g")

    echo "# $1: make clean"
    make clean            DESTDIR="$PWD/debian/$package" PG_CONFIG="$pgc" USE_PGXS=1
    echo "# $1: make"
    make CFLAGS="$cflags" DESTDIR="$PWD/debian/$package" PG_CONFIG="$pgc" USE_PGXS=1
    echo "# $1: make install"
    make install          DESTDIR="$PWD/debian/$package" PG_CONFIG="$pgc" USE_PGXS=1
    echo "### done $1 ###"
}

106 107 108 109 110 111
installcheck() {
    prepare_env $1

    if [ "$target" ]; then # if target is given, use it, else stay in the top source dir
	# if a Makefile was created by configure, use it, else the top level Makefile
	[ -f $vtarget/Makefile ] || makefile="-f $srcdir/Makefile"
112
	if ! pg_virtualenv $VENVARGS -v $1 \
113 114 115 116 117 118 119 120 121
	    make -C $vtarget $makefile installcheck \
		PG_CONFIG="$pgc" VPATH="$srcdir" srcdir="$srcdir" USE_PGXS=1; then
	    if [ -r $vtarget/regression.diffs ]; then
		echo "**** $vtarget/regression.diffs ****"
		cat $vtarget/regression.diffs
	    fi
	    exit 1
	fi
    else
122
	if ! pg_virtualenv $VENVARGS -v $1 \
123 124 125 126 127 128 129 130 131 132
	    make installcheck PG_CONFIG="$pgc" srcdir="$srcdir" USE_PGXS=1; then
	    if [ -r regression.diffs ]; then
		echo "**** regression.diffs ****"
		cat regression.diffs
	    fi
	    exit 1
	fi
    fi
}

133
versions() {
134 135
    [ -e /usr/share/postgresql-common/supported-versions ] ||
	die "/usr/share/postgresql-common/supported-versions not found"
136
    [ -e debian/pgversions ] || die "debian/pgversions not found"
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
    supported_versions=$(/usr/share/postgresql-common/supported-versions)
    while read version; do
	case $version in
	    all) echo "$supported_versions" ;;
	    [1-9]*+)
		for sup_version in $supported_versions; do
		    if expr $(echo "$version" | tr -d +) '<=' $sup_version > /dev/null; then echo "$sup_version"; fi
		done ;;
	    [1-9]*)
		for sup_version in $supported_versions; do
		    if [ "$version" = "$sup_version" ]; then echo "$sup_version"; fi
		done ;;
	    '#'*) ;;
	    '') ;;
	    *) echo "Syntax error in debian/pgversions: $version" >&2 ;;
	esac
    done < debian/pgversions
154 155
}

156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
# when a version is included in the action, just act on this one (this is
# useful if some extra work needs to be done per version, so the loop over
# supported-versions needs to be in the script calling pg_buildext)

case $action in
    configure-*|build-*|install-*|clean-*|installcheck-*)
	a=${action%%-*}
	v=${action##$a-}
	echo "### $a $v ###"
	$a $v
	exit
	;;
esac

# loop over versions

172 173 174
VERSIONS=`versions`

for v in $VERSIONS
175 176 177 178 179 180
do
    case "$action" in
	"supported-versions")
	    echo $v
	    ;;

181
	configure|build|install|clean|loop)
182
	    [ "$target" ] || die "syntax: pg_buildext $action [...]"
183 184 185 186 187 188
	    echo "### $action $v ###"
	    $action $v
	    ;;

	installcheck)
	    echo "### $action $v ###"
189 190 191 192
	    $action $v
	    ;;

	*)
193
	    die "unsupported $action"
194 195 196
	    ;;
    esac
done