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 c046dee commit 71ec7a7
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 12 deletions.
57 changes: 47 additions & 10 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,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 @@ -150,7 +150,7 @@ foreach (_OPTION IN ITEMS hw asm err nasm deprecated)
string(CONCAT _OPTION_HELP "enable OpenSSL option " ${_OPTION})
if (_OPTION STREQUAL "asm")
# building ASM needs Perl
cmake_dependent_option("${_OPTION_STR}" "${_OPTION_HELP}" ON "Perl_FOUND;DEFINED OPENSSL_TARGET_ARCH;( IOS AND NOT OPENSSL_IOS_IS_SIMULATOR ) OR ( NOT IOS )" OFF)
cmake_dependent_option("${_OPTION_STR}" "${_OPTION_HELP}" ON "Perl_FOUND;DEFINED OPENSSL_TARGET_ARCH;( IOS AND NOT OPENSSL_IOS_IS_SIMULATOR ) OR ( NOT IOS );( 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 @@ -436,7 +436,9 @@ foreach (_CIPHER IN ITEMS
elseif (_CIPHER STREQUAL "srp")
cmake_dependent_option("${_CIPHER_STR}" "${_CIPHER_HELP}" "${_CIPHER_DEFAULT}" "OPENSSL_DEPRECATED_3_0" 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 STREQUAL "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 @@ -544,16 +546,51 @@ endif()
# currently only supported platforms are listed - other platforms will be added when finished
if (WIN32)
if (MSVC)
if (OPENSSL_TARGET_ARCH STREQUAL "x64")
if ( ( NOT OPENSSL_ASM ) OR OPENSSL_NASM )
set(OPENSSL_BUILD_PLATFORM "VC-WIN64A")
else()
set(OPENSSL_BUILD_PLATFORM "VC-WIN64A-masm")
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")
if ( ( NOT OPENSSL_ASM ) OR OPENSSL_NASM )
set(OPENSSL_BUILD_PLATFORM "VC-WIN64A")
else()
set(OPENSSL_BUILD_PLATFORM "VC-WIN64A-masm")
endif()
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()
elseif (OPENSSL_TARGET_ARCH STREQUAL "x86")
set(OPENSSL_BUILD_PLATFORM "VC-WIN32")
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_SYS_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_SYS_WIN32")
elseif (OPENSSL_TARGET_ARCH STREQUAL "x64")
set(OPENSSL_SYS_DEFINE "OPENSSL_SYS_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_SYS_iOS")
else()
# assume macOS since OpenSSL hasn't yet supports watchOS, tvOS, etc.
set(OPENSSL_SYS_DEFINE "OPENSSL_SYS_MACOSX")
endif()
endif()
Expand Down Expand Up @@ -52,7 +58,7 @@ else()
endif()

#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 APPLE
OR BSD
Expand All @@ -66,7 +72,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 ( LINUX AND ( ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) OR ( OPENSSL_TARGET_ARCH STREQUAL "arm32" ) ) )
OR ( CMAKE_SYSTEM_NAME MATCHES "SunOS" AND ( OPENSSL_TARGET_ARCH STREQUAL "x86" ) ) # # TODO: Solaris on sparcv7 and sparcv9-64 have BN_LLONG
Expand Down Expand Up @@ -277,6 +283,12 @@ set(LIBCRYPTO_DIRECTORIES _cryptoDir async err dso)
set(LIBCRYPTO_CFLAGS)
if (WIN32)
set(LIBCRYPTO_CFLAGS ${LIBCRYPTO_CFLAGS} "-DOPENSSL_SYS_WIN32" "-DWIN32_LEAN_AND_MEAN" "-D_WINSOCK_DEPRECATED_NO_WARNINGS" "-DUNICODE" "-D_UNICODE")
if (WINDOWS_ONECORE OR WINDOWS_PHONE OR WINDOWS_STORE)
set(LIBCRYPTO_CFLAGS ${LIBCRYPTO_CFLAGS} "-DOPENSSL_SYS_WIN_CORE")
if (OPENSSL_TARGET_ARCH MATCHES "arm")
set(LIBCRYPTO_CFLAGS ${LIBCRYPTO_CFLAGS} "-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE")
endif()
endif()
endif()
if (CMAKE_SYSTEM_NAME MATCHES "SunOS")
set(LIBCRYPTO_CFLAGS ${LIBCRYPTO_CFLAGS} "-DFILIO_H")
Expand Down

0 comments on commit 71ec7a7

Please sign in to comment.