#!/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

mkdir -p $DEPS_PREFIX/bin
mkdir -p $DEPS_PREFIX/lib
mkdir -p $DEPS_PREFIX/include
 
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 x86_64"
SDK="/Developer/SDKs/MacOSX10.4u.sdk"

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

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

if [ "${OSTYPE:0:6}" == "darwin" ]; then  
    if [ -x /usr/bin/gcc-4.0 ]; then
        export CC="gcc-4.0"
        export CXX="g++-4.0"
    fi
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

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 --disable-shared
    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
    
    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
    
    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
    
    cp include/curl/curlbuild32.h $DEPS_PREFIX/include/curl/curlbuild32.h
    cp include/curl/curlbuild64.h $DEPS_PREFIX/include/curl/curlbuild64.h
    cp include/curl/curlbuild.h $DEPS_PREFIX/include/curl/curlbuild.h
    
  else
    ./configure --prefix=$DEPS_PREFIX
  
    make
    make install
  fi
  
  cd $DL_DIR
  rm -rf $DL_DIR/curl-$LIBCURL_VERSION
fi
