#!/bin/bash

# RO_SHAREDLIBS and RO_DIST are optional user parameters.
if [ "$RO_DIST" == "yes" ] ; then
  ro_distcc="$(which distcc) "
else
  ro_distcc=""
fi

ro_cparams=
ro_recurse=no

# Check Parameters for recurse option
for param in $@ ; do
  if [ "$param" == "--ro-recurse" ] ; then
    ro_recurse=yes
  else
    ro_cparams="$ro_cparams $param"
  fi
done

# Add onto exeext with ,e1f extension 
adde1f() {
  if grep -q "exeext=$" $e1fPATH ; then
    echo RISC OS: Adding E1F filetype for $e1fPATH
    sed -i s#exeext=\$#"exeext=,e1f;"# $e1fPATH
  fi

  # Fix modern autoconf badness with ,e1f
  if grep -q "conftest.exe a.out" $e1fPATH ; then
    echo RISC OS: Adding extra filetype checks for $e1fPATH
    sed -i -e s#"conftest.exe a.out"#"conftest.exe *,e1f !RunImage a.out"# \
        -e s#"[ab].out )"#"[ab].out | *,e1f )"# \
        $e1fPATH
  fi

  # Fix some tests that assume no file extension for binaries
  if grep -E -q -- "-s conftest;|-o conftest" $e1fPATH ; then
    echo RISC OS: Adding filetype for binary tests for $e1fPATH
    sed -i -e s#-s\ conftest\;#"-s conftest\$\{ac_exeext\}\;"# -e "s# -o conftest # -o conftest\$\{ac_exeext\}\ #" \
      $e1fPATH
  fi

  # Be GNU for linking and versioning characteristics for libraries
  if grep -q -- "^gnu\*)" $e1fPATH ; then
    echo RISC OS: Adding libtool handling
    sed -i "s#^gnu\*)#gnu\* | riscos\*)#" $e1fPATH
  else
    # The above grep can fail on later versions of configure (perhaps regenerated after
    # using autoreconf) where other targets have been added and gnu* is no longer the first
    # thing on the line.
    # Only do this once.
    if ! grep -q -- "^riscos\*)" $e1fPATH ; then
      echo "RISC OS: Failed to patch configure to support libtool."
      echo "RISC OS: This may be because configure was regenerated by autoreconf."
      echo "RISC OS: Calling perl script to patch configure instead."
      mv -f $e1fPATH $e1fPATH.old
      /opt/netsurf/arm-unknown-riscos/env/patch-configure.pl $e1fPATH $e1fPATH.old
      rm -f $e1fPATH.old
      chmod 755 $e1fPATH
    fi
  fi

  # Use CX11
  if grep -q -- "-lX11" $e1fPATH ; then
    echo RISC OS: Replacing -lX11 with -lCX11 -lDesk
    sed "s#-lX11#-lCX11 -lDesk#" -i $e1fPATH
  fi

  # Doesn't strictly belong here, but it fits
  if grep -q "sys_lib_dlsearch_path_spec=" $e1fPATH ; then
    echo RISC OS: Setting libtool library paths for $e1fPATH
    sed -i -e s#"sys_lib_dlsearch_path_spec=".*\$#"sys_lib_dlsearch_path_spec=/opt/netsurf/arm-unknown-riscos/env/lib"# \
        -e s#"sys_lib_search_path_spec=".*\$#"sys_lib_search_path_spec=/opt/netsurf/arm-unknown-riscos/env/lib"# \
        $e1fPATH
  fi
}



# If the path for the configure script wasn't set, then use .
if [ -z "$RO_CPATH" ] ; then
  RO_CPATH=.
fi

# Also check .. if it doesn't exist.  This is useful for some setups
#  (e.g. bash)
if ! [ -e $RO_CPATH/configure ] ; then
  if [ -e ../configure ] ; then
    RO_CPATH=..
  else
    echo "No configure script found" 1>&2
    exit 1
  fi
fi


# Massage the configure scripts
if [ "$ro_recurse" == "yes" ] ; then
  # Search for more configure files
  ro_cfiles=$(find $RO_CPATH -type f -name configure)

  for e1fPATH in $ro_cfiles ; do
    adde1f
  done
else
  # Otherwise, just the single one at the top
  e1fPATH=$RO_CPATH/configure
  adde1f
fi

# Fix up config.guess to match our uname tool
if [ -e $RO_CPATH/config.guess ]; then
  sed s/arm:riscos/arm\*:riscos/g -i.orig $RO_CPATH/config.guess  
  sed s/arm:RISCOS/arm\*:RISCOS/g -i $RO_CPATH/config.guess  
