From 6f5bfe4fcbf30700e90c70e244d8e012178766c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 6 May 2019 11:53:16 +0200 Subject: [PATCH] add support for MSVC compiler --- CMakeLists.txt | 96 +++++++++++++++++++++++++++++++++++++---- apps/CMakeLists.txt | 6 +++ cmake/MSVCRuntime.cmake | 60 ++++++++++++++++++++++++++ crypto/CMakeLists.txt | 10 ++--- ssl/CMakeLists.txt | 7 +-- 5 files changed, 161 insertions(+), 18 deletions(-) create mode 100644 cmake/MSVCRuntime.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index cc0efa5..c22b860 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,9 +27,73 @@ project( openssl ) cmake_minimum_required( VERSION 3.1.0 ) -set( VERSION_MAJOR 1 ) -set( VERSION_MINOR 1 ) -set( VERSION_PATCH 1 ) +set(CMAKE_DISABLE_SOURCE_CHANGES ON) +set(CMAKE_DISABLE_IN_SOURCE_BUILD ON) + +set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") + +option(WITH_APPS "Build applications" ON) + +# OpenSSL version detection imported from FindOpenSSL.cmake + +file(STRINGS "${CMAKE_SOURCE_DIR}/include/openssl/opensslv.h" openssl_version_str + REGEX "^#[\t ]*define[\t ]+OPENSSL_VERSION_NUMBER[\t ]+0x([0-9a-fA-F])+.*") + +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() + +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) + 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}") + +message(STATUS "OpenSSL version ${OPENSSL_VERSION}") + +set( VERSION_MAJOR ${OPENSSL_VERSION_MAJOR} ) +set( VERSION_MINOR ${OPENSSL_VERSION_MINOR} ) +set( VERSION_PATCH ${OPENSSL_VERSION_PATCH} ) set( VERSION_STRING ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH} ) set( LIB_VERSION ${VERSION_MAJOR}.${VERSION_MINOR} ) @@ -46,6 +110,16 @@ add_definitions( -DOPENSSL_NO_STATIC_ENGINE ) add_definitions( "-DOPENSSLDIR=\"/usr/local/ssl\"" ) add_definitions( "-DENGINESDIR=\"/usr/local/engines-1.1\"" ) +if(MSVC) + include(MSVCRuntime) + configure_msvc_runtime() +endif() + +if(WIN32) + set(CMAKE_SHARED_LIBRARY_PREFIX "lib") + set(CMAKE_STATIC_LIBRARY_PREFIX "lib") +endif() + if ( APPLE ) set( CMAKE_MACOSX_RPATH ON ) add_definitions( -DOPENSSL_SYSNAME_MACOSX ) @@ -54,9 +128,12 @@ endif() if( WIN32 AND NOT CYGWIN ) add_definitions( -DOPENSSL_SYSNAME_WIN32 ) add_definitions( -DWIN32_LEAN_AND_MEAN ) + add_definitions( -D_CRT_SECURE_NO_WARNINGS ) - # avoid conflict: ocsp.h and wincrypt.h - add_definitions( -D_WINDLL ) + if (BUILD_SHARED_LIBS) + # avoid conflict: ocsp.h and wincrypt.h + add_definitions( -D_WINDLL ) + endif() endif() if( MINGW ) @@ -79,9 +156,12 @@ if ( WIN32 AND MINGW AND NOT CYGWIN ) set( OPENSSL_EXPORT_VAR_AS_FUNCTION true ) endif() -add_subdirectory( crypto ) -add_subdirectory( ssl ) -add_subdirectory( apps ) +add_subdirectory(crypto) +add_subdirectory(ssl) + +if(WITH_APPS) + add_subdirectory(apps) +endif() file( COPY ${PROJECT_SOURCE_DIR}/include/internal DESTINATION include ) file( COPY ${PROJECT_SOURCE_DIR}/include/openssl DESTINATION include ) diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 800fde7..67387ee 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -45,6 +45,12 @@ set ( E_SRC s_client.c s_server.c s_socket.c s_time.c sess_id.c smime.c speed.c spkac.c storeutl.c srp.c ts.c verify.c version.c x509.c ) +if ( WIN32 ) + if ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/win32_init.c" ) + list( APPEND E_SRC win32_init.c ) + endif() +endif() + add_executable ( openssl ${E_SRC} ) target_link_libraries ( openssl crypto ssl ) diff --git a/cmake/MSVCRuntime.cmake b/cmake/MSVCRuntime.cmake new file mode 100644 index 0000000..001a987 --- /dev/null +++ b/cmake/MSVCRuntime.cmake @@ -0,0 +1,60 @@ + +macro(configure_msvc_runtime) + if(MSVC) + # Default to statically-linked runtime. + if("${MSVC_RUNTIME}" STREQUAL "") + set(MSVC_RUNTIME "static") + endif() + + # Set compiler options. + set(variables + CMAKE_C_FLAGS + CMAKE_C_FLAGS_DEBUG + CMAKE_C_FLAGS_MINSIZEREL + CMAKE_C_FLAGS_RELEASE + CMAKE_C_FLAGS_RELWITHDEBINFO + CMAKE_CXX_FLAGS + CMAKE_CXX_FLAGS_DEBUG + CMAKE_CXX_FLAGS_MINSIZEREL + CMAKE_CXX_FLAGS_RELEASE + CMAKE_CXX_FLAGS_RELWITHDEBINFO) + + if(${MSVC_RUNTIME} STREQUAL "static") + message(STATUS "MSVC: using statically-linked runtime (/MT and /MTd).") + foreach(variable ${variables}) + if(${variable} MATCHES "/MD") + string(REGEX REPLACE "/MD" "/MT" ${variable} "${${variable}}") + endif() + endforeach() + else() + message(STATUS "MSVC: using dynamically-linked runtime (/MD and /MDd).") + foreach(variable ${variables}) + if(${variable} MATCHES "/MT") + string(REGEX REPLACE "/MT" "/MD" ${variable} "${${variable}}") + endif() + endforeach() + endif() + + foreach(variable ${variables}) + if(${variable} MATCHES "/Ob0") + string(REGEX REPLACE "/Ob0" "/Ob2" ${variable} "${${variable}}") + endif() + endforeach() + + foreach(variable ${variables}) + if(${variable} MATCHES "/W3") + string(REGEX REPLACE "/W3" "/W2" ${variable} "${${variable}}") + endif() + endforeach() + + set(CMAKE_CXX_FLAGS "${CMAKE_C_FLAGS}") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") + set(CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}") + set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}") + + foreach(variable ${variables}) + set(${variable} "${${variable}}" CACHE STRING "MSVC_${variable}" FORCE) + endforeach() + endif() +endmacro(configure_msvc_runtime) diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index a2af52e..527d626 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -55,6 +55,10 @@ set( LIBSRC cpt_err.c cryptlib.c ctype.c cversion.c ebcdic.c ex_data.c init.c mem.c mem_clr.c mem_dbg.c mem_sec.c o_dir.c o_fips.c o_fopen.c o_init.c o_str.c o_time.c uid.c ) +if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/getenv.c") + list(APPEND LIBSRC getenv.c) +endif() + include_directories( BEFORE SYSTEM include modes ec/curve448 ec/curve448/arch_32 ) if( BUILD_SHARED_LIBS ) @@ -267,11 +271,7 @@ else() add_submodule ( . threads_pthread.c ) endif() -if( ANDROID ) - add_library( crypto SHARED ${LIBSRC} ${OBJECTS_SRC} ) -else() - add_library( crypto ${LIBSRC} ${OBJECTS_SRC} ) -endif() +add_library( crypto ${LIBSRC} ${OBJECTS_SRC} ) if( WIN32 AND NOT CYGWIN ) target_link_libraries( crypto ws2_32 crypt32 ) diff --git a/ssl/CMakeLists.txt b/ssl/CMakeLists.txt index b581652..9bb2ae1 100644 --- a/ssl/CMakeLists.txt +++ b/ssl/CMakeLists.txt @@ -39,11 +39,8 @@ set ( LIBSRC statem/statem_lib.c statem/statem_srvr.c ) -if( ANDROID ) - add_library ( ssl SHARED ${LIBSRC} ) -else() - add_library ( ssl ${LIBSRC} ) -endif() +add_library( ssl ${LIBSRC} ) + target_link_libraries ( ssl crypto ) set_target_properties( ssl PROPERTIES