FindOpenSSL.cmake 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  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 <neundorf@kde.org>
  44. # Copyright 2009-2011 Mathieu Malaterre <mathieu.malaterre@gmail.com>
  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. NAMES_PER_DIR
  144. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  145. PATH_SUFFIXES
  146. ${_OPENSSL_PATH_SUFFIXES}
  147. )
  148. find_library(LIB_EAY_RELEASE
  149. NAMES
  150. libeay32${_OPENSSL_MSVC_RT_MODE}
  151. libeay32
  152. NAMES_PER_DIR
  153. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  154. PATH_SUFFIXES
  155. ${_OPENSSL_PATH_SUFFIXES}
  156. )
  157. find_library(SSL_EAY_DEBUG
  158. NAMES
  159. ssleay32${_OPENSSL_MSVC_RT_MODE}d
  160. ssleay32d
  161. NAMES_PER_DIR
  162. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  163. PATH_SUFFIXES
  164. ${_OPENSSL_PATH_SUFFIXES}
  165. )
  166. find_library(SSL_EAY_RELEASE
  167. NAMES
  168. ssleay32${_OPENSSL_MSVC_RT_MODE}
  169. ssleay32
  170. ssl
  171. NAMES_PER_DIR
  172. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  173. PATH_SUFFIXES
  174. ${_OPENSSL_PATH_SUFFIXES}
  175. )
  176. set(LIB_EAY_LIBRARY_DEBUG "${LIB_EAY_DEBUG}")
  177. set(LIB_EAY_LIBRARY_RELEASE "${LIB_EAY_RELEASE}")
  178. set(SSL_EAY_LIBRARY_DEBUG "${SSL_EAY_DEBUG}")
  179. set(SSL_EAY_LIBRARY_RELEASE "${SSL_EAY_RELEASE}")
  180. include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations.cmake)
  181. select_library_configurations(LIB_EAY)
  182. select_library_configurations(SSL_EAY)
  183. mark_as_advanced(LIB_EAY_LIBRARY_DEBUG LIB_EAY_LIBRARY_RELEASE
  184. SSL_EAY_LIBRARY_DEBUG SSL_EAY_LIBRARY_RELEASE)
  185. set(OPENSSL_SSL_LIBRARY ${SSL_EAY_LIBRARY} )
  186. set(OPENSSL_CRYPTO_LIBRARY ${LIB_EAY_LIBRARY} )
  187. set(OPENSSL_LIBRARIES ${SSL_EAY_LIBRARY} ${LIB_EAY_LIBRARY} )
  188. elseif(MINGW)
  189. # same player, for MinGW
  190. set(LIB_EAY_NAMES crypto libeay32)
  191. set(SSL_EAY_NAMES ssl ssleay32)
  192. find_library(LIB_EAY
  193. NAMES
  194. ${LIB_EAY_NAMES}
  195. NAMES_PER_DIR
  196. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  197. PATH_SUFFIXES
  198. "lib"
  199. "lib/MinGW"
  200. )
  201. find_library(SSL_EAY
  202. NAMES
  203. ${SSL_EAY_NAMES}
  204. NAMES_PER_DIR
  205. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  206. PATH_SUFFIXES
  207. "lib"
  208. "lib/MinGW"
  209. )
  210. mark_as_advanced(SSL_EAY LIB_EAY)
  211. set(OPENSSL_SSL_LIBRARY ${SSL_EAY} )
  212. set(OPENSSL_CRYPTO_LIBRARY ${LIB_EAY} )
  213. set(OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} )
  214. unset(LIB_EAY_NAMES)
  215. unset(SSL_EAY_NAMES)
  216. else()
  217. # Not sure what to pick for -say- intel, let's use the toplevel ones and hope someone report issues:
  218. find_library(LIB_EAY
  219. NAMES
  220. libeay32
  221. NAMES_PER_DIR
  222. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  223. HINTS
  224. ${_OPENSSL_LIBDIR}
  225. PATH_SUFFIXES
  226. lib
  227. )
  228. find_library(SSL_EAY
  229. NAMES
  230. ssleay32
  231. NAMES_PER_DIR
  232. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  233. HINTS
  234. ${_OPENSSL_LIBDIR}
  235. PATH_SUFFIXES
  236. lib
  237. )
  238. mark_as_advanced(SSL_EAY LIB_EAY)
  239. set(OPENSSL_SSL_LIBRARY ${SSL_EAY} )
  240. set(OPENSSL_CRYPTO_LIBRARY ${LIB_EAY} )
  241. set(OPENSSL_LIBRARIES ${SSL_EAY} ${LIB_EAY} )
  242. endif()
  243. else()
  244. find_library(OPENSSL_SSL_LIBRARY
  245. NAMES
  246. ssl
  247. ssleay32
  248. ssleay32MD
  249. NAMES_PER_DIR
  250. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  251. HINTS
  252. ${_OPENSSL_LIBDIR}
  253. PATH_SUFFIXES
  254. lib
  255. )
  256. find_library(OPENSSL_CRYPTO_LIBRARY
  257. NAMES
  258. crypto
  259. NAMES_PER_DIR
  260. ${_OPENSSL_ROOT_HINTS_AND_PATHS}
  261. HINTS
  262. ${_OPENSSL_LIBDIR}
  263. PATH_SUFFIXES
  264. lib
  265. )
  266. mark_as_advanced(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY)
  267. # compat defines
  268. set(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY})
  269. set(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
  270. set(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
  271. endif()
  272. function(from_hex HEX DEC)
  273. string(TOUPPER "${HEX}" HEX)
  274. set(_res 0)
  275. string(LENGTH "${HEX}" _strlen)
  276. while (_strlen GREATER 0)
  277. math(EXPR _res "${_res} * 16")
  278. string(SUBSTRING "${HEX}" 0 1 NIBBLE)
  279. string(SUBSTRING "${HEX}" 1 -1 HEX)
  280. if (NIBBLE STREQUAL "A")
  281. math(EXPR _res "${_res} + 10")
  282. elseif (NIBBLE STREQUAL "B")
  283. math(EXPR _res "${_res} + 11")
  284. elseif (NIBBLE STREQUAL "C")
  285. math(EXPR _res "${_res} + 12")
  286. elseif (NIBBLE STREQUAL "D")
  287. math(EXPR _res "${_res} + 13")
  288. elseif (NIBBLE STREQUAL "E")
  289. math(EXPR _res "${_res} + 14")
  290. elseif (NIBBLE STREQUAL "F")
  291. math(EXPR _res "${_res} + 15")
  292. else()
  293. math(EXPR _res "${_res} + ${NIBBLE}")
  294. endif()
  295. string(LENGTH "${HEX}" _strlen)
  296. endwhile()
  297. set(${DEC} ${_res} PARENT_SCOPE)
  298. endfunction()
  299. if (OPENSSL_INCLUDE_DIR)
  300. if(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h")
  301. file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str
  302. REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*")
  303. # The version number is encoded as 0xMNNFFPPS: major minor fix patch status
  304. # The status gives if this is a developer or prerelease and is ignored here.
  305. # Major, minor, and fix directly translate into the version numbers shown in
  306. # the string. The patch field translates to the single character suffix that
  307. # indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so
  308. # on.
  309. 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]).*$"
  310. "\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}")
  311. list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
  312. list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
  313. from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR)
  314. list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX)
  315. from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX)
  316. list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH)
  317. if (NOT OPENSSL_VERSION_PATCH STREQUAL "00")
  318. from_hex("${OPENSSL_VERSION_PATCH}" _tmp)
  319. # 96 is the ASCII code of 'a' minus 1
  320. math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96")
  321. unset(_tmp)
  322. # Once anyone knows how OpenSSL would call the patch versions beyond 'z'
  323. # this should be updated to handle that, too. This has not happened yet
  324. # so it is simply ignored here for now.
  325. string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING)
  326. endif ()
  327. set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}")
  328. endif ()
  329. endif ()
  330. include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)
  331. if (OPENSSL_VERSION)
  332. find_package_handle_standard_args(OpenSSL
  333. REQUIRED_VARS
  334. OPENSSL_LIBRARIES
  335. OPENSSL_INCLUDE_DIR
  336. VERSION_VAR
  337. OPENSSL_VERSION
  338. FAIL_MESSAGE
  339. "Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR"
  340. )
  341. else ()
  342. 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"
  343. OPENSSL_LIBRARIES
  344. OPENSSL_INCLUDE_DIR
  345. )
  346. endif ()
  347. mark_as_advanced(OPENSSL_INCLUDE_DIR OPENSSL_LIBRARIES)
  348. if(OPENSSL_FOUND)
  349. if(NOT TARGET OpenSSL::Crypto AND
  350. (EXISTS "${OPENSSL_CRYPTO_LIBRARY}" OR
  351. EXISTS "${LIB_EAY_LIBRARY_DEBUG}" OR
  352. EXISTS "${LIB_EAY_LIBRARY_RELEASE}")
  353. )
  354. add_library(OpenSSL::Crypto UNKNOWN IMPORTED)
  355. set_target_properties(OpenSSL::Crypto PROPERTIES
  356. INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
  357. if(EXISTS "${OPENSSL_CRYPTO_LIBRARY}")
  358. set_target_properties(OpenSSL::Crypto PROPERTIES
  359. IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  360. IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}")
  361. endif()
  362. if(EXISTS "${LIB_EAY_LIBRARY_DEBUG}")
  363. set_property(TARGET OpenSSL::Crypto APPEND PROPERTY
  364. IMPORTED_CONFIGURATIONS DEBUG)
  365. set_target_properties(OpenSSL::Crypto PROPERTIES
  366. IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
  367. IMPORTED_LOCATION_DEBUG "${LIB_EAY_LIBRARY_DEBUG}")
  368. endif()
  369. if(EXISTS "${LIB_EAY_LIBRARY_RELEASE}")
  370. set_property(TARGET OpenSSL::Crypto APPEND PROPERTY
  371. IMPORTED_CONFIGURATIONS RELEASE)
  372. set_target_properties(OpenSSL::Crypto PROPERTIES
  373. IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
  374. IMPORTED_LOCATION_RELEASE "${LIB_EAY_LIBRARY_RELEASE}")
  375. endif()
  376. endif()
  377. if(NOT TARGET OpenSSL::SSL AND
  378. (EXISTS "${OPENSSL_SSL_LIBRARY}" OR
  379. EXISTS "${SSL_EAY_LIBRARY_DEBUG}" OR
  380. EXISTS "${SSL_EAY_LIBRARY_RELEASE}")
  381. )
  382. add_library(OpenSSL::SSL UNKNOWN IMPORTED)
  383. set_target_properties(OpenSSL::SSL PROPERTIES
  384. INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
  385. if(EXISTS "${OPENSSL_SSL_LIBRARY}")
  386. set_target_properties(OpenSSL::SSL PROPERTIES
  387. IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  388. IMPORTED_LOCATION "${OPENSSL_SSL_LIBRARY}")
  389. endif()
  390. if(EXISTS "${SSL_EAY_LIBRARY_DEBUG}")
  391. set_property(TARGET OpenSSL::SSL APPEND PROPERTY
  392. IMPORTED_CONFIGURATIONS DEBUG)
  393. set_target_properties(OpenSSL::SSL PROPERTIES
  394. IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
  395. IMPORTED_LOCATION_DEBUG "${SSL_EAY_LIBRARY_DEBUG}")
  396. endif()
  397. if(EXISTS "${SSL_EAY_LIBRARY_RELEASE}")
  398. set_property(TARGET OpenSSL::SSL APPEND PROPERTY
  399. IMPORTED_CONFIGURATIONS RELEASE)
  400. set_target_properties(OpenSSL::SSL PROPERTIES
  401. IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
  402. IMPORTED_LOCATION_RELEASE "${SSL_EAY_LIBRARY_RELEASE}")
  403. endif()
  404. if(TARGET OpenSSL::Crypto)
  405. set_target_properties(OpenSSL::SSL PROPERTIES
  406. INTERFACE_LINK_LIBRARIES OpenSSL::Crypto)
  407. endif()
  408. endif()
  409. endif()
  410. # Restore the original find library ordering
  411. if(OPENSSL_USE_STATIC_LIBS)
  412. set(CMAKE_FIND_LIBRARY_SUFFIXES ${_openssl_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
  413. endif()