#!/bin/sh
#
# QEmacs configure script
#
# Copyright (c) 2002 Fabrice Bellard
# Copyright (c) 2002-2013 Charlie Gordon
#

# set temporary file name
if test ! -z "$TMPDIR" ; then
    TMPDIR1="${TMPDIR}"
elif test ! -z "$TEMPDIR" ; then
    TMPDIR1="${TEMPDIR}"
else
    TMPDIR1="/tmp"
fi

TMPC="${TMPDIR1}/qemacs-conf-${RANDOM}-$$-${RANDOM}.c"
TMPO="${TMPDIR1}/qemacs-conf-${RANDOM}-$$-${RANDOM}.o"
TMPS="${TMPDIR1}/qemacs-conf-${RANDOM}-$$-${RANDOM}.S"
TMPH="${TMPDIR1}/qemacs-conf-${RANDOM}-$$-${RANDOM}.h"
TMPMAK="${TMPDIR1}/qemacs-conf-${RANDOM}-$$-${RANDOM}.mak"

# default parameters
prefix="/usr/local"
cross_prefix=""
cc="gcc"
host_cc="gcc"
ar="ar"
make="make"
strip="strip"
strip_args="-s -R .comment -R .note"
cpu=`uname -m`
case "$cpu" in
  i386|i486|i586|i686|i86pc|BePC)
    cpu="x86"
    ;;
  x86_64)
    cpu="x86_64"
    ;;
  armv4l)
    cpu="armv4l"
    ;;
  alpha)
    cpu="alpha"
    ;;
  *)
    cpu="unknown"
    ;;
esac

unlockio="no"
ptsname="yes"
gprof="no"
network="yes"
win32="no"
cygwin="no"
darwin="no"
haiku="no"
lshared="no"
dllibs="-ldl"
extralibs=""
simpleidct="yes"
bigendian="no"
mpegaudio_hp="yes"

tiny="no"
x11="no"
xv="no"
xshm="no"
xrender="no"
png="no"
ffmpeg="no"
html="no"
doc="yes"
plugins="yes"
initcalls="yes"
mmap="yes"
kmaps="yes"
modes="yes"
bidir="yes"
exe=""

# OS specific
targetos=`uname -s`
case $targetos in
  BeOS)
    prefix="/boot/home/config"
    # helps building libavcodec
    CFLAGS="-O2 -DPIC"
    # no need for libm, but the inet stuff
    # Check for BONE
    if (echo $BEINCLUDES|grep 'headers/be/bone' >/dev/null); then
        extralibs="-lbind -lsocket"
    else
        echo "Not sure building for net_server will succeed... good luck."
        extralibs="-lsocket"
    fi
    ;;
  BSD/OS)
    extralibs="-lpoll -lgnugetopt -lm"
    make="gmake"
    doc="no"
    plugins="no"
    ptsname="no"
    ;;
  OpenBSD)
    extralibs="-lm"
    make="gmake"
    doc="no"
    plugins="no"
    ptsname="no"
    dllibs=
    ;;
  FreeBSD)
    extralibs="-lm"
    make="gmake"
    doc="no"
    unlockio="no"
    plugins="no"
    ptsname="no"
    ;;
  CYGWIN*)
    cygwin="yes"
    ;;
  Darwin)
    darwin="yes"
    CFLAGS=""
    initcalls="no"
    unlockio="no"
    plugins="no"
    extralibs="-lm"
    strip_args="-x -S"
    ;;
  Haiku)
    prefix="`finddir B_COMMON_DIRECTORY`"
    # no need for libm, but the network stuff
    extralibs="-lnetwork"
    # dlopen() is in libroot already
    dllibs=""
    # use Haiku GUI; avoid building for X11 even if there are headers around
    haiku="yes"
    html="yes"
    png="yes"
    x11="no"
    ;;
  *)
    extralibs="-lm"
    unlockio="yes"
    ;;
esac

# find source path
# XXX: we assume an absolute path is given when launching configure, 
# except in './configure' case.
source_path=${0%configure}
source_path=${source_path%/}
source_path_used="yes"
if test -z "$source_path" -o "$source_path" = "." ; then
    source_path=`pwd`
    source_path_used="no"
fi

if test -d "./ffmpeg" ; then
    ffmpeg="yes"
    ffmpeg_srcdir="./ffmpeg"
fi

if test -f "/usr/include/png.h" ; then
    png="yes"
fi

for x11path in /usr/include/X11 /opt/X11 /usr/X11R6; do
    if test -f "$x11path/include/X11/Xlib.h" ; then
        x11="yes"
        x11_libdir="$x11path/lib"
        x11_includedir="$x11path/include"
        LDFLAGS="$LDFLAGS -L$x11path/lib"
        html="yes"
        if test -f "$x11path/include/X11/extensions/Xv.h" ; then
            xv="yes"
        fi
        if test -f "$x11path/include/X11/extensions/Xshm.h" ; then
            xshm="yes"
        fi
        break
    fi
done

if test -z `which texi2html` ; then
    doc="no"
fi

usage () {
    cat << EOF

Usage: configure [options]
Options: [defaults in brackets after descriptions]

EOF

echo "Standard options:"
echo "  --help                   print this message"
echo "  --prefix=PREFIX          install in PREFIX [$prefix]"
echo "  --enable-win32           enable win32 cross compile"
echo "  --enable-cygwin          compile for cygwin systems"
echo "  --disable-x11            disable Xwindow support"
echo "  --disable-xv             disable Xvideo extension support"
echo "  --disable-xshm           disable XShm extension support"
echo "  --disable-xrender        disable Xrender extension support"
echo "  --enable-tiny            build a very small version"
echo "  --disable-html           disable graphical html support"
echo "  --disable-png            disable png support"
echo "  --disable-plugins        disable plugins support"
echo "  --disable-ffmpeg         disable ffmpeg support"
echo "  --with-ffmpegdir=DIR     find ffmpeg sources and libraries in DIR"
echo "                           for audio/video/image support"
echo ""
echo "Advanced options (experts only):"
echo "  --source-path=PATH       path of source code [$source_path]"
echo "  --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]"
echo "  --cc=CC                  use C compiler CC [$cc]"
echo "  --make=MAKE              use specified make [$make]"
echo "  --with-ffmpeglibdir=DIR  set ffmpeg object files directory"
echo ""
echo "NOTE: The object files are built at the place where configure is launched"
exit 1
}

for opt do
    value="none"
    case "$opt" in
      --prefix=*)
        prefix=`echo $opt | cut -d '=' -f 2`
        ;;
      --datadir=*)
        datadir=`echo $opt | cut -d '=' -f 2`
        ;;
      --mandir=*)
        mandir=`echo $opt | cut -d '=' -f 2`
        ;;
      --source-path=*)
        source_path=`echo $opt | cut -d '=' -f 2`
        ;;
      --cross-prefix=*)
        cross_prefix=`echo $opt | cut -d '=' -f 2`
        ;;
      --cc=*)
        cc=`echo $opt | cut -d '=' -f 2`
        ;;
      --make=*)
        make=`echo $opt | cut -d '=' -f 2`
        ;;
      --extra-cflags=*)
        CFLAGS="$CFLAGS ${opt#--extra-cflags=}"
        ;;
      --extra-ldflags=*)
        LDFLAGS="$LDFLAGS ${opt#--extra-ldflags=}"
        ;;
      --extra-libs=*)
        extralibs=${opt#--extra-libs=}
        ;;
      --cpu=*)
        cpu=`echo $opt | cut -d '=' -f 2`
        ;;
      --with-ffmpegdir=*)
        ffmpeg_srcdir=${opt#--with-ffmpegdir=} ; ffmpeg="yes"
        ;;
      --with-ffmpeglibdir=*)
        ffmpeg_libdir=${opt#--with-ffmpeglibdir=}
        ;;
      --disable-*)
        value="no"
        ;;
      --enable-*)
        value="yes"
        ;;
      --help|-h|-?)
        usage
        ;;
      *)
        echo "unknown option: $opt"
        exit 1
        ;;
      esac
      case "$opt" in
      --disable-gprof | --enable-gprof)
        gprof="$value"
        ;;
      --enable-network | --disable-network)
        network="$value"
        ;;
      --enable-win32)
        win32="yes"
        ;;
      --enable-cygwin)
        cygwin="yes"
        ;;
      --enable-shared | --disable-shared)
        lshared="$value"
        ;;
      --enable-mpegaudio-hp | --disable-mpegaudio-hp)
        mpegaudio_hp="$value"
        ;;
      --enable-tiny | --disable-tiny)
        tiny="$value"
        ;;
      --enable-x11 | --disable-x11)
        x11="$value"
        ;;
      --enable-xv | --disable-xv)
        xv="$value"
        ;;
      --enable-xshm | --disable-xshm)
        xshm="$value"
        ;;
      --enable-xrender | --disable-xrender)
        xrender="$value"
        ;;
      --enable-png | --disable-png)
        png="$value"
        ;;
      --enable-html | --disable-html)
        html="$value"
        ;;
      --enable-plugins | --disable-plugins)
        plugins="$value"
        ;;
      --enable-ffmpeg | --disable-ffmpeg)
        ffmpeg="$value"
        ;;
      --enable-* | --disable-*)
        echo "unknown option: $opt"
        exit 1
        ;;
    esac
