coreutils/scripts/autotools-install
Stefano Lattarini d263b0e252 scripts: autotools-install: allow user-specified make program
* scripts/autotools-install: Honor $MAKE.  This might be useful
on systems where the make implementation available in $PATH
by default is limited (Solaris) or broken (HP-UX).
2012-09-02 20:05:39 +02:00

209 lines
6.3 KiB
Bash
Executable File

#!/bin/sh
# Building coreutils from a git-cloned directory may require versions of
# tools like autoconf, automake, gettext, etc. that are newer than the ones
# provided by the distribution on which you want to build. In that case,
# you can use this script to bootstrap the "autotools" tool chain, starting
# with m4 (prereq of autoconf), then autoconf (prereq of automake), etc.
# It also builds a few others, including gettext and pkg-config.
# The results are installed in a directory whose --prefix you specify, and
# it tells you how to update envvars like PATH and (if you use pkg-config)
# PKG_CONFIG_PATH.
# Written by Jim Meyering
VERSION='2012-08-31 07:40' # UTC
# For systems with limited/botched make (the case of most vendor makes!),
# allow the user to override it.
MAKE=${MAKE-make}
prog_name=`basename $0`
die () { echo "$prog_name: $*" >&2; exit 1; }
tarballs='
http://pkgconfig.freedesktop.org/releases/pkg-config-0.27.1.tar.gz
ftp://ftp.gnu.org/gnu/m4/m4-1.4.16.tar.gz
ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
http://ftp.gnu.org/gnu/automake/automake-1.12.3.tar.gz
ftp://ftp.gnu.org/gnu/libtool/libtool-2.4.2.tar.gz
ftp://ftp.gnu.org/gnu/gettext/gettext-0.18.1.tar.gz
'
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 \$HOME/autotools/bin, run this command:
$prog_name --prefix=\$HOME/autotools
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=\$HOME/autotools --skip-check
"
}
# Get the public keys associated with each .sig file.
# for i in *.sig; do k=$(gpgv $i 2>&1 | sed -n 's/.*key ID //p'); \
# gpg --keyserver pgp.mit.edu --recv-key $k; done
# 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';;
*)
die 'no wget program found; please install it and try again';;
esac
# Download the each tar-ball along with its signature, if there is one.
pkgs=
for t in $tarballs; do
base=`basename $t`
pkgs="$pkgs $base"
test -f $base || $WGET_COMMAND $t
# No signatures for some :-(
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 \
--trusted-key=FC818E17429F96EA \
$base.sig > /dev/null 2>&1 \
|| echo "info: not verifying GPG signature for $base" 1>&2
done
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"
case $prefix in
/*) ;;
*) die 'invalid prefix: '"$prefix"': it must be an absolute name';;
esac
# Don't run as root.
# Make sure id -u succeeds.
my_uid=`id -u` && test -n "$my_uid" || die "'id -u' failed"
test $my_uid -ne 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
# Create a build directory, then cd into it for the rest....
tmpdir=.build-auto-tools
mkdir -p $tmpdir
cd $tmpdir
pkgs=`get_sources`
export PATH=$prefix/bin:$PATH
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 >makerr-build 2>&1
if test $make_check = yes; then
case $pkg in
# FIXME: these are out of date and very system-sensitive
automake*) expected_duration_minutes=40;;
autoconf*) expected_duration_minutes=15;;
libtool*) expected_duration_minutes=3;;
*);;
esac
if test -n "$expected_duration_minutes"; then
echo "running 'make check' for $pkg; NB: this can take over" \
"$expected_duration_minutes minutes"
fi
$MAKE check >makerr-check 2>&1
fi
$MAKE 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)
echo 'Good! your PKG_CONFIG_PATH envvar is already set';;
*) 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
case $PATH in
"$prefix/bin:"*) echo 'Good! your PATH is fine';;
*) cat <<EOF;;
**************************************************************************
Be sure that "$prefix/bin" is earlier in your PATH than /bin, /usr/bin, etc.
**************************************************************************
EOF
esac
cat <<EOF
**************************************************************************
You may want to remove the tool build directory:
rm -rf $tmpdir
**************************************************************************
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: