FindOpenSSL.cmake 14 KB

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