#!/bin/sh # # Build script to automatically build Chocolate Doom. This will work # on OSX and Linux, and hopefully Cygwin as well (havent tried) # # To build on OSX: # 1. Install Xcode (available on your OSX DVDs or from the Apple # website) # 2. Type: # curl http://www.chocolate-doom.org/build-chocolate-doom | sh # # To build on Linux: # 1. Make sure gcc is installed (depends on your distribution). # 2. Type: # wget -O - http://www.chocolate-doom.org/build-chocolate-doom | sh # CHOCOLATE_DOOM_DIR=~/chocolate-doom PACKAGES_DIR=$CHOCOLATE_DOOM_DIR/packages BUILD_DIR=$CHOCOLATE_DOOM_DIR/build # Check if the specified string matches the glob pattern. pattern_match() { pattern="$1" case "$2" in $pattern) true ;; *) false ;; esac } # Determine if a given program is in the PATH. have_tool() { tool=$1 result=1 SAVE_IFS=$IFS IFS=: for dir in $PATH; do if [ -e $dir/$tool ]; then # echo $dir/$tool result=0 break fi done IFS=$SAVE_IFS return $result } # Download a given URL to stdout. get_url() { url=$1 if have_tool curl; then curl $url return fi if have_tool wget; then wget $url -O - return fi # Desperate? for l in lynx links elinks; do if have_tool $l; then echo "Using $l to download $url..." >&2 $l -source $url return fi done echo "No tool available to retrieve URLs. Please install curl or wget." >&2 exit -1 } # Extract a tar.gz file. extract_targz() { file=$1 gunzip < $1 | tar -x } # Download a file to the packages directory. download_file() { url=$1 file=$2 if get_url $url$file > $PACKAGES_DIR/$file.part; then mv $PACKAGES_DIR/$file.part $PACKAGES_DIR/$file return 0 else echo "File $file failed to download! Please try again." return 1 fi } # fetch_from_svn(svn_url, checkout_dir_name) # Check module out from subversion. fetch_from_svn() { svn_url=$1 checkout_dir_name=$2 checkout_path="$BUILD_DIR/$checkout_dir_name" if [ ! -e "$checkout_path" ]; then if ! svn checkout "$svn_url" "$checkout_path"; then echo "Failed to check out $checkout_dir_name from Subversion" exit fi else svn update "$checkout_path" fi } # fetch_module(base_url, module_name, version) # Download the specified module. fetch_module() { url=$1 module=$2 version=$3 echo ======================================================= echo Building $module version $version echo ======================================================= echo if [ ! -e $PACKAGES_DIR/$module-$version.tar.gz ]; then echo Downloading tar file... download_file $url $module-$version.tar.gz fi echo Extracting... cd $BUILD_DIR if ! extract_targz $PACKAGES_DIR/$module-$version.tar.gz; then rm -f $PACKAGES_DIR/$module-$version.tar.gz echo Archive failed to extract and is possibly corrupted. echo Please run this script again. exit fi } # build_module(module_dir, args) # Build the specified module. build_module() { module=$1 args=$2 echo Building module... cd "$BUILD_DIR/$module" (./configure --with-sdl-prefix=$SDL_PREFIX --prefix=$INSTALL_DIR $args) || exit make || exit # Install the package echo $INSTALL_MESSAGE $INSTALL_COMMAND make install || exit echo Build complete. echo } # fetch_and_build_module(base_url, module_name, version, args) # Build a module, downloading from http: fetch_and_build_module() { url=$1 module=$2 version=$3 args=$4 fetch_module "$url" "$module" "$version" build_module "$module-$version" "$args" } autogen_module() { module=$1 cd "$BUILD_DIR/$module" # This is what is normally found in the autogen.sh script. The # commands are run here directly as some slight tweaks are needed. mkdir autotools aclocal -I "$SDL_PREFIX/share/aclocal" || exit autoheader || exit automake -a -c || exit autoconf || exit automake || exit } # Check if a given header file is in the standard include directory or # SDL include directory. check_header() { headerfile=$1 echo "#include <$headerfile>" | cpp $SDL_CFLAGS $CPPFLAGS > /dev/null result=$? if [ $result = 0 ]; then echo "Have $headerfile" else echo "Don't have $headerfile" fi return $result } usage() { echo echo "Usage:" echo "$0 : Install into home directory" echo "$0 -su : Install globally onto system using 'su'" echo "$0 -sudo : Install globally onto system using 'sudo'" echo echo "Extra options:" echo "-v2 : Build v2-branch instead of trunk" echo "-host : Cross-compile for the specified target." echo exit 0 } if pattern_match "* *" "$HOME"; then echo echo "The path to your home directory contains a space:" echo echo " HOME=$HOME" echo echo "This script will probably fail to build - reset HOME to point" echo "somewhere else. For example, type:" echo echo " mkdir /home/user" echo " HOME=/home/user" echo exit -1 fi if ! have_tool gcc; then echo "No compiler found. Please install gcc!" >&2 exit -1 fi # Decide on how to install things svn_build=false INSTALL_DIR=$CHOCOLATE_DOOM_DIR/install INSTALL_COMMAND= INSTALL_MESSAGE="Installing..." SVN_PATH=/trunk/chocolate-doom SVN_CO_NAME=chocolate-doom-svn HOST_ARG= for arg in "$@"; do case "$arg" in "-su") INSTALL_DIR=/usr/local INSTALL_COMMAND=su -c INSTALL_MESSAGE="Type the root password:" ;; "-sudo") INSTALL_DIR=/usr/local INSTALL_COMMAND=sudo INSTALL_MESSAGE="Type your password:" ;; -host=*) HOST_ARG="-$arg" ;; "-svn") svn_build=true ;; "-v2") svn_build=true SVN_PATH=/branches/v2-branch SVN_CO_NAME=v2-branch-svn ;; *) usage ;; esac done # Make all our build directories etc mkdir $CHOCOLATE_DOOM_DIR mkdir $PACKAGES_DIR mkdir $BUILD_DIR MACOSX_DEPLOYMENT_TARGET=10.4 PATH="$INSTALL_DIR/bin:$PATH" CPPFLAGS="-I$INSTALL_DIR/include -I$INSTALL_DIR/include/SDL" LDFLAGS="-L$INSTALL_DIR/lib $LDFLAGS" export MACOSX_DEPLOYMENT_TARGET export CPPFLAGS export LDFLAGS SDL_BUILD_OPTIONS="" if [ `uname` = "Darwin" ]; then SDL_BUILD_OPTIONS="--disable-video-x11 $SDL_BUILD_OPTIONS" CC="gcc -m32" export CC else LDFLAGS="-Wl,-rpath -Wl,$INSTALL_DIR/lib $LDFLAGS" fi # Windows build? echo $HOST_ARG if [ `uname` = "Cygwin" ] || pattern_match "*mingw*" "$HOST_ARG"; then echo echo "Windows build: installing supplementary DirectX headers." echo if [ ! -e $PACKAGES_DIR/directx-devel.tar.gz ]; then download_file http://www.libsdl.org/extras/win32/common/ \ directx-devel.tar.gz fi mkdir -p $INSTALL_DIR cd $INSTALL_DIR extract_targz $PACKAGES_DIR/directx-devel.tar.gz fi SDL_CFLAGS= SDL_PREFIX=`sdl-config --prefix` if [ $? = 0 ]; then # SDL is installed on the system SDL_CFLAGS=`sdl-config --cflags` else # SDL not installed; we must build it SDL_PREFIX=$INSTALL_DIR fetch_and_build_module http://www.libsdl.org/release/ SDL 1.2.14 \ "$SDL_BUILD_OPTIONS $HOST_ARG" fi if ! check_header SDL_net.h; then # SDL_net not installed; we must build it fetch_and_build_module http://www.libsdl.org/projects/SDL_net/release/ \ SDL_net 1.2.6 "$HOST_ARG" fi if ! check_header SDL_mixer.h; then # SDL_mixer not installed; we must build it fetch_and_build_module http://www.libsdl.org/projects/SDL_mixer/release/ \ SDL_mixer 1.2.11 "$HOST_ARG" fi # Build Chocolate Doom. We can build the stable version or check out # the latest code from Subversion. if $svn_build; then fetch_from_svn "http://chocolate-doom.svn.sourceforge.net/svnroot/chocolate-doom$SVN_PATH" \ "$SVN_CO_NAME" autogen_module "$SVN_CO_NAME" build_module "$SVN_CO_NAME" "$HOST_ARG" else # Build v1.6.0 fetch_and_build_module http://mesh.dl.sourceforge.net/project/chocolate-doom/chocolate-doom/1.6.0/ \ chocolate-doom 1.6.0 "$HOST_ARG" fi cd $CHOCOLATE_DOOM_DIR ln -sf $INSTALL_DIR/games/chocolate-doom chocolate-doom ln -sf $INSTALL_DIR/games/chocolate-server chocolate-server ln -sf $INSTALL_DIR/games/chocolate-setup chocolate-setup