Add libuv extension.

This commit is contained in:
Jim Hague 2019-10-29 09:15:04 +00:00
parent 3604add64f
commit 6a043d2fac
2 changed files with 119 additions and 0 deletions

View File

@ -113,6 +113,7 @@ option(BUILD_STUBBY "Compile and install stubby, the (stub) resolver daemon." OF
option(USE_LIBEV "Use libev if available." ON)
option(USE_LIBEVENT2 "Use libevent2 if available." ON)
option(USE_LIBUV "Use libuv if available." ON)
option(USE_LIBIDN "Use libidn if available." ON)
option(USE_LIBIDN2 "Use libidn2 if available." ON)
@ -687,6 +688,45 @@ if (USE_LIBEVENT2)
endif ()
endif ()
# libuv extension.
if (USE_LIBUV)
find_package(Libuv)
if (Libuv_FOUND)
# Copy module header to getdns include dir.
file(COPY src/getdns/getdns_ext_libuv.h DESTINATION getdns)
add_library(uv_objects OBJECT src/extension/libuv.c)
target_include_directories(uv_objects
PRIVATE
src
${CMAKE_CURRENT_BINARY_DIR}
)
set_property(TARGET uv_objects PROPERTY POSITION_INDEPENDENT_CODE 1)
set_property(TARGET uv_objects PROPERTY C_STANDARD 11)
if (ENABLE_STATIC)
add_library(getdns_ex_uv STATIC $<TARGET_OBJECTS:uv_objects>)
target_include_directories(getdns_ex_uv PRIVATE Libuv::Libuv)
target_link_libraries(getdns_ex_uv PUBLIC getdns Libuv::Libuv)
set_target_properties(getdns_ex_uv PROPERTIES OUTPUT_NAME getdns_ex_uv${static_lib_suffix})
endif ()
if (ENABLE_SHARED)
add_library(getdns_ex_uv_shared SHARED $<TARGET_OBJECTS:uv_objects>)
target_include_directories(getdns_ex_uv_shared PRIVATE Libuv::Libuv)
target_link_libraries(getdns_ex_uv_shared PUBLIC getdns_shared Libuv::Libuv)
set_target_properties(getdns_ex_uv_shared PROPERTIES OUTPUT_NAME getdns_ex_uv)
target_shared_library_version(getdns_ex_uv_shared ${GETDNS_VERSION_CURRENT} ${GETDNS_VERSION_REVISION} ${GETDNS_VERSION_AGE})
file(STRINGS src/extension/libuv.symbols symbols)
target_shared_library_exports(getdns_ex_uv_shared getdns_ex_uv "${symbols}")
if (NOT ENABLE_STATIC)
add_library(getdns_ex_uv ALIAS getdns_ex_uv_shared)
endif ()
endif ()
else ()
message(WARNING "Libuv not found, libuv extension not built.")
set(USE_LIBUV OFF)
endif ()
endif ()
# The tools.
if (BUILD_GETDNS_QUERY)
add_executable(getdns_query src/tools/getdns_query.c)
@ -812,6 +852,9 @@ if (ENABLE_STATIC)
if (USE_LIBEVENT2)
install(TARGETS getdns_ex_event LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
endif ()
if (USE_LIBUV)
install(TARGETS getdns_ex_uv LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
endif ()
endif ()
if (ENABLE_SHARED)
install(TARGETS getdns_shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
@ -821,6 +864,9 @@ if (ENABLE_SHARED)
if (USE_LIBEVENT2)
install(TARGETS getdns_ex_event_shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
endif ()
if (USE_LIBUV)
install(TARGETS getdns_ex_uv_shared LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
endif ()
endif ()
if (BUILD_GETDNS_QUERY)
install(TARGETS getdns_query RUNTIME DESTINATION bin)

View File

@ -0,0 +1,73 @@
#[=======================================================================[.rst:
FindLibuv
---------
Find the Libuv library.
Imported targets
^^^^^^^^^^^^^^^^
This module defines the following :prop_tgt:`IMPORTED` targets:
``Libuv::Libuv``
The Libuv library, if found.
Result variables
^^^^^^^^^^^^^^^^
This module will set the following variables in your project:
``Libuv_FOUND``
If false, do not try to use Libuv.
``LIBUV_INCLUDE_DIR``
where to find check.h, etc.
``LIBUV_LIBRARIES``
the libraries needed to use Libuv.
``LIBUV_VERSION``
the version of the Libuv library found
#]=======================================================================]
find_path(LIBUV_INCLUDE_DIR uv.h
HINTS
"${LIBUV_DIR}"
"${LIBUV_DIR}/include"
)
find_library(LIBUV_LIBRARY NAMES uv libuv
HINTS
"${LIBUV_DIR}"
"${LIBUV_DIR}/lib"
)
set(LIBUV_LIBRARIES "")
if (LIBUV_INCLUDE_DIR AND LIBUV_LIBRARY)
if (NOT TARGET Libuv::Libuv)
add_library(Libuv::Libuv UNKNOWN IMPORTED)
set_target_properties(Libuv::Libuv PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${LIBUV_INCLUDE_DIR}"
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
IMPORTED_LOCATION "${LIBUV_LIBRARY}"
)
endif ()
if (NOT LIBUV_VERSION AND LIBUV_INCLUDE_DIR)
if (EXISTS "${LIBUV_INCLUDE_DIR}/uv-version.h")
file(STRINGS "${LIBUV_INCLUDE_DIR}/uv-version.h" LIBUV_VER_H REGEX "^#define UV_VERSION_(MAJOR|MINOR|PATCH) ")
elseif (EXISTS "${LIBUV_INCLUDE_DIR}/uv/version.h")
file(STRINGS "${LIBUV_INCLUDE_DIR}/uv/version.h" LIBUV_VER_H REGEX "^#define UV_VERSION_(MAJOR|MINOR|PATCH) ")
endif ()
string(REGEX REPLACE "^.*_MAJOR ([0-9]+).*_MINOR ([0-9]+).*_PATCH ([0-9]+).*$" "\\1.\\2.\\3" LIBUV_VERSION "${LIBUV_VER_H}")
endif ()
endif()
list(APPEND LIBUV_LIBRARIES "${LIBUV_LIBRARY}")
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Libuv
REQUIRED_VARS LIBUV_LIBRARIES LIBUV_INCLUDE_DIR
VERSION_VAR LIBUV_VERSION
)
mark_as_advanced(LIBUV_INCLUDE_DIR LIBUV_LIBRARIES LIBUV_LIBRARY)