fi
  
# Prevent configure being re-run by make in some circumstances (e.g.
# Debian patches make changes in configure.in which normally results in
# recreating aclocal.m4, config.h.in, Makefile.in, etc).  For all clearness,
# we ignore such patches by doing the following:
for touched in \
  aclocal.m4 config.h.in Makefile.in stamp-h.in config.guess config.sub configure 
do
  touch -c $RO_CPATH/$touched
done


# Record configure options so switches can be added if needed
tmpoutconfigure=/tmp/out-configure-$$-$RANDOM
$RO_CPATH/configure --help > $tmpoutconfigure

# Set target type
if grep -q -- --target= $RO_CPATH/configure; then
  if [ "x$RO_USE_ARMEABIHF" == "xyes" ] ; then
    ro_target="--target=arm-riscos-gnueabihf"
  else
    ro_target="--target=arm-unknown-riscos"
  fi
else
  ro_target=
fi
# Well, this should ideally be set.  But some things (e.g. ncurses) get
# confused and think we're no longer cross compiling.  OTOH, the TIFF
# library needs it set, so we do so manually for its configure switches
ro_target=

if grep -q -- --build= $RO_CPATH/configure; then
  ro_build="--build=x86_64-unknown-linux-gnu"
else
  ro_build=
fi


if grep -q -- --host= $RO_CPATH/configure; then
  if [ "x$RO_USE_ARMEABIHF" == "xyes" ] ; then
    ro_host="--host=arm-riscos-gnueabihf"
  else
    ro_host="--host=arm-unknown-riscos"
  fi
else
  ro_host=
fi


# Set prefix
if echo $@ | grep -q -- -prefix; then
  :
elif grep -q -- --prefix-dir $tmpoutconfigure; then
  ro_prefix="--prefix-dir=/opt/netsurf/arm-unknown-riscos/env"
elif grep -q -- --prefix $tmpoutconfigure; then
  ro_prefix="--prefix=/opt/netsurf/arm-unknown-riscos/env"
elif grep -q -- -prefix $tmpoutconfigure; then
  ro_prefix="-prefix=/opt/netsurf/arm-unknown-riscos/env"
else
  ro_prefix=
fi 

# Set ro_withlibs
#if grep -q -- --with-libs $tmpoutconfigure; then
#  ro_withlibs="--with-libs=/opt/netsurf/arm-unknown-riscos/env"
#else
  ro_withlibs= 
#fi

# Add X paths if needed
if grep -q -- -x-includes $RO_CPATH/configure; then
  echo RISC OS: Adding X Paths
  ro_x="--x-libraries=/opt/netsurf/arm-unknown-riscos/env/lib --x-includes=/opt/netsurf/arm-unknown-riscos/env/include"
else
  ro_x=
fi


# Add OpenSSL
if grep -q -- --with-openssl $RO_CPATH/configure; then
  echo RISC OS: Adding SSL Path
  ro_ssl="--with-openssl=/opt/netsurf/arm-unknown-riscos/env"
else
  ro_ssl=
fi


# Disable NLS unless otherwise specified
if echo $@ | grep -q -- -nls; then
  ro_nls=
elif grep -q -- --disable-nls $RO_CPATH/configure; then
  echo RISC OS: Disable NLS
  ro_nls="--disable-nls"
fi


# Set Static and Dynamic options
if [ "$RO_SHAREDLIBS" == yes ] ; then
  # Enable shared library building
  if grep -q -- --enable-shared $tmpoutconfigure; then
    echo RISC OS: Enabling shared libraries
    ro_shared=--enable-shared
  else
    ro_shared=
  fi

else
  # Disable shared library building
  if grep -q -- --enable-shared $tmpoutconfigure; then
    echo RISC OS: Disabling shared libraries
    ro_shared=--enable-shared=no
  elif grep -q -- --disable-shared $tmpoutconfigure; then
    echo RISC OS: Disabling shared libraries
    ro_shared=--disable-shared
  else
    ro_shared=
  fi
fi

# Always build static if we can
unset ro_static
if ! grep -q "Only one of --enable-shared" $RO_CPATH/configure; then
  if grep -q -- --enable-static $tmpoutconfigure; then
    echo RISC OS: Enabling static libraries
    ro_static=--enable-static=yes
  elif grep -q -- " -static" $tmpoutconfigure; then
    ro_static=-static
  fi
fi

