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