#!/bin/sh

# Copyright (C) 2008-2017 Cosmin Truta.
#
# This software is distributed under the zlib license.
# Please see the accompanying LICENSE file.

trap "rm -f conftest* core a.out; exit 1" 1 2 3 15

LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

prefix="${prefix-/usr/local}"
exec_prefix="${exec_prefix-\$(prefix)}"
bindir="${bindir-\$(exec_prefix)/bin}"
mandir="${mandir-\$(prefix)/man}"
man1dir="${man1dir-\$(mandir)/man1}"

cc="${CC-gcc}"
#cc="${CC-clang}"
#cc="${CC-cc}"
cflags="$CFLAGS"

enable_debug=0

with_system_libpng=0
with_system_zlib=0

with_preconfigured_libpng=1
with_preconfigured_zlib=0

unique_file=src/optipng/optipng.c

for arg in "$@"
do
    case "$arg" in
    -- )
        option="$arg"
        ;;
    --* )
        option=`expr "X$arg" : 'X-\(.*\)'`
        ;;
    * )
        option="$arg"
        ;;
    esac
    case "$arg" in
    *=* )
        optarg=`expr "X$arg" : 'X[^=]*=\(.*\)'`
        ;;
    * )
        optarg=""
        ;;
    esac
    case "$option" in
    -help | -hel | -he | -h )
        echo "Usage:"
        echo "    $0 [options]"
        echo "Options:"
        echo "    -h, -help               Show this help"
        echo "Installation directories:"
        echo "    -prefix=PREFIX          Install architecture-independent files in PREFIX"
        echo "                            [default: $prefix]"
        echo "    -exec-prefix=EPREFIX    Install architecture-dependent files in EPREFIX"
        echo "                            [default: PREFIX]"
        echo "    -bindir=DIR             Install executable in DIR [default: EPREFIX/bin]"
        echo "    -mandir=DIR             Install manual in DIR [default: PREFIX/man]"
        echo "Optional features:"
        echo "    -enable-debug           Enable debug build flags and run-time checks"
        echo "Optional packages:"
        echo "    -with-system-libs       Use all system-supplied libraries (details below)"
        echo "    -with-system-libpng     Use the system-supplied libpng"
        echo "                            [default: false]"
        echo "    -with-system-zlib       Use the system-supplied zlib"
        echo "                            [default: with-system-libpng]"
        echo "Environment variables:"
        echo "    CC                      C compiler command"
        echo "    LD                      Linker command"
        echo "    AR                      Library archiver command"
        echo "    RANLIB                  Library indexer/randomizer command"
        echo "    CFLAGS                  C compiler flags (e.g. -O3)"
        echo "    CPPFLAGS                C preprocessor flags (e.g. -I DIR)"
        echo "    LDFLAGS                 Linker flags (e.g. -L DIR)"
        echo "    ARFLAGS                 Library archiver flags (e.g. rcu)"
        echo "    LIBS                    Additional libraries (e.g. -lfoo)"
        exit 0
        ;;
    -prefix | -prefi | -pref | -pre | -pr | -p )
        prefix="$2"
        shift
        ;;
    -prefix=* | -prefi=* | -pref=* | -pre=* | -pr=* | -p=* )
        prefix="$optarg"
        ;;
    -exec-prefix | -exec_prefix | -exec-prefi | -exec_prefi \
    | -exec-pref |  -exec_pref | -exec-pre | -exec_pre \
    | -exec-pr | -exec_pr | -exec-p | -exec_p | exec- | -exec_ \
    | -exec | -exe | -ex | -e )
        exec_prefix="$2"
        shift
        ;;
    -exec-prefix=* | -exec_prefix=* | -exec-prefi=* | -exec_prefi=* \
    | -exec-pref=* |  -exec_pref=* | -exec-pre=* | -exec_pre=* \
    | -exec-pr=* | -exec_pr=* | -exec-p=* | -exec_p=* | exec-=* | -exec_=* \
    | -exec=* | -exe=* | -ex=* | -e=* )
        exec_prefix="$optarg"
        ;;
    -bindir | -bindi | -bind | -bin | -bi | -b )
        bindir="$2"
        shift
        ;;
    -bindir=* | -bindi=* | -bind=* | -bin=* | -bi=* | -b=* )
        bindir="$optarg"
        ;;
    -mandir | -mandi | -mand | -man | -ma | -m )
        mandir="$2"
        shift
        ;;
    -mandir=* | -mandi=* | -mand=* | -man=* | -ma=* | -m=* )
        mandir="$optarg"
        ;;
    -enable-debug )
        enable_debug=1
        ;;
    -disable-debug )
        enable_debug=0
        ;;
    -with-system-libs )
        with_system_libpng=1
        with_system_zlib=1
        ;;
    -without-system-libs )
        with_system_zlib=0
        with_system_libpng=0
        ;;
    -with-system-libpng )
        with_system_libpng=1
        # Must use the system-supplied zlib with the system-supplied libpng.
        with_system_zlib=1
        ;;
    -without-system-libpng )
        with_system_libpng=0
        ;;
    -with-system-zlib )
        with_system_zlib=1
        ;;
    -without-system-zlib )
        with_system_zlib=0
        # Can't use the system-supplied libpng without the system-supplied zlib.
        with_system_libpng=0
        ;;
    * )
        echo "$0: error: unknown option: $arg"
        echo "Type \"$0 -help\" for help"
        exit 64  # EX_USAGE
        ;;
    esac
done

if test ! -f "$0"
then
    echo "$0: error: cannot find myself; rerun with an absolute file name"
    exit 1
fi

if test ! -r "$unique_file"
then
    echo "$0: error: cannot find: $unique_file"
    echo "$0: note: building outside the source directory tree is not supported"
    exit 1
fi

test=conftest$$
cat > $test.c <<EOM
int hello() { return 42; }
EOM

gccish=0
case "$cc" in
*gcc* | *clang* )
    echo "Checking for $cc..."
    if ($cc -c $cflags $test.c) 2>/dev/null
    then
        gccish=1
    fi
    ;;
esac

rm -f $test.c $test.o

if test "$gccish" -ne 0
then
    CC="${CC-$cc}"
    CFLAGS="${CFLAGS--O2 -Wall -Wextra}"
else
    CC="${CC-cc}"
    CFLAGS="${CFLAGS--O}"
fi

if test "$enable_debug" -ne 0
then
    CPPFLAGS="$CPPFLAGS -DDEBUG -D_DEBUG -DPNGX_DEBUG"
    CFLAGS="$CFLAGS -g"
    LDFLAGS="$LDFLAGS -g"
fi

if test "$with_system_libpng" -ne 0
then
    USE_SYSTEM_LIBPNG_TRUE=""
    USE_SYSTEM_LIBPNG_FALSE="#"
    echo "Checking for system libpng..."
    test=conftest$$
cat > $test.c <<EOM
#include <png.h>
#if PNG_LIBPNG_VER < 10209
#error This program requires libpng version 1.2.9 or higher
#endif
int dummy;
EOM
    ($CC -c $CPPFLAGS $CFLAGS $test.c) 2>/dev/null
    status=$?
    rm -f $test.c $test.o
    if test $status -ne 0
    then
        echo "$0: error: missing libpng or incorrect libpng version"
        echo "$0: note: libpng version 1.2.9 or higher is required"
        exit 1
    fi
else
    USE_SYSTEM_LIBPNG_TRUE="#"
    USE_SYSTEM_LIBPNG_FALSE=""
    if test "$with_preconfigured_libpng" -ne 0
    then
        echo "Using pre-configured libpng..."
        libpng_preconfig_makefile=scripts/makefile.gcc
        if test ! -f "src/libpng/$libpng_preconfig_makefile"
        then
            echo "$0: warning: cannot find: src/libpng/$libpng_preconfig_makefile"
            with_preconfigured_libpng=0
        fi
    fi
    if test "$with_preconfigured_libpng" -ne 0
    then
        sed_preconfig_libpng=""
        if test "$CC"
        then
            sed_preconfig_libpng="
                $sed_preconfig_libpng
                s|^CC *=.*|CC = $CC|
            "
        fi
        if test "$CFLAGS"
        then
            sed_preconfig_libpng="
                $sed_preconfig_libpng
                s|^CFLAGS *=.*|CFLAGS = $CFLAGS|
            "
        fi
        if test "$CPPFLAGS"
        then
            sed_preconfig_libpng="
                $sed_preconfig_libpng
                s|^CPPFLAGS *=.*|CPPFLAGS = $CPPFLAGS|
            "
        fi
        if test "$LD"
        then
            sed_preconfig_libpng="
                $sed_preconfig_libpng
                s|^LD *=.*|LD = $LD|
            "
        fi
        if test "$LDFLAGS"
        then
            sed_preconfig_libpng="
                $sed_preconfig_libpng
                s|^LDFLAGS *=.*|LDFLAGS = $LDFLAGS|
            "
        fi
        if test "$AR$ARFLAGS"
        then
            AR="${AR-ar}"
            ARFLAGS="${ARFLAGS-cru}"
            sed_preconfig_libpng="
                $sed_preconfig_libpng
                s|^AR *=.*|AR = $AR|
                s|^ARFLAGS *=.*|ARFLAGS = $ARFLAGS|
                s|^AR_\([A-Z]*\) *=.*|AR_\1 = $AR $ARFLAGS|
            "
        fi
        if test "$RANLIB"
        then
            sed_preconfig_libpng="
                $sed_preconfig_libpng
                s|^RANLIB *=.*|RANLIB = $RANLIB|
            "
        fi
        sed "$sed_preconfig_libpng" \
            src/libpng/$libpng_preconfig_makefile > src/libpng/Makefile
        LIBPNG_MK=Makefile
        # The pre-configured makefiles in libpng don't do distclean.
        LIBPNG_DISTCLEAN="clean"
        LIBPNG_DISTCLEAN_XCMD="\$(RM_F) \$(LIBPNG_MK)"
    else
        echo "Configuring libpng..."
        (cd src/libpng && ./configure)
        if test $? -ne 0
        then
            echo "$0: error: could not configure: libpng"
            exit 1
        fi
    fi
fi

if test "$with_system_zlib" -ne 0
then
    USE_SYSTEM_ZLIB_TRUE=""
    USE_SYSTEM_ZLIB_FALSE="#"
    echo "Checking for system zlib..."
    test=conftest$$
cat > $test.c <<EOM
#include <zlib.h>
#if ZLIB_VERNUM < 0x1210
#error This program requires zlib version 1.2.1 or higher.
#endif
int dummy;
EOM
    ($CC -c $CPPFLAGS $CFLAGS $test.c) 2>/dev/null
    status=$?
    rm -f $test.c $test.o
    if test $status -ne 0
    then
        echo "$0: error: missing zlib or incorrect zlib version"
        echo "$0: note: zlib version 1.2.1 or higher is required"
        exit 1
    fi
else
    USE_SYSTEM_ZLIB_TRUE="#"
    USE_SYSTEM_ZLIB_FALSE=""
    case `(uname -s) 2>/dev/null || echo unknown` in
    mingw* | MINGW* | windows* | WINDOWS* )
        with_preconfigured_zlib=1
        ZLIB_MK=win32/Makefile.gcc
        # This pre-configured makefile doesn't do distclean.
        ZLIB_DISTCLEAN=clean
        ;;
    *djgpp | *DJGPP | *dos | *DOS )
        with_preconfigured_zlib=1
        ZLIB_MK=msdos/Makefile.dj2
        # This pre-configured makefile doesn't do distclean.
        ZLIB_DISTCLEAN=clean
        ;;
    * )
        with_preconfigured_zlib=0
        ZLIB_MK=Makefile
        ZLIB_DISTCLEAN=distclean
    esac
    if test "$with_preconfigured_zlib" -ne 0
    then
        echo "Using pre-configured zlib..."
        if test ! -f "src/zlib/$ZLIB_MK"
        then
            echo "$0: error: cannot find: src/zlib/$ZLIB_MK"
            exit 1
        fi
    else
        echo "Configuring zlib..."
        (cd src/zlib && ./configure --static)
        if test $? -ne 0
        then
            echo "$0: error: could not configure: zlib"
            exit 1
        fi
    fi
fi

sed_config="
    s|@prefix@|$prefix|g
    s|@exec_prefix@|$exec_prefix|g
    s|@bindir@|$bindir|g
    s|@mandir@|$mandir|g
    s|@man1dir@|$man1dir|g
    s|@USE_SYSTEM_LIBPNG_FALSE@|$USE_SYSTEM_LIBPNG_FALSE|g
    s|@USE_SYSTEM_LIBPNG_TRUE@|$USE_SYSTEM_LIBPNG_TRUE|g
    s|@USE_SYSTEM_ZLIB_FALSE@|$USE_SYSTEM_ZLIB_FALSE|g
    s|@USE_SYSTEM_ZLIB_TRUE@|$USE_SYSTEM_ZLIB_TRUE|g
    s|@CC@|${CC-cc}|g
    s|@CFLAGS@|${CFLAGS--O}|g
    s|@CPP@|${CPP-\$(CC) -E}|g
    s|@CPPFLAGS@|${CPPFLAGS-}|g
    s|@LD@|${LD-\$(CC)}|g
    s|@LDFLAGS@|${LDFLAGS--s}|g
    s|@AR@|${AR-ar}|g
    s|@ARFLAGS@|${ARFLAGS-cru}|g
    s|@RANLIB@|${RANLIB-ranlib}|g
    s|@CP_FP@|${CP_FP-cp -f -p}|g
    s|@MKDIR_P@|${MKDIR_P-mkdir -p}|g
    s|@RM_F@|${RM_F-rm -f}|g
    s|@LIBM@|${LIBM--lm}|g
    s|@LIBPNG@|${LIBPNG--lpng}|g
    s|@LIBS@|${LIBS-}|g
    s|@LIBZ@|${LIBZ--lz}|g
    s|@LIBPNG_DISTCLEAN@|${LIBPNG_DISTCLEAN-distclean}|g
    s|@LIBPNG_DISTCLEAN_XCMD@|${LIBPNG_DISTCLEAN_XCMD-true}|g
    s|@LIBPNG_MK@|${LIBPNG_MK-Makefile}|g
    s|@LIBPNG_MK_DEF@|${LIBPNG_MK_DEF-PNGLIBCONF_H_PREBUILT=pnglibconf.h.optipng}|g
    s|@ZLIB_DISTCLEAN@|${ZLIB_DISTCLEAN-distclean}|g
    s|@ZLIB_MK@|${ZLIB_MK-Makefile}|g
    s|@[A-Z]*_MK@|Makefile|g
    s| *\$||
"

for makefile in \
    ./Makefile \
    src/Makefile \
    src/gifread/Makefile \
    src/minitiff/Makefile \
    src/opngreduc/Makefile \
    src/optipng/Makefile \
    src/optipng/man/Makefile \
    src/pngxtern/Makefile \
    src/pnmio/Makefile
do
    sed "$sed_config" $makefile.in > $makefile
done
