#!/bin/bash

#----------------------------------------------------------------------------------------------
#  configure script for VapourSynth plugins
#----------------------------------------------------------------------------------------------

# -- help -------------------------------------------------------------------------------------
if test x"$1" = x"-h" -o x"$1" = x"--help" ; then
cat << EOF
Usage: [PKG_CONFIG_PATH=/foo/bar/lib/pkgconfig] ./configure [options]
options:
  -h, --help               print help (this)

  --prefix=PREFIX          install architecture-independent files into PREFIX
                           [/usr/local]
  --exec-prefix=EPREFIX    install architecture-dependent files into EPREFIX
                           [PREFIX]
  --libdir=DIR             install libs in DIR [EPREFIX/lib]
  --vs-plugindir=DIR       location of VapourSynth plugin directory,
                              default is [libdir]/vapoursynth

  --extra-cflags=XCFLAGS   add XCFLAGS to CFLAGS
  --extra-ldflags=XLDFLAGS add XLDFLAGS to LDFLAGS
  --extra-libs=XLIBS       add XLIBS to LIBS

  --target-os=TARGET_OS    select target operating system
  --cross-prefix=PREFIX    use PREFIX for compilation tools
  --sysroot=SYSROOT        root of cross-build tree

EOF
exit 1
fi

#-- func --------------------------------------------------------------------------------------
error_exit()
{
    echo error: $1
    exit 1
}

log_echo()
{
    echo $1
    echo >> config.log
    echo --------------------------------- >> config.log
    echo $1 >> config.log
}

cc_check()
{
    rm -f conftest.c
    if [ -n "$3" ]; then
        echo "#include <$3>" >> config.log
        echo "#include <$3>" > conftest.c
    fi
    echo "int main(void){$4 return 0;}" >> config.log
    echo "int main(void){$4 return 0;}" >> conftest.c
    echo $CC conftest.c -o conftest $1 $2 >> config.log
    $CC conftest.c -o conftest $1 $2 2>> config.log
    ret=$?
    echo $ret >> config.log
    rm -f conftest*
    return $ret
}
#----------------------------------------------------------------------------------------------
rm -f config.* .depend

SRCDIR="$(cd $(dirname $0); pwd)"
test "$SRCDIR" = "$(pwd)" && SRCDIR=.
test -n "$(echo $SRCDIR | grep ' ')" && \
    error_exit "out-of-tree builds are impossible with whitespace in source path"

# -- output config.h --------------------------------------------------------------------------
pushd $SRCDIR
REV="$(git rev-list --count HEAD 2> /dev/null)"
HASH="$(git rev-parse --short HEAD 2> /dev/null)"
popd
cat >> config.h << EOF
#define LSMASHWORKS_REV "$REV"
#define LSMASHWORKS_GIT_HASH "$HASH"
EOF

# -- init -------------------------------------------------------------------------------------
CC="gcc"
LD="gcc"
STRIP="strip"

prefix=""
exec_prefix=""
libdir=""
vsplugindir=""
DESTDIR=""

CFLAGS="-Wall -std=c99 -pedantic -I. -I$SRCDIR"
LDFLAGS="-L."
DEPLIBS="liblsmash libavformat libavcodec libswscale libavutil"

SRC_SOURCE="lsmashsource.c video_output.c libavsmash_source.c lwlibav_source.c  \
            ../common/utils.c  ../common/qsv.c ../common/libavsmash.c           \
            ../common/libavsmash_video.c ../common/lwlibav_dec.c                \
            ../common/lwlibav_video.c ../common/lwlibav_audio.c                 \
            ../common/lwindex.c ../common/video_output.c ../common/decode.c     \
            ../common/osdep.c"

# -- options ----------------------------------------------------------------------------------
echo all command lines: > config.log
echo "$*" >> config.log

