#!/usr/bin/ksh PROGNAME=`basename $0` set -e uname_sr() { case `uname -s` in Linux) if [ -f /etc/debian_version ]; then echo "Debian" cat /etc/debian_version else error "cannot determine Linux distribution" fi case `uname -m` in i[3456]86) echo i386 ;; *) error "cannot determine processor" ;; esac ;; CYGWIN_*) uname -s ;; *) uname -sr ;; esac | xargs echo | sed 's/ /_/g' } case `uname -n` in hermes) SOURCE_ARCHIVE_DIR=/pub/computing/software/unix/sources MAKE_DIR=/pub/computing/software/makes PREFIX=/usr/server/opt BINDIR=/usr/server/bin MANDIR=/usr/server/man LIBDIR=/usr/server/lib ;; te30) SOURCE_ARCHIVE_DIR=/diskd/tmp/ahuxley/sources MAKE_DIR=/diskd/tmp/ahuxley/makes PREFIX=$HOME/opt/`uname_sr` BINDIR=$HOME/bin/OS/`uname_sr` MANDIR=$HOME/doc/man/OS/`uname_sr` LIBDIR=$HOME/lib/OS/`uname_sr` ;; *) error "can't set directories" ;; esac PACKAGES="bzip2 make binutils m4 bison gcc wget am-utils bash perl less svn vim ssh ade lx libiconv slang mutt fad lspipe" BZIP2_URL=ftp://sources.redhat.com/pub/bzip2/v102/bzip2-1.0.2.tar.gz MAKE_URL=ftp://ftp.gnu.org/pub/gnu/make/make-3.80.tar.gz BINUTILS_URL=ftp://ftp.gnu.org/pub/gnu/binutils/binutils-2.15.tar.gz M4_URL=ftp://ftp.gnu.org/pub/gnu/m4/m4-1.4.2.tar.gz # bison 2.0 causes HP-UX cc to report "_obstack_begin(): internal error 5111: This operator does not support huge data yet" BISON_URL=ftp://ftp.gnu.org/pub/gnu/bison/bison-1.875.tar.gz GCC_URL=ftp://ftp.gnu.org/pub/gnu/gcc/gcc-3.4.3/gcc-3.4.3.tar.bz2 WGET_URL=ftp://ftp.gnu.org/gnu/wget/wget-1.9.1.tar.gz AMUTILS_URL=ftp://ftp.am-utils.org/pub/am-utils/am-utils-6.0.9.tar.gz BASH_URL=http://ftp.gnu.org/pub/gnu/bash/bash-2.05b.tar.gz PERL_URL=http://www.cpan.org/src/perl-5.8.6.tar.gz LESS_URL=ftp://ftp.gnu.org/gnu/less/less-382.tar.gz SVN_URL=http://subversion.tigris.org/tarballs/subversion-1.1.2.tar.gz VIM_URL=ftp://ftp.vim.org/pub/vim/unix/vim-6.3.tar.bz2 ADE_URL=http://dione.no-ip.org/~alexis/computing/ade/ade-0.9.tar.gz LX_URL=http://dione.no-ip.org/~alexis/computing/lx/lx-3.2.tar.gz MUTT_URL=ftp://ftp.mutt.org/mutt/mutt-1.4.2i.tar.gz LIBICONV_URL=http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.2.tar.gz SLANG_URL=ftp://space.mit.edu/pub/davis/slang/v1.4/slang-1.4.9.tar.gz FAD_URL=http://dione.no-ip.org/~alexis/computing/fad/fad-4.4.2.tar.gz LSPIPE_URL=http://dione.no-ip.org/~alexis/computing/lspipe/lspipe-1.3.tar.gz # These will work once we ensure that stuff we install is found before # native OS stuff (which we do in a moment) GUNZIP_CMD=gunzip BUNZIP2_CMD=bunzip2 GNU_MAKE_CMD="make -e" # Ensure that stuff is found as we install it PATH=$BINDIR:$PATH ADE_MSG_VERBOSELEVEL=3 main() { typeset DOIT DESPKGS PACKAGE DESPKG URL DESPKGS="$@" for PACKAGE in $PACKAGES; do DOIT=false for DESPKG in $DESPKGS; do [ $DESPKG = $PACKAGE -o $DESPKG = all ] && { DOIT=true; break; }; done [ $DOIT = true ] || continue case $PACKAGE in bzip2) # bzip2 required to unpack gcc sources. do_package --wget-cmd wgetfunc --no-configure --make-cmd /usr/bin/make $BZIP2_URL ;; make) # GNU make required to build gcc. do_package --wget-cmd wgetfunc --make-cmd /usr/bin/make $MAKE_URL ;; binutils) # gcc can use gnu as. do_package --wget-cmd wgetfunc --environment "CC=cc CCOPTS=+DAportable CFLAGS=-O" $BINUTILS_URL ;; m4) # bison requires m4 do_package --wget-cmd wgetfunc --environment "CC=cc CCOPTS=+DAportable CFLAGS=-O" $M4_URL ;; bison) # bison used to be prerequisite for gcc, but now not listed as such, but still # getting a lot of yacc-like errors without it. do_package --wget-cmd wgetfunc --environment "CC=cc CCOPTS=+DAportable CFLAGS=-O" $BISON_URL ;; gcc) # gcc to be made not in sources directory rm -fr $MAKE_DIR/objdir mkdir -p $MAKE_DIR/objdir do_package --cd $MAKE_DIR/objdir --wget-cmd wgetfunc --environment "CC=cc" --configure-options "--with-gnu-as --with-as=$BINDIR/as --enable-shared --enable-languages=c++" --compile-target bootstrap $GCC_URL ;; wget) # wget required to start getting stuff only available via http (e.g. amd) do_package --wget-cmd wgetfunc $WGET_URL ;; am-utils) do_package $AMUTILS_URL ;; bash) do_package --configure-options "--without-gnu-malloc" $BASH_URL ;; perl) do_package --configure-cmd configure.gnu $PERL_URL ;; less) do_package $LESS_URL ;; svn) do_package $SVN_URL ;; vim) do_package --configure-options "--enable-gui" --sub-dir vim63 $VIM_URL ;; ade) do_package --configure-style-ade true --environment "SHELL_CMD=/bin/bash ADEROOT_INCLUDE=\`pwd\`/include ADEROOT_LIB=\`pwd\`/lib ADEROOT_BIN=\`pwd\`/bin" $ADE_URL ;; lx) do_package --configure-style-ade true --environment "SHELL_CMD=/bin/bash" $LX_URL ;; libiconv) # libiconv is prereq for mutt do_package $LIBICONV_URL ;; slang) # slang is prereq for mutt do_package $SLANG_URL ;; mutt) do_package --sub-dir mutt-1.4.2 --configure-options "--with-libiconv-prefix=$PREFIX/libiconv --with-slang=$PREFIX/slang --enable-pop --enable-imap" $MUTT_URL ;; fad) do_package --configure-style-ade true --environment "PERL_CMD=/usr/server/bin/perl SHELL_CMD=/bin/bash" $FAD_URL ;; lspipe) do_package --configure-style-ade true --environment "PERL_CMD=/usr/server/bin/perl SHELL_CMD=/bin/bash" $LSPIPE_URL ;; esac done } do_package() { typeset WGET_CMD URL CONFIGURE_OPTIONS DO_CONFIGURE MAKE_CMD ENVIRONMENT PACKAGE HOST DIR FILE SUBDIR CDTO COMPILE_TARGET typeset CONFIGURE_CMD NEWSUBDIR CONFIGURE_STYLE_ADE WGET_CMD="wget --passive-ftp" DO_CONFIGURE=true CONFIGURE_OPTIONS="" ENVIRONMENT="" NEWSUBDIR= CONFIGURE_CMD=configure COMPILE_TARGET= MAKE_CMD="$GNU_MAKE_CMD" CONFIGURE_STYLE_ADE=false while [ "X$1" != X ]; do case "$1" in --wget-cmd) WGET_CMD="$2" shift ;; --make-cmd) MAKE_CMD="$2" shift ;; --environment) ENVIRONMENT="$2" shift ;; --compile-target) COMPILE_TARGET="$2" shift ;; --configure-cmd) CONFIGURE_CMD="$2" shift ;; --configure-options) CONFIGURE_OPTIONS="$2" shift ;; --no-configure) DO_CONFIGURE=false ;; --sub-dir) NEWSUBDIR="$2" shift ;; --cd) CDTO="$2" shift ;; --configure-style-ade) CONFIGURE_STYLE_ADE="$2" shift ;; *) break ;; esac shift done [ "X$1" != X -a "X$2" = X ] || error "do_package: wrong arg count" URL="$1" eval `set_vars "$URL"` [ "X$NEWSUBDIR" = X ] || SUBDIR=$NEWSUBDIR [ "X$CDTO" != X ] || CDTO=$MAKE_DIR/$SUBDIR get_package --wget-cmd "$WGET_CMD" "$URL" unpack_package "$URL" [ $DO_CONFIGURE = false ] || configure_package --configure-style-ade $CONFIGURE_STYLE_ADE --sub-dir $SUBDIR --configure-cmd $CONFIGURE_CMD --cd "$CDTO" --configure-options "$CONFIGURE_OPTIONS" --environment "$ENVIRONMENT" "$URL" compile_package --sub-dir $SUBDIR --cd "$CDTO" --make-cmd "$MAKE_CMD" --environment "$ENVIRONMENT" --compile-target "$COMPILE_TARGET" "$URL" install_package --sub-dir $SUBDIR --cd "$CDTO" --make-cmd "$MAKE_CMD" --environment "$ENVIRONMENT" "$URL" symlink_package "$URL" } set_vars() { typeset URL PACKAGE HOST DIR FILE SUBDIR URL="$1" PACKAGE=`echo $URL | sed 's/.*\/\(.*\)-.*$/\1/'` HOST=`echo $URL | sed 's/.*\/\/\([^\/]*\).*\/[^\/]*$/\1/'` DIR=`echo $URL | sed 's/.*\/\/[^\/]*\(.*\)\/[^\/]*$/\1/'` FILE=`echo $URL | sed 's/.*\///'` SUBDIR=`echo $URL | sed 's/^.*\/\([^\/]*\)\.tar\.[^\.]*$/\1/'` #info "PACKAGE=$PACKAGE; HOST=$HOST; DIR=$DIR; FILE=$FILE; SUBDIR=$SUBDIR" echo "PACKAGE=$PACKAGE; HOST=$HOST; DIR=$DIR; FILE=$FILE; SUBDIR=$SUBDIR" } get_package() { typeset URL PACKAGE HOST DIR FILE SUBDIR WGET_CMD WGET_CMD=wget while [ "X$1" != X ]; do case "$1" in --wget-cmd) WGET_CMD="$2" shift ;; *) break ;; esac shift done [ "X$1" != X -a "X$2" = X ] || error "get_package: wrong arg count" URL="$1" eval `set_vars "$URL"` info "$PACKAGE: getting ..." mkdir -p $SOURCE_ARCHIVE_DIR cd $SOURCE_ARCHIVE_DIR rm -f $FILE $WGET_CMD $URL } wgetfunc() { typeset URL PACKAGE HOST DIR FILE SUBDIR [ "X$1" != X -a "X$2" = X ] || error "wgetfunc: wrong arg count" URL="$1" eval `set_vars "$URL"` info "wgetfunc: retrieving $URL ..." echo "machine $HOST login ftp password ahuxley@eso.org" > $HOME/.netrc chmod 600 $HOME/.netrc ftp $HOST <&2 exit 1 } warning() { [ $ADE_MSG_VERBOSELEVEL -lt 2 ] || echo "$PROGNAME: WARNING: $1" >&2 } info() { [ $ADE_MSG_VERBOSELEVEL -lt 3 ] || echo "$PROGNAME: INFO: $1" >&2 } debug() { [ $ADE_MSG_VERBOSELEVEL -lt $1 ] || echo "$PROGNAME: DEBUG[$1]: $2" >&2 } ade_msg_debug() { debug $1 "$2" } ade_msg_internalerror() { internalerror "$1" } internalerror() { echo "$PROGNAME: INTERNAL ERROR: $1" >&2 exit 1 } main "$@"