#!/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://wxwebkit.wxcommunity.com/downloads/deps/$LIBJPEG_TARBALL"

LIBPNG_VERSION="1.2.33"
LIBPNG_TARBALL="libpng-$LIBPNG_VERSION.tar.gz"
LIBPNG_URL="http://wxwebkit.wxcommunity.com/downloads/deps/$LIBPNG_TARBALL"

LIBCURL_VERSION="7.19.6"
LIBCURL_TARBALL="curl-$LIBCURL_VERSION.tar.gz"
LIBCURL_URL="http://curl.haxx.se/download/$LIBCURL_TARBALL"

export MAC_OS_X_DEPLOYMENT_TARGET=10.4

ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64"
SDK="/Developer/SDKs/MacOSX10.4u.sdk"

if [ ! -d $SDK ]; then
    SDK="/Developer/SDKs/MacOSX10.5.sdk"
fi

if [ "${OSTYPE:0:6}" == "darwin" ]; then  
    export CC="gcc-4.0"
    export CXX="g++-4.0"
fi

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 $SDK $ARCH_FLAGS" \
    LDFLAGS=$ARCH_FLAGS
    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 $SDK $ARCH_FLAGS" \
    LDFLAGS="$ARCH_FLAGS"
    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 $SDK $ARCH_FLAGS" \
    LDFLAGS="$ARCH_FLAGS"
    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 $SDK $ARCH_FLAGS" \
    LDFLAGS="$ARCH_FLAGS"
    make install
  else
    ./configure --prefix=$DEPS_PREFIX
  
    make
    make install
  fi
  
  cd $DL_DIR
  rm -rf $DL_DIR/libpng-$LIBPNG_VERSION
fi

if [ ! -f $DEPS_PREFIX/lib/libcurl.$DLLEXT ]; then
  $DL_CMD -o $DL_DIR/$LIBCURL_TARBALL $LIBCURL_URL

  tar xzvf $DL_DIR/$LIBCURL_TARBALL
  cd $DL_DIR/curl-$LIBCURL_VERSION

  if [ "${OSTYPE:0:6}" == "darwin" ]; then
    # CURL creates different build headers for 32 and 64 bit, so to get a universal build,
    # we must first create a 32 bit version of the header, then a 64 bit version, and
    # have the original header simply decide which to use.
    export CFLAGS="-O -g -isysroot $SDK -mmacosx-version-min=10.4 -arch i386 -arch ppc"
    ./configure --prefix=$DEPS_PREFIX --disable-dependency-tracking
    
    mkdir -p $DEPS_PREFIX/include/curl
    
    cp include/curl/curlbuild.h include/curl/curlbuild32.h
    cp include/curl/curlbuild.h $DEPS_PREFIX/include/curl/curlbuild32.h
    
    make distclean
    
    export CFLAGS="-O -g -isysroot $SDK -mmacosx-version-min=10.4 -arch x86_64 -arch ppc64"
    ./configure --prefix=$DEPS_PREFIX --disable-dependency-tracking
    
    cp include/curl/curlbuild.h include/curl/curlbuild64.h
    cp include/curl/curlbuild.h $DEPS_PREFIX/include/curl/curlbuild64.h
    
    make distclean
    
    export CFLAGS="-O -g -isysroot $SDK -mmacosx-version-min=10.4 $ARCH_FLAGS"
    ./configure --prefix=$DEPS_PREFIX --disable-dependency-tracking
    
    cat > include/curl/curlbuild.h <<EOF
#ifdef __LP64__
#include "curlbuild64.h"
#else
#include "curlbuild32.h"
#endif 
EOF

    make CFLAGS="-O -g -isysroot $SDK $ARCH_FLAGS" \
    LDFLAGS="$ARCH_FLAGS"
    make install
  else
    ./configure --prefix=$DEPS_PREFIX
  
    make
    make install
  fi
  
  cd $DL_DIR
  rm -rf $DL_DIR/curl-$LIBCURL_VERSION
fi
