add_library(uv.hdll
    uv.c
)

if(WIN32)
    target_sources(uv.hdll
        PRIVATE
            ${INCLUDES_BASE_DIR}/libuv/src/fs-poll.c
            ${INCLUDES_BASE_DIR}/libuv/src/inet.c
            ${INCLUDES_BASE_DIR}/libuv/src/threadpool.c
            ${INCLUDES_BASE_DIR}/libuv/src/uv-common.c
            ${INCLUDES_BASE_DIR}/libuv/src/version.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/async.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/core.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/dl.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/error.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/fs-event.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/fs.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/getaddrinfo.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/getnameinfo.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/handle.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/loop-watcher.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/pipe.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/poll.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/process-stdio.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/process.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/req.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/signal.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/snprintf.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/stream.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/tcp.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/thread.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/timer.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/tty.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/udp.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/util.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/winapi.c
            ${INCLUDES_BASE_DIR}/libuv/src/win/winsock.c
    )
elseif(DOWNLOAD_DEPENDENCIES)
	FetchContent_Declare(libuv-project
        URL https://github.com/libuv/libuv/archive/refs/tags/v1.51.0.tar.gz
        URL_HASH SHA256=27e55cf7083913bfb6826ca78cde9de7647cded648d35f24163f2d31bb9f51cd
        EXCLUDE_FROM_ALL
    )
    set(_OLD_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
    set(BUILD_SHARED_LIBS OFF)
    set(LIBUV_BUILD_SHARED OFF CACHE INTERNAL "")
    set(LIBUV_BUILD_TESTS OFF CACHE INTERNAL "")
    FetchContent_MakeAvailable(libuv-project)
    set(BUILD_SHARED_LIBS ${_OLD_BUILD_SHARED_LIBS})
    add_library(LibUV::LibUV ALIAS uv_a)
else()
    find_package(LibUV)
endif()

set_as_hdll(uv)
target_link_libraries(uv.hdll
    libhl
)
if(WIN32)
    target_include_directories(uv.hdll
        PRIVATE
        ${INCLUDES_BASE_DIR}/libuv/include
    )
    target_link_libraries(uv.hdll
        psapi
        iphlpapi
        userenv
    )
    target_compile_definitions(uv.hdll
        PRIVATE
        UV_EXPORTS
        BUILDING_UV_SHARED
    )
else()
    target_link_libraries(uv.hdll
        LibUV::LibUV
    )
endif()

install(
    TARGETS
        uv.hdll
    DESTINATION ${HDLL_DESTINATION}
)
