#! /bin/sh

#
# Functions
#
usage()
{
  cat << EOF

  OpenSSL options:
    --disable-openssl      Disable OpenSSL, use built-in SHA1 implementation
    --openssl-prefix=PATH  Location of OpenSSL headers and library
    --gettext-prefix=PATH  Location of the Gettext header and library
    --disable-gtk          Don't build the GTK+ GUI
    --prefix=PATH          Install here instead of $INSTALL_PREFIX

  Some influential environment variables:
    CC          C compiler command (default "cc")
    CFLAGS      C compiler flags (default "-g -Wall -W")

EOF
}

openssl_test()
{
  cat > testconf.c << EOF
  #include <stdio.h>
  #include <openssl/sha.h>
  int main()
  {
      SHA1( 0, 0, 0 );
  }
EOF
  if [ -n "$OPENSSL_PREFIX" ]; then
    TMPFLAGS="-I$OPENSSL_PREFIX/include -L$OPENSSL_PREFIX/lib"
  fi
  if $CC $TMPFLAGS -o testconf testconf.c -lcrypto > /dev/null 2>&1
  then
    echo "OpenSSL: yes"
    DEFINES="$DEFINES HAVE_OPENSSL"
    LINKLIBS="$LINKLIBS -lcrypto"
  else
    echo "OpenSSL: no, using built-in SHA1 implementation"
  fi
  rm -f testconf.c testconf
}

gettext_test()
{
  cat > testconf.c <<EOF
  #include <libintl.h>
  int main()
  {
    gettext("");
  }
EOF

  if [ -n "$GETTEXT_PREFIX" ] && $CC "-I$GETTEXT_PREFIX/include" "-Wl,-R$GETTEXT_PREFIX/lib" "-L$GETTEXT_PREFIX/lib" -lintl -liconv -o testconf testconf.c >/dev/null 2>&1
  then
    GTKCCFLAGS="-I$GETTEXT_PREFIX/include $GTKCCFLAGS"
    GTKLINKLIBS="-Wl,-R$GETTEXT_PREFIX/lib -L$GETTEXT_PREFIX/lib -lintl -liconv $GTKLINKLIBS"
    rm -f testconf.c testconf
    return 0
  fi

  if $CC $GTKCCFLAGS $GTKLINKLIBS -o testconf testconf.c > /dev/null 2>&1
  then
    rm -f testconf.c testconf
    return 0
  fi

  for intl_testdir in $INSTALL_PREFIX/include \
      /usr/local/include /usr/X11R6/include /usr/pkg/include
  do
    if $CC $GTKCCFLAGS -I$intl_testdir $GTKLINKLIBS -o testconf testconf.c > /dev/null 2>&1
    then
      GTKCCFLAGS="$GTKCCFLAGS -I$intl_testdir"
      rm -f testconf.c testconf
      return 0
    fi
  done
  rm -f testconf.c testconf
  return 1
}

gtk_test()
{
  if pkg-config gtk+-2.0 > /dev/null 2>&1
  then
    if expr `pkg-config --modversion gtk+-2.0` '>=' 2.6.0 > /dev/null 2>&1
    then
      cat > testconf.c << EOF
      #include <gtk/gtk.h>
      int main()
      {
        gtk_main();
      }
EOF
      if $CC `pkg-config gtk+-2.0 --cflags --libs` -o testconf testconf.c > /dev/null 2>&1
      then
        GTKCCFLAGS=`pkg-config gtk+-2.0 --cflags`
        GTKLINKLIBS=`pkg-config gtk+-2.0 --libs`
        if gettext_test
        then
          GTKLOCALEDIR="$INSTALL_PREFIX/share/locale"
          GTK=yes
          echo "GTK+:    yes"
        else
          GTKCCFLAGS=
          GTKLINKLIBS=
          echo "GTK+:    no, could not find gettext libintl.h"
          GTK=no
        fi
      else
        echo "GTK+:    no"
        GTK=no
      fi
      rm -f testconf.c testconf
    else
      echo "GTK+:    no (2.6.0 or later is required)"
      GTK=no
    fi
  else
    echo "GTK+:    no"
    GTK=no
  fi
}

#
# Defaults settings
#
CC="${CC-cc}"
CFLAGS="${CFLAGS--g -Wall -W}"
# For > 2 GB files
DEFINES="_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE"
# For asprintf
DEFINES="$DEFINES _GNU_SOURCE"
openssl_disable=0
gtk_disable=0
GTK=no
GTKCCFLAGS=
GTKLINKLIBS=
GTKLOCALEDIR=
if [ -n "$PREFIX" ]; then
    INSTALL_PREFIX=$PREFIX
else
    INSTALL_PREFIX=/usr/local
fi

#
# Parse options
#
while [ $# -ne 0 ]; do
  param=`expr "opt$1" : 'opt[^=]*=\(.*\)'`

  case "x$1" in
    x--disable-openssl)
      openssl_disable="1";
      ;;
    x--openssl-prefix=*)
      OPENSSL_PREFIX="$param";
      ;;
    x--gettext-prefix=*)
      GETTEXT_PREFIX="$param";
      ;;
    x--disable-gtk)
      gtk_disable="1";
      ;;
    x--prefix=*)
      INSTALL_PREFIX="$param";
      ;;
    x--help)
      usage
      exit 0
      ;;
  esac
  shift
done

#
# System-specific flags
#
SYSTEM=`uname -s`
case $SYSTEM in
  BeOS)
    DEFINES="$DEFINES SYS_BEOS"

    CC="gcc"
    MACHINE=`uname -m`
    case $MACHINE in
      BePC) # BeOS on x86
    	CPU="x86"
    	;;
      *)
        CPU="ppc"
        ;;
    esac
    SYSTEM="$SYSTEM / $CPU"
	
    RELEASE=`uname -r`
    case $RELEASE in
      6.0*|5.0.4) # Zeta or R5 / BONE beta 7
        SYSTEM="$SYSTEM / BONE"
        LINKLIBS="$LINKLIBS -lbind -lsocket"
        ;;
      5.0*)      # R5 / net_server
        SYSTEM="$SYSTEM / net_server"
        DEFINES="$DEFINES BEOS_NETSERVER"
        LINKLIBS="$LINKLIBS -lnet"
        ;;
      *)
        echo "Unsupported BeOS version"
        exit 1 
        ;;
    esac
    ;;

  Darwin)
    DEFINES="$DEFINES SYS_DARWIN"
    LINKLIBS="$LINKLIBS -lpthread"
    ;;

  FreeBSD)
    DEFINES="$DEFINES SYS_FREEBSD"
    LINKLIBS="$LINKLIBS -pthread -lm"
    ;;

  NetBSD)
    DEFINES="$DEFINES SYS_NETBSD"
    LINKLIBS="$LINKLIBS -lpthread -lm"
    ;;

  OpenBSD)
    DEFINES="$DEFINES SYS_OPENBSD"
    LINKLIBS="$LINKLIBS -lpthread -lm"
    ;;

  Linux)
    DEFINES="$DEFINES SYS_LINUX"
    LINKLIBS="$LINKLIBS -lpthread -lm"
    ;;

  *)
    echo "Unsupported operating system"
    exit 1 ;;
esac
echo "System:  $SYSTEM"

#
# Mac OS X check for the Universal SDK
#
if [ "$SYSTEM" = Darwin -a ! -d /Developer/SDKs/MacOSX10.4u.sdk ]; then
  echo
  echo "You need to install the Universal SDK in order to build Transmission:"
  echo "  Get your Xcode CD or package"
  echo "  Restart the install"
  echo "  When it gets to \"Installation Type\", select \"Customize\""
  echo "  Select \"Mac OS X 10.4 (Universal) SDL\" under \"Cross Development\""
  echo "  Finish the install."
  exit 1
fi

#
# OpenSSL settings
#
if [ ${openssl_disable} = 1 ]; then
  echo "OpenSSL: no, using built-in SHA1 implementation"
else
    openssl_test
fi

#
# GTK settings
#
if [ ${gtk_disable} = 1 ]; then
  echo "GTK+:    no"
else
    gtk_test
fi

#
# Generate config.jam
#
rm -f config.jam
cat > config.jam << EOF
CC          = $CC ;
LINK        = $CC ;
CCFLAGS     = $CFLAGS ;
DEFINES     = $DEFINES ;
LINKLIBS    = $LINKLIBS ;
GTK         = $GTK ;
GTKCCFLAGS  = $GTKCCFLAGS ;
GTKLINKLIBS = $GTKLINKLIBS ;
EOF
if [ -n "$OPENSSL_PREFIX" ]; then
cat >> config.jam << EOF
HDRS       += $OPENSSL_PREFIX/include ;
LINKFLAGS  += -L$OPENSSL_PREFIX/lib ;
EOF
fi
if [ -n "$CPU" ]; then
cat >> config.jam << EOF
CPU        = $CPU ;
EOF
fi

if [ xyes = "x$GTK" ]; then
    rm -f gtk/defines.h
    cat > gtk/defines.h << EOF
#ifndef TG_DEFINES_H
#define TG_DEFINES_H
#define LOCALEDIR               "$GTKLOCALEDIR"
#endif
EOF
fi

echo
echo "To build Transmission, run 'jam'."
