From 131b2738949212be9676c97a9733a8e245b9119e Mon Sep 17 00:00:00 2001 From: Tres Finocchiaro Date: Wed, 22 Sep 2021 09:28:16 -0400 Subject: [PATCH] Fix compilation on macOS aarch64 (#6152) * Fix compilation on macOS aarch64 - Bumps rpmalloc submodule to fix assembly compilation, fix `rpmalloc_thread_finalize()` API change - Adds aarch64 "/opt" Homebrew prefix (reuse `APPLE_PREFIX`) * Add detection for non-Intel architectures --- CMakeLists.txt | 2 +- cmake/modules/DetectMachine.cmake | 81 +++++++++++++++++++++++----- include/versioninfo.h | 16 ++++++ src/3rdparty/rpmalloc/rpmalloc | 2 +- src/core/AudioEngineWorkerThread.cpp | 4 +- src/core/MemoryManager.cpp | 2 +- src/lmmsconfig.h.in | 4 ++ 7 files changed, 92 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c86c217c2..cb89d707e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -86,7 +86,7 @@ OPTION(BUNDLE_QT_TRANSLATIONS "Install Qt translation files for LMMS" OFF) IF(LMMS_BUILD_APPLE) # Fix linking on 10.14+. See issue #4762 on github - LINK_DIRECTORIES(/usr/local/lib) + LINK_DIRECTORIES("${APPLE_PREFIX}/lib") SET(WANT_SOUNDIO OFF) SET(WANT_ALSA OFF) SET(WANT_PULSEAUDIO OFF) diff --git a/cmake/modules/DetectMachine.cmake b/cmake/modules/DetectMachine.cmake index 86807b757..e3daa99f3 100644 --- a/cmake/modules/DetectMachine.cmake +++ b/cmake/modules/DetectMachine.cmake @@ -20,22 +20,40 @@ ENDIF() MESSAGE("PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}") SET(LMMS_HOST_X86 FALSE) SET(LMMS_HOST_X86_64 FALSE) +SET(LMMS_HOST_ARM32 FALSE) +SET(LMMS_HOST_ARM64 FALSE) +SET(LMMS_HOST_RISCV32 FALSE) +SET(LMMS_HOST_RISCV64 FALSE) IF(NOT DEFINED WIN64 AND CMAKE_SIZEOF_VOID_P EQUAL 8) - SET(WIN64 ON) + # TODO: This seems a bit presumptous + SET(WIN64 ON) ENDIF() IF(WIN32) - IF(WIN64) - SET(IS_X86_64 TRUE) - SET(LMMS_BUILD_WIN64 TRUE) - ELSE(WIN64) - SET(IS_X86 TRUE) - ENDIF(WIN64) - if(MSVC) SET(MSVC_VER ${CMAKE_CXX_COMPILER_VERSION}) + # Detect target architecture + IF(CMAKE_GENERATOR_PLATFORM) + STRING(TOLOWER "${CMAKE_GENERATOR_PLATFORM}" MSVC_TARGET_PLATFORM) + ELSE() + STRING(TOLOWER "${CMAKE_VS_PLATFORM_NAME_DEFAULT}" MSVC_TARGET_PLATFORM) + ENDIF() + + IF(MSVC_TARGET_PLATFORM MATCHES "x64") + SET(IS_X86_64 TRUE) + SET(LMMS_BUILD_WIN64 TRUE) + ELSEIF(MSVC_TARGET_PLATFORM MATCHES "win32") + SET(IS_X86 TRUE) + ELSEIF(MSVC_TARGET_PLATFORM MATCHES "arm64") + SET(IS_ARM64 TRUE) + ELSEIF(MSVC_TARGET_PLATFORM MATCHES "arm") + SET(IS_ARM32 TRUE) + ELSE() + MESSAGE(WARNING "Unknown target architecture: ${MSVC_TARGET_PLATFORM}") + ENDIF() + IF(MSVC_VER VERSION_GREATER 19.20 OR MSVC_VER VERSION_EQUAL 19.20) SET(LMMS_MSVC_GENERATOR "Visual Studio 16 2019") SET(LMMS_MSVC_YEAR 2019) # Qt only provides binaries for MSVC 2017, but 2019 is binary compatible @@ -50,23 +68,58 @@ IF(WIN32) ENDIF() unset(MSVC_VER) + else() + # Cross-compiled + # TODO: Handle Windows ARM64 targets + IF(WIN64) + SET(IS_X86_64 TRUE) + SET(LMMS_BUILD_WIN64 TRUE) + ELSE(WIN64) + SET(IS_X86 TRUE) + ENDIF(WIN64) endif() -ELSE(WIN32) +ELSE() + # Detect target architecture based on compiler target triple e.g. "x86_64-pc-linux" EXEC_PROGRAM( ${CMAKE_C_COMPILER} ARGS "-dumpmachine ${CMAKE_C_FLAGS}" OUTPUT_VARIABLE Machine ) MESSAGE("Machine: ${Machine}") STRING(REGEX MATCH "i.86" IS_X86 "${Machine}") STRING(REGEX MATCH "86_64|amd64" IS_X86_64 "${Machine}") -ENDIF(WIN32) + IF(Machine MATCHES "arm|aarch64") + IF(Machine MATCHES "arm64|aarch64") + SET(IS_ARM64 TRUE) + ELSE() + SET(IS_ARM32 TRUE) + ENDIF() + ELSEIF(Machine MATCHES "rv|riscv") + IF(Machine MATCHES "rv64|riscv64") + SET(IS_RISCV64 TRUE) + ELSE() + SET(IS_RISCV32 TRUE) + ENDIF() + ENDIF() +ENDIF() IF(IS_X86) - MESSAGE("-- Target host is 32 bit") + MESSAGE("-- Target host is 32 bit, Intel") SET(LMMS_HOST_X86 TRUE) ELSEIF(IS_X86_64) - MESSAGE("-- Target host is 64 bit") + MESSAGE("-- Target host is 64 bit, Intel") SET(LMMS_HOST_X86_64 TRUE) -ELSE(IS_X86) +ELSEIF(IS_ARM32) + MESSAGE("-- Target host is 32 bit, ARM") + SET(LMMS_HOST_ARM32 TRUE) +ELSEIF(IS_ARM64) + MESSAGE("-- Target host is 64 bit, ARM") + SET(LMMS_HOST_ARM64 TRUE) +ELSEIF(IS_RISCV32) + MESSAGE("-- Target host is 32 bit, RISC-V") + SET(LMMS_HOST_RISCV32 TRUE) +ELSEIF(IS_RISCV64) + MESSAGE("-- Target host is 64 bit, RISC-V") + SET(LMMS_HOST_RISCV64 TRUE) +ELSE() MESSAGE("Can't identify target host. Assuming 32 bit platform.") -ENDIF(IS_X86) +ENDIF() IF(CMAKE_INSTALL_LIBDIR) SET(LIB_DIR "${CMAKE_INSTALL_LIBDIR}") diff --git a/include/versioninfo.h b/include/versioninfo.h index a5d3d64c6..b5965deba 100644 --- a/include/versioninfo.h +++ b/include/versioninfo.h @@ -16,6 +16,22 @@ #define MACHINE "x86_64" #endif +#ifdef LMMS_HOST_ARM32 +#define MACHINE "arm32" +#endif + +#ifdef LMMS_HOST_ARM64 +#define MACHINE "arm64" +#endif + +#ifdef LMMS_HOST_RISCV32 +#define MACHINE "riscv32" +#endif + +#ifdef LMMS_HOST_RISCV64 +#define MACHINE "riscv64" +#endif + #ifndef MACHINE #define MACHINE "unknown processor" #endif diff --git a/src/3rdparty/rpmalloc/rpmalloc b/src/3rdparty/rpmalloc/rpmalloc index 8d790d2b4..30cc0c7a8 160000 --- a/src/3rdparty/rpmalloc/rpmalloc +++ b/src/3rdparty/rpmalloc/rpmalloc @@ -1 +1 @@ -Subproject commit 8d790d2b45e1818e531c61bf649c5225556dd07a +Subproject commit 30cc0c7a8c1b4decdeb72d456b158f0995ca839e diff --git a/src/core/AudioEngineWorkerThread.cpp b/src/core/AudioEngineWorkerThread.cpp index 0746583d2..5790b547a 100644 --- a/src/core/AudioEngineWorkerThread.cpp +++ b/src/core/AudioEngineWorkerThread.cpp @@ -32,7 +32,7 @@ #include "AudioEngine.h" #include "ThreadableJob.h" -#if defined(LMMS_HOST_X86) || defined(LMMS_HOST_X86_64) +#if __SSE__ #include #endif @@ -98,7 +98,7 @@ void AudioEngineWorkerThread::JobQueue::wait() { while (m_itemsDone < m_writeIndex) { -#if defined(LMMS_HOST_X86) || defined(LMMS_HOST_X86_64) +#ifdef __SSE__ _mm_pause(); #endif } diff --git a/src/core/MemoryManager.cpp b/src/core/MemoryManager.cpp index d0932e4f1..0f1c93466 100644 --- a/src/core/MemoryManager.cpp +++ b/src/core/MemoryManager.cpp @@ -53,7 +53,7 @@ MemoryManager::ThreadGuard::ThreadGuard() MemoryManager::ThreadGuard::~ThreadGuard() { if (--thread_guard_depth == 0) { - rpmalloc_thread_finalize(); + rpmalloc_thread_finalize(true); } } diff --git a/src/lmmsconfig.h.in b/src/lmmsconfig.h.in index 9ed3a496b..d58c9705d 100644 --- a/src/lmmsconfig.h.in +++ b/src/lmmsconfig.h.in @@ -8,6 +8,10 @@ #cmakedefine LMMS_HOST_X86 #cmakedefine LMMS_HOST_X86_64 +#cmakedefine LMMS_HOST_ARM32 +#cmakedefine LMMS_HOST_ARM64 +#cmakedefine LMMS_HOST_RISCV32 +#cmakedefine LMMS_HOST_RISCV64 #cmakedefine LMMS_HAVE_ALSA #cmakedefine LMMS_HAVE_FLUIDSYNTH