You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@qpid.apache.org by Jim Meyering <ji...@meyering.net> on 2006/12/14 16:51:13 UTC

new version of qpid-autotools-install script

The previous version didn't work unless you already had the
GPG signatures of each package signer on your keyring.
Now, if the gpg signature check fails, you just get an "info:..." notice.
Later, sha1sum fingerprints are checked.

###################################################
#!/bin/sh
# Written by Jim Meyering

VERSION='2006-12-14 15:46' # UTC

prog_name=`basename $0`
die () { echo "$prog_name: $*" >&2; exit 1; }

usage() {
  echo >&2 "\
Usage: $0 [OPTION]...
Download, build, and install some tools.

Options:
 --prefix=PREFIX    install tools under specified directory
 --skip-check       do not run "make check" (this can save 50+ min)
 --help             display this help and exit

For example, to install programs into /usr/local/bin, run this command:

  $prog_name --prefix=/usr/local

If you've already verified that your system/environment can build working
versions of these tools, you can make this script complete in just a
minute or two (rather than about an hour if you let all "make check"
tests run) by invoking it like this:

  $prog_name --prefix=/usr/local --skip-check

"
}

# Get the listed tarballs into the current directory.
get_sources()
{
  case `wget --help` in
    *'--no-cache'*)
      WGET_COMMAND='wget -nv --no-cache';;
    *'--cache=on/off'*)
      WGET_COMMAND='wget -nv --cache=off';;
    *'--non-verbose'*)
      WGET_COMMAND='wget -nv';;
    *)
      WGET_COMMAND='';;
  esac

  # FIXME handle case of no WGET

  # Download the following, each along with its signature.
  tarballs='
    http://pkgconfig.freedesktop.org/releases/pkg-config-0.21.tar.gz
    ftp://ftp.gnu.org/gnu/m4/m4-1.4.8.tar.gz
    ftp://ftp.gnu.org/gnu/automake/automake-1.10.tar.gz
    ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.61.tar.gz
    ftp://ftp.gnu.org/gnu/libtool/libtool-1.5.22.tar.gz
  '
  pkgs=
  for t in $(echo $tarballs); do
    base=$(basename $t)
    pkgs="$pkgs $base"
    test -f $base     || $WGET_COMMAND $t

    # pkg-config has no .sig file.
    case $base in pkg-config*) continue;; esac

    test -f $base.sig || $WGET_COMMAND $t.sig
    # Verify each signature.
    gpg --quiet --verify --trust-model=always	\
        --trusted-key=32419B785D0CDCFC		\
        --trusted-key=3859C03B2E236E47		\
        --trusted-key=B93F60C6B5C4CE13		\
        --trusted-key=F382AE19F4850180		\
        $base.sig > /dev/null 2>&1		\
      || echo "info: not verifying signature for $base" 1>&2
  done

  printf 'checking package signatures with sha1sum...' 1>&2
  sha1sum -c --warn --status <<EOF || die "checksum mismatch"
69f37c509a4757d747b6f4c091d209ab3984d62f  autoconf-2.61.tar.gz
69dc02b083b9a609b28fc4db129fef6a83ed2339  automake-1.10.tar.gz
17353e66aeaac80ae188ea0a3a90609550ce3254  libtool-1.5.22.tar.gz
32b5bb526de9315d1a319c2ca8eb881d9b835506  m4-1.4.8.tar.gz
b2508ba8404cad46ec42f6f58cbca43ae59d715f  pkg-config-0.21.tar.gz
EOF
  printf 'ok\n' 1>&2
  echo $pkgs
}

#################################################################
set -e

# Parse options.

make_check=yes
prefix=

for option
do
  case $option in
    --help) usage; exit;;
    --skip-check) make_check=no;;
    --prefix=*) prefix=`expr "$option" : '--prefix=\(.*\)'`;;
    *) die "$option: unknown option";;
  esac
done

test -n "$prefix" \
  || die "you must specify a --prefix"

# Don't run as root.
# Make sure id -u succeeds.
my_uid=`id -u`
test $? = 0 || {
  echo "$0: cannot run \`id -u'" 1>&2
  (exit 1); exit 1
}
test $my_uid = 0 && die "please don't run this program as root"

# Ensure that prefix is not /usr/bin or /bin, /sbin, etc.
case $prefix in
  /bin|/sbin|/usr/bin|/usr/sbin)
    die "don't set PREFIX to a system directory";;
  *) ;;
esac

# Verify $prefix, e.g., to ensure that $prefix/bin is earlier in PATH than
# /bin, /usr/bin, /usr/local/bin.
# FIXME

# FIXME: create temp directory, named e.g., .build-auto-tools
# then cd into it for the rest....

pkgs=$(get_sources)

for pkg in $pkgs; do
  echo building/installing $pkg...
  dir=$(basename $pkg .tar.gz)
  rm -rf dir
  gzip -dc $pkg|tar xf -
  cd $dir
  ./configure CFLAGS=-O2 LDFLAGS=-s --prefix=$prefix	> makerr-config  2>&1
  make -j1						> makerr-build   2>&1
  if test "$make_check" = yes; then
    case $pkg in
      automake*) expected_duration_minutes=40;;
      autoconf*) expected_duration_minutes=15;;
      # libtool*) expected_duration_minutes=3;;
      *);;
    esac
    test -n "$expected_duration_minutes" \
      && echo "running 'make check' for $pkg; NB: this can take over" \
	      "$expected_duration_minutes minutes"
    make -j1 check					> makerr-check   2>&1
  fi
  make -j1 install					> makerr-install 2>&1
  echo done at $(date +%Y-%m-%d.%T)
  cd ..
done

# Without checks (and with existing tarballs), it takes just one minute.
# Including all checks, it takes nearly an hour on an AMD64/3400+

case $PKG_CONFIG_PATH in
  $prefix/lib/pkgconfig:/usr/lib/pkgconfig);;
  *) cat <<EOF ;;
**************************************************************************
Be sure that PKG_CONFIG_PATH is set in your environment, e.g.,
PKG_CONFIG_PATH=$prefix/lib/pkgconfig:/usr/lib/pkgconfig
**************************************************************************
EOF
esac

cat <<EOF
**************************************************************************
Be sure that "$prefix/bin" is earlier in your PATH than /bin, /usr/bin, etc.
**************************************************************************
EOF

## Local Variables:
## eval: (add-hook 'write-file-hooks 'time-stamp)
## time-stamp-start: "VERSION='"
## time-stamp-format: "%:y-%02m-%02d %02H:%02M"
## time-stamp-time-zone: "UTC"
## time-stamp-end: "' # UTC"
## End: