2006-08-11 Jonathan Chambers <joncham@gmail.com>
[mono.git] / web / mono-build.sh
index ca92b965452eeb80fa8211562f50402b340ec916..17b604cc27386ef0a37525f9f8adf3d2d174b9e9 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/bash
+#! /usr/bin/env bash
 
 # Script to automate the building of mono and its dependencies.
 # Relies on wget being installed (could make it fall back to using
@@ -17,6 +17,44 @@ echo "Building Mono and dependencies in $here, installing to $here/install"
 PATH=$here/install/bin:$PATH
 LD_LIBRARY_PATH=$here/install/lib:$LD_LIBRARY_PATH
 
+# Find a tool to fetch files. It must take an HTTP URL on the command line and
+# save the file in the current directory.  (It must also talk HTTP/1.1, which
+# rules out BSD's ftp(1), at least on FreeBSD 4.4.)
+viable_downloaders="wget fetch"
+for i in $viable_downloaders
+do
+    if which $i > /dev/null; then
+       downloader=`which $i`
+       break
+    fi
+done
+
+if [ -z "$downloader" ]; then
+    echo "Can't find a commandline download tool (tried: $viable_downloaders)"
+    exit -1
+else
+    echo "Using $downloader to fetch files"
+fi 
+
+# We need to prefer GNU make if there's a choice.  BSD make falls over in
+# the glib build if gtk-doc is disabled.
+viable_makers="gmake make"
+for i in $viable_makers
+do
+    if which $i > /dev/null; then
+       MAKE=$i
+       break
+    fi
+done
+
+if [ -z "$MAKE" ]; then
+    echo "Can't find a make tool (tried: $viable_makers)"
+    exit -1
+else
+    echo "Using $MAKE"
+    export MAKE
+fi
+
 # Need to install pkgconfig and set ACLOCAL_FLAGS if there is not a
 # pkgconfig installed already.  Otherwise set PKG_CONFIG_PATH to the
 # glib we're about to install in $here/install.  This script could
@@ -25,67 +63,158 @@ LD_LIBRARY_PATH=$here/install/lib:$LD_LIBRARY_PATH
 
 # --print-ac-dir was added in 1.2h according to the ChangeLog.  This
 # should mean that any automake new enough for us has it.