done

if test -z "$datadir"; then
    datadir="${prefix}/share"
fi
if test -z "$mandir"; then
    mandir="${prefix}/man"
fi

# Checking for CFLAGS
if test -z "$CFLAGS"; then
    CFLAGS="-O2"
fi

if test "$win32" = "yes" ; then
    if test "$cygwin" = "yes" ; then
        cross_prefix="i686-pc-mingw32-"
        gcc_major="3"
	CFLAGS="$CFLAGS -I/usr/include/mingw -I/usr/include/w32api"
	LDFLAGS="$LDFLAGS -L/usr/lib/mingw"
    else
        cross_prefix="i586-mingw32msvc-"
	CFLAGS="$CFLAGS -I/usr/i586-mingw32msvc/include"
	extralibs="$extralibs -lws2_32"
    fi
    network="no"
    doc="no"
    plugins="no"
    initcalls="no"
    x11="no"
    mmap="no"
    cygwin="no"
    exe=".exe"
fi

if test "$cygwin" = "yes" ; then
    doc="no"
    x11="no"
    png="no"
    ffmpeg="no"
    html="no"
    plugins="no"
    initcalls="no"
    exe=".exe"
fi

if test "$x11" = "no" ; then
    xv="no"
    xshm="no"
    xrender="no"
fi

if test "$x11" = "no" -a "$haiku" = "no" ; then
    png="no"
    ffmpeg="no"
    html="no"
fi

# endianness: guess with cpu type. Should also use prefix
if test "$cpu" = "powerpc"; then
    bigendian="yes"
fi

cc="${cross_prefix}${cc}"
ar="${cross_prefix}${ar}"
strip="${cross_prefix}${strip}"

# ---
# check availability of some header files

cat > $TMPC << EOF
#include <malloc.h>
int main( void ) { return 0; }
EOF

_memalign=no
_malloc_h=no
if $cc -o $TMPO $TMPC 2> /dev/null ; then
    _malloc_h=yes
    _memalign=yes
    # check for memalign - atmos
    cat > $TMPC << EOF
#include <malloc.h>
int main (void) {
  char *string = NULL;
  string = memalign(64, sizeof(char));
  return 0;
}
EOF
    $cc -o $TMPO $TMPC 2> /dev/null || _memalign=no
fi

if test "$ffmpeg" = "yes" ; then
    if test -z "$ffmpeg_libdir" ; then
        ffmpeg_libdir="$ffmpeg_srcdir"
    fi
fi

if test "$tiny" = "yes" ; then
    ffmpeg="no"
    x11="no"
    xv="no"
    xshm="no"
    xrender="no"
    png="no"
    html="no"
    plugins="no"
    kmaps="no"
    modes="no"
    bidir="no"
fi

if test -z "$CFLAGS"; then
    CFLAGS="-O2"
fi


# check gcc version
cat > $TMPC <<EOF
int main(void) {
#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)
return 0;
#else
#error gcc < 3.2
#endif
}
EOF

gcc_major="2"
if $cc -o $TMPO $TMPC 2> /dev/null ; then
    gcc_major="3"
fi

# check typeof support
cat > $TMPC <<EOF
int main(int argc, char **argv) {
    typeof(**argv) **a = argv;
    return *a != 0;
}
EOF

has_typeof="no"
if $cc -o $TMPO $TMPC 2> /dev/null ; then
    has_typeof="yes"
fi

if test "$x11" = "yes" ; then
    if test ! -z "$x11_libdir" ; then
        LIBS="$LIBS -L$x11_libdir"
    fi
    if test ! -z "$x11_includedir" ; then
        CFLAGS="$CFLAGS -I$x11_includedir"
    fi
fi

echo "Install prefix      $prefix"
echo "Shared data dir     $datadir"
echo "Manpages dir        $mandir"
echo "Source path         $source_path"
echo "C compiler          $cc"
echo "Tiny build          $tiny"
echo "X11 support         $x11"
echo "Xvideo support      $xv"
echo "XShm support        $xshm"
#echo "Xrender support     $xrender"
echo "libpng support      $png"
echo "FFMPEG support      $ffmpeg"
echo "Graphical HTML      $html"
echo "Memory mapped files $mmap"
echo "Initcall support    $initcalls"
echo "Plugins support     $plugins"
echo "Bidir support       $bidir"
echo "All kmaps           $kmaps"
echo "All modes           $modes"
echo "Build doc files     $doc"
echo ""
echo "Creating config.mak and config.h"

