#!/bin/bash # # Script to update/install the latest versions of all the most # important Common Lisp packages. Uses SBCL but otherwise tries to be # somewhat independent of your local environment. # # Intended to quickly bootstrap a working development environment for # Lisp free software hackers. # # Idea from jhbuild by James Henstridge (a Gnome hacker). # # Contributors: # Luke Gorrie # Anthony Chaumas-Pellet # Christophe Rhodes # David Lichteblau # Eric Marsden set -e if [ "$CLNET_USER" == "" ]; then CLNET_USER=:pserver:anonymous:anonymous fi cd $(dirname $0) system_dir="$(pwd)/systems" source_dir="$(pwd)/source" target_dir="$(pwd)/target" # SBCL-specific options build_options="--noinform --noprint --disable-debugger" run_options="--disable-debugger" quit="(sb-ext:quit)" # CLIM configuration case x$CLIM_BACKEND in xgtkairo) EXTRA_CLIM_FEATURES="(pushnew :gtkairo *features*)" ;; x|xclx) EXTRA_CLIM_FEATURES="nil" ;; *) echo "invalid $CLIM_BACKEND, expected clx or gtkairo." 1>&2 exit 1 ;; esac if [ ! -z $CCL ]; then # user wants OpenMCL instead of SBCL. Make it so. lisp=$CCL build_options="--batch" # fixme, that's not good enough run_options="--batch" # ditto quit="(ccl:quit)" elif [ ! -z $SBCL ]; then lisp=$SBCL elif [ -x ${target_dir}/bin/sbcl ]; then lisp="${target_dir}/bin/sbcl --core ${target_dir}/lib/sbcl/sbcl.core" else lisp=sbcl fi [ -d $system_dir ] || mkdir $system_dir [ -d $source_dir ] || mkdir $source_dir [ -d $target_dir ] || mkdir $target_dir case $1 in world) "$0" clean && "$0" buildsbcl && "$0" build ;; clean) cd $source_dir find . -name "*.fasl" -exec rm {} \; find . -name "*.lx64fsl" -exec rm {} \; ;; mrproper) rm -rf ${source_dir} ${target_dir} ;; build) cd $source_dir # flexichain cvs -d ${CLNET_USER}@common-lisp.net:/project/flexichain/cvsroot co flexichain ln -f -s $(pwd)/flexichain/*.asd ${system_dir}/ # mcclim cvs -d ${CLNET_USER}@common-lisp.net:/project/mcclim/cvsroot co mcclim ln -f -s $(pwd)/mcclim/*.asd ${system_dir}/ # spatial trees (does not exist in CVS so redownload each time) [ -d spatial-trees*/ ] && rm -rf spatial-trees*/ wget -O /tmp/spatial-trees.tar.gz http://ftp.linux.org.uk/pub/lisp/cclan/spatial-trees.tar.gz tar vzxf /tmp/spatial-trees.tar.gz rm /tmp/spatial-trees.tar.gz ln -f -s $(pwd)/spatial-trees*/*.asd ${system_dir}/ # CLX (update or checkout - I'm not good with darcs) if [ -d clx ]; then (cd clx; darcs pull --all) else darcs get http://common-lisp.net/~crhodes/clx fi ln -f -s $(pwd)/clx/*.asd ${system_dir}/ # CL-PPCRE wget -O /tmp/cl-ppcre.tar.gz http://weitz.de/files/cl-ppcre.tar.gz tar vzxf /tmp/cl-ppcre.tar.gz rm /tmp/cl-ppcre.tar.gz ln -f -s $(pwd)/cl-ppcre*/*.asd ${system_dir}/ # Skippy (required by closure) [ -d skippy* ] && rm -rf skippy*/ wget -O /tmp/skippy.tgz http://www.xach.com/lisp/skippy.tgz tar vzxf /tmp/skippy.tgz rm /tmp/skippy.tgz ln -f -s $(pwd)/skippy*/*.asd ${system_dir}/ # FLEXI-STREAMS (for CLOSURE) wget -O /tmp/flexi-streams.tar.gz http://weitz.de/files/flexi-streams.tar.gz tar vzxf /tmp/flexi-streams.tar.gz rm /tmp/flexi-streams.tar.gz ln -f -s $(pwd)/flexi-streams*/*.asd ${system_dir}/ # TRIVIAL-GRAY-STREAMS (for CLOSURE) wget -O /tmp/trivial-gray-streams.tar.gz http://common-lisp.net/project/cl-plus-ssl/download/trivial-gray-streams.tar.gz tar vzxf /tmp/trivial-gray-streams.tar.gz rm /tmp/trivial-gray-streams.tar.gz ln -f -s $(pwd)/trivial-gray-streams*/*.asd ${system_dir}/ # ZIP (for CLOSURE) cvs -d ${CLNET_USER}@common-lisp.net:/project/zip/cvsroot co zip ln -f -s $(pwd)/zip/*.asd ${system_dir}/ # SALZA (for CLOSURE) wget -O /tmp/salza.tar.gz http://www.xach.com/lisp/salza/salza-0.7.2.tar.gz tar vzxf /tmp/salza.tar.gz rm /tmp/salza.tar.gz ln -f -s $(pwd)/salza*/*.asd ${system_dir}/ # TRIVIAL-SOCKETS (for CLOSURE) wget -O /tmp/trivial-sockets.tar.gz http://ftp.linux.org.uk/pub/lisp/cclan/trivial-sockets.tar.gz tar vzxf /tmp/trivial-sockets.tar.gz rm /tmp/trivial-sockets.tar.gz ln -f -s $(pwd)/trivial-sockets*/*.asd ${system_dir}/ # BORDEAUX-THREADS (for CLOSURE) if [ -d bordeaux-threads ]; then (cd bordeaux-threads; darcs pull --all) else darcs get http://common-lisp.net/project/bordeaux-threads/darcs/bordeaux-threads/ fi ln -f -s $(pwd)/bordeaux-threads/*.asd ${system_dir}/ # CXML (for CLOSURE) cvs -d ${CLNET_USER}@common-lisp.net:/project/cxml/cvsroot co cxml ln -f -s $(pwd)/cxml/*.asd ${system_dir}/ # PURI (for CLOSURE) wget -O /tmp/puri.tar.gz http://files.b9.com/puri/puri-latest.tar.gz tar vzxf /tmp/puri.tar.gz rm /tmp/puri.tar.gz ln -f -s $(pwd)/puri*/*.asd ${system_dir}/ # CLOSURE cvs -d ${CLNET_USER}@common-lisp.net:/project/closure/cvsroot co closure ln -f -s $(pwd)/closure/*.asd ${system_dir}/ # MIDI (for GSHARP) [ -d midi*/ ] && rm -rf midi*/ wget -O /tmp/midi.tar.gz http://doc.gold.ac.uk/isms/lisp/midi/midi.tar.gz tar vzxf /tmp/midi.tar.gz rm /tmp/midi.tar.gz ln -f -s $(pwd)/midi*/*.asd ${system_dir}/ # GSHARP cvs -d ${CLNET_USER}@common-lisp.net:/project/gsharp/cvsroot co gsharp ln -f -s $(pwd)/gsharp/*.asd ${system_dir}/ # Climacs cvs -d ${CLNET_USER}@common-lisp.net:/project/climacs/cvsroot co climac\s ln -f -s $(pwd)/climacs/*.asd ${system_dir} # slime cvs -d ${CLNET_USER}@common-lisp.net:/project/slime/cvsroot co slime # tab-layout (for Beirc) wget -O /tmp/tab-layout.tar.bz2 --no-check-certificate http://bl0rg.net/~mgr/flux/tab-layout_2005-09-19_02-52+0200.tar.bz2 tar vjxf /tmp/tab-layout.tar.bz2 rm /tmp/tab-layout.tar.bz2 ln -f -s $(pwd)/tab-layout/*.asd ${system_dir}/ # split-sequence (for Beirc; does not go through the CCLAN mirror selector because of cookies) wget -O /tmp/split-sequence.tar.gz http://ftp.linux.org.uk/pub/lisp/cclan/split-sequence.tar.gz tar vzxf /tmp/split-sequence.tar.gz rm /tmp/split-sequence.tar.gz ln -f -s $(pwd)/split-sequence/*.asd ${system_dir}/ # cl-fad (for Beirc) wget -O /tmp/cl-fad.tar.gz http://weitz.de/files/cl-fad.tar.gz tar vzxf /tmp/cl-fad.tar.gz rm /tmp/cl-fad.tar.gz ln -f -s $(pwd)/cl-fad*/*.asd ${system_dir}/ # usocket (for Beirc) svn co svn://common-lisp.net/project/usocket/svn/usocket/trunk/ usocket/ ln -f -s $(pwd)/usocket/*.asd ${system_dir}/ # cl-irc (for Beirc) svn co svn://common-lisp.net/project/cl-irc/svn/trunk/ cl-irc/ ln -f -s $(pwd)/cl-irc/*.asd ${system_dir} # Beirc cvs -d ${CLNET_USER}@common-lisp.net:/project/beirc/cvsroot co beirc ln -f -s $(pwd)/beirc/*.asd ${system_dir} # CLIMPlayer if [ -d climplayer ]; then (cd climplayer; darcs pull --all) else darcs get http://www.spacecentre.se/thomas/repos/climplayer fi ln -f -s $(pwd)/climplayer/*.asd ${system_dir}/ # cffi (for gtkairo) if [ -d cffi ]; then (cd cffi; darcs pull --all) else darcs get http://common-lisp.net/project/cffi/darcs/cffi/ fi ln -f -s $(pwd)/cffi/*.asd ${system_dir} ${lisp} $build_options \ --eval "(require :asdf)" \ --eval "(setq asdf:*central-registry* '(\"${system_dir}/\"))" \ --eval "(asdf:oos 'asdf:load-op :mcclim)" \ --eval "(asdf:oos 'asdf:load-op :cl-ppcre)" \ --eval "(asdf:oos 'asdf:load-op :clim-listener)" \ --eval "(asdf:oos 'asdf:load-op :skippy)" \ --eval "(asdf:oos 'asdf:load-op :gsharp)" \ --eval "(asdf:oos 'asdf:load-op :closure)" \ --eval "(asdf:oos 'asdf:load-op :beirc)" \ --eval "(asdf:oos 'asdf:load-op :climacs)" \ --eval "(asdf:oos 'asdf:load-op :climplayer)" \ --eval $quit echo "$0 ok" ;; buildsbcl) if [ -n "$CCL" ]; then echo "Cowardly refusing to build SBCL when \$CCL is set." 1>&2 exit 1 fi cd ${source_dir} cvs -d :pserver:anonymous:@sbcl.cvs.sourceforge.net:/cvsroot/sbcl co sbcl # Enable threads echo '(lambda (list) (pushnew :sb-thread list) list)' > sbcl/customize-target-features.lisp (cd sbcl; sh make.sh; INSTALL_ROOT=${target_dir} sh install.sh) ;; sbcl) if [ -n "$CCL" ]; then echo "Cowardly refusing to run SBCL when \$CCL is set." 1>&2 exit 1 fi shift; ${lisp} \ --eval "(require :asdf)" \ --eval "(setq asdf:*central-registry* '(\"${system_dir}/\"))" \ "$@" ;; openmcl) if [ -z "$CCL" ]; then echo "Cannot run OpenMCL because \$CCL is not set." 1>&2 exit 1 fi shift; ${lisp} \ --eval "(require :asdf)" \ --eval "(setq asdf:*central-registry* '(\"${system_dir}/\"))" \ "$@" ;; slime) shift emacs_args="$@" emacs=${EMACS-emacs} $emacs \ -eval "(setq load-path (cons \"${source_dir}/slime\" load-path))" \ -eval "(setq inhibit-splash-screen t)" \ -eval "(load \"${source_dir}/slime/slime\")" \ -eval "(setq inferior-lisp-program \"$0 sbcl\")" \ -eval "(slime-setup)" \ -eval '(slime)' \ ${emacs_args} ;; listener) ${lisp} $run_options \ --eval "(require :asdf)" \ --eval "(setq asdf:*central-registry* '(\"${system_dir}/\"))" \ --eval "$EXTRA_CLIM_FEATURES" \ --eval "(asdf:operate 'asdf:load-op :mcclim)" \ --eval "(asdf:operate 'asdf:load-op :clim-listener)" \ --eval "(clim-listener:run-listener)" ;; gsharp) ${lisp} \ --eval "(require :asdf)" \ --eval "(setq asdf:*central-registry* '(\"${system_dir}/\"))" \ --eval "$EXTRA_CLIM_FEATURES" \ --eval "(asdf:operate 'asdf:load-op :gsharp)" \ --eval "(gsharp::gsharp)" ;; climacs) ${lisp} \ --eval "(require :asdf)" \ --eval "(setq asdf:*central-registry* '(\"${system_dir}/\"))" \ --eval "$EXTRA_CLIM_FEATURES" \ --eval "(asdf:operate 'asdf:load-op :climacs)" \ --eval "(climacs:climacs)" ;; closure) ${lisp} \ --eval "(require :asdf)" \ --eval "(setq asdf:*central-registry* '(\"${system_dir}/\"))" \ --eval "$EXTRA_CLIM_FEATURES" \ --eval "(asdf:operate 'asdf:load-op :closure)" \ --eval "(closure:start)" ;; beirc) ${lisp} \ --eval "(require :asdf)" \ --eval "(setq asdf:*central-registry* '(\"${system_dir}/\"))" \ --eval "$EXTRA_CLIM_FEATURES" \ --eval "(asdf:operate 'asdf:load-op :beirc)" \ --eval "(beirc:beirc)" ;; climplayer) ${lisp} \ --eval "(require :asdf)" \ --eval "(setq asdf:*central-registry* '(\"${system_dir}/\"))" \ --eval "$EXTRA_CLIM_FEATURES" \ --eval "(asdf:operate 'asdf:load-op :climplayer)" \ --eval "(climplayer:climplayer)" ;; *) cat <= 2.8.) EOF esac