X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=doc%2Fmono-build.sh;h=17b604cc27386ef0a37525f9f8adf3d2d174b9e9;hb=e416c58812bf539bf8ff7af64b364c102825ffe4;hp=ca92b965452eeb80fa8211562f50402b340ec916;hpb=eb4fe4d252b573a33af0a320d59b8026e7d90e51;p=mono.git diff --git a/doc/mono-build.sh b/doc/mono-build.sh index ca92b965452..17b604cc273 100755 --- a/doc/mono-build.sh +++ b/doc/mono-build.sh @@ -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 ""