129 lines
4.6 KiB
CMake
129 lines
4.6 KiB
CMake
##################################################
|
|
# Find and Add OpenSSL shared (dynamic) library
|
|
#
|
|
# - This module defines the following variables:
|
|
# OpenSSL_DIR
|
|
# OPENSSL_VERSION
|
|
#
|
|
# - Imported shared(dynamic) libraries "ssl" and "crypto" are created.
|
|
#
|
|
# - It is assumed that OpenSSL has been built and path to OpenSSL build directory is
|
|
# added into system(environment) variable ROBOMONGO_CMAKE_PREFIX_PATH.
|
|
#
|
|
##################################################
|
|
|
|
# Try to find OpenSSL directory (uses CMAKE_PREFIX_PATH locations)
|
|
#-------------------------------------------
|
|
find_path(
|
|
OpenSSL_DIR include/openssl/ssl.h
|
|
DOC "Path to OpenSSL (github.com/openssl/openssl) root directory"
|
|
)
|
|
|
|
# Find OpenSSL version
|
|
#-------------------------------------------
|
|
set (OPENSSL_INCLUDE_DIR "${OpenSSL_DIR}/include")
|
|
|
|
function(from_hex HEX DEC)
|
|
string(TOUPPER "${HEX}" HEX)
|
|
set(_res 0)
|
|
string(LENGTH "${HEX}" _strlen)
|
|
|
|
while (_strlen GREATER 0)
|
|
math(EXPR _res "${_res} * 16")
|
|
string(SUBSTRING "${HEX}" 0 1 NIBBLE)
|
|
string(SUBSTRING "${HEX}" 1 -1 HEX)
|
|
if (NIBBLE STREQUAL "A")
|
|
math(EXPR _res "${_res} + 10")
|
|
elseif (NIBBLE STREQUAL "B")
|
|
math(EXPR _res "${_res} + 11")
|
|
elseif (NIBBLE STREQUAL "C")
|
|
math(EXPR _res "${_res} + 12")
|
|
elseif (NIBBLE STREQUAL "D")
|
|
math(EXPR _res "${_res} + 13")
|
|
elseif (NIBBLE STREQUAL "E")
|
|
math(EXPR _res "${_res} + 14")
|
|
elseif (NIBBLE STREQUAL "F")
|
|
math(EXPR _res "${_res} + 15")
|
|
else()
|
|
math(EXPR _res "${_res} + ${NIBBLE}")
|
|
endif()
|
|
|
|
string(LENGTH "${HEX}" _strlen)
|
|
endwhile()
|
|
|
|
set(${DEC} ${_res} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
if (OPENSSL_INCLUDE_DIR)
|
|
if(OPENSSL_INCLUDE_DIR AND EXISTS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h")
|
|
file(STRINGS "${OPENSSL_INCLUDE_DIR}/openssl/opensslv.h" openssl_version_str
|
|
REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*")
|
|
|
|
# The version number is encoded as 0xMNNFFPPS: major minor fix patch status
|
|
# The status gives if this is a developer or prerelease and is ignored here.
|
|
# Major, minor, and fix directly translate into the version numbers shown in
|
|
# the string. The patch field translates to the single character suffix that
|
|
# indicates the bug fix state, which 00 -> nothing, 01 -> a, 02 -> b and so
|
|
# on.
|
|
|
|
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]).*$"
|
|
"\\1;\\2;\\3;\\4;\\5" OPENSSL_VERSION_LIST "${openssl_version_str}")
|
|
list(GET OPENSSL_VERSION_LIST 0 OPENSSL_VERSION_MAJOR)
|
|
list(GET OPENSSL_VERSION_LIST 1 OPENSSL_VERSION_MINOR)
|
|
from_hex("${OPENSSL_VERSION_MINOR}" OPENSSL_VERSION_MINOR)
|
|
list(GET OPENSSL_VERSION_LIST 2 OPENSSL_VERSION_FIX)
|
|
from_hex("${OPENSSL_VERSION_FIX}" OPENSSL_VERSION_FIX)
|
|
list(GET OPENSSL_VERSION_LIST 3 OPENSSL_VERSION_PATCH)
|
|
|
|
if (NOT OPENSSL_VERSION_PATCH STREQUAL "00")
|
|
from_hex("${OPENSSL_VERSION_PATCH}" _tmp)
|
|
# 96 is the ASCII code of 'a' minus 1
|
|
math(EXPR OPENSSL_VERSION_PATCH_ASCII "${_tmp} + 96")
|
|
unset(_tmp)
|
|
# Once anyone knows how OpenSSL would call the patch versions beyond 'z'
|
|
# this should be updated to handle that, too. This has not happened yet
|
|
# so it is simply ignored here for now.
|
|
string(ASCII "${OPENSSL_VERSION_PATCH_ASCII}" OPENSSL_VERSION_PATCH_STRING)
|
|
endif ()
|
|
|
|
set(OPENSSL_VERSION "${OPENSSL_VERSION_MAJOR}.${OPENSSL_VERSION_MINOR}.${OPENSSL_VERSION_FIX}${OPENSSL_VERSION_PATCH_STRING}")
|
|
endif ()
|
|
endif ()
|
|
|
|
|
|
# Add imported ssl and crypto libraries
|
|
#-------------------------------------------
|
|
|
|
# Add imported target ssl (ssleay32)
|
|
add_library(ssl SHARED IMPORTED)
|
|
|
|
# Add imported target for crypto (libeay32)
|
|
add_library(crypto SHARED IMPORTED)
|
|
|
|
# todo: refactor
|
|
if(SYSTEM_WINDOWS)
|
|
set_target_properties(ssl PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${OpenSSL_DIR}/include"
|
|
IMPORTED_IMPLIB "${OpenSSL_DIR}/libssl.lib"
|
|
)
|
|
set_target_properties(crypto PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${OpenSSL_DIR}/include"
|
|
IMPORTED_IMPLIB "${OpenSSL_DIR}/libcrypto.lib"
|
|
)
|
|
else()
|
|
if(SYSTEM_MACOSX)
|
|
SET(EXT "dylib")
|
|
elseif(SYSTEM_LINUX)
|
|
SET(EXT "so")
|
|
endif()
|
|
set_target_properties(ssl PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${OpenSSL_DIR}/include"
|
|
IMPORTED_LOCATION "${OpenSSL_DIR}/libssl.${EXT}"
|
|
)
|
|
set_target_properties(crypto PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${OpenSSL_DIR}/include"
|
|
IMPORTED_LOCATION "${OpenSSL_DIR}/libcrypto.${EXT}"
|
|
)
|
|
endif()
|
|
|
|
# End of file |