diff --git a/CMakeLists.txt b/CMakeLists.txt index 6ae840e7..23dcd7de 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,26 +65,30 @@ if(NOT WIN32 AND USE_LIBCPP) cmake_pop_check_state() endif() +option(FETCH_LIBUV "Fetch the libuv repo using CMake FetchContent facility" ON) function(fetch_libuv) - include(FetchContent) + if (FETCH_LIBUV) + include(FetchContent) - FetchContent_Declare( - libuv - GIT_REPOSITORY https://github.com/libuv/libuv.git - GIT_TAG v1.40.0 - GIT_SHALLOW 1 - ) + FetchContent_Declare( + libuv + GIT_REPOSITORY https://github.com/libuv/libuv.git + GIT_TAG v1.40.0 + GIT_SHALLOW 1 + ) - FetchContent_GetProperties(libuv) + FetchContent_GetProperties(libuv) - if(NOT libuv_POPULATED) - FetchContent_Populate(libuv) - add_subdirectory(${libuv_SOURCE_DIR} ${libuv_BINARY_DIR}) - endif() + if(NOT libuv_POPULATED) + FetchContent_Populate(libuv) + add_subdirectory(${libuv_SOURCE_DIR} ${libuv_BINARY_DIR}) + endif() - add_library(uv::uv-static ALIAS uv_a) - set_target_properties(uv_a PROPERTIES POSITION_INDEPENDENT_CODE 1) - set_target_properties(uv PROPERTIES POSITION_INDEPENDENT_CODE 1) + add_library(uv::uv-static ALIAS uv_a) + + set_target_properties(uv_a PROPERTIES POSITION_INDEPENDENT_CODE 1) + set_target_properties(uv PROPERTIES POSITION_INDEPENDENT_CODE 1) + endif(FETCH_LIBUV) endfunction() # @@ -93,10 +97,11 @@ endfunction() include(GNUInstallDirs) + if(BUILD_UVW_LIBS) fetch_libuv() - add_subdirectory(src) + add_subdirectory(src) file(GLOB HEADERS src/uvw/*.h src/uvw/*.hpp) else() add_library(uvw INTERFACE) @@ -167,6 +172,7 @@ if(BUILD_TESTING) option(FIND_GTEST_PACKAGE "Enable finding gtest package." OFF) fetch_libuv() + enable_testing() add_subdirectory(test) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d825e500..ed48f7ca 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -63,7 +63,7 @@ endfunction() add_library(uvw-static STATIC) add_library(uvw::uvw-static ALIAS uvw-static) -target_link_libraries(uvw-static PUBLIC uv::uv-static) +target_link_libraries(uvw-static PUBLIC $<$:uv::uv-static> $<$>:uv_a dl>) set_target_properties(uvw-static PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD 1) add_uvw_library(uvw-static) @@ -73,5 +73,7 @@ add_uvw_library(uvw-static) install(EXPORT uvw NAMESPACE uvw:: DESTINATION ${CMAKE_INSTALL_LIBDIR}) install(TARGETS uvw-static EXPORT uvw ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) -install(TARGETS uv_a EXPORT uvw ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) -install(TARGETS uv EXPORT uvw LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) +if(FETCH_LIBUV) + install(TARGETS uv_a EXPORT uvw ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) + install(TARGETS uv EXPORT uvw LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) +endif(FETCH_LIBUV) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4dc69d60..892b4aa8 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -48,7 +48,7 @@ function(ADD_UVW_TEST TEST_NAME TEST_SOURCE) ${TEST_NAME} PRIVATE $<$:uvw::uvw> - $<$:uv::uv-static> + $<$:uv::uv-static> $<$:uvw::uvw-static> GTest::Main Threads::Threads @@ -78,9 +78,11 @@ endfunction() function(ADD_UVW_LIB_TEST TEST_NAME TEST_SOURCE) ADD_UVW_TEST(${TEST_NAME} ${TEST_SOURCE}) target_link_libraries(${TEST_NAME} PRIVATE ${CMAKE_DL_LIBS}) - target_compile_definitions(${TEST_NAME} PRIVATE TARGET_LIB_SO="$") + target_compile_definitions(${TEST_NAME} PRIVATE TARGET_LIB_SO="$") endfunction() +add_library(fake SHARED fake.cpp) + # List of available targets option(BUILD_DNS_TEST "Build DNS test." OFF) diff --git a/test/fake.cpp b/test/fake.cpp new file mode 100644 index 00000000..c3eb25c5 --- /dev/null +++ b/test/fake.cpp @@ -0,0 +1,9 @@ +#include + +extern "C" int fake_func(double *); + +int fake_func(double *d) { + if (d) + *d = -*d; + return -42; +} diff --git a/test/uvw/lib.cpp b/test/uvw/lib.cpp index c4c38d7e..38f808c1 100644 --- a/test/uvw/lib.cpp +++ b/test/uvw/lib.cpp @@ -22,7 +22,10 @@ TEST(SharedLib, Success) { ASSERT_TRUE(static_cast(*lib)); ASSERT_EQ(&lib->loop(), loop.get()); ASSERT_EQ(lib->sym("foobar"), nullptr); - ASSERT_NE(lib->sym("uv_uptime"), nullptr); + ASSERT_NE(lib->sym("fake_func"), nullptr); + double d{1.}; + ASSERT_EQ(-42, lib->sym("fake_func")(&d)); + ASSERT_DOUBLE_EQ(-1., d); // this forces a call to the destructor to invoke uv_dlclose lib.reset();