SUBDIRS="include utils ipc common libshareinfo client server drivers tools fuse etc tests doc"

_in_list()
{
    _needle="$1"
    shift
    for _item in $@
    do
        [ "$_needle" = "$_item" ] && return 0
    done
    return 1
}

lwio_driver_enabled()
{
    _in_list "$1" ${LWIO_DRIVERS}
}

option()
{
    _default_BUILTIN_DRIVERS="no"
    _default_DRIVERS="rdr npfs pvfs srv"
    _default_FUSE="yes"

    mk_option \
        OPTION=lwio-fuse \
        VAR=LWIO_FUSE \
        PARAM="yes|no" \
        DEFAULT="$_default_FUSE" \
        HELP="Enable building fuse module"

    mk_option \
        OPTION=lwio-drivers \
        VAR=LWIO_DRIVERS \
        PARAM=... \
        DEFAULT="$_default_DRIVERS" \
        HELP="Enabled drivers"

    mk_option \
        OPTION=lwio-builtin-drivers \
        VAR=LWIO_BUILTIN_DRIVERS \
        PARAM="yes|no" \
        DEFAULT="$_default_BUILTIN_DRIVERS" \
        HELP="Build drivers directly into service"
}

configure()
{
    mk_config_header \
        HEADER="include/config.h"

    lw_define_feature_macros

    case "$MK_OS" in
        freebsd)
            mk_define HAVE_DECL_KERN_PROC_PATHNAME 1 # FIXME
            ;;
        darwin)
            mk_define HAVE_DECL_KERN_PROCARGS 1 # FIXME
            ;;
    esac

    mk_multiarch_do
        lw_check_isa
        lw_check_endian
    mk_multiarch_done

    mk_declare -o \
        MOD_EXT="$MK_DLO_EXT" \
        SBINDIR="$MK_SBINDIR" \
        LIBDIR="$MK_LIBDIR" \
        providerdir="$MK_LIBDIR/lwio-driver"

    mk_define MOD_EXT "\"$MK_DLO_EXT\""
    mk_define CACHEDIR "\"$LW_CACHEDIR\""
    mk_define LIBDIR "\"${MK_LIBDIR}\""
    mk_define PREFIXDIR "\"${MK_PREFIX}\""

    if [ "$LWIO_BUILTIN_DRIVERS" = "yes" ]
    then
        mk_define ENABLE_STATIC_DRIVERS

        for _driver in ${LWIO_DRIVERS}
        do
            mk_define "ENABLE_`echo $_driver | tr 'a-z' 'A-Z'`"
        done
    fi

    mk_define UNICODE 1
    mk_define _FILE_OFFSET_BITS 64

    MK_CFLAGS="$MK_CFLAGS -Wall -Werror -fno-strict-aliasing"

    mk_check_types \
        HEADERDEPS="sys/types.h" \
        blksize_t

    mk_check_libraries \
        FAIL="yes" \
        regclient lwbase krb5 gssapi_krb5 crypto lwnetclientapi uuid

    mk_check_headers \
        FAIL="yes" \
        reg/reg.h lw/base.h krb5.h gssapi.h openssl/crypto.h wc16str.h \
        openssl/md5.h openssl/hmac.h openssl/rand.h uuid/uuid.h

    mk_check_headers \
        inttypes.h stdlib.h sys/varargs.h dlfcn.h pthread.h \
        time.h sys/time.h strings.h stdbool.h sys/socket.h netinet/tcp.h \
        netdb.h wc16str.h wc16printf.h sys/param.h sys/pstat.h \
        procfs.h sys/procfs.h sys/vfs.h netinet/in.h netinet/in6.h

    mk_check_headers \
        fuse.h

    mk_check_headers \
        HEADERDEPS="stdlib.h" \
        attr/xattr.h

    mk_check_headers \
        HEADERDEPS="sys/types.h" \
        sys/extattr.h

    mk_check_headers \
        HEADERDEPS="sys/types.h" \
        sys/security_id.h

    mk_check_headers \
        HEADERDEPS="sys/acl.h sys/endian.h sys/security_id.h" \
        sys/security_descriptor.h

    if mk_try_compile \
        HEADERDEPS="sys/stat.h unistd.h" \
        CODE='
int foo = UF_SYSTEM;
return foo;
'
    then
        mk_define HAVE_STATFLAG_SUPPORT 1
    fi


    mk_check_headers \
        HEADERDEPS="sys/types.h" \
        sys/sysctl.h sys/user.h

    mk_check_types \
        HEADERDEPS="sys/types.h sys/socket.h" \
        "socklen_t"

    mk_check_libraries \
        attr pthread nsl socket fuse dl

    lw_check_getsockname

    LWIO_SD_ENABLED=no
    LWIO_EA_ENABLED=no

    case "$MK_OS" in
        freebsd)
	    mk_check_functions \
		HEADERDEPS="sys/types.h sys/socket.h sys/uio.h" \
		sendfile

            mk_check_functions \
                HEADERDEPS="sys/types.h sys/extattr.h" \
                extattr_get_fd extattr_get_file extattr_set_fd
            if [ "$HAVE_EXTATTR_GET_FD" = yes -a \
                 "$HAVE_EXTATTR_GET_FILE" = yes -a \
                 "$HAVE_EXTATTR_SET_FD" = yes ]
            then
                LWIO_EA_ENABLED=yes
            fi

            mk_check_functions \
                HEADERDEPS="sys/acl.h sys/security_id.h sys/security_descriptor.h" \
                security_descriptor_get_fd security_descriptor_get_file \
                security_descriptor_set_fd
            if [ "$HAVE_SECURITY_DESCRIPTOR_GET_FD" = yes -a \
                 "$HAVE_SECURITY_DESCRIPTOR_GET_FILE" = yes -a \
                 "$HAVE_SECURITY_DESCRIPTOR_SET_FD" = yes ]
            then
                LWIO_SD_ENABLED=yes
            fi
            ;;

        linux)
            mk_check_functions \
                HEADERDEPS="stdlib.h attr/xattr.h" \
                LIBDEPS="$LIB_ATTR" \
                setxattr fsetxattr getxattr fgetxattr
            if [ "$HAVE_SETXATTR" = yes -a "$HAVE_GETXATTR" = yes ] ||
               [ "$HAVE_FSETXATTR" = yes -a "$HAVE_FGETXATTR" = yes ]
            then
                LWIO_EA_ENABLED=yes
            fi
            ;;
    esac

    mk_msg "EA support: $LWIO_EA_ENABLED"
    mk_msg "SD support: $LWIO_SD_ENABLED"

    mk_check_functions \
        HEADERDEPS="sys/vfs.h sys/param.h sys/mount.h" \
        statfs fstatfs

    mk_check_functions \
        HEADERDEPS="unistd.h" \
        fdatasync fsync

    mk_check_functions \
        HEADERDEPS="sys/types.h dirent.h" \
        dirfd

    mk_check_functions \
        HEADERDEPS="stdlib.h" \
        strtoll __strtoll strtoull __strtoull

    mk_check_functions \
        HEADERDEPS="sys/pstat.h" \
        pstat_getproc

    mk_check_functions \
        HEADERDEPS="ctype.h" \
        isblank

    mk_check_functions \
        HEADERDEPS="time.h" \
        timegm

    lw_check_pthread_once_init

    if [ "$HAVE_FUSE_H" != "no" -a "$HAVE_LIB_FUSE" != "no" -a "$LWIO_FUSE" = "yes" ]
    then
        LWIO_FUSE_ENABLED=yes
    else
        LWIO_FUSE_ENABLED=no
        mk_skip_subdir fuse
    fi

    # srvstat can only be enabled if srv enabled
    if lwio_driver_enabled srv
    then
        LWIO_SRVSTAT_ENABLED=yes
    else
        LWIO_SRVSTAT_ENABLED=no
    fi

    mk_msg "build FUSE module: $LWIO_FUSE_ENABLED"

    mk_check_moonunit

    mk_check_doxygen

    mk_output_file etc/lwiod.reg
    mk_output_file doc/Doxyfile
    for _driver in ${LWIO_DRIVERS}
    do
        mk_output_file "etc/${_driver}.reg"
    done
}
