Skip to content

Commit

Permalink
Bug#28170711 ADD CMAKE SUPPORT FOR OPENSSL 1.1 ON WINDOWS
Browse files Browse the repository at this point in the history
In Windows.cmake: WARNING rather than FATAL_ERROR for 32bit builds if
this is a client-only build.

ssl.cmake: FIND_PACKAGE(OpenSSL) has a predefined set of places to
look for the installed package. This means that it may return path to
the 32bit library, even for a 64bit build, if both library versions
are installed. To avoid this, we do our own lookup, and set
OPENSSL_ROOT_DIR before calling FIND_PACKAGE(OpenSSL).

ssl.cmake: The .lib files have changed names on windows for OpenSSL
1.1, so look for 'libssl' and 'libcrypto' in addition to the NAMES we
already look for.

ssl.cmake: Get OPENSSL_MINOR_VERSION from OPENSSL_VERSION_NUMBER

ssl.cmake: Warn about usage of OpenSSL 1.1 on windows. The server will
actually hang on the first call to any SSL function. File a separate
bug for this.

ssl.cmake: For OpenSSL 1.1 the libraries have changed names on windows:
  ssleay32.dll -> libssl-1_1-x64.dll    or libssl-1_1.dll
  libeay32.dll -> libcrypto-1_1-x64.dll or libcrypto-1_1.dll
Rewrite the cmake code for locating the .dll files, and allow 32bit
versions also.

Also: ensure that CMAKE_SIZEOF_VOID_P matches result of CHECK_TYPE_SIZE("void*")

Change-Id: I6d2fd0a27ef56baa1f31896ba79b03d290be1b3d
  • Loading branch information
Tor Didriksen committed Jun 13, 2018
1 parent 57e401b commit 6d07c9c
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 17 deletions.
4 changes: 4 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,10 @@ ENDIF()
INCLUDE(CheckTypeSize)
CHECK_TYPE_SIZE("void *" SIZEOF_VOIDP)
MESSAGE(STATUS "SIZEOF_VOIDP ${SIZEOF_VOIDP}")
# On some platforms, cmake may think that CMAKE_SIZEOF_VOID_P == 4
# even if we have configured for 64bit build....
SET(CMAKE_SIZEOF_VOID_P ${SIZEOF_VOIDP})

IF(WITH_DEFAULT_COMPILER_OPTIONS)
INCLUDE(${CMAKE_SOURCE_DIR}/cmake/build_configurations/compiler_options.cmake)
ENDIF()
Expand Down
10 changes: 7 additions & 3 deletions cmake/os/Windows.cmake
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
# Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
Expand Down Expand Up @@ -59,8 +59,12 @@ IF(CMAKE_SIZEOF_VOID_P MATCHES 8)
SET(SYSTEM_TYPE "Win64")
SET(MYSQL_MACHINE_TYPE "x86_64")
ELSE()
MESSAGE(FATAL_ERROR "32 bit Windows builds are not supported. "
"Clean the build dir and rebuild using -G \"${CMAKE_GENERATOR} Win64\"")
IF(WITHOUT_SERVER)
MESSAGE(WARNING "32bit is experimental!!")
ELSE()
MESSAGE(FATAL_ERROR "32 bit Windows builds are not supported. "
"Clean the build dir and rebuild using -G \"${CMAKE_GENERATOR} Win64\"")
ENDIF()
ENDIF()

# Target Windows 7 / Windows Server 2008 R2 or later, i.e _WIN32_WINNT_WIN7
Expand Down
81 changes: 67 additions & 14 deletions cmake/ssl.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,26 @@ MACRO (MYSQL_CHECK_SSL)
IF(APPLE AND NOT OPENSSL_ROOT_DIR)
SET(OPENSSL_ROOT_DIR "/usr/local/opt/openssl")
ENDIF()
IF(WIN32 AND NOT OPENSSL_ROOT_DIR)
# We want to be able to support 32bit client-only builds
# FindOpenSSL.cmake will look for 32bit before 64bit ...
FILE(TO_CMAKE_PATH "$ENV{PROGRAMFILES}" _programfiles)
IF(SIZEOF_VOIDP EQUAL 8)
FIND_PATH(OPENSSL_WIN32
NAMES "include/openssl/ssl.h"
PATHS "${_programfiles}/OpenSSL-Win32" "C:/OpenSSL-Win32/")
FIND_PATH(OPENSSL_WIN64
NAMES "include/openssl/ssl.h"
PATHS "${_programfiles}/OpenSSL-Win64" "C:/OpenSSL-Win64/")
MESSAGE(STATUS "OPENSSL_WIN32 ${OPENSSL_WIN32}")
MESSAGE(STATUS "OPENSSL_WIN64 ${OPENSSL_WIN64}")
IF(OPENSSL_WIN32 AND OPENSSL_WIN64)
MESSAGE(STATUS "Found both 32bit and 64bit")
SET(OPENSSL_ROOT_DIR ${OPENSSL_WIN64})
MESSAGE(STATUS "OPENSSL_ROOT_DIR ${OPENSSL_ROOT_DIR}")
ENDIF()
ENDIF()
ENDIF()
FIND_PACKAGE(OpenSSL)
IF(OPENSSL_FOUND)
GET_FILENAME_COMPONENT(OPENSSL_ROOT_DIR ${OPENSSL_INCLUDE_DIR} PATH)
Expand Down Expand Up @@ -262,10 +282,10 @@ MACRO (MYSQL_CHECK_SSL)
MESSAGE(STATUS "suffixes <${CMAKE_FIND_LIBRARY_SUFFIXES}>")
ENDIF()
FIND_LIBRARY(OPENSSL_LIBRARY
NAMES ssl ssleay32 ssleay32MD
NAMES ssl libssl ssleay32 ssleay32MD
HINTS ${OPENSSL_ROOT_DIR}/lib)
FIND_LIBRARY(CRYPTO_LIBRARY
NAMES crypto libeay32
NAMES crypto libcrypto libeay32
HINTS ${OPENSSL_ROOT_DIR}/lib)
IF (WITH_SSL_PATH AND NOT APPLE AND NOT LINUX_STANDALONE)
LIST(REVERSE CMAKE_FIND_LIBRARY_SUFFIXES)
Expand All @@ -283,6 +303,10 @@ MACRO (MYSQL_CHECK_SSL)
"^.*OPENSSL_VERSION_NUMBER[\t ]+0x([0-9]).*$" "\\1"
OPENSSL_MAJOR_VERSION "${OPENSSL_VERSION_NUMBER}"
)
STRING(REGEX REPLACE
"^.*OPENSSL_VERSION_NUMBER[\t ]+0x[0-9]([0-9][0-9]).*$" "\\1"
OPENSSL_MINOR_VERSION "${OPENSSL_VERSION_NUMBER}"
)
ENDIF()
IF(OPENSSL_INCLUDE_DIR AND
OPENSSL_LIBRARY AND
Expand Down Expand Up @@ -353,6 +377,11 @@ MACRO (MYSQL_CHECK_SSL)
MESSAGE(STATUS "OPENSSL_LIBRARY = ${OPENSSL_LIBRARY}")
MESSAGE(STATUS "CRYPTO_LIBRARY = ${CRYPTO_LIBRARY}")
MESSAGE(STATUS "OPENSSL_MAJOR_VERSION = ${OPENSSL_MAJOR_VERSION}")
MESSAGE(STATUS "OPENSSL_MINOR_VERSION = ${OPENSSL_MINOR_VERSION}")
# The server hangs in OpenSSL_add_all_algorithms() in ssl_start()
IF(WIN32 AND OPENSSL_MINOR_VERSION VERSION_EQUAL 1)
MESSAGE(WARNING "OpenSSL 1.1 is experimental on Windows")
ENDIF()

INCLUDE(CheckSymbolExists)
SET(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
Expand Down Expand Up @@ -676,26 +705,50 @@ MACRO(MYSQL_CHECK_SSL_DLLS)
IF(WIN32)
GET_FILENAME_COMPONENT(CRYPTO_NAME "${CRYPTO_LIBRARY}" NAME_WE)
GET_FILENAME_COMPONENT(OPENSSL_NAME "${OPENSSL_LIBRARY}" NAME_WE)
FILE(GLOB HAVE_CRYPTO_DLL "${WITH_SSL_PATH}/bin/${CRYPTO_NAME}.dll")
FILE(GLOB HAVE_OPENSSL_DLL "${WITH_SSL_PATH}/bin/${OPENSSL_NAME}.dll")

# Different naming scheme for the matching .dll as of SSL 1.1
SET(SSL_MSVC_VERSION_SUFFIX)
SET(SSL_MSVC_ARCH_SUFFIX)
IF(OPENSSL_MINOR_VERSION VERSION_EQUAL 1)
SET(SSL_MSVC_VERSION_SUFFIX "-1_1")
SET(SSL_MSVC_ARCH_SUFFIX "-x64")
ENDIF()

# OpenSSL 1.1 Look for libcrypto-1_1-x64.dll or libcrypto-1_1.dll
# OpenSSL 1.0 Look for libeay32.dll
FIND_FILE(HAVE_CRYPTO_DLL
NAMES
"${CRYPTO_NAME}${SSL_MSVC_VERSION_SUFFIX}${SSL_MSVC_ARCH_SUFFIX}.dll"
"${CRYPTO_NAME}${SSL_MSVC_VERSION_SUFFIX}.dll"
PATHS "${WITH_SSL_PATH}/bin"
NO_DEFAULT_PATH
)
FIND_FILE(HAVE_OPENSSL_DLL
NAMES
"${OPENSSL_NAME}${SSL_MSVC_VERSION_SUFFIX}${SSL_MSVC_ARCH_SUFFIX}.dll"
"${OPENSSL_NAME}${SSL_MSVC_VERSION_SUFFIX}.dll"
PATHS "${WITH_SSL_PATH}/bin"
NO_DEFAULT_PATH
)

MESSAGE(STATUS "HAVE_CRYPTO_DLL ${HAVE_CRYPTO_DLL}")
MESSAGE(STATUS "HAVE_OPENSSL_DLL ${HAVE_OPENSSL_DLL}")
IF(HAVE_CRYPTO_DLL AND HAVE_OPENSSL_DLL)
GET_FILENAME_COMPONENT(CRYPTO_DLL_NAME "${HAVE_CRYPTO_DLL}" NAME)
GET_FILENAME_COMPONENT(OPENSSL_DLL_NAME "${HAVE_OPENSSL_DLL}" NAME)
ADD_CUSTOM_TARGET(copy_openssl_dlls ALL
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${WITH_SSL_PATH}/bin/${CRYPTO_NAME}.dll"
"${CMAKE_BINARY_DIR}/runtime_output_directory/${CMAKE_CFG_INTDIR}/${CRYPTO_NAME}.dll"
"${HAVE_CRYPTO_DLL}"
"${CMAKE_BINARY_DIR}/runtime_output_directory/${CMAKE_CFG_INTDIR}/${CRYPTO_DLL_NAME}"
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${WITH_SSL_PATH}/bin/${OPENSSL_NAME}.dll"
"${CMAKE_BINARY_DIR}/runtime_output_directory/${CMAKE_CFG_INTDIR}/${OPENSSL_NAME}.dll"
"${HAVE_OPENSSL_DLL}"
"${CMAKE_BINARY_DIR}/runtime_output_directory/${CMAKE_CFG_INTDIR}/${OPENSSL_DLL_NAME}"
)
MESSAGE(STATUS
"INSTALL ${WITH_SSL_PATH}/bin/${CRYPTO_NAME}.dll to ${INSTALL_BINDIR}")
MESSAGE(STATUS
"INSTALL ${WITH_SSL_PATH}/bin/${OPENSSL_NAME}.dll to ${INSTALL_BINDIR}")
MESSAGE(STATUS "INSTALL ${HAVE_CRYPTO_DLL} to ${INSTALL_BINDIR}")
MESSAGE(STATUS "INSTALL ${HAVE_OPENSSL_DLL} to ${INSTALL_BINDIR}")
INSTALL(FILES
"${WITH_SSL_PATH}/bin/${CRYPTO_NAME}.dll"
"${WITH_SSL_PATH}/bin/${OPENSSL_NAME}.dll"
"${HAVE_CRYPTO_DLL}"
"${HAVE_OPENSSL_DLL}"
DESTINATION "${INSTALL_BINDIR}" COMPONENT SharedLibraries)
ELSE()
MESSAGE(STATUS "Cannot find SSL dynamic libraries")
Expand Down

0 comments on commit 6d07c9c

Please sign in to comment.