#!/bin/sh

# Copyright (C) 2005, 2006 Apple Computer, Inc.  All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1.  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer. 
# 2.  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution. 
# 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission. 
#
# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# A script to download the extra libraries needed to build WebKit on UNIX-based OSes.
# libxml/libxslt need to be added, but so far I've had them on all the (UNIX) machines
# I've tested on, so I don't have a machine to test the code on.

DL_CMD="curl -L"

scriptDir="$(cd $(dirname $0);pwd)"
WK_ROOT=$scriptDir/../..
WK_ROOTDIR=$WK_ROOT

DL_DIR=/tmp/webkit-deps
# NOTE: If you change this, make sure the dir is on the path.
DEPS_PREFIX=$WK_ROOT/WebKitLibraries/unix
DLLEXT=so

if [ "${OSTYPE:0:6}" == "darwin" ]; then
    DLLEXT=dylib
fi

mkdir -p $DL_DIR
mkdir -p $DEPS_PREFIX

ICU_VERSION="3.4.1"
ICU_TARBALL="icu-$ICU_VERSION.tgz"
ICU_URL="ftp://ftp.software.ibm.com/software/globalization/icu/$ICU_VERSION/$ICU_TARBALL"

# dependent app, not lib, what should we do for these?

GPERF_VERSION="3.0.1"
GPERF_TARBALL="gperf-$GPERF_VERSION.tar.gz"
GPERF_URL="ftp://mirrors.kernel.org/gnu/gperf/$GPERF_TARBALL"

PKG_CONFIG_VERSION="0.20"
PKG_CONFIG_TARBALL="pkg-config-$PKG_CONFIG_VERSION.tar.gz"
PKG_CONFIG_URL="http://pkgconfig.freedesktop.org/releases/$PKG_CONFIG_TARBALL"

ICONV_VERSION="1.9.2"
ICONV_TARBALL="libiconv-$ICONV_VERSION.tar.gz"
ICONV_URL="http://ftp.gnu.org/pub/gnu/libiconv/$ICONV_TARBALL"

LIBJPEG_VERSION="6b"
LIBJPEG_TARBALL="jpegsrc.v$LIBJPEG_VERSION.tar.gz"
LIBJPEG_URL="http://www.ijg.org/files/$LIBJPEG_TARBALL"

LIBPNG_VERSION="1.2.24"
LIBPNG_TARBALL="libpng-$LIBPNG_VERSION.tar.gz"
LIBPNG_URL="ftp://ftp.simplesystems.org/pub/libpng/png/src/$LIBPNG_TARBALL"

cd $DL_DIR
# build ICU
if [ `which icu-config >/dev/null 2>&1` ]; then
  $DL_CMD -o $DL_DIR/$ICU_TARBALL $ICU_URL

  tar xzvf $DL_DIR/$ICU_TARBALL
  cd $DL_DIR/icu/source
  
  chmod +x configure install-sh

  if [ "${OSTYPE:0:6}" == "darwin" ]; then  
    ./configure --prefix=$DEPS_PREFIX --disable-dependency-tracking
    make CFLAGS="-O -g -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \
    LDFLAGS="-arch i386 -arch ppc"
    make install
  else
    ./configure --prefix=$DEPS_PREFIX
  
    make
    #make check
    make install
  fi
  cd $DL_DIR
  rm -rf icu
fi

# TODO: What would be a good way to test for this?
if [ ! -f $DEPS_PREFIX/lib/libiconv.$DLLEXT ]; then
  $DL_CMD -o $DL_DIR/$ICONV_TARBALL $ICONV_URL

  tar xzvf $DL_DIR/$ICONV_TARBALL
  cd $DL_DIR/libiconv-$ICONV_VERSION

  if [ "${OSTYPE:0:6}" == "darwin" ]; then  
    ./configure --prefix=$DEPS_PREFIX --disable-dependency-tracking
    make CFLAGS="-O -g -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \
    LDFLAGS="-arch i386 -arch ppc"
    make install
  else
    ./configure --prefix=$DEPS_PREFIX
  
    make
    make install
  fi
  cd $DL_DIR
  rm -rf $DL_DIR/libiconv-$ICONV_VERSION
fi

if [ ! -f $DEPS_PREFIX/lib/libjpeg.a ]; then
  $DL_CMD -o $DL_DIR/$LIBJPEG_TARBALL $LIBJPEG_URL

  tar xzvf $DL_DIR/$LIBJPEG_TARBALL
  cd $DL_DIR/jpeg-$LIBJPEG_VERSION

  # jpeg install command expects this to exist.
  mkdir -p $DEPS_PREFIX/man/man1

  if [ "${OSTYPE:0:6}" == "darwin" ]; then
    ./configure --prefix=$DEPS_PREFIX --disable-dependency-tracking
    make CFLAGS="-O -g -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \
    LDFLAGS="-arch i386 -arch ppc"
    make install
  else
    ./configure --prefix=$DEPS_PREFIX
  
    make
  fi
  
  cp libjpeg.a $DEPS_PREFIX/lib
  cp *.h $DEPS_PREFIX/include
  
  cd $DL_DIR
  rm -rf $DL_DIR/jpeg-$LIBJPEG_VERSION
fi

if [ ! -f $DEPS_PREFIX/lib/libpng.a ]; then
  $DL_CMD -o $DL_DIR/$LIBPNG_TARBALL $LIBPNG_URL

  tar xzvf $DL_DIR/$LIBPNG_TARBALL
  cd $DL_DIR/libpng-$LIBPNG_VERSION

  if [ "${OSTYPE:0:6}" == "darwin" ]; then
    ./configure --prefix=$DEPS_PREFIX --disable-dependency-tracking
    make CFLAGS="-O -g -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch i386 -arch ppc" \
    LDFLAGS="-arch i386 -arch ppc"
    make install
  else
    ./configure --prefix=$DEPS_PREFIX
  
    make
    make install
  fi
  
  cd $DL_DIR
  rm -rf $DL_DIR/libpng-$LIBPNG_VERSION
fi