if [ "$RO_APPSHARED" == "yes" ] ; then
  unset ro_static
  unset ro_shared
fi


# Glib location
if grep -q with-glib-prefix $tmpoutconfigure; then
  echo RISC OS: Setting Glib path
  ro_glib=--with-glib-prefix=/opt/netsurf/arm-unknown-riscos/env
else
  ro_glib=
fi

# GTK location
if grep -q with-gtk-prefix $tmpoutconfigure; then
  echo RISC OS: Setting GTK path
  ro_gtk=--with-gtk-prefix=/opt/netsurf/arm-unknown-riscos/env
else
  ro_gtk=
fi


# TCL
if grep -q with-tclconfig $tmpoutconfigure; then
  echo RISC OS: Setting TCL path
  ro_tcltk="--with-tclconfig=/opt/netsurf/arm-unknown-riscos/env/lib/tcl8.4"
else
  ro_tcltk=
fi

# TK
if grep -q with-tkconfig $tmpoutconfigure; then
  echo RISC OS: Setting TK path
  ro_tcltk="$ro_tcltk --with-tkconfig=/opt/netsurf/arm-unknown-riscos/env/lib/tk8.4"
fi


# Threading
# We probably want this on in future. 
#if grep -q -- "--enable-thread" $tmpoutconfigure ; then
# echo RISC OS: Disabling threads
# ro_threads=--disable-threads
#else
# ro_threads=
#fi


# Native compilers
if grep -q -- "--with-build-cc" $tmpoutconfigure ; then
  echo RISC OS: Setting native compiler
  ro_native="--with-build-cc=$(which cc)"
else
  ro_native=
fi


# Define architecture
if grep -q -- "--with-arch" $tmpoutconfigure ; then
  echo RISC OS: Setting architecture
  # FIXME: right value?
  ro_architecture="--with-arch=arm-riscos"
else
  ro_architecture=
fi


# Remove configure options
rm $tmpoutconfigure


# Set tool chain variables picked up by configure
if [ "x$RO_USE_ARMEABIHF" == "xyes" ] ; then
export CC="${ro_distcc}/opt/netsurf/arm-unknown-riscos/env/arm-riscos-gnueabihf-gcc"
export CPP="/opt/netsurf/arm-unknown-riscos/env/arm-riscos-gnueabihf-cpp"
export RAWCPP=$CPP
export CXX="${ro_distcc}/opt/netsurf/arm-unknown-riscos/env/arm-riscos-gnueabihf-g++"
export LD="/opt/netsurf/arm-unknown-riscos/cross/bin/arm-riscos-gnueabihf-ld"
else
export CC="${ro_distcc}/opt/netsurf/arm-unknown-riscos/env/arm-unknown-riscos-gcc"
export CPP="/opt/netsurf/arm-unknown-riscos/env/arm-unknown-riscos-cpp"
export RAWCPP=$CPP
export CXX="${ro_distcc}/opt/netsurf/arm-unknown-riscos/env/arm-unknown-riscos-g++"
export LD="/opt/netsurf/arm-unknown-riscos/cross/bin/arm-unknown-riscos-ld"
fi

# Only set optimization if CFLAGS not already set
if [ -z "$CFLAGS" ] ; then
  export CFLAGS=-O3
fi

if [ "$RO_SHAREDLIBS" == yes ] ; then
  export CFLAGS+=
  export LDFLAGS="$AB_LDFLAGS"
else
  export CFLAGS+=" -static "
  export LDFLAGS="-static $AB_LDFLAGS"
fi

export CC_FOR_BUILD=/usr/bin/cc

export config_BUILD_CC=/usr/bin/cc
if [ "x$RO_USE_ARMEABIHF" == "xyes" ] ; then
export config_TARGET_CC="${ro_distcc}/opt/netsurf/arm-unknown-riscos/env/arm-riscos-gnueabihf-gcc"
else
export config_TARGET_CC="${ro_distcc}/opt/netsurf/arm-unknown-riscos/env/arm-unknown-riscos-gcc"
fi

#export AR=/opt/netsurf/arm-unknown-riscos/cross/bin/arm-unknown-riscos-ar
export AR=/opt/netsurf/arm-unknown-riscos/env/ro-ar
export NM=/opt/netsurf/arm-unknown-riscos/cross/bin/arm-unknown-riscos-nm
export RANLIB=/opt/netsurf/arm-unknown-riscos/cross/bin/arm-unknown-riscos-ranlib
export INSTALL=/opt/netsurf/arm-unknown-riscos/env/ro-install
export STRIP=/opt/netsurf/arm-unknown-riscos/cross/bin/arm-unknown-riscos-strip
# Used by Mozilla
export CROSS_COMPILE=1
export HOST_RANLIB=/usr/bin/ranlib
export HOST_AR=/usr/bin/ar
export HOST_CC=/usr/bin/cc
export HOST_CXX=/usr/bin/c++

