SUBDIRS='include src moonunit doc'

option()
{
    mk_option \
        OPTION=threadpool-backend \
        PARAM='value' \
        VAR=LWBASE_THREADPOOL_BACKEND \
        DEFAULT="autodetect" \
        HELP="Threadpool backend"
}

configure()
{
    mk_config_header 'include/config.h'

    lw_define_feature_macros

    MK_CFLAGS="$MK_CFLAGS -Wall -Werror"

    # lwbase libraries are built in compat mode as well, so we
    # need to peform configure checks for all instruction set
    # architectures where the result could vary between them
    mk_multiarch_do
    	case "${MK_ISA}" in
            x86_32)
                mk_msg "atomic ops: x86 ($MK_CANONICAL_SYSTEM)"
                mk_define LWBASE_ATOMIC_X86 1
                ;;
            x86_64)
                mk_msg "atomic ops: x86_64 ($MK_CANONICAL_SYSTEM)"
                mk_define LWBASE_ATOMIC_X86_64 1
                ;;
            *)
                mk_msg "atomic ops: pthread mutex ($MK_CANONICAL_SYSTEM)"
                mk_define LWBASE_ATOMIC_LOCK 1
                ;;
        esac

        mk_define MOD_EXT "\"$MK_DLO_EXT\""
        mk_define LIBDIR "\"$MK_LIBDIR\""

        if [ "$MK_HOST_OS" = "darwin" ]
        then
            DS_FRAMEWORK_LDFLAGS="-framework DirectoryService"
            MK_CFLAGS="$MK_CFLAGS -Wno-deprecated-declarations"
        fi

        mk_check_endian
        
        case "$ENDIANNESS" in
            big) mk_define LW_BIG_ENDIAN;;
            little) mk_define LW_LITTLE_ENDIAN;;
        esac
    mk_multiarch_done

    mk_declare -i DS_FRAMEWORK_LDFLAGS

    mk_check_libraries \
        xnet \
        dl \
        rt \
        pthread
    
    lw_check_iconv
    
    # Necessary headers
    mk_check_headers \
        FAIL=yes \
        pthread.h \
        dlfcn.h \
        inttypes.h \
        uuid/uuid.h \
        wctype.h
    
    # Optional headers
    mk_check_headers \
        sys/varargs.h \
        sys/param.h \
        unistd.h \
        string.h \
        strings.h \
        pthread_np.h \
        signal.h \
        stdarg.h
        
    mk_check_headers \
        HEADERDEPS="sys/param.h" \
        sys/cpuset.h

    mk_check_types \
        HEADERDEPS="sys/param.h sys/cpuset.h pthread.h" \
        cpu_set_t cpuset_t

    if [ "$HAVE_CPU_SET_T" = yes ]
    then
        mk_define CPU_SET_TYPE "cpu_set_t"
    elif [ "$HAVE_CPUSET_T" = yes ]
    then
        mk_define CPU_SET_TYPE "cpuset_t"
    fi

    # Necessary libraries \
    mk_check_libraries \
        FAIL=yes \
        uuid
    
    mk_check_functions \
        HEADERDEPS="signal.h" \
        LIBDEPS="$LIB_RT" \
        sigwaitinfo

    mk_check_functions \
        HEADERDEPS="pthread.h pthread_np.h wchar.h" \
        LIBDEPS="$LIB_PTHREAD" \
        pthread_setaffinity_np pthread_attr_setaffinity_np wcscasecmp

    mk_check_functions \
        HEADERDEPS="sys/epoll.h" \
        epoll_create

    mk_check_functions \
        HEADERDEPS="sys/types.h sys/event.h sys/time.h" \
        kqueue

    if [ "$LWBASE_THREADPOOL_BACKEND" = "autodetect" ]
    then
        if [ "$HAVE_EPOLL_CREATE" = "yes" ]
        then
            LWBASE_THREADPOOL_BACKEND="epoll"
        elif [ "$HAVE_KQUEUE" = "yes"  ]
        then
            LWBASE_THREADPOOL_BACKEND="kqueue"
        else
            LWBASE_THREADPOOL_BACKEND="poll"
        fi
    fi

    mk_msg "threadpool backend: $LWBASE_THREADPOOL_BACKEND"

    mk_check_moonunit
    mk_check_doxygen
    
    mk_declare -o ENABLE_INTERNAL_DOCS=no

    mk_output_file doc/Doxyfile
}