for opt; do
    optarg="${opt#*=}"
    case "$opt" in
        --prefix=*)
            prefix="$optarg"
            ;;
        --exec-prefix=*)
            exec_prefix="$optarg"
            ;;
        --libdir=*)
            libdir="$optarg"
            ;;
        --vs-plugindir=*)
            vsplugindir="$optarg"
            ;;
        --destdir=*)
            DESTDIR="$optarg"
            ;;
        --extra-cflags=*)
            XCFLAGS="$optarg"
            ;;
        --extra-ldflags=*)
            XLDFLAGS="$optarg"
            ;;
        --extra-libs=*)
            XLIBS="$optarg"
            ;;
        --target-os=*)
            TARGET_OS="$optarg"
            ;;
        --cross-prefix=*)
            CROSS="$optarg"
            ;;
        --sysroot=*)
            CFLAGS="$CFLAGS --sysroot=$optarg"
            LDFLAGS="$LDFLAGS --sysroot=$optarg"
            ;;
        *)
            error_exit "unknown option $opt"
            ;;
    esac
done

test -n "$prefix" || prefix="/usr/local"
test -n "$exec_prefix" || exec_prefix='${prefix}'
test -n "$libdir" || libdir='${exec_prefix}/lib'
test -n "$vsplugindir" || vsplugindir='${libdir}/vapoursynth'

BASENAME="vslsmashsource"

if test -n "$TARGET_OS"; then
    TARGET_OS=$(echo $TARGET_OS | tr '[A-Z]' '[a-z]')
else
    TARGET_OS=$($CC -dumpmachine | tr '[A-Z]' '[a-z]')
fi
case "$TARGET_OS" in
    *mingw*|*cygwin*)
        SYS="WIN32"
        SOSUFFIX="dll"
        SONAME="$BASENAME.$SOSUFFIX"
        SOFLAGS="-Wl,--enable-auto-image-base -Wl,--export-all-symbols"
        CFLAGS="$CFLAGS -D__USE_MINGW_ANSI_STDIO=1"
        ;;
    *darwin*)
        SYS="MACOSX"
        SOSUFFIX="dylib"
        SONAME="lib$BASENAME.$REV.$SOSUFFIX"
        SONAME_LN="lib$BASENAME.$SOSUFFIX"
        SOFLAGS="-dynamiclib -Wl,-single_module -Wl,-read_only_relocs,suppress -install_name ${DESTDIR}${libdir}/${SONAME}"
        ;;
    *)
        SOSUFFIX="so"
        SONAME="lib$BASENAME.$SOSUFFIX.$REV"
        SONAME_LN="lib$BASENAME.$SOSUFFIX"
        SOFLAGS="-Wl,-soname,$SONAME"
        CFLAGS="$CFLAGS -fPIC"
        LDFLAGS="-fPIC $LDFLAGS"
        ;;
esac

# -- add extra --------------------------------------------------------------------------------
if test -n "$prefix"; then
    CFLAGS="$CFLAGS -I$prefix/include"
    LDFLAGS="$LDFLAGS -L$prefix/lib"
fi
test -n "$libdir" && LDFLAGS="$LDFLAGS -L$libdir"

CFLAGS="$CFLAGS $XCFLAGS"
LDFLAGS="$LDFLAGS $XLDFLAGS"

# -- check_exe --------------------------------------------------------------------------------
CC="${CROSS}${CC}"
LD="${CROSS}${LD}"
STRIP="${CROSS}${STRIP}"
for f in "$CC" "$LD" "$STRIP"; do
    test -n "$(which $f 2> /dev/null)" || error_exit "$f is not executable"
done

# -- check & set cflags and ldflags  ----------------------------------------------------------
log_echo "CFLAGS/LDFLAGS checking..."
if ! cc_check "$CFLAGS" "$LDFLAGS"; then
    error_exit "invalid CFLAGS/LDFLAGS"
fi
if cc_check "-Os -ffast-math $CFLAGS" "$LDFLAGS"; then
    CFLAGS="-Os -ffast-math $CFLAGS"
fi
if cc_check "$CFLAGS -fexcess-precision=fast" "$LDFLAGS"; then
    CFLAGS="$CFLAGS -fexcess-precision=fast"
fi