-if [ -f `aclocal --print-ac-dir`/pkg.m4 ]; then
+
+function aclocal_scan () {
+    # Quietly ignore the rogue '-I' and other aclocal flags that
+    # aren't actually directories...
+    for i in `aclocal --print-ac-dir` $ACLOCAL_FLAGS
+    do
+       if [ -f $i/$1 ]; then
+           return 0
+       fi
+    done
+
+    return 1
+}
+
+function pkgconfig_scan () {
+    module=$1
+
+    echo "Finding pkgconfig files for $module..."
+
+    # Should we use locate? or just a list of well-known directories?
+    # locate has the problem of false positives in src dirs
+    for i in /usr/lib/pkgconfig /usr/local/lib/pkgconfig
+    do
+       echo "Looking in $i..."
+       if [ -f $i/${module}.pc ]; then
+           echo $i
+           return
+       fi
+    done
+}
+
+function install_package() {
+    tarfile=$1
+    dirname=$2
+    name=$3
+    configure_options=$4
+
+    echo "Installing $name..."
+    if [ ! -f $here/$tarfile ]; then
+       (cd $here && $downloader http://www.go-mono.com/archive/$tarfile)
+    fi
+
+    # Assume that the package built correctly if the dir is there
+    if [ ! -d $here/$dirname ]; then
+       # Build and install package
+       (cd $here && tar xzf $tarfile) || exit -1
+       (cd $here/$dirname; ./configure --prefix=$here/install $configure_options || exit -1; $MAKE || exit -1; $MAKE install || exit -1)
+       success=$?
+       if [ $success -ne 0 ]; then
+           echo "***** $name build failure. Run rm -rf $here/$dirname to have this script attempt to build $name again next time"
+           exit -1
+       fi
+    fi
+}
+
+if aclocal_scan pkg.m4 ; then
     install_pkgconfig=no
-    PKG_CONFIG_PATH="$here/install/lib/pkgconfig"
 else
     install_pkgconfig=yes
-    ACLOCAL_FLAGS="-I $here/install/share/aclocal $ACLOCAL_FLAGS"
 fi
 
+if aclocal_scan glib-2.0.m4 ; then
+    install_glib=no
+    if [ $install_pkgconfig = "yes" ]; then
+       # We have to tell the newly-installed pkgconfig about the
+       # system-installed glib
+       PKG_CONFIG_PATH=`pkgconfig_scan glib-2.0`:$PKG_CONFIG_PATH
+    fi
+else
+    install_glib=yes
+    PKG_CONFIG_PATH="$here/install/lib/pkgconfig:$PKG_CONFIG_PATH"
+fi
+
+if [ -f /usr/include/gc/gc.h ]; then
+    install_libgc=no
+else
+    install_libgc=yes
+fi
+
+if [ $install_pkgconfig = "yes" -o $install_glib = "yes" ]; then
+    ACLOCAL_FLAGS="-I $here/install/share/aclocal $ACLOCAL_FLAGS"
+fi
 
 export PATH
 export LD_LIBRARY_PATH
 export ACLOCAL_FLAGS
 export PKG_CONFIG_PATH
 
-# Grab pkg-config-0.8, glib-1.3.12 if necessary
+# Freebsd puts iconv in /usr/local, so see if we need to add
+# /usr/local/include and /usr/local/lib to CPPFLAGS and LDFLAGS.  We could
+# skip this if it would add /usr/include and /usr/lib, but leaving it
+# shouldnt break anything.
+#
+# Actually, it does break stuff :-(  gcc 3.2 prints gratuitous warnings
+# and configure fails to find header files because of this cpp output.
+
+if [ ! -f /usr/include/iconv.h ]; then
+       iconvdirs="/usr/local/include"
+       for i in $iconvdirs
+       do
+               if [ -f $i/iconv.h ]; then
+                       iconvh_dir=$i
+                       break
+               fi
+       done
+
+       if [ -z "$iconvh_dir" ]; then
+           echo "Can't find iconv headers (looked in $iconvdirs)"
+           exit -1
+       fi
 
-# If any more dependencies are added, it would be worth encapsulating
-# the configure; make; make install part in a shell function
+       iconvlib_dir=`echo $iconvh_dir | sed -e 's/include/lib/'`
 
-if [ $install_pkgconfig = "yes" ]; then
-    echo "Installing pkgconfig..."
-    if [ ! -f $here/pkgconfig-0.8.0.tar.gz ]; then
-       wget --timestamping http://www.go-mono.org/archive/pkgconfig-0.8.0.tar.gz
-    fi
+       echo "Adding $iconvh_dir to CPPFLAGS"
+       echo "Adding $iconvlib_dir to LDFLAGS"
 
-    # Assume that pkgconfig built correctly if the dir is there
-    if [ ! -d $here/pkgconfig-0.8.0 ]; then
-       # Build and install pkg-config
-       tar xzf $here/pkgconfig-0.8.0.tar.gz || exit -1
-       (cd $here/pkgconfig-0.8.0; ./configure --prefix=$here/install || exit -1; make || exit -1; make install || exit -1)
-       success=$?
-       if [ $success -ne 0 ]; then
-           echo "***** pkgconfig build failure. Run rm -rf $here/pkgconfig-0.8.0 to have this script attempt to build pkgconfig again next time"
-           exit -1
-       fi
-    fi
+       CPPFLAGS="$CPPFLAGS -I$here/install/include -I$iconvh_dir"
+       LDFLAGS="$LDFLAGS -L$here/install/lib -L$iconvlib_dir"
 else
-    echo "Not installing pkgconfig, you already seem to have it installed"
+       CPPFLAGS="$CPPFLAGS -I$here/install/include"
+       LDFLAGS="$LDFLAGS -L$here/install/lib"
 fi
 
+export CPPFLAGS
+export LDFLAGS
 
-echo "Installing glib..."
-if [ ! -f $here/glib-1.3.13.tar.gz ]; then
-    wget --timestamping http://www.go-mono.org/archive/glib-1.3.13.tar.gz
+# Grab pkg-config, glib and libgc if necessary
+
+if [ $install_pkgconfig = "yes" ]; then
+    install_package pkgconfig-0.8.0.tar.gz pkgconfig-0.8.0 pkgconfig ""
+else
+    echo "Not installing pkgconfig, you already seem to have it installed"
 fi
 
-# Assume that glib built correctly if the dir is there
-if [ ! -d $here/glib-1.3.13 ]; then
-    # Build and install glib
-    tar xzf $here/glib-1.3.13.tar.gz || exit -1
-    (cd $here/glib-1.3.13; ./configure --prefix=$here/install || exit -1; make || exit -1; make install || exit -1)
-    success=$?
-    if [ $success -ne 0 ]; then
-       echo "***** glib build failure. Run rm -rf $here/glib-1.3.13 to have this script attempt to build glib again next time"
-       exit -1
-    fi
+if [ $install_glib = "yes" ]; then
+    install_package glib-2.0.6.tar.gz glib-2.0.6 glib ""
+else
+    echo "Not installing glib, you already seem to have it installed"
+fi
+
+if [ $install_libgc = "yes" ]; then
+    install_package gc6.1alpha5.tar.gz gc6.1alpha5 libgc "--enable-threads=pthreads"
+    # make install didnt do the headers!
+    mkdir -p $here/install/include/gc
+    cp -r $here/gc6.1alpha5/include/* $here/install/include/gc
+else
+    echo "Not installing libgc, you already seem to have it installed"
 fi
 
 # End of build dependencies, now get the latest mono checkout and build that
 
-test -z "$CVSROOT" && CVSROOT=:pserver:anonymous@reypastor.hispalinux.es:/mono
+test -z "$CVSROOT" && CVSROOT=:pserver:anonymous@anoncvs.go-mono.com:/mono
 export CVSROOT
 
 echo "Updating mono"
@@ -100,18 +229,20 @@ if [ ${CVSROOT:0:5} = ":ext:" ]; then
     CVS_RSH=ssh
     export CVS_RSH
 elif [ ${CVSROOT:0:9} = ":pserver:" ]; then
-    if ! grep $CVSROOT ~/.cvspass > /dev/null 2>&1 ; then
+    # Chop off the trailing /mono because cvs 1.11 adds the port number
+    # into the .cvspass line
+    if ! grep ${CVSROOT%:/mono} ~/.cvspass > /dev/null 2>&1 ; then
        echo "Logging into CVS server.  Anonymous CVS password is probably empty"
        cvs login
     fi
 fi
 
-cvs checkout mono || exit -1
+(cd $here && cvs checkout mono) || exit -1
 
 # Build and install mono
 echo "Building and installing mono"
 
-(cd $here/mono; ./autogen.sh --prefix=$here/install || exit -1; make || exit -1; make install || exit -1) || exit -1
+(cd $here/mono; ./autogen.sh --prefix=$here/install || exit -1; $MAKE || exit -1; $MAKE install || exit -1) || exit -1
 
 
 echo ""