FindOpenSSL.cmake 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. #.rst:
  2. # FindOpenSSL
  3. # -----------
  4. #
  5. # Try to find the OpenSSL encryption library
  6. #
  7. # Once done this will define
  8. #
  9. # ::
  10. #
  11. # OPENSSL_ROOT_DIR - Set this variable to the root installation of OpenSSL
  12. #
  13. #
  14. #
  15. # Read-Only variables:
  16. #
  17. # ::
  18. #
  19. # OPENSSL_FOUND - system has the OpenSSL library
  20. # OPENSSL_INCLUDE_DIR - the OpenSSL include directory
  21. # OPENSSL_LIBRARIES - The libraries needed to use OpenSSL
  22. # OPENSSL_VERSION - This is set to $major.$minor.$revision$path (eg. 0.9.8s)
  23. #=============================================================================
  24. # Copyright 2006-2009 Kitware, Inc.
  25. # Copyright 2006 Alexander Neundorf <[email protected]>
  26. # Copyright 2009-2011 Mathieu Malaterre <[email protected]>
  27. #
  28. # Distributed under the OSI-approved BSD License (the "License");
  29. # see accompanying file Copyright.txt for details.
  30. #
  31. # This software is distributed WITHOUT ANY WARRANTY; without even the
  32. # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  33. # See the License for more information.
  34. #=============================================================================
  35. # (To distribute this file outside of CMake, substitute the full
  36. # License text for the above reference.)
  37. if (UNIX)
  38. find_package(PkgConfig QUIET)
  39. pkg_check_modules(_OPENSSL QUIET openssl)
  40. endif ()
  41. if (WIN32)
  42. # http://www.slproweb.com/products/Win32OpenSSL.html
  43. set(_OPENSSL_ROOT_HINTS
  44. ${OPENSSL_ROOT_DIR}
  45. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]"
  46. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]"
  47. ENV OPENSSL_ROOT_DIR
  48. )
  49. file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
  50. set(_OPENSSL_ROOT_PATHS
  51. "${_programfiles}/OpenSSL"
  52. "${_programfiles}/OpenSSL-Win32"
  53. "${_programfiles}/OpenSSL-Win64"
  54. "C:/OpenSSL/"
  55. "C:/OpenSSL-Win32/"
  56. "C:/OpenSSL-Win64/"
  57. )
  58. unset(_programfiles)
  59. else ()
  60. set(_OPENSSL_ROOT_HINTS
  61. ${OPENSSL_ROOT_DIR}
  62. ENV OPENSSL_ROOT_DIR
  63. )
  64. endif ()
  65. set(_OPENSSL_ROOT_HINTS_AND_PATHS
  66. HINTS ${_OPENSSL_ROOT_HINTS}
  67. PATHS ${_OPENSSL_ROOT_PATHS}
  68. )
  69. find_path(OPENSSL_INCLUDE_DIR
  70. NAMES
  71. openssl/ssl.h
  72. HINTS
  73. ${_OPENSSL_INCLUDEDIR}
  74. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  75. PATH_SUFFIXES
  76. include
  77. )
  78. if(WIN32 AND NOT CYGWIN)
  79. if(MSVC)
  80. # /MD and /MDd are the standard values - if someone wants to use
  81. # others, the libnames have to change here too
  82. # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b
  83. # TODO: handle /MT and static lib
  84. # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix:
  85. # * MD for dynamic-release
  86. # * MDd for dynamic-debug
  87. # * MT for static-release
  88. # * MTd for static-debug
  89. # Implementation details:
  90. # We are using the libraries located in the VC subdir instead of the parent directory eventhough :
  91. # libeay32MD.lib is identical to ../libeay32.lib, and
  92. # ssleay32MD.lib is identical to ../ssleay32.lib
  93. find_library(LIB_EAY_DEBUG
  94. NAMES
  95. libeay32MDd
  96. libeay32d
  97. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  98. PATH_SUFFIXES
  99. "lib"
  100. "VC"
  101. "lib/VC"
  102. )
  103. find_library(LIB_EAY_RELEASE
  104. NAMES
  105. libeay32MD
  106. libeay32
  107. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  108. PATH_SUFFIXES
  109. "lib"
  110. "VC"
  111. "lib/VC"
  112. )
  113. find_library(SSL_EAY_DEBUG
  114. NAMES
  115. ssleay32MDd
  116. ssleay32d
  117. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  118. PATH_SUFFIXES
  119. "lib"
  120. "VC"
  121. "lib/VC"
  122. )
  123. find_library(SSL_EAY_RELEASE
  124. NAMES
  125. ssleay32MD
  126. ssleay32
  127. ssl
  128. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  129. PATH_SUFFIXES
  130. "lib"
  131. "VC"
  132. "lib/VC"
  133. )
  134. set(LIB_EAY_LIBRARY_DEBUG "${LIB_EAY_DEBUG}")
  135. set(LIB_EAY_LIBRARY_RELEASE "${LIB_EAY_RELEASE}")
  136. set(SSL_EAY_LIBRARY_DEBUG "${SSL_EAY_DEBUG}")
  137. set(SSL_EAY_LIBRARY_RELEASE "${SSL_EAY_RELEASE}")
  138. include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
  139. select_library_configurations(LIB_EAY)
  140. select_library_configurations(SSL_EAY)
  141. mark_as_advanced(LIB_EAY_LIBRARY_DEBUG LIB_EAY_LIBRARY_RELEASE
  142. SSL_EAY_LIBRARY_DEBUG SSL_EAY_LIBRARY_RELEASE)
  143. set( OPENSSL_LIBRARIES ${SSL_EAY_LIBRARY} ${LIB_EAY_LIBRARY} )
  144. elseif(MINGW)
  145. # same player, for MinGW
  146. set(LIB_EAY_NAMES libeay32)
  147. set(SSL_EAY_NAMES ssleay32)
  148. if(CMAKE_CROSSCOMPILING)
  149. list(APPEND LIB_EAY_NAMES crypto)
  150. list(APPEND SSL_EAY_NAMES ssl)
  151. endif()
  152. find_library(LIB_EAY
  153. NAMES
  154. ${LIB_EAY_NAMES}
  155. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  156. PATH_SUFFIXES
  157. "lib"
  158. "lib/MinGW"
  159. )
  160. find_library(SSL_EAY
  161. NAMES
  162. ${SSL_EAY_NAMES}
  163. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  164. PATH_SUFFIXES
  165. "lib"
  166. "lib/MinGW"
  167. )
  168. mark_as_advanced(SSL_EAY LIB_EAY)
  169. set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} )
  170. unset(LIB_EAY_NAMES)
  171. unset(SSL_EAY_NAMES)
  172. else()
  173. # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues:
  174. find_library(LIB_EAY
  175. NAMES
  176. libeay32
  177. HINTS
  178. ${_OPENSSL_LIBDIR}
  179. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  180. PATH_SUFFIXES
  181. lib
  182. )
  183. find_library(SSL_EAY
  184. NAMES
  185. ssleay32
  186. HINTS
  187. ${_OPENSSL_LIBDIR}
  188. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  189. PATH_SUFFIXES
  190. lib
  191. )
  192. mark_as_advanced(SSL_EAY LIB_EAY)
  193. set( OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} )
  194. endif()
  195. else()
  196. find_library(OPENSSL_SSL_LIBRARY
  197. NAMES
  198. ssl
  199. ssleay32
  200. ssleay32MD
  201. HINTS
  202. ${_OPENSSL_LIBDIR}
  203. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  204. PATH_SUFFIXES
  205. lib
  206. )
  207. find_library(OPENSSL_CRYPTO_LIBRARY
  208. NAMES
  209. crypto
  210. HINTS
  211. ${_OPENSSL_LIBDIR}
  212. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  213. PATH_SUFFIXES
  214. lib
  215. )
  216. mark_as_advanced(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY)
  217. # compat defines
  218. set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY})
  219. set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
  220. set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
  221. endif()
  222. function(from_hex HEX DEC)
  223. string(TOUPPER "${HEX}" HEX)
  224. set(_res 0)
  225. string(LENGTH "${HEX}" _strlen)
  226. while (_strlen GREATER 0)
  227. math(EXPR _res "${_res} * 16")
  228. string(SUBSTRING "${HEX}" 0 1 NIBBLE)
  229. string(SUBSTRING "${HEX}" 1 -1 HEX)
  230. if (NIBBLE STREQUAL "A")
  231. math(EXPR _res "${_res} + 10")
  232. elseif (NIBBLE STREQUAL "B")
  233. math(EXPR _res "${_res} + 11")
  234. elseif (NIBBLE STREQUAL "C")
  235. math(EXPR _res "${_res} + 12")
  236. elseif (NIBBLE STREQUAL "D")
  237. math(EXPR _res "${_res} + 13")
  238. elseif (NIBBLE STREQUAL "E")
  239. math(EXPR _res "${_res} + 14")
  240. elseif (NIBBLE STREQUAL "F")
  241. math(EXPR _res "${_res} + 15")
  242. else()
  243. math(EXPR _res "${_res} + ${NIBBLE}")
  244. endif()
  245. string(LENGTH "${HEX}" _strlen)
  246. endwhile()
  247. set(${DEC} ${_res} PARENT_SCOPE)
  248. endfunction()
  249. if (OPENSSL_INCLUDE_DIR)
  250. if (_OPENSSL_VERSION)
  251. set(OPENSSL_VERSION "${_OPENSSL_VERSION}")
  252. elseif(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h")
  253. file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str
  254. REGEX "^#define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*")
  255. # The version number is encoded as 0xMNNFFPPS: major minor fix patch status
  256. # The status gives if this is a developer or prerelease and is ignored here.
  257. # Major, minor, and fix directly translate into the version numbers shown in
  258. # the string. The patch field translates to the single character suffix that
  259. # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so
  260. # on.
  261. string(REGEX REPLACE "^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F][0-9a-fA-F])([0-9a-fA-F]).*$"
  262. "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}")
  263. list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
  264. list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
  265. from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR)
  266. list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX)
  267. from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX)
  268. list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH)
  269. if (NOT OPENSSL_VERSION_PATCH STREQUAL "00")
  270. from_hex("${OPENSSL_VERSION_PATCH}" _tmp)
  271. # 96 is the ASCII code of 'a' minus 1
  272. math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96")
  273. unset(_tmp)
  274. # Once anyone knows how OpenSSL would call the patch versions beyond 'z'
  275. # this should be updated to handle that, too. This has not happened yet
  276. # so it is simply ignored here for now.
  277. string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING)
  278. endif ()
  279. set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}")
  280. endif ()
  281. endif ()
  282. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  283. if (OPENSSL_VERSION)
  284. find_package_handle_standard_args(OpenSSL
  285. REQUIRED_VARS
  286. OPENSSL_LIBRARIES
  287. OPENSSL_INCLUDE_DIR
  288. VERSION_VAR
  289. OPENSSL_VERSION
  290. FAIL_MESSAGE
  291. "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR"
  292. )
  293. else ()
  294. find_package_handle_standard_args(OpenSSL "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR"
  295. OPENSSL_LIBRARIES
  296. OPENSSL_INCLUDE_DIR
  297. )
  298. endif ()
  299. mark_as_advanced(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES)