FindOpenSSL.cmake 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. #.rst:
  2. # FindOpenSSL
  3. # -----------
  4. #
  5. # Find the OpenSSL encryption library.
  6. #
  7. # Imported Targets
  8. # ^^^^^^^^^^^^^^^^
  9. #
  10. # This module defines the following :prop_tgt:`IMPORTED` targets:
  11. #
  12. # ``OpenSSL::SSL``
  13. # The OpenSSL ``ssl`` library, if found.
  14. # ``OpenSSL::Crypto``
  15. # The OpenSSL ``crypto`` library, if found.
  16. #
  17. # Result Variables
  18. # ^^^^^^^^^^^^^^^^
  19. #
  20. # This module will set the following variables in your project:
  21. #
  22. # ``OPENSSL_FOUND``
  23. # System has the OpenSSL library.
  24. # ``OPENSSL_INCLUDE_DIR``
  25. # The OpenSSL include directory.
  26. # ``OPENSSL_CRYPTO_LIBRARY``
  27. # The OpenSSL crypto library.
  28. # ``OPENSSL_SSL_LIBRARY``
  29. # The OpenSSL SSL library.
  30. # ``OPENSSL_LIBRARIES``
  31. # All OpenSSL libraries.
  32. # ``OPENSSL_VERSION``
  33. # This is set to ``$major.$minor.$revision$patch`` (e.g. ``0.9.8s``).
  34. #
  35. # Hints
  36. # ^^^^^
  37. #
  38. # Set ``OPENSSL_ROOT_DIR`` to the root directory of an OpenSSL installation.
  39. # Set ``OPENSSL_USE_STATIC_LIBS`` to ``TRUE`` to look for static libraries.
  40. # Set ``OPENSSL_MSVC_STATIC_RT`` set ``TRUE`` to choose the MT version of the lib.
  41. #=============================================================================
  42. # Copyright 2006-2009 Kitware, Inc.
  43. # Copyright 2006 Alexander Neundorf <[email protected]>
  44. # Copyright 2009-2011 Mathieu Malaterre <[email protected]>
  45. #
  46. # Distributed under the OSI-approved BSD License (the "License");
  47. # see accompanying file Copyright.txt for details.
  48. #
  49. # This software is distributed WITHOUT ANY WARRANTY; without even the
  50. # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  51. # See the License for more information.
  52. #=============================================================================
  53. # (To distribute this file outside of CMake, substitute the full
  54. # License text for the above reference.)
  55. if (UNIX)
  56. find_package(PkgConfig QUIET)
  57. pkg_check_modules(_OPENSSL QUIET openssl)
  58. endif ()
  59. # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
  60. if(OPENSSL_USE_STATIC_LIBS)
  61. set(_openssl_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
  62. if(WIN32)
  63. set(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
  64. else()
  65. set(CMAKE_FIND_LIBRARY_SUFFIXES .a )
  66. endif()
  67. endif()
  68. if (WIN32)
  69. # http://www.slproweb.com/products/Win32OpenSSL.html
  70. set(_OPENSSL_ROOT_HINTS
  71. ${OPENSSL_ROOT_DIR}
  72. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (32-bit)_is1;Inno Setup: App Path]"
  73. "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\OpenSSL (64-bit)_is1;Inno Setup: App Path]"
  74. ENV OPENSSL_ROOT_DIR
  75. )
  76. file(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
  77. set(_OPENSSL_ROOT_PATHS
  78. "${_programfiles}/OpenSSL"
  79. "${_programfiles}/OpenSSL-Win32"
  80. "${_programfiles}/OpenSSL-Win64"
  81. "C:/OpenSSL/"
  82. "C:/OpenSSL-Win32/"
  83. "C:/OpenSSL-Win64/"
  84. )
  85. unset(_programfiles)
  86. else ()
  87. set(_OPENSSL_ROOT_HINTS
  88. ${OPENSSL_ROOT_DIR}
  89. ENV OPENSSL_ROOT_DIR
  90. )
  91. endif ()
  92. set(_OPENSSL_ROOT_HINTS_AND_PATHS
  93. HINTS ${_OPENSSL_ROOT_HINTS}
  94. PATHS ${_OPENSSL_ROOT_PATHS}
  95. )
  96. find_path(OPENSSL_INCLUDE_DIR
  97. NAMES
  98. openssl/ssl.h
  99. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  100. HINTS
  101. ${_OPENSSL_INCLUDEDIR}
  102. PATH_SUFFIXES
  103. include
  104. )
  105. if(WIN32 AND NOT CYGWIN)
  106. if(MSVC)
  107. # /MD and /MDd are the standard values - if someone wants to use
  108. # others, the libnames have to change here too
  109. # use also ssl and ssleay32 in debug as fallback for openssl < 0.9.8b
  110. # enable OPENSSL_MSVC_STATIC_RT to get the libs build /MT (Multithreaded no-DLL)
  111. # In Visual C++ naming convention each of these four kinds of Windows libraries has it's standard suffix:
  112. # * MD for dynamic-release
  113. # * MDd for dynamic-debug
  114. # * MT for static-release
  115. # * MTd for static-debug
  116. # Implementation details:
  117. # We are using the libraries located in the VC subdir instead of the parent directory eventhough :
  118. # libeay32MD.lib is identical to ../libeay32.lib, and
  119. # ssleay32MD.lib is identical to ../ssleay32.lib
  120. # enable OPENSSL_USE_STATIC_LIBS to use the static libs located in lib/VC/static
  121. if (OPENSSL_MSVC_STATIC_RT)
  122. set(_OPENSSL_MSVC_RT_MODE "MT")
  123. else ()
  124. set(_OPENSSL_MSVC_RT_MODE "MD")
  125. endif ()
  126. if(OPENSSL_USE_STATIC_LIBS)
  127. set(_OPENSSL_PATH_SUFFIXES
  128. "lib"
  129. "VC/static"
  130. "lib/VC/static"
  131. )
  132. else()
  133. set(_OPENSSL_PATH_SUFFIXES
  134. "lib"
  135. "VC"
  136. "lib/VC"
  137. )
  138. endif ()
  139. find_library(LIB_EAY_DEBUG
  140. NAMES
  141. libeay32${_OPENSSL_MSVC_RT_MODE}d
  142. libeay32d
  143. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  144. PATH_SUFFIXES
  145. ${_OPENSSL_PATH_SUFFIXES}
  146. )
  147. find_library(LIB_EAY_RELEASE
  148. NAMES
  149. libeay32${_OPENSSL_MSVC_RT_MODE}
  150. libeay32
  151. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  152. PATH_SUFFIXES
  153. ${_OPENSSL_PATH_SUFFIXES}
  154. )
  155. find_library(SSL_EAY_DEBUG
  156. NAMES
  157. ssleay32${_OPENSSL_MSVC_RT_MODE}d
  158. ssleay32d
  159. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  160. PATH_SUFFIXES
  161. ${_OPENSSL_PATH_SUFFIXES}
  162. )
  163. find_library(SSL_EAY_RELEASE
  164. NAMES
  165. ssleay32${_OPENSSL_MSVC_RT_MODE}
  166. ssleay32
  167. ssl
  168. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  169. PATH_SUFFIXES
  170. ${_OPENSSL_PATH_SUFFIXES}
  171. )
  172. set(LIB_EAY_LIBRARY_DEBUG "${LIB_EAY_DEBUG}")
  173. set(LIB_EAY_LIBRARY_RELEASE "${LIB_EAY_RELEASE}")
  174. set(SSL_EAY_LIBRARY_DEBUG "${SSL_EAY_DEBUG}")
  175. set(SSL_EAY_LIBRARY_RELEASE "${SSL_EAY_RELEASE}")
  176. include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
  177. select_library_configurations(LIB_EAY)
  178. select_library_configurations(SSL_EAY)
  179. mark_as_advanced(LIB_EAY_LIBRARY_DEBUG LIB_EAY_LIBRARY_RELEASE
  180. SSL_EAY_LIBRARY_DEBUG SSL_EAY_LIBRARY_RELEASE)
  181. set(OPENSSL_SSL_LIBRARY ${SSL_EAY_LIBRARY} )
  182. set(OPENSSL_CRYPTO_LIBRARY ${LIB_EAY_LIBRARY} )
  183. set(OPENSSL_LIBRARIES ${SSL_EAY_LIBRARY} ${LIB_EAY_LIBRARY} )
  184. elseif(MINGW)
  185. # same player, for MinGW
  186. set(LIB_EAY_NAMES libeay32)
  187. set(SSL_EAY_NAMES ssleay32)
  188. if(CMAKE_CROSSCOMPILING)
  189. list(APPEND LIB_EAY_NAMES crypto)
  190. list(APPEND SSL_EAY_NAMES ssl)
  191. endif()
  192. find_library(LIB_EAY
  193. NAMES
  194. ${LIB_EAY_NAMES}
  195. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  196. PATH_SUFFIXES
  197. "lib"
  198. "lib/MinGW"
  199. )
  200. find_library(SSL_EAY
  201. NAMES
  202. ${SSL_EAY_NAMES}
  203. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  204. PATH_SUFFIXES
  205. "lib"
  206. "lib/MinGW"
  207. )
  208. mark_as_advanced(SSL_EAY LIB_EAY)
  209. set(OPENSSL_SSL_LIBRARY ${SSL_EAY} )
  210. set(OPENSSL_CRYPTO_LIBRARY ${LIB_EAY} )
  211. set(OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} )
  212. unset(LIB_EAY_NAMES)
  213. unset(SSL_EAY_NAMES)
  214. else()
  215. # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues:
  216. find_library(LIB_EAY
  217. NAMES
  218. libeay32
  219. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  220. HINTS
  221. ${_OPENSSL_LIBDIR}
  222. PATH_SUFFIXES
  223. lib
  224. )
  225. find_library(SSL_EAY
  226. NAMES
  227. ssleay32
  228. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  229. HINTS
  230. ${_OPENSSL_LIBDIR}
  231. PATH_SUFFIXES
  232. lib
  233. )
  234. mark_as_advanced(SSL_EAY LIB_EAY)
  235. set(OPENSSL_SSL_LIBRARY ${SSL_EAY} )
  236. set(OPENSSL_CRYPTO_LIBRARY ${LIB_EAY} )
  237. set(OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} )
  238. endif()
  239. else()
  240. find_library(OPENSSL_SSL_LIBRARY
  241. NAMES
  242. ssl
  243. ssleay32
  244. ssleay32MD
  245. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  246. HINTS
  247. ${_OPENSSL_LIBDIR}
  248. PATH_SUFFIXES
  249. lib
  250. )
  251. find_library(OPENSSL_CRYPTO_LIBRARY
  252. NAMES
  253. crypto
  254. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  255. HINTS
  256. ${_OPENSSL_LIBDIR}
  257. PATH_SUFFIXES
  258. lib
  259. )
  260. mark_as_advanced(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY)
  261. # compat defines
  262. set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY})
  263. set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
  264. set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
  265. endif()
  266. function(from_hex HEX DEC)
  267. string(TOUPPER "${HEX}" HEX)
  268. set(_res 0)
  269. string(LENGTH "${HEX}" _strlen)
  270. while (_strlen GREATER 0)
  271. math(EXPR _res "${_res} * 16")
  272. string(SUBSTRING "${HEX}" 0 1 NIBBLE)
  273. string(SUBSTRING "${HEX}" 1 -1 HEX)
  274. if (NIBBLE STREQUAL "A")
  275. math(EXPR _res "${_res} + 10")
  276. elseif (NIBBLE STREQUAL "B")
  277. math(EXPR _res "${_res} + 11")
  278. elseif (NIBBLE STREQUAL "C")
  279. math(EXPR _res "${_res} + 12")
  280. elseif (NIBBLE STREQUAL "D")
  281. math(EXPR _res "${_res} + 13")
  282. elseif (NIBBLE STREQUAL "E")
  283. math(EXPR _res "${_res} + 14")
  284. elseif (NIBBLE STREQUAL "F")
  285. math(EXPR _res "${_res} + 15")
  286. else()
  287. math(EXPR _res "${_res} + ${NIBBLE}")
  288. endif()
  289. string(LENGTH "${HEX}" _strlen)
  290. endwhile()
  291. set(${DEC} ${_res} PARENT_SCOPE)
  292. endfunction()
  293. if (OPENSSL_INCLUDE_DIR)
  294. if(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h")
  295. file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str
  296. REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*")
  297. # The version number is encoded as 0xMNNFFPPS: major minor fix patch status
  298. # The status gives if this is a developer or prerelease and is ignored here.
  299. # Major, minor, and fix directly translate into the version numbers shown in
  300. # the string. The patch field translates to the single character suffix that
  301. # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so
  302. # on.
  303. 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]).*$"
  304. "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}")
  305. list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
  306. list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
  307. from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR)
  308. list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX)
  309. from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX)
  310. list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH)
  311. if (NOT OPENSSL_VERSION_PATCH STREQUAL "00")
  312. from_hex("${OPENSSL_VERSION_PATCH}" _tmp)
  313. # 96 is the ASCII code of 'a' minus 1
  314. math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96")
  315. unset(_tmp)
  316. # Once anyone knows how OpenSSL would call the patch versions beyond 'z'
  317. # this should be updated to handle that, too. This has not happened yet
  318. # so it is simply ignored here for now.
  319. string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING)
  320. endif ()
  321. set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}")
  322. endif ()
  323. endif ()
  324. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  325. if (OPENSSL_VERSION)
  326. find_package_handle_standard_args(OpenSSL
  327. REQUIRED_VARS
  328. OPENSSL_LIBRARIES
  329. OPENSSL_INCLUDE_DIR
  330. VERSION_VAR
  331. OPENSSL_VERSION
  332. FAIL_MESSAGE
  333. "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR"
  334. )
  335. else ()
  336. 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"
  337. OPENSSL_LIBRARIES
  338. OPENSSL_INCLUDE_DIR
  339. )
  340. endif ()
  341. mark_as_advanced(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES)
  342. if(OPENSSL_FOUND)
  343. if(NOT TARGET OpenSSL::Crypto AND
  344. (EXISTS "${OPENSSL_CRYPTO_LIBRARY}" OR
  345. EXISTS "${LIB_EAY_LIBRARY_DEBUG}" OR
  346. EXISTS "${LIB_EAY_LIBRARY_RELEASE}")
  347. )
  348. add_library(OpenSSL::Crypto UNKNOWN IMPORTED)
  349. set_target_properties(OpenSSL::Crypto PROPERTIES
  350. INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
  351. if(EXISTS "${OPENSSL_CRYPTO_LIBRARY}")
  352. set_target_properties(OpenSSL::Crypto PROPERTIES
  353. IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  354. IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}")
  355. endif()
  356. if(EXISTS "${LIB_EAY_LIBRARY_DEBUG}")
  357. set_property(TARGET OpenSSL::Crypto APPEND PROPERTY
  358. IMPORTED_CONFIGURATIONS DEBUG)
  359. set_target_properties(OpenSSL::Crypto PROPERTIES
  360. IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
  361. IMPORTED_LOCATION_DEBUG "${LIB_EAY_LIBRARY_DEBUG}")
  362. endif()
  363. if(EXISTS "${LIB_EAY_LIBRARY_RELEASE}")
  364. set_property(TARGET OpenSSL::Crypto APPEND PROPERTY
  365. IMPORTED_CONFIGURATIONS RELEASE)
  366. set_target_properties(OpenSSL::Crypto PROPERTIES
  367. IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
  368. IMPORTED_LOCATION_RELEASE "${LIB_EAY_LIBRARY_RELEASE}")
  369. endif()
  370. endif()
  371. if(NOT TARGET OpenSSL::SSL AND
  372. (EXISTS "${OPENSSL_SSL_LIBRARY}" OR
  373. EXISTS "${SSL_EAY_LIBRARY_DEBUG}" OR
  374. EXISTS "${SSL_EAY_LIBRARY_RELEASE}")
  375. )
  376. add_library(OpenSSL::SSL UNKNOWN IMPORTED)
  377. set_target_properties(OpenSSL::SSL PROPERTIES
  378. INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
  379. if(EXISTS "${OPENSSL_SSL_LIBRARY}")
  380. set_target_properties(OpenSSL::SSL PROPERTIES
  381. IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  382. IMPORTED_LOCATION "${OPENSSL_SSL_LIBRARY}")
  383. endif()
  384. if(EXISTS "${SSL_EAY_LIBRARY_DEBUG}")
  385. set_property(TARGET OpenSSL::SSL APPEND PROPERTY
  386. IMPORTED_CONFIGURATIONS DEBUG)
  387. set_target_properties(OpenSSL::SSL PROPERTIES
  388. IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
  389. IMPORTED_LOCATION_DEBUG "${SSL_EAY_LIBRARY_DEBUG}")
  390. endif()
  391. if(EXISTS "${SSL_EAY_LIBRARY_RELEASE}")
  392. set_property(TARGET OpenSSL::SSL APPEND PROPERTY
  393. IMPORTED_CONFIGURATIONS RELEASE)
  394. set_target_properties(OpenSSL::SSL PROPERTIES
  395. IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
  396. IMPORTED_LOCATION_RELEASE "${SSL_EAY_LIBRARY_RELEASE}")
  397. endif()
  398. if(TARGET OpenSSL::Crypto)
  399. set_target_properties(OpenSSL::SSL PROPERTIES
  400. INTERFACE_LINK_LIBRARIES OpenSSL::Crypto)
  401. endif()
  402. endif()
  403. endif()
  404. # Restore the original find library ordering
  405. if(OPENSSL_USE_STATIC_LIBS)
  406. set(CMAKE_FIND_LIBRARY_SUFFIXES ${_openssl_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
  407. endif()