#!/bin/sh


test x"$CC" != "x" || CC=gcc
test x"$CFLAGS" != "x" || CFLAGS="-I/usr/X11R6/include"
test x"$LDFLAGS" != "x" || LDFLAGS="-L/usr/X11R6/lib"

echo "CC: $CC"

CHECK_XRENDER=0
CHECK_XCURSOR=0
CHECK_XPM=0
CHECK_IMLIB2=0
CHECK_PAM=0
CHECK_PASSWD=0
CHECK_HASH=1

prefix=/usr/local

##############################################################

msg_chkfor() {
    echo -n "checking for "$1" ... "
}

check_docs() {

    msg_chkfor "asciidoc"
    if which asciidoc 1> /dev/null 2>&3
    then
        echo "ok."
        echo "#_______________________" >&4
        echo "WITH_DOCS=1" >&4
        echo "" >&4
    else
        echo "no. you cant rebuild the docs."
    fi
}

check_tools() {

    msg_chkfor "compiler $CC"
    if which "$CC" 1> /dev/null 2>&3
    then
        echo "ok."
        echo "---------------------------------" 1>&3
        "$CC" -v 1>&3 2>&3
        echo "---------------------------------" 1>&3
    else
        echo "no."
        echo "error, no compiler found"
        exit 1
    fi
}

check_imlib2() {

    msg_chkfor "imlib2-config"
    if which imlib2-config 1> /dev/null 2>&3
    then
        echo "ok."
        cat << EOF > tmp.c
#include <X11/Xlib.h>
#include <Imlib2.h>
int main() {
    Imlib_Context ctx = NULL;
    ctx = imlib_context_new();
    return 0;
}
EOF
        msg_chkfor "compile with imlib2"
        if ${CC} -c tmp.c -o /dev/null `imlib2-config --cflags` 2>&3
        then
            echo "ok."
            msg_chkfor "link with imlib2"
            if ${CC} tmp.c -o /dev/null `imlib2-config --cflags` `imlib2-config --libs` 2>&3
            then
                echo "ok."
                echo "#_______________________" >&4
                echo "WITH_IMLIB2:=1" >&4
                echo "CFLAGS_IMLIB2:=`imlib2-config --cflags`" >&4
                echo "LIBS_IMLIB2:=`imlib2-config --libs`" >&4
                echo "" >&4
            else
                echo "no."
                echo "error, can't link against imlib2. check 'config.log' for possible"
                echo "error messages. you can also call configure with specifying "
                echo "special LDFLAGS."
                exit 1
            fi
        else
            echo "no."
            echo "error, can't compile with imlib2 support. check 'config.log'"
            echo "for further details."
            exit 1
        fi
    else
        echo "no."
    fi
}


check_xrender() {

    cat << EOF > tmp.c
#include <X11/Xlib.h>
#include <X11/extensions/Xrender.h>
int main() {
    XRenderFindVisualFormat(NULL, NULL);
    return 0;
}
EOF
    msg_chkfor "Xrender.h"
    if ${CC} ${CFLAGS} -c tmp.c -o /dev/null 2>&3
    then
        echo "ok."
        msg_chkfor "libXrender"
        if ${CC} ${CFLAGS} tmp.c -o /dev/null ${LDFLAGS} -lXrender 2>&3
        then
            echo "ok."
            echo "#_______________________" >&4
            echo "WITH_XRENDER:=1" >&4
            echo "CFLAGS_XRENDER:=" >&4
            echo "LDFLAGS_XRENDER:=-lXrender" >&4
            echo "" >&4
            return
        fi
    fi
    echo "no."
    echo "error, can't compile/link with xrender support."
    echo "check 'config.log' for further details."
    exit 1
}

check_xcursor() {

    cat << EOF > tmp.c
#include <X11/Xlib.h>
#include <X11/Xcursor/Xcursor.h>
int main() {
    XcursorFilenameLoadCursor(NULL, NULL);
    return 0;
}
EOF
    msg_chkfor "Xcursor.h"
    if ${CC} ${CFLAGS} -c tmp.c -o /dev/null 2>&3
    then
        echo "ok."
        msg_chkfor "libXcursor"
        if ${CC} ${CFLAGS} tmp.c -o /dev/null ${LDFLAGS} -lXcursor 2>&3
        then
            echo "ok."
            echo "#_______________________" >&4
            echo "WITH_XCURSOR:=1" >&4
            echo "CFLAGS_XCURSOR:=" >&4
            echo "LDFLAGS_XCURSOR:=" >&4
            echo "LIBS_XCURSOR:=-lXcursor" >&4
            echo "" >&4
            return
        fi
    fi
    echo "no."
    echo "error, can't compile/link with xcursor support."
    echo "check 'config.log' for further details."
    exit 1
}

check_xf86misc() {

    cat << EOF > tmp.c
#include <X11/Xlib.h>
#include <X11/extensions/xf86misc.h>
int main() {
    XF86MiscSetGrabKeysState(NULL, True);
    return 0;
}
EOF
    msg_chkfor "extensions/xf86misc.h"
    if ${CC} ${CFLAGS} -c tmp.c -o /dev/null 2>&3
    then
        echo "ok."
        msg_chkfor "xf86misc"
        if ${CC} ${CFLAGS} tmp.c -o /dev/null ${LDFLAGS} -lX11 -lXxf86misc 2>&3
        then
            echo "ok."
            echo "#_______________________" >&4
            echo "WITH_XF86MISC:=1" >&4
            echo "LIBS += -lXxf86misc" >&4
            echo "" >&4
            return
        fi
    fi
    echo "no."
    echo " "
    echo "!!! WARNING !!!"
    echo "   if the xserver is configured to allow"
    echo "   'AllowDeactivateGrabs' or 'AllowClosedownGrabs'"
    echo "   people can bypass alock !!! consider"
    echo "   to install the xf86misc extension!"
    echo "!!! WARNING !!!"
    echo " "
}




check_xlib() {

    cat << EOF > tmp.c
#include <X11/Xlib.h>
int main() {
    XOpenDisplay(NULL);
    return 0;
}
EOF
    msg_chkfor "Xlib.h"
    if ${CC} ${CFLAGS} -c tmp.c -o /dev/null 2>&3
    then
        echo "ok."
        msg_chkfor "Xlib"
        if ${CC} ${CFLAGS} tmp.c -o /dev/null ${LDFLAGS} -lX11 2>&3
        then
            echo "ok."
            echo "#_______________________" >&4
            echo "LIBS += -lX11" >&4
            echo "" >&4
        else
            echo "no."
            echo "error: you need Xlibs to build alock."
            exit 1
        fi
    else
        echo "no."
        echo "error: can't compile without Xlib.h header."
        exit 1
    fi
}

check_xlogo16() {
    cat << EOF > tmp.c
#include <X11/bitmaps/xlogo16>
int main() {
    return 0;
}
EOF
    msg_chkfor "X11/bitmaps/xlogo16"
    if ${CC} ${CFLAGS} -c tmp.c -o /dev/null 2>&3
    then
        echo "ok."
        echo "#_______________________" >&4
        echo "WITH_THEME:=1" >&4
        echo "" >&4
    else
        echo "no."
        echo "maybe you should install a package called 'xbitmaps'."
    fi
}

check_xpm() {
    cat << EOF > tmp.c
#include <X11/xpm.h>
int main() {
    XpmReadFileToImage(NULL, NULL, NULL, NULL, NULL);
    return 0;
}
EOF
    msg_chkfor "X11/xpm.h"
    if ${CC} ${CFLAGS} -c tmp.c -o /dev/null 2>&3
    then
        echo "ok."
        msg_chkfor "libXpm"
        if ${CC} ${CFLAGS} tmp.c -o /dev/null ${LDFLAGS} -lXpm -lX11 2>&3
        then
            echo "ok."
            echo "#_______________________" >&4
            echo "WITH_XPM:=1" >&4
            echo "LIBS_XPM:=-lXpm" >&4
            echo "" >&4
        else
            echo "no."
            exit 1
        fi
    else
        echo "no."
        echo "maybe you should install a package called 'xpm'."
        exit 1
    fi
}

check_hash() {
    echo "configure for hash."
    echo "#_______________________" >&4
    echo "WITH_HASH:=1" >&4
    echo "" >&4
}

check_pam() {
    echo "configure for pam."
    echo "#_______________________" >&4
    echo "WITH_PAM:=1" >&4
    if [ "X`uname -s | sed 's/.*BSD/BSD/'`" = "XBSD" ]
    then
        echo "LIBS_PAM:= -lpam -lcrypt" >&4
    else
        echo "LIBS_PAM= -lpam -lpam_misc -lcrypt" >&4
    fi
    echo "" >&4
}

check_passwd() {
    echo "configure for passwd."
    echo "#_______________________" >&4
    echo "WITH_PASSWD:=1" >&4

    cat << EOF > tmp.c
#include <shadow.h>
int main() {
    /* TODO: write the test */;
    return 0;
}
EOF
    msg_chkfor "shadow.h"
    if ${CC} ${CFLAGS} -c tmp.c -o /dev/null 2>&3
    then
        echo "ok."
        echo "CFLAGS_PASSWD:=-DHAVE_SHADOW" >&4
    else
        echo "no."
    fi

    echo "LIBS_PASSWD=-lcrypt" >&4
    echo "" >&4
}

#############################################################################


while [ $# -gt 0 ]
do
    case $1 in

        --help)
            cat <<EOF

  Options for configure:

    --prefix <prefix>     where to install
    --debug               enable debug

    --with(out)-xrender   use Xrender
    --with(out)-xcursor   use Xcursor
    --with(out)-imlib2    use imlib2
    --with(out)-xpm       use Xpm

    --with(out)-pam       use pam_login
    --with(out)-passwd    use /etc/passwd
    --with(out)-hash      use sha1,sha2 and md5 based passwords

    --with-all            use all with-options from above

    --help                shows usage of the configure script

EOF
            exit 0
            ;;

        --with-xrender|--enable-xrender) CHECK_XRENDER=1;;
        --without-xrender|--disable-xrender) CHECK_XRENDER=0;;

        --with-xcursor|--enable-xcursor) CHECK_XCURSOR=1;;
        --without-xcursor|--disable-xcursor) CHECK_XCURSOR=0;;

        --with-xpm|--enable-xpm) CHECK_XPM=1;;
        --without-xpm|--disable-xpm) CHECK_XPM=0;;

        --with-imlib2|--enable-imlib2) 
            CHECK_IMLIB2=1
            CHECK_XRENDER=1
            ;;
        --without-imlib2|--disable-imlib2) CHECK_IMLIB2=0;;

        --with-pam|--enable-pam) CHECK_PAM=1;;
        --without-pam|--disable-pam) CHECK_PAM=0;;

        --with-passwd|--enable-passwd) CHECK_PASSWD=1;;
        --without-passwd|--disable-passwd) CHECK_PASSWD=0;;

        --with-all|--enable-all) 
            CHECK_PASSWD=1
            CHECK_PAM=1
            CHECK_IMLIB2=1
            CHECK_XCURSOR=1
            CHECK_XRENDER=1
            CHECK_XPM=1
            ;;

        --prefix)
            shift
            if [ $# -gt 0 ]
            then
                prefix=$1
            else
                echo "error, missing argument for -prefix."
                exit 1
            fi
            ;;

        --debug)
            CFLAGS="${CFLAGS} -g"
            LDFLAGS="${LDFLAGS} -g"
            ;;
    esac
    shift
done


##############################################################

exec 3> config.log
exec 4> config.mk

echo "# alock's config.mk" >&4
echo "#_______________________" >&4
echo "VERSION=\\\"1.0\\\"" >&4
echo "prefix=$prefix" >&4
echo "CC=${CC}" >&4
echo "CFLAGS=${CFLAGS}" >&4
echo "LDFLAGS=${LDFLAGS}" >&4
echo "LIBS=${LIBS}" >&4
echo "#_______________________" >&4
echo "" >&4

check_docs
check_tools
check_xlib
check_xf86misc
check_xlogo16
[ "$CHECK_XPM" -eq 1 ] && check_xpm
[ "$CHECK_XRENDER" -eq 1 ] && check_xrender
[ "$CHECK_XCURSOR" -eq 1 ] && check_xcursor
[ "$CHECK_IMLIB2" -eq 1 ] && check_imlib2
[ "$CHECK_PAM" -eq 1 ] && check_pam
[ "$CHECK_PASSWD" -eq 1 ] && check_passwd
[ "$CHECK_HASH" -eq 1 ] && check_hash

echo "#_______________________" >&4
echo "" >&4

rm -fr tmp.c

# vim:ft=sh
