From 83c3b4ea89210f5f4aa989d3b9a6c3c8bcce07b2 Mon Sep 17 00:00:00 2001 From: Schrodinger ZHU Yifan Date: Mon, 22 Jul 2024 22:23:36 -0700 Subject: [PATCH] Add arm64 windows support --- CMakeLists.txt | 14 ++++++++++--- cmake/FindCurl.cmake | 7 +++++-- cmake/FindExceptionHandling.cmake | 21 ++++++++++++------- cmake/FindFreetype.cmake | 4 +++- cmake/FindOpusfile.cmake | 21 +++++++++++++------ cmake/FindSQLite3.cmake | 8 ++++++- cmake/FindSSP.cmake | 5 ++++- .../toolchains/mingw64-aarch64-llvm.toolchain | 12 +++++++++++ ddnet-libs | 2 +- src/base/detect.h | 2 +- 10 files changed, 73 insertions(+), 23 deletions(-) create mode 100644 cmake/toolchains/mingw64-aarch64-llvm.toolchain diff --git a/CMakeLists.txt b/CMakeLists.txt index acf1ccf7b..907417532 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,9 @@ else() set(TARGET_BITS "64") endif() -if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64") +if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "arm" + OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "aarch64" + OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "ARM64") if(TARGET_BITS STREQUAL "32") set(TARGET_CPU_ARCHITECTURE "arm") else() @@ -3112,6 +3114,8 @@ set(CPACK_GENERATOR TGZ TXZ) set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) if(TARGET_OS STREQUAL "mac") set(CPACK_STRIP_FILES FALSE) +elseif(TARGET_OS STREQUAL "windows" AND TARGET_CPU_ARCHITECTURE STREQUAL "arm64") + set(CPACK_STRIP_FILES FALSE) else() set(CPACK_STRIP_FILES TRUE) endif() @@ -3125,7 +3129,11 @@ set(CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}) if(TARGET_OS AND TARGET_BITS) if(TARGET_OS STREQUAL "windows") - set(CPACK_SYSTEM_NAME "win${TARGET_BITS}") + if (TARGET_CPU_ARCHITECTURE STREQUAL "arm64") + set(CPACK_SYSTEM_NAME "win-arm64") + else() + set(CPACK_SYSTEM_NAME "win${TARGET_BITS}") + endif() set(CPACK_GENERATOR ZIP) elseif(TARGET_OS STREQUAL "linux") # Let compiler tell its arch @@ -3386,7 +3394,7 @@ foreach(ext zip tar.gz tar.xz) endforeach() foreach(target ${CPACK_TARGETS}) list(APPEND COPY_TARGET_COMMANDS COMMAND ${CMAKE_COMMAND} -E copy $ ${TMPDIR}/) - if(NOT TARGET_OS STREQUAL "mac") + if(NOT TARGET_OS STREQUAL "mac" AND NOT (TARGET_OS STREQUAL "windows" AND TARGET_CPU_ARCHITECTURE STREQUAL "arm64")) list(APPEND STRIP_TARGET_COMMANDS COMMAND strip -s ${TMPDIR}/$) endif() endforeach() diff --git a/cmake/FindCurl.cmake b/cmake/FindCurl.cmake index 77ce5013e..54249d5d7 100644 --- a/cmake/FindCurl.cmake +++ b/cmake/FindCurl.cmake @@ -26,8 +26,11 @@ if(CURL_FOUND) is_bundled(CURL_BUNDLED "${CURL_LIBRARY}") set(CURL_LIBRARIES ${CURL_LIBRARY}) set(CURL_INCLUDE_DIRS ${CURL_INCLUDEDIR}) - - if(CURL_BUNDLED AND TARGET_OS STREQUAL "windows") + if (CURL_BUNDLED AND TARGET_OS STREQUAL "windows" AND TARGET_CPU_ARCHITECTURE STREQUAL "arm64") + set(CURL_COPY_FILES + "${EXTRA_CURL_LIBDIR}/libcurl-4.dll" + ) + elseif(CURL_BUNDLED AND TARGET_OS STREQUAL "windows") set(CURL_COPY_FILES "${EXTRA_CURL_LIBDIR}/libcurl.dll" "${EXTRA_CURL_LIBDIR}/zlib1.dll" diff --git a/cmake/FindExceptionHandling.cmake b/cmake/FindExceptionHandling.cmake index f6d12632e..ef7f1665c 100644 --- a/cmake/FindExceptionHandling.cmake +++ b/cmake/FindExceptionHandling.cmake @@ -11,11 +11,18 @@ if(TARGET_OS STREQUAL "windows") if(NOT EXCEPTION_HANDLING_BUNDLED) message(FATAL_ERROR "could not find exception handling paths") endif() - set(EXCEPTION_HANDLING_COPY_FILES - "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/exchndl.dll" - "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/dbgcore.dll" - "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/dbghelp.dll" - "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/mgwhelp.dll" - "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/symsrv.dll" - ) + if(TARGET_CPU_ARCHITECTURE STREQUAL "arm64") + set(EXCEPTION_HANDLING_COPY_FILES + "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/exchndl.dll" + "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/mgwhelp.dll" + ) + else() + set(EXCEPTION_HANDLING_COPY_FILES + "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/exchndl.dll" + "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/dbgcore.dll" + "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/dbghelp.dll" + "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/mgwhelp.dll" + "${EXTRA_EXCEPTION_HANDLING_LIBDIR}/symsrv.dll" + ) + endif() endif() diff --git a/cmake/FindFreetype.cmake b/cmake/FindFreetype.cmake index a061fccce..04ea3ab52 100644 --- a/cmake/FindFreetype.cmake +++ b/cmake/FindFreetype.cmake @@ -31,7 +31,9 @@ if(FREETYPE_FOUND) is_bundled(FREETYPE_BUNDLED "${FREETYPE_LIBRARY}") set(FREETYPE_COPY_FILES) if(FREETYPE_BUNDLED) - if(TARGET_OS STREQUAL "windows") + if(TARGET_OS STREQUAL "windows" AND TARGET_CPU_ARCHITECTURE STREQUAL "arm64") + set(FREETYPE_COPY_FILES "${EXTRA_FREETYPE_LIBDIR}/libfreetype-6.dll") + elseif(TARGET_OS STREQUAL "windows") set(FREETYPE_COPY_FILES "${EXTRA_FREETYPE_LIBDIR}/libfreetype.dll") elseif(TARGET_OS STREQUAL "mac") set(FREETYPE_COPY_FILES "${EXTRA_FREETYPE_LIBDIR}/libfreetype.6.dylib") diff --git a/cmake/FindOpusfile.cmake b/cmake/FindOpusfile.cmake index 39a3f0878..dd522bb2b 100644 --- a/cmake/FindOpusfile.cmake +++ b/cmake/FindOpusfile.cmake @@ -29,12 +29,21 @@ set(OPUSFILE_INCLUDE_DIRS ${OPUSFILE_INCLUDEDIR}) if(OPUSFILE_FOUND) is_bundled(OPUSFILE_BUNDLED "${OPUSFILE_LIBRARY}") if(OPUSFILE_BUNDLED AND TARGET_OS STREQUAL "windows") - set(OPUSFILE_COPY_FILES - "${EXTRA_OPUSFILE_LIBDIR}/libogg.dll" - "${EXTRA_OPUSFILE_LIBDIR}/libopus.dll" - "${EXTRA_OPUSFILE_LIBDIR}/libopusfile.dll" - "${EXTRA_OPUSFILE_LIBDIR}/libwinpthread-1.dll" - ) + if (TARGET_CPU_ARCHITECTURE STREQUAL "arm64") + set(OPUSFILE_COPY_FILES + "${EXTRA_OPUSFILE_LIBDIR}/libopusfile-0.dll" + "${EXTRA_OPUSFILE_LIBDIR}/libopus-0.dll" + "${EXTRA_OPUSFILE_LIBDIR}/libogg-0.dll" + "${EXTRA_OPUSFILE_LIBDIR}/libwinpthread-1.dll" + ) + else() + set(OPUSFILE_COPY_FILES + "${EXTRA_OPUSFILE_LIBDIR}/libogg.dll" + "${EXTRA_OPUSFILE_LIBDIR}/libopus.dll" + "${EXTRA_OPUSFILE_LIBDIR}/libopusfile.dll" + "${EXTRA_OPUSFILE_LIBDIR}/libwinpthread-1.dll" + ) + endif() if(TARGET_BITS EQUAL 32) list(APPEND OPUSFILE_COPY_FILES "${EXTRA_OPUSFILE_LIBDIR}/libgcc_s_sjlj-1.dll" diff --git a/cmake/FindSQLite3.cmake b/cmake/FindSQLite3.cmake index f400c0f94..758f23340 100644 --- a/cmake/FindSQLite3.cmake +++ b/cmake/FindSQLite3.cmake @@ -40,6 +40,12 @@ if(SQLite3_FOUND) is_bundled(SQLite3_BUNDLED "${SQLite3_LIBRARY}") set(SQLite3_COPY_FILES) if(SQLite3_BUNDLED AND TARGET_OS STREQUAL "windows") - set(SQLite3_COPY_FILES "${EXTRA_SQLite3_LIBDIR}/sqlite3.dll") + if (TARGET_CPU_ARCHITECTURE STREQUAL "arm64") + set(SQLite3_COPY_FILES + "${EXTRA_SQLite3_LIBDIR}/libsqlite3-0.dll" + ) + else() + set(SQLite3_COPY_FILES "${EXTRA_SQLite3_LIBDIR}/sqlite3.dll") + endif() endif() endif() diff --git a/cmake/FindSSP.cmake b/cmake/FindSSP.cmake index d1923c2e9..b2cf807b3 100644 --- a/cmake/FindSSP.cmake +++ b/cmake/FindSSP.cmake @@ -1,4 +1,7 @@ -if(TARGET_OS STREQUAL "windows") +# only find ssp when toolchain is gcc +if(TARGET_OS STREQUAL "windows" + AND NOT CMAKE_C_COMPILER_ID STREQUAL "Clang" + AND NOT CMAKE_C_COMPILER_ID STREQUAL "MSVC") set_extra_dirs_lib(SSP ssp) find_file(SSP_LIBRARY NAMES libssp-0.dll diff --git a/cmake/toolchains/mingw64-aarch64-llvm.toolchain b/cmake/toolchains/mingw64-aarch64-llvm.toolchain new file mode 100644 index 000000000..0bf154bab --- /dev/null +++ b/cmake/toolchains/mingw64-aarch64-llvm.toolchain @@ -0,0 +1,12 @@ +set(CMAKE_SYSTEM_NAME Windows) + +set(CMAKE_SYSTEM_PROCESSOR aarch64) +set(CMAKE_C_COMPILER aarch64-w64-mingw32-clang) +set(CMAKE_CXX_COMPILER aarch64-w64-mingw32-clang++) +set(CMAKE_RC_COMPILER aarch64-w64-mingw32-windres) +set(CMAKE_RUST_COMPILER_TARGET aarch64-pc-windows-gnullvm) + +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/ddnet-libs b/ddnet-libs index d5f0cd919..e78f350e7 160000 --- a/ddnet-libs +++ b/ddnet-libs @@ -1 +1 @@ -Subproject commit d5f0cd9194936d1ab5bd19952645b8dffe9ae06c +Subproject commit e78f350e7898fc6b0702cdc3b7ce6ee347c97d49 diff --git a/src/base/detect.h b/src/base/detect.h index 8bceed086..40882acb8 100644 --- a/src/base/detect.h +++ b/src/base/detect.h @@ -171,7 +171,7 @@ #define CONF_ARCH_ENDIAN_LITTLE 1 #endif -#if defined(__aarch64__) || defined(__arm64__) +#if defined(__aarch64__) || defined(__arm64__) || defined(__ARM_ARCH) #define CONF_ARCH_ARM64 1 #define CONF_ARCH_STRING "arm64" #define CONF_ARCH_ENDIAN_LITTLE 1