From 1eed86883bff8a031d397ddd38b39fb307a31198 Mon Sep 17 00:00:00 2001 From: John Szakmeister Date: Sun, 9 Mar 2014 08:40:55 -0400 Subject: [PATCH] Deal with the missing dependencies for libuv. Since libuv.pc is broken at the moment, try to determine libuv's dependencies ourselves. This ports most of the checks from libuv into our CMake build, and fixes the build on other unix platforms. --- CMakeLists.txt | 4 ---- cmake/FindLibUV.cmake | 39 +++++++++++++++++++++++++++++++++++++++ src/CMakeLists.txt | 24 ++++++++++-------------- 3 files changed, 49 insertions(+), 18 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b32bd5e2de..38fa216010 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,10 +40,6 @@ if(NOT CMAKE_USE_PTHREADS_INIT) message(SEND_ERROR "The pthread library must be installed on your system.") endif(NOT CMAKE_USE_PTHREADS_INIT) -# Detect if clock_gettime exists in -lrt. If so we need to link with it because -# the static libuv doesn't but uses clock_gettime. -check_library_exists(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME) - find_package(LibIntl) if(LibIntl_FOUND) include_directories(${LibIntl_INCLUDE_DIR}) diff --git a/cmake/FindLibUV.cmake b/cmake/FindLibUV.cmake index b11d2b1949..357f12c3fd 100644 --- a/cmake/FindLibUV.cmake +++ b/cmake/FindLibUV.cmake @@ -46,6 +46,45 @@ mark_as_advanced(LIBUV_INCLUDE_DIR LIBUV_LIBRARY) set(LIBUV_LIBRARIES ${LIBUV_LIBRARY}) set(LIBUV_INCLUDE_DIRS ${LIBUV_INCLUDE_DIR}) +# Deal with the fact that libuv.pc is missing important dependency information. + +include(CheckLibraryExists) + +check_library_exists(dl dlopen "dlfcn.h" HAVE_LIBDL) +if(HAVE_LIBDL) + list(APPEND LIBUV_LIBRARIES dl) +endif() + +check_library_exists(kstat kstat_lookup "kstat.h" HAVE_LIBKSTAT) +if(HAVE_LIBKSTAT) + list(APPEND LIBUV_LIBRARIES kstat) +endif() + +check_library_exists(kvm kvm_open "kvm.h" HAVE_LIBKVM) +if(HAVE_LIBKVM) + list(APPEND LIBUV_LIBRARIES kvm) +endif() + +check_library_exists(nsl gethostbyname "nsl.h" HAVE_LIBNSL) +if(HAVE_LIBNSL) + list(APPEND LIBUV_LIBRARIES nsl) +endif() + +check_library_exists(perfstat perfstat_cpu "libperfstat.h" HAVE_LIBPERFSTAT) +if(HAVE_LIBPERFSTAT) + list(APPEND LIBUV_LIBRARIES perfstat) +endif() + +check_library_exists(rt clock_gettime "time.h" HAVE_LIBRT) +if(HAVE_LIBRT) + list(APPEND LIBUV_LIBRARIES rt) +endif() + +check_library_exists(sendfile sendfile "" HAVE_LIBSENDFILE) +if(HAVE_LIBSENDFILE) + list(APPEND LIBUV_LIBRARIES sendfile) +endif() + include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set LIBUV_FOUND to TRUE diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 86be94238a..e89672a91f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,3 +1,5 @@ +include(CheckLibraryExists) + file( GLOB NEOVIM_SOURCES *.c ) foreach(sfile ${NEOVIM_SOURCES}) @@ -25,25 +27,12 @@ if(CMAKE_C_COMPILER_ID MATCHES "Clang") endif() endif() -# The libraries we link against for nvim -set(NVIM_LINK_LIBRARIES - m - ${LIBUV_LIBRARIES} - ${LUAJIT_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT}) - -# Add any libraries needed for a specific platform -if(HAVE_CLOCK_GETTIME) - # Work around libuv.a not linking in rt. - list(APPEND NVIM_LINK_LIBRARIES rt) -endif(HAVE_CLOCK_GETTIME) +# Our dependencies come first. if (LibIntl_FOUND) list(APPEND NVIM_LINK_LIBRARIES ${LibIntl_LIBRARY}) endif() -include(CheckLibraryExists) - check_library_exists(curses tgetent "" HAVE_LIBCURSES) if (HAVE_LIBCURSES) list(APPEND NVIM_LINK_LIBRARIES curses) @@ -52,6 +41,13 @@ else() list(APPEND NVIM_LINK_LIBRARIES ${CURSES_LIBRARIES}) endif() +# Put these last on the link line, since multiple things may depend on them. +list(APPEND NVIM_LINK_LIBRARIES + ${LIBUV_LIBRARIES} + ${LUAJIT_LIBRARIES} + m + ${CMAKE_THREAD_LIBS_INIT}) + if(NOT DEFINED ENV{SKIP_EXEC}) add_executable(nvim ${NEOVIM_SOURCES} ${OS_SOURCES}) target_link_libraries(nvim ${NVIM_LINK_LIBRARIES})