echo "# Automatically generated by configure - do not modify" > $TMPMAK
echo "/* Automatically generated by configure - do not modify */" > $TMPH

echo "prefix=$prefix" >> $TMPMAK
echo "#define CONFIG_QE_PREFIX \"$prefix\"" >> $TMPH
echo "datadir=$datadir" >> $TMPMAK
echo "#define CONFIG_QE_DATADIR \"$datadir\"" >> $TMPH
echo "mandir=$mandir" >> $TMPMAK
echo "#define CONFIG_QE_MANDIR \"$mandir\"" >> $TMPH
echo "MAKE=$make" >> $TMPMAK
echo "CC=$cc" >> $TMPMAK
echo "GCC_MAJOR=$gcc_major" >> $TMPMAK
echo "HOST_CC=$host_cc" >> $TMPMAK
echo "AR=$ar" >> $TMPMAK
echo "STRIP=$strip $strip_args" >> $TMPMAK
echo "INSTALL=install" >> $TMPMAK
echo "CFLAGS=$CFLAGS" >> $TMPMAK
echo "LIBS=$LIBS" >> $TMPMAK
echo "LDFLAGS=$LDFLAGS" >> $TMPMAK
echo "EXE=$exe" >> $TMPMAK
echo "TARGET_OS=$targetos" >> $TMPMAK
echo "TARGET_ARCH=$cpu" >> $TMPMAK

if test "$cpu" = "x86" ; then
  echo "TARGET_ARCH_X86=yes" >> $TMPMAK
  echo "#define ARCH_X86 1" >> $TMPH
elif test "$cpu" = "x86_64" ; then
  echo "TARGET_ARCH_X86_64=yes" >> $TMPMAK
  echo "#define ARCH_X86_64 1" >> $TMPH
elif test "$cpu" = "armv4l" ; then
  echo "TARGET_ARCH_ARMV4L=yes" >> $TMPMAK
  echo "#define ARCH_ARMV4L 1" >> $TMPH
elif test "$cpu" = "alpha" ; then
  echo "TARGET_ARCH_ALPHA=yes" >> $TMPMAK
  echo "#define ARCH_ALPHA 1" >> $TMPH
elif test "$cpu" = "powerpc" ; then
  echo "TARGET_ARCH_POWERPC=yes" >> $TMPMAK
  echo "#define ARCH_POWERPC 1" >> $TMPH
fi
if test "$has_typeof" = "yes" ; then
  echo "CONFIG_HAS_TYPEOF=yes" >> $TMPMAK
  echo "#define CONFIG_HAS_TYPEOF 1" >> $TMPH
fi
if test "$bigendian" = "yes" ; then
  echo "WORDS_BIGENDIAN=yes" >> $TMPMAK
  echo "#define WORDS_BIGENDIAN 1" >> $TMPH
fi
if test "$unlockio" = "yes" ; then
  echo "CONFIG_UNLOCKIO=yes" >> $TMPMAK
  echo "#define CONFIG_UNLOCKIO 1" >> $TMPH
fi
if test "$ptsname" = "yes" ; then
  echo "CONFIG_PTSNAME=yes" >> $TMPMAK
  echo "#define CONFIG_PTSNAME 1" >> $TMPH
fi
if test "$gprof" = "yes" ; then
  echo "TARGET_GPROF=yes" >> $TMPMAK
  echo "#define HAVE_GPROF 1" >> $TMPH
fi
if test "$lshared" = "yes" ; then
  echo "BUILD_SHARED=yes" >> $TMPMAK
  echo "PIC=-fPIC" >> $TMPMAK
fi
echo "DLLIBS=$dllibs" >> $TMPMAK
echo "EXTRALIBS=$extralibs" >> $TMPMAK
version=`head $source_path/VERSION`
echo "VERSION=$version" >> $TMPMAK
echo "#define QE_VERSION \"$version\"" >> $TMPH

if test "$network" = "yes" ; then
  echo "#define CONFIG_NETWORK 1" >> $TMPH
  echo "CONFIG_NETWORK=yes" >> $TMPMAK
fi

if test "$win32" = "yes" ; then
  echo "#define CONFIG_WIN32 1" >> $TMPH
  echo "CONFIG_WIN32=yes" >> $TMPMAK
fi

