FindOpenSSL.cmake 14 KB

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