# 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

clean_build=false
just_make=false

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

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

if [ $clean_build = "false" ] && [ $just_make = "false" ]; then
    has_stamp curl
else
    __has_stamp=false
fi

if [ $__has_stamp = "false" ]; then

source $script_dir/fuchsia_toolchain.sh

CURL_NAME_VERSION=curl-7.51.0
CURL_ARCHIVE=$CURL_NAME_VERSION.tar.gz
CURL_ROOT=$WM_DEPS_SOURCE_DIR/$CURL_NAME_VERSION

if [ ! -d "$CURL_ROOT" ]; then
    cd $WM_DEPS_SOURCE_DIR
    if [ ! -f $CURL_ARCHIVE ]; then
        wget https://curl.haxx.se/download/curl-7.51.0.tar.gz
    fi

    tar xf $CURL_ARCHIVE
fi

cd $CURL_ROOT

if [ $just_make = "false" ]; then
    if [ $clean_build = "true" ]; then
        make distclean
    fi
    $CURL_ROOT/configure --prefix=$FUCHSIA_CROSS_ROOT --host=x86_64-fuchsia-elf --with-ca-fallback
    sed -i -e 's/#define HAVE_MSG_NOSIGNAL 1/\/* #undef HAVE_MSG_NOSIGNAL *\//g' lib/curl_config.h
fi
make $PARALLEL
make install

make_stamp curl
fi
