diff --git a/cmake/FindOpenSSLbins.cmake b/cmake/FindOpenSSLbins.cmake index 5611c04cd..3f32994a0 100644 --- a/cmake/FindOpenSSLbins.cmake +++ b/cmake/FindOpenSSLbins.cmake @@ -1,42 +1,102 @@ - -if(OPENSSL_FOUND) - - find_program(OPENSSL_EXECUTABLE openssl openssl.exe bin/openssl.exe - HINTS ${_OPENSSL_ROOT_HINTS} - PATH - /usr/bin/ - bin/ - DOC "Openssl executable") - - mark_as_advanced(OPENSSL_EXECUTABLE) - - # On Windows, we need to copy the OpenSSL dlls - # to the output directory. - if(WIN32) - set(OPENSSL_BIN_FOUND 0) - - find_file(LIBEAY_BIN - NAMES - libeay32.dll - HINTS - ${_OPENSSL_ROOT_HINTS} - PATH_SUFFIXES - bin) - - find_file(SSLEAY_BIN - NAMES - ssleay32.dll - HINTS - ${_OPENSSL_ROOT_HINTS} - PATH_SUFFIXES - bin) - - if(LIBEAY_BIN) - if(SSLEAY_BIN) - set(OPENSSL_BIN_FOUND 1) - endif(SSLEAY_BIN) - endif(LIBEAY_BIN) - endif(WIN32) - -endif(OPENSSL_FOUND) - + +if(OPENSSL_FOUND) + + find_program(OPENSSL_EXECUTABLE openssl openssl.exe bin/openssl.exe + HINTS ${_OPENSSL_ROOT_HINTS} + PATH + /usr/bin/ + bin/ + DOC "Openssl executable") + + mark_as_advanced(OPENSSL_EXECUTABLE) + + # On Windows, we need to copy the OpenSSL dlls + # to the output directory. + # BUT only if non-static libs (referencing dlls) are used + # In this case + # ** we only want to find dlls that are compatible with the libs + # the assumption is that these are part of the same OpenSSL package + # and typically reside in the same or in a close by directory as the executable + # ** we do NOT want to find dlls in general dll directories such as C:\Windows\systemXX + # because these IN GENERAL are not compatible with the libs + if (WIN32 AND OPENSSL_VERSION) + set(OPENSSL_BIN_FOUND 0) + + # we check for OpenSSL versioning, as described in https://wiki.openssl.org/index.php/Versioning + string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.(.*)$" REGEX_MATCH ${OPENSSL_VERSION}) + + if (NOT ${REGEX_MATCH} EQUAL "") + + message(DEBUG "Assuming OpenSSL release ${OPENSSL_VERSION} >= 1.1.0 for dll discovery") + + # the regex matched - so we assume OpenSSL release >= 1.1 + set(OVNR "${CMAKE_MATCH_1}") # OpenSSL version number + set(ORNR "${CMAKE_MATCH_2}") # OpenSSL release number + set(CRYPTO32_NAME "libcrypto-${OVNR}_${ORNR}.dll") + set(CRYPTO64_NAME "libcrypto-${OVNR}_${ORNR}-x64.dll") + message(VERBOSE "CRYPTO32_NAME=${CRYPTO32_NAME}") + message(VERBOSE "CRYPTO64_NAME=${CRYPTO64_NAME}") + set(SSL32_NAME "libssl-${OVNR}_${ORNR}.dll") + set(SSL64_NAME "libssl-${OVNR}_${ORNR}-x64.dll") + message(VERBOSE "SSL32_NAME=${SSL32_NAME}") + message(VERBOSE "SSL64_NAME=${SSL64_NAME}") + + get_filename_component(OPENSSL_EXECUTABLE_PATH ${OPENSSL_EXECUTABLE} DIRECTORY) + message(VERBOSE "OPENSSL_EXECUTABLE_PATH=${OPENSSL_EXECUTABLE_PATH}") + set(OPENSSL_EXECUTABLE_BIN_PATH "") + string(REGEX MATCH "^(.*)/tools/openssl$" REGEX_MATCH ${OPENSSL_EXECUTABLE_PATH}) + message(DEBUG "REGEX_MATCH=\"${REGEX_MATCH}\"") + message(DEBUG "CMAKE_MATCH_1=\"${CMAKE_MATCH_1}\"") + if (NOT ${REGEX_MATCH} EQUAL "") + set(OPENSSL_EXECUTABLE_BIN_PATH "${CMAKE_MATCH_1}/bin") # bin path of this openssl variant + endif() + message(VERBOSE "OPENSSL_EXECUTABLE_BIN_PATH=${OPENSSL_EXECUTABLE_BIN_PATH}") + + unset(LIBCRYPTO_BIN) # clear + unset(LIBCRYPTO_BIN CACHE) # clear as well, because otherwise find_file might use it + find_file(LIBCRYPTO_BIN + NO_DEFAULT_PATH + NAMES ${CRYPTO32_NAME} ${CRYPTO64_NAME} + PATHS ${OPENSSL_EXECUTABLE_PATH} ${OPENSSL_EXECUTABLE_BIN_PATH} + ) + message(VERBOSE "LIBCRYPTO_BIN=${LIBCRYPTO_BIN}") + + unset(LIBSSL_BIN) # clear + unset(LIBSSL_BIN CACHE) # clear as well, because otherwise find_file might use it + find_file(LIBSSL_BIN + NO_DEFAULT_PATH + NAMES ${SSL32_NAME} ${SSL64_NAME} + PATHS ${OPENSSL_EXECUTABLE_PATH} ${OPENSSL_EXECUTABLE_BIN_PATH} + ) + message(VERBOSE "LIBSSL_BIN=${LIBSSL_BIN}") + + else() # the version regex did not match + + # as a fallback, we check for "old" OpenSSL library (used before OpenSSL 1.1.0) + + find_file(LIBCRYPTO_BIN + NAMES + libeay32.dll + HINTS + ${_OPENSSL_ROOT_HINTS} + PATH_SUFFIXES + bin) + + find_file(LIBSSL_BIN + NAMES + ssleay32.dll + HINTS + ${_OPENSSL_ROOT_HINTS} + PATH_SUFFIXES + bin) + + endif() + + if(LIBCRYPTO_BIN AND LIBSSL_BIN) + set(OPENSSL_BIN_FOUND 1) + endif() + + endif(WIN32 AND OPENSSL_VERSION) + +endif(OPENSSL_FOUND) +