# Set autoconf variables to avoid configure scripts complaining about running
# programs during cross compile

export ac_cv_prog_system=riscos

export ac_cv_gnu_library_version=2.3.2

export ac_cv_sizeof_char=1
export ac_cv_sizeof_unsigned_char=1
export ac_cv_sizeof_short=2
export ac_cv_sizeof_short_int=2
export ac_cv_sizeof_unsigned_short_int=2
export ac_cv_sizeof_int=4
export ac_cv_sizeof_unsigned_int=4
export ac_cv_sizeof_unsigned_long_int=4
export ac_cv_sizeof_long=4
export ac_cv_sizeof_long_int=4
export ac_cv_sizeof_long_long=8
export ac_cv_sizeof_long_long_int=8
export ac_cv_sizeof_unsigned_long_long=8
export ac_cv_sizeof_void_p=4
export ac_cv_sizeof_char_p=4
export ac_cv_sizeof_unsigned_char_p=4
export ac_cv_sizeof_off_t=4
export ac_cv_sizeof_pid_t=4
export ac_cv_sizeof_size_t=4
export ac_cv_sizeof_ssize_t=4

export ac_cv_alignof_guint32=4
export ac_cv_alignof_guint64=4
export ac_cv_alignof_unsigned_long=4

export ac_cv_va_copy=yes

export ac_cv_type_long_long=yes
export ac_cv_type_unsigned_long_long=yes

export ac_cv_have_int64_t=yes
export ac_cv_have_accrights_in_msghdr=no
export ac_cv_have_control_in_msghdr=no
export ac_cv_have_uname_domainname_field=no
export ac_cv_have_uname_us_domainname_field=no

export ac_exeext=,e1f
export ac_cv_exeext=,e1f

export ac_cv_file___dev_ptmx_=no
export ac_cv_file___dev_ptc_=no
export ac_cv_file___etc_default_login_=no
export ac_cv_file___dev_urandom_=yes
export ac_cv_file__etc_environment=no
export ac_cv_file__etc_TIMEZONE=no

export ac_cv_need_trio=no

export ac_cv_prog_cc_works=yes
export ac_cv_prog_cc_cross=yes
export ac_cv_prog_cc_g=no

export ac_cv_func_atexit=yes
export ac_cv_func_bcopy=yes
export ac_cv_func_bsd_getpgrp=yes
export ac_cv_func_bsd_setpgrp=yes
export ac_cv_func_bzero=yes
export ac_cv_func_dtoa=yes
export ac_cv_func_dtoa_r=yes
export ac_cv_func_ecvt=no
export ac_cv_func_fcvt=no
export ac_cv_func_fork=yes
export ac_cv_func_fork_works=yes
export ac_cv_func_gcvt=no
export ac_cv_func_getloadavg=no
export ac_cv_func_getpgrp_void=yes
export ac_cv_func_getpgrp_void=yes
export ac_cv_func_getpwuid_r=yes
export ac_cv_func_gnu_get_libc_version=no
export ac_cv_func_log=yes
export ac_cv_func_malloc_works=yes
export ac_cv_func_memchr=yes
export ac_cv_func_memcmp_working=yes
export ac_cv_func_memcmp_clean=yes
export ac_cv_func_memcpy=yes
export ac_cv_func_memset=yes
export ac_cv_func_memmove=yes
export ac_cv_func_mlock=no
export ac_cv_func_mlockall=no
export ac_cv_func_nl_langinfo=no
export ac_cv_func_posix_getpwuid_r=no
export ac_cv_func_posix_getgrgid_r=no
export ac_cv_func_realloc_works=yes
export ac_cv_func_setenv=yes
export ac_cv_func_setpgrp_void=yes
export ac_cv_func_setvbuf_reversed=no
export ac_cv_func_snprintf=yes
export ac_cv_func_strcasecmp=yes
export ac_cv_func_strdup=yes
export ac_cv_func_strerror=yes
export ac_cv_func_strerror_r=yes
export ac_cv_func_strsignal=yes
export ac_cv_func_strstr=yes
export ac_cv_func_strtod=yes
export ac_cv_func_strtoul=yes
export ac_cv_func_sys_siglist=yes
export ac_cv_have_decl_sys_siglist=yes
export ac_cv_func_realloc_0_nonnull=yes
export ac_cv_func_malloc_0_nonnull=yes
export ac_cv_func_unsetenv=yes
export ac_cv_func_vprintf=yes
export ac_cv_func_vfork=yes
export ac_cv_func_vfork_works=yes

export ac_cv_no_user_malloc=no

export ac_cv_c_char_unsigned=yes
export ac_cv_c_bitfields_htol=no
export ac_cv_c_const=yes

export ac_cv_conv_longlong_to_float=yes

export ac_cv_dev_minor_bits=0
export ac_cv_dev_minor_noncontig=no

export ac_cv_type_prototypes=yes

export ac_cv_sctp=no

export bash_cv_have_mbstate_t=no
export bash_cv_getenv_redef=no
export bash_cv_getcwd_malloc=yes

export glib_cv_hasinline=yes
export glib_cv_has__inline=yes
export glib_cv_has__inline__=yes
export glib_cv_sane_realloc=yes
export glib_cv_va_copy=""
export glib_cv___va_copy=""
export glib_cv_va_val_copy=""
export glib_cv_sizeof_gmutex=24
export glib_cv_stack_grows=yes

export ac_cv_path_db_cv_path_ar=ar
export ac_cv_path_db_cv_path_ranlib=:
export ac_cv_path_db_cv_path_cp=$INSTALL
export ac_cv_path_db_cv_path_chmod=/bin/echo
export ac_cv_path_db_cv_path_rm=/opt/netsurf/arm-unknown-riscos/env/rm
export ac_cv_path_db_cv_path_strip=:

export ac_cv_path_install=$INSTALL

export ac_cv_snprintf_returns_bogus=no
export ac_cv_fread_reads_directories=no

export db_cv_alignp_t=int
export db_cv_fcntl_f_setfd=yes
export db_cv_sprintf_count=yes
export db_cv_path_cp=$INSTALL
export db_cv_path_rm=echo

export ac_cv_header_wctype_h=no
export ac_cv_header_mcheck=no
export ac_cv_header_tcl_h=yes 
export ac_cv_header_readline_h=yes
export ac_cv_header_nl_types_h=no
export ac_cv_header_sys_vfs_h=yes
export ac_cv_header_sys_statfs_h=yes
export ac_cv_header_sys_statvfs_h=no

export ac_cv_header_X11_X_h=yes
export ac_cv_header_X11_Xatom_h=yes
export ac_cv_header_X11_Xlib_h=yes
export ac_cv_header_X11_Xmd_h=yes
export ac_cv_header_X11_Xos_h=yes
export ac_cv_header_X11_Xutil_h=yes
export ac_cv_header_X11_extensions_XShm_h=no
export ac_cv_header_X11_keysym_h=yes

export ac_cv_lib_X11_XOpenDisplay=yes

export libc_cv_asm_global_directive=EXPORT

# We don't need -lc added to our linker line by libtool:
export archive_cmds_need_lc=no

#export libltdl_cv_sys_dlopen_deplibs=no
#export lt_cv_sys_global_symbol_pipe="cut -d ' ' -f 1"
#export lt_cv_global_symbol_to_cdecl="sed -n -e 's/\\(.*\\)\$/extern char \\1;/p'"
#export lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/  {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^\\([^ ]*\\)\$/  {\"\\1\", (lt_ptr) \\&\\1},/p'"

# Dynamic library handling disabling
if [ "$RO_SHAREDLIBS" != yes ] ; then
  export ac_cv_header_dlfcn_h=no
  export ac_cv_lib_dl_dlopen=no
  export ac_cv_func_dlsym=no
else
  export ac_cv_header_dlfcn_h=yes
fi


/opt/netsurf/arm-unknown-riscos/env/ro-path $RO_CPATH/configure \
  $ro_host $ro_build $ro_target $ro_prefix $ro_withlibs $ro_x $ro_shared $ro_static $ro_glib $ro_gtk \
  $ro_tcltk $ro_threads $ro_native $ro_architecture $ro_ssl $ro_nls $ro_cparams 


# Force libtool to make static binaries
if [ "$RO_SHAREDLIBS" != yes ] && [ -e $RO_CPATH/libtool ] ; then
  sed -i -e "s#all-static)#all-static|-static)#" -e "s#prefer_static_libs=built#prefer_static_libs=yes#" $RO_CPATH/libtool
fi