if test "$cygwin" = "yes" ; then
  echo "#define CONFIG_CYGWIN 1" >> $TMPH
  echo "CONFIG_CYGWIN=yes" >> $TMPMAK
fi

if test "$darwin" = "yes" ; then
  echo "#define CONFIG_DARWIN 1" >> $TMPH
  echo "CONFIG_DARWIN=yes" >> $TMPMAK
fi

if test "$haiku" = "yes" ; then
  echo "#define CONFIG_HAIKU 1" >> $TMPH
  echo "CONFIG_HAIKU=yes" >> $TMPMAK
fi

if test "$x11" = "yes" ; then
  #echo "#define CONFIG_X11 1" >> $TMPH
  echo "CONFIG_X11=yes" >> $TMPMAK
fi

if test "$xv" = "yes" ; then
  echo "#define CONFIG_XV 1" >> $TMPH
  echo "CONFIG_XV=yes" >> $TMPMAK
fi

if test "$xshm" = "yes" ; then
  echo "#define CONFIG_XSHM 1" >> $TMPH
  echo "CONFIG_XSHM=yes" >> $TMPMAK
fi

if test "$xrender" = "yes" ; then
  echo "#define CONFIG_XRENDER 1" >> $TMPH
  echo "CONFIG_XRENDER=yes" >> $TMPMAK
fi

if test "$tiny" = "yes" ; then
  echo "#define CONFIG_TINY 1" >> $TMPH
  echo "CONFIG_TINY=yes" >> $TMPMAK
fi

if test "$html" = "yes" ; then
  echo "#define CONFIG_HTML 1" >> $TMPH
  echo "CONFIG_HTML=yes" >> $TMPMAK
fi

if test "$plugins" = "yes" ; then
  echo "#define CONFIG_DLL 1" >> $TMPH
  echo "CONFIG_DLL=yes" >> $TMPMAK
fi

if test "$initcalls" = "yes" ; then
  echo "#define CONFIG_INIT_CALLS 1" >> $TMPH
  echo "CONFIG_INIT_CALLS=yes" >> $TMPMAK
fi

if test "$png" = "yes" ; then
  echo "#define CONFIG_PNG_OUTPUT 1" >> $TMPH
  echo "CONFIG_PNG_OUTPUT=yes" >> $TMPMAK
fi

if test "$ffmpeg" = "yes" ; then
  echo "#define CONFIG_FFMPEG 1" >> $TMPH
  echo "CONFIG_FFMPEG=yes" >> $TMPMAK
  echo "FFMPEG_SRCDIR=$ffmpeg_srcdir" >> $TMPMAK
  echo "FFMPEG_LIBDIR=$ffmpeg_libdir" >> $TMPMAK
fi

if test "$kmaps" = "yes" ; then
  echo "#define CONFIG_ALL_KMAPS 1" >> $TMPH
  echo "CONFIG_ALL_KMAPS=yes" >> $TMPMAK
fi

if test "$mmap" = "yes" ; then
  echo "#define CONFIG_MMAP 1" >> $TMPH
  echo "CONFIG_MMAP=yes" >> $TMPMAK
fi

if test "$modes" = "yes" ; then
  echo "#define CONFIG_ALL_MODES 1" >> $TMPH
  echo "CONFIG_ALL_MODES=yes" >> $TMPMAK
fi

if test "$bidir" = "yes" ; then
  echo "#define CONFIG_UNICODE_JOIN 1" >> $TMPH
  echo "CONFIG_UNICODE_JOIN=yes" >> $TMPMAK
fi

if test "$doc" = "yes" ; then
  echo "#define CONFIG_DOC 1" >> $TMPH
  echo "CONFIG_DOC=yes" >> $TMPMAK
fi

# build tree in object directory if source path is different from current one
if test "$source_path_used" = "yes" ; then
    DIRS="tests"
    FILES="Makefile tests/Makefile"
    for dir in $DIRS ; do
        mkdir -p $dir
    done
    for f in $FILES ; do
        ln -sf $source_path/$f $f
    done
fi
echo "SRC_PATH=$source_path" >> $TMPMAK

diff $TMPMAK config.mak >/dev/null 2>&1
if test $? -ne 0 ; then
    cp -f $TMPMAK config.mak
else
    echo "config.mak is unchanged"
fi

diff $TMPH config.h >/dev/null 2>&1
if test $? -ne 0 ; then
    cp -f $TMPH config.h
else
    echo "config.h is unchanged"
fi

rm -f $TMPC $TMPO $TMPS $TMPH $TMPE $TMPMAK
