# Copyright 2016 The Fuchsia Authors. 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.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT HOLDERS OR 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.

set -e

source $(dirname $BASH_SOURCE)/common.sh
source $(dirname $BASH_SOURCE)/deps.sh

has_stamp fontconfig

if [ $__has_stamp = "false" ]; then

require_deps freetype

while getopts ":hc" arg; do
  case $arg in
    c) # Do a clean build
      clean_build=true
      ;;
    h | *) # Display help.
      usage
      exit 0
      ;;
  esac
done

FONTCONFIG_NAME_VERSION=fontconfig-2.12.1
FONTCONFIG_ARCHIVE=$FONTCONFIG_NAME_VERSION.tar.gz
FONTCONFIG_ROOT=$WM_DEPS_SOURCE_DIR/$FONTCONFIG_NAME_VERSION

if [ ! -d "$FONTCONFIG_ROOT" ]; then
    cd $WM_DEPS_SOURCE_DIR
    if [ ! -f $FONTCONFIG_ARCHIVE ]; then
        wget https://www.freedesktop.org/software/fontconfig/release/fontconfig-2.12.1.tar.gz
    fi
    
    tar xf $FONTCONFIG_ARCHIVE

    cd $FONTCONFIG_ROOT
    patch -p1 < $script_dir/fc.patch
fi

source $script_dir/fuchsia_toolchain.sh

cd $FONTCONFIG_ROOT

declare -x CFLAGS="$CFLAGS -D__linux__" 
declare -x FREETYPE_CFLAGS=$(pkg-config --cflags freetype2)
declare -x ARCHFLAGS="-arch x86_64"

$FONTCONFIG_ROOT/configure --prefix=$FUCHSIA_CROSS_ROOT --host=x86_64-fuchsia-elf 

make $PARALLEL
make install

make_stamp fontconfig
fi