# -- check pkg-config ----------------------------------------------------------------
PKGCONFIGEXE="pkg-config"
test -n "$(which ${CROSS}${PKGCONFIGEXE} 2> /dev/null)" && \
    PKGCONFIGEXE=${CROSS}${PKGCONFIGEXE}

if $PKGCONFIGEXE --exists $DEPLIBS 2> /dev/null; then
    LIBS="$($PKGCONFIGEXE --libs $DEPLIBS)"
    CFLAGS="$CFLAGS $($PKGCONFIGEXE --cflags $DEPLIBS)"
else
    for lib in $DEPLIBS; do
        LIBS="$LIBS -l${lib#lib}"
    done
    log_echo "warning: pkg-config or pc files not found, lib detection may be inaccurate."
fi

# -- check lsmash -----------------------------------------------------------------------------
log_echo "checking for liblsmash..."
if ! cc_check "$CFLAGS" "$LDFLAGS $LIBS $XLIBS" "lsmash.h" "lsmash_create_root();" ; then
    log_echo "error: liblsmash checking failed"
    error_exit "lsmash.h might not be installed or some libs missing."
fi

# -- check libav ------------------------------------------------------------------------------
log_echo "checking for libavformat..."
if ! cc_check "$CFLAGS" "$LDFLAGS $LIBS $XLIBS" "libavformat/avformat.h" "avformat_find_stream_info(0,0);" ; then
    log_echo "error: libavformat checking failed."
    error_exit "libavformat/avformat.h might not be installed or some libs missing."
fi

log_echo "checking for libavcodec..."
if ! cc_check "$CFLAGS" "$LDFLAGS $LIBS $XLIBS" "libavcodec/avcodec.h" "avcodec_find_decoder(0);" ; then
    log_echo "error: libavcodec checking failed."
    error_exit "libavcodec/avcodec.h might not be installed or some libs missing."
fi

log_echo "checking for libswscale..."
if ! cc_check "$CFLAGS" "$LDFLAGS $LIBS $XLIBS" "libswscale/swscale.h" "sws_getCachedContext(0,0,0,0,0,0,0,0,0,0,0);" ; then
    log_echo "error: libswscale checking failed."
    error_exit "libswscale/swscale.h might not be installed or some libs missing."
fi

# -- LDFLAGS settings --------------------------------------------------------------------------
if [ "$SYS" = WIN32 ]; then
    LDFLAGS="$LDFLAGS -shared -Wl,--dll,--add-stdcall-alias"
    LIBS="-lwinmm $LIBS $XLIBS"
else
    LDFLAGS="$LDFLAGS -shared"
    LIBS="$LIBS $XLIBS"
fi

# -- output config.mak ------------------------------------------------------------------------
rm -f config.mak
cat >> config.mak << EOF
CC = $CC
LD = $LD
STRIP = $STRIP
CFLAGS = $CFLAGS
LDFLAGS = $LDFLAGS
LIBS = $LIBS
SRCDIR = $SRCDIR
DESTDIR = $DESTDIR
prefix = $prefix
exec_prefix = $exec_prefix
libdir = $libdir
vsplugindir = $vsplugindir
SRC_SOURCE = $SRC_SOURCE
BASENAME=$BASENAME
SONAME=$SONAME
SONAME_LN=$SONAME_LN
SOSUFFIX=$SOSUFFIX
SOFLAGS=$SOFLAGS
EOF

cat >> config.log << EOF
---------------------------------
    setting
---------------------------------
EOF
cat config.mak >> config.log

cat << EOF

settings...
CC          = $CC
LD          = $LD
STRIP       = $STRIP
CFLAGS      = $CFLAGS
LDFLAGS     = $LDFLAGS
LIBS        = $LIBS
SONAME      = $SONAME
SOFLAGS     = $SOFLAGS
PREFIX      = $prefix
VSPLUGINDIR = $vsplugindir
EOF

test "$SRCDIR" = "." || cp -f $SRCDIR/GNUmakefile .

# ---------------------------------------------------------------------------------------------

cat << EOF

configure finished.
type 'make' : compile $SONAME
EOF
