update known-issues
[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
 
 # 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
 
 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
 # 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.
 
 # --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
     install_pkgconfig=no
-    PKG_CONFIG_PATH="$here/install/lib/pkgconfig"
 else
     install_pkgconfig=yes
 else
     install_pkgconfig=yes
-    ACLOCAL_FLAGS="-I $here/install/share/aclocal $ACLOCAL_FLAGS"
 fi
 
 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
 
 
 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
 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
 
 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
 
 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
 
 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"
 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
     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
 
        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"
 
 
 # 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 ""
 
 
 echo ""