Skip to content

Commit

Permalink
VS Support Target ARM64
Browse files Browse the repository at this point in the history
  • Loading branch information
Fsu0413 committed Feb 25, 2024
1 parent c4ec6ed commit 6f2ed02
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 9 deletions.
51 changes: 44 additions & 7 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ endif()
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(OpenSslExternalCMakeCheckArchitecture)

# undocumented!
# Defining customized OPENSSL_TARGET_ARCH shouldn't be a designed workflow, since an available architecture must be determined for ASM being built
if ( NOT DEFINED OPENSSL_TARGET_ARCH )
openssl_external_cmake_detect_target_arch(OPENSSL_TARGET_ARCH)
endif()
Expand Down Expand Up @@ -137,7 +137,7 @@ foreach (_OPTION IN ITEMS hw hw-4758-cca hw-aep hw-atalla hw-chil hw-cswift hw-i
if (_OPTION STREQUAL "asm")
# building ASM needs Perl
# ASM is not supported on iOS
cmake_dependent_option("${_OPTION_STR}" "${_OPTION_HELP}" ON "Perl_FOUND;DEFINED OPENSSL_TARGET_ARCH;NOT APPLE OR ( NOT IOS AND OPENSSL_TARGET_ARCH STREQUAL \"x64\" )" OFF)
cmake_dependent_option("${_OPTION_STR}" "${_OPTION_HELP}" ON "Perl_FOUND;DEFINED OPENSSL_TARGET_ARCH;NOT APPLE OR ( NOT IOS AND OPENSSL_TARGET_ARCH STREQUAL \"x64\" );( MSVC AND NOT ( OPENSSL_TARGET_ARCH MATCHES \"arm\" ) ) OR ( NOT MSVC )" OFF)
elseif (_OPTION STREQUAL "nasm")
cmake_dependent_option("${_OPTION_STR}" "${_OPTION_HELP}" OFF "OPENSSL_ASM;MSVC" OFF)
else()
Expand Down Expand Up @@ -215,7 +215,9 @@ foreach (_CIPHER IN ITEMS
elseif (_CIPHER STREQUAL "heartbeats")
cmake_dependent_option("${_CIPHER_STR}" "${_CIPHER_HELP}" "${_CIPHER_DEFAULT}" "OPENSSL_TLSEXT" OFF)
elseif (_CIPHER STREQUAL "uplink")
cmake_dependent_option("${_CIPHER_STR}" "${_CIPHER_HELP}" "${_CIPHER_DEFAULT}" "WIN32;MSVC OR ( OPENSSL_TARGET_ARCH STREQUAL \"x86\" );NOT OPENSSL_386;BUILD_SHARED_LIBS" OFF)
cmake_dependent_option("${_CIPHER_STR}" "${_CIPHER_HELP}" "${_CIPHER_DEFAULT}" "WIN32;( MSVC AND NOT ( OPENSSL_TARGET_ARCH MATCHES \"arm\" ) ) OR ( OPENSSL_TARGET_ARCH STREQUAL \"x86\" );NOT OPENSSL_386;BUILD_SHARED_LIBS;NOT WINDOWS_STORE;NOT WINDOWS_PHONE" OFF)
elseif ( ( _CIPHER STREQUAL "stdio" ) OR ( _CIPHER STREUQAL "ui-console" ) OR ( _CIPHER STREQUAL "async") )
cmake_dependent_option("${_CIPHER_STR}" "${_CIPHER_HELP}" "${_CIPHER_DEFAULT}" "( WIN32 AND ( NOT WINDOWS_STORE AND NOT WINDOWS_PHONE ) ) OR ( NOT WIN32 )" OFF)
else()
option("${_CIPHER_STR}" "${_CIPHER_HELP}" "${_CIPHER_DEFAULT}")
endif()
Expand Down Expand Up @@ -325,12 +327,47 @@ configure_file(${CMAKE_SOURCE_DIR}/openssl/e_os2.h ${CMAKE_BINARY_DIR}/include/o
# currently only supported platforms are listed - other platforms will be added when finished
if (WIN32)
if (MSVC)
if (OPENSSL_TARGET_ARCH STREQUAL "x64")
set(OPENSSL_BUILD_PLATFORM "VC-WIN64A")
elseif (OPENSSL_TARGET_ARCH STREQUAL "x86")
set(OPENSSL_BUILD_PLATFORM "VC-WIN32")
if (WINDOWS_STORE)
if (OPENSSL_TARGET_ARCH STREQUAL "x64")
set(OPENSSL_BUILD_PLATFORM "VC-WIN64A-UWP")
elseif (OPENSSL_TARGET_ARCH STREQUAL "arm32")
set(OPENSSL_BUILD_PLATFORM "VC-WIN32-ARM-UWP")
elseif (OPENSSL_TARGET_ARCH STREQUAL "x86")
set(OPENSSL_BUILD_PLATFORM "VC-WIN32-UWP")
elseif (OPENSSL_TARGET_ARCH STREQUAL "arm64")
set(OPENSSL_BUILD_PLATFORM "VC-WIN64-ARM-UWP")
endif()
elseif (WINDOWS_ONECORE OR WINDOWS_PHONE)
# OneCore is not supported by CMake right now (as of 3.28)
# So we need a toolchain file which sets options for OneCore
# Assuming WINDOWS_ONECORE variable is set to 1 and CMAKE_SYSTEM_NAME is set to "WindowsOneCore"
# (Although on Windows only WIN32 is judged, CMAKE_SYSTEM_NAME does not make any difference here)
# Note that the library set for OneCore is not maintained here since it shouldn't be. It may only be specified by a toolchain file or CMake itself.
if (OPENSSL_TARGET_ARCH STREQUAL "x64")
set(OPENSSL_BUILD_PLATFORM "VC-WIN64A-ONECORE")
elseif (OPENSSL_TARGET_ARCH STREQUAL "arm32")
set(OPENSSL_BUILD_PLATFORM "VC-WIN32-ARM")
elseif (OPENSSL_TARGET_ARCH STREQUAL "x86")
set(OPENSSL_BUILD_PLATFORM "VC-WIN32-ONECORE")
elseif (OPENSSL_TARGET_ARCH STREQUAL "arm64")
set(OPENSSL_BUILD_PLATFORM "VC-WIN64-ARM")
endif()
else()
if (OPENSSL_TARGET_ARCH STREQUAL "x64")
set(OPENSSL_BUILD_PLATFORM "VC-WIN64A")
elseif (OPENSSL_TARGET_ARCH STREQUAL "arm32")
# not using original "VC-WIN32-ARM" since it targets for OneCore - see above
set(OPENSSL_BUILD_PLATFORM "VC-WIN32-ARM-DESKTOP")
elseif (OPENSSL_TARGET_ARCH STREQUAL "x86")
set(OPENSSL_BUILD_PLATFORM "VC-WIN32")
elseif (OPENSSL_TARGET_ARCH STREQUAL "arm64")
# not using original "VC-WIN64-ARM" since it targets for OneCore - see above
set(OPENSSL_BUILD_PLATFORM "VC-WIN64-ARM-DESKTOP")
endif()
endif()
else()
# OpenSSL never supports Windows on ARM using MinGW toolchain
# TODO: check how MSYS2 is patching OpenSSL for ASM builds
if (OPENSSL_TARGET_ARCH STREQUAL "x64")
set(OPENSSL_BUILD_PLATFORM "mingw64")
elseif (OPENSSL_TARGET_ARCH STREQUAL "x86")
Expand Down
16 changes: 14 additions & 2 deletions crypto/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,15 @@

set(OPENSSL_SYS_DEFINE)
if (MSVC)
# Note: All Windows platform defines OPENSSL_SYSNAME_WIN32 regardless of what OPENSSL_SYS_DEFINE is

if (OPENSSL_TARGET_ARCH STREQUAL "x86")
# Seems unneeded, but keep compatibility with OpenSSL
set(OPENSSL_SYS_DEFINE "OPENSSL_SYSNAME_WIN32")
elseif (OPENSSL_TARGET_ARCH STREQUAL "x64")
set(OPENSSL_SYS_DEFINE "OPENSSL_SYSNAME_WIN64A")
elseif (OPENSSL_TARGET_ARCH MATCHES "arm")
# Nothing should be defined. OPENSSL_SYS_WIN_CORE is not OPENSSL_SYS_DEFINE
else()
message(FATAL_ERROR "This version of MSVC is not yet supported")
endif()
Expand All @@ -23,6 +28,7 @@ elseif (APPLE)
if (IOS)
set(OPENSSL_SYS_DEFINE "OPENSSL_SYSNAME_iOS")
else()
# assume macOS since OpenSSL hasn't yet supports watchOS, tvOS, etc.
set(OPENSSL_SYS_DEFINE "OPENSSL_SYSNAME_MACOSX")
endif()
endif()
Expand Down Expand Up @@ -74,7 +80,7 @@ set(OPENSSL_MD2_INT "int")
set(OPENSSL_RC2_INT "int")

#define RC4_INT unsigned @OPENSSL_RC4_INT@
if ( WIN32
if ( ( WIN32 AND ( ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) OR ( OPENSSL_TARGET_ARCH STREQUAL "x64" ) ) )
OR ( ANDROID AND ( ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) OR ( OPENSSL_TARGET_ARCH STREQUAL "x64" ) ) )
OR ( LINUX AND ( ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) OR ( OPENSSL_TARGET_ARCH STREQUAL "x64" ) ) )
OR ( APPLE AND NOT IOS )
Expand Down Expand Up @@ -118,7 +124,7 @@ endif()
#cmakedefine BN_LLONG
if ( ( BSD AND ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) )
OR ( CYGWIN AND ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) )
OR ( WIN32 AND ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) )
OR ( WIN32 AND ( ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) OR ( OPENSSL_TARGET_ARCH STREQUAL "arm32" ) ) )
OR ( ANDROID AND ( ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) OR ( OPENSSL_TARGET_ARCH STREQUAL "arm32" ) ) )
OR IOS
OR ( LINUX AND ( ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) OR ( OPENSSL_TARGET_ARCH STREQUAL "arm32" ) ) )
Expand Down Expand Up @@ -493,6 +499,12 @@ if (WIN32)
if ( OPENSSL_TARGET_ARCH STREQUAL "x64" )
set(LIBCRYPTO_CFLAGS ${LIBCRYPTO_CFLAGS} "-DUNICODE" "-D_UNICODE")
endif()
if (WINDOWS_ONECORE OR WINDOWS_PHONE OR WINDOWS_STORE)
set(LIBCRYPTO_CFLAGS ${LIBCRYPTO_CFLAGS} "-DOPENSSL_SYSNAME_WIN_CORE")
if (OPENSSL_TARGET_ARCH MATCHES "arm")
set(LIBCRYPTO_CFLAGS ${LIBCRYPTO_CFLAGS} "-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE")
endif()
endif()
endif()
if (OPENSSL_SSE2)
set(LIBCRYPTO_CFLAGS ${LIBCRYPTO_CFLAGS} "-DOPENSSL_IA32_SSE2")
Expand Down

0 comments on commit 6f2ed02

Please sign in to comment.