FindLIBMEMCACHED.cmake 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. ################################################################################
  2. # HPCC SYSTEMS software Copyright (C) 2014 HPCC Systems®.
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. ################################################################################
  16. # - Try to find the libmemcached library
  17. # Once done this will define
  18. #
  19. # LIBMEMCACHED_FOUND - system has the libmemcached library
  20. # LIBMEMCACHED_INCLUDE_DIR - the libmemcached include directory(s)
  21. # LIBMEMCACHED_LIBRARIES - The libraries needed to use libmemcached
  22. # If the memcached libraries are found on the system, we assume they exist natively and dependencies
  23. # can be handled through package management. If the libraries are not found, and if
  24. # MEMCACHED_USE_EXTERNAL_LIBRARY is ON, we will fetch, build, and include a copy of the neccessary
  25. # Libraries.
  26. IF (NOT LIBMEMCACHED_FOUND)
  27. option(MEMCACHED_USE_EXTERNAL_LIBRARY "Pull and build source from external location if local is not found" ON)
  28. if(NOT LIBMEMCACHED_VERSION)
  29. set(LIBMEMCACHED_VERSION "${LIBMEMCACHED_FIND_VERSION}")
  30. endif()
  31. # Search for native library to build against
  32. IF (WIN32)
  33. SET (libmemcached_lib "libmemcached")
  34. SET (libmemcachedUtil_lib "libmemcachedutil")
  35. ELSE()
  36. SET (libmemcached_lib "memcached")
  37. SET (libmemcachedUtil_lib "memcachedutil")
  38. ENDIF()
  39. FIND_PATH(LIBMEMCACHED_INCLUDE_DIR libmemcached/memcached.hpp PATHS /usr/include /usr/share/include /usr/local/include PATH_SUFFIXES libmemcached)
  40. FIND_LIBRARY (LIBMEMCACHEDCORE_LIBRARY NAMES ${libmemcached_lib} PATHS /usr/lib usr/lib/libmemcached /usr/share /usr/lib64 /usr/local/lib /usr/local/lib64)
  41. FIND_LIBRARY (LIBMEMCACHEDUTIL_LIBRARY NAMES ${libmemcachedUtil_lib} PATHS /usr/lib /usr/share /usr/lib64 /usr/local/lib /usr/local/lib64)
  42. #IF (LIBMEMCACHED_LIBRARY STREQUAL "LIBMEMCACHED_LIBRARY-NOTFOUND")
  43. # SET (LIBMEMCACHEDCORE_LIBRARY "") # Newer versions of libmemcached are header-only, with no associated library.
  44. #ENDIF()
  45. SET (LIBMEMCACHED_LIBRARIES ${LIBMEMCACHEDCORE_LIBRARY} ${LIBMEMCACHEDUTIL_LIBRARY})
  46. IF(LIBMEMCACHED_INCLUDE_DIR)
  47. FILE (STRINGS "${LIBMEMCACHED_INCLUDE_DIR}/libmemcached-1.0/configure.h" version REGEX "#define LIBMEMCACHED_VERSION_STRING")
  48. STRING(REGEX REPLACE "#define LIBMEMCACHED_VERSION_STRING " "" version "${version}")
  49. STRING(REGEX REPLACE "\"" "" version "${version}")
  50. SET (LIBMEMCACHED_VERSION_STRING ${version})
  51. IF ("${LIBMEMCACHED_VERSION_STRING}" VERSION_EQUAL "${LIBMEMCACHED_FIND_VERSION}" OR "${LIBMEMCACHED_VERSION_STRING}" VERSION_GREATER "${LIBMEMCACHED_FIND_VERSION}")
  52. SET (LIBMEMCACHED_VERSION_OK 1)
  53. SET (MSG "${DEFAULT_MSG}")
  54. ELSE()
  55. SET (LIBMEMCACHED_VERSION_OK 0)
  56. SET(MSG "libmemcached version '${LIBMEMCACHED_VERSION_STRING}' incompatible with min version>=${LIBMEMCACHED_FIND_VERSION}")
  57. ENDIF()
  58. ENDIF()
  59. include(FindPackageHandleStandardArgs)
  60. find_package_handle_standard_args(libmemcached ${MSG}
  61. LIBMEMCACHED_LIBRARIES
  62. LIBMEMCACHED_INCLUDE_DIR
  63. LIBMEMCACHED_VERSION_OK
  64. )
  65. if(NOT LIBMEMCACHED_FOUND AND MEMCACHED_USE_EXTERNAL_LIBRARY)
  66. # Currently libmemcached versions are not sufficient on ubuntu 12.04 and 14.04 LTS
  67. # until then, we build the required libraries from source
  68. set(LIBMEMCACHED_URL https://launchpad.net/libmemcached/1.0/${LIBMEMCACHED_VERSION}/+download/libmemcached-${LIBMEMCACHED_VERSION}.tar.gz)
  69. if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/libmemcached-${LIBMEMCACHED_VERSION}.tar.gz)
  70. file(DOWNLOAD
  71. ${LIBMEMCACHED_URL} ${CMAKE_CURRENT_SOURCE_DIR}/libmemcached-${LIBMEMCACHED_VERSION}.tar.gz
  72. STATUS libmemcached_status
  73. LOG libmemcached_log
  74. TIMEOUT 30
  75. TLS_VERIFY ON)
  76. list(GET libmemcached_status 0 status_code)
  77. list(GET libmemcached_status 1 status_msg)
  78. if(NOT status_code EQUAL 0)
  79. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libmemcached-${LIBMEMCACHED_VERSION}.tar.gz")
  80. file(REMOVE ${CMAKE_CURRENT_SOURCE_DIR}/libmemcached-${LIBMEMCACHED_VERSION}.tar.gz)
  81. endif()
  82. message(FATAL_ERROR "Fatal Error: download of ${LIBMEMCACHED_URL} failed
  83. status_code: ${status_code}
  84. status_msg: ${status_msg}
  85. log: ${libmemcached_log}\n")
  86. else()
  87. message(STATUS "Download of external libmemcached ${LIBMEMCACHED_VERSION} library successful")
  88. endif()
  89. endif()
  90. add_custom_command(
  91. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs/libmemcached.so.11.0.0
  92. COMMAND ${CMAKE_COMMAND} -E tar xzf ${CMAKE_CURRENT_SOURCE_DIR}/libmemcached-${LIBMEMCACHED_VERSION}.tar.gz -C ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}
  93. COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION} ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/configure --prefix=\"${INSTALL_DIR}\" LDFLAGS=\"-L${LIB_PATH}\" > /dev/null
  94. COMMAND ${CMAKE_COMMAND} -E chdir ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION} ${CMAKE_MAKE_PROGRAM} LDFLAGS=\"-Wl,-rpath-link,${LIB_PATH}\" > /dev/null
  95. DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/libmemcached-${LIBMEMCACHED_VERSION}.tar.gz
  96. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
  97. COMMENT "building libmemcached-${LIBMEMCACHED_VERSION}")
  98. add_custom_target(generate-libmemcached
  99. DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs/libmemcached.so.11.0.0)
  100. add_library(libmemcached SHARED IMPORTED)
  101. add_library(libmemcachedutil SHARED IMPORTED)
  102. set_property(TARGET libmemcached
  103. PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs/libmemcached.so.11.0.0)
  104. set_property(TARGET libmemcachedutil
  105. PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs/libmemcachedutil.so.2.0.0)
  106. set_property(TARGET libmemcached
  107. PROPERTY IMPORTED_LINK_DEPENDENT_LIBRARIES libmemcachedutil)
  108. add_dependencies(libmemcached generate-libmemcached)
  109. add_dependencies(libmemcachedutil generate-libmemcached)
  110. install(CODE "set(ENV{LD_LIBRARY_PATH} \"\$ENV{LD_LIBRARY_PATH}:${PROJECT_BINARY_DIR}:${PROJECT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs\")")
  111. install(PROGRAMS
  112. ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs/libmemcached.so
  113. ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs/libmemcached.so.11
  114. ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs/libmemcached.so.11.0.0
  115. ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs/libmemcachedutil.so
  116. ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs/libmemcachedutil.so.2
  117. ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION}/libmemcached/.libs/libmemcachedutil.so.2.0.0
  118. DESTINATION lib)
  119. set(LIBMEMCACHED_LIBRARIES $<TARGET_FILE:libmemcached> $<TARGET_FILE:libmemcachedutil>)
  120. set(LIBMEMCACHED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/libmemcached-${LIBMEMCACHED_VERSION})
  121. IF ("${LIBMEMCACHED_VERSION}" VERSION_EQUAL "${LIBMEMCACHED_FIND_VERSION}" OR "${LIBMEMCACHED_VERSION}" VERSION_GREATER "${LIBMEMCACHED_FIND_VERSION}")
  122. SET (LIBMEMCACHED_VERSION_OK 1)
  123. SET (MSG "${DEFAULT_MSG}")
  124. ELSE()
  125. SET (LIBMEMCACHED_VERSION_OK 0)
  126. SET(MSG "libmemcached version '${LIBMEMCACHED_VERSION}' incompatible with min version>=${LIBMEMCACHED_FIND_VERSION}")
  127. ENDIF()
  128. include(FindPackageHandleStandardArgs)
  129. find_package_handle_standard_args(libmemcached ${MSG}
  130. LIBMEMCACHED_LIBRARIES
  131. LIBMEMCACHED_INCLUDE_DIR
  132. LIBMEMCACHED_VERSION_OK
  133. )
  134. endif()
  135. MARK_AS_ADVANCED(LIBMEMCACHED_INCLUDE_DIRS LIBMEMCACHED_LIBRARIES)
  136. ENDIF()