From 8b68c4a12b44e12574e1364a20139fdfeede68f2 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 9 Apr 2026 11:38:30 +0000 Subject: [PATCH 1/2] Haiku: Fix native component build This contains the missing configuration updates required to build the native component for Haiku with the latest .NET source. --- eng/native/configurecompiler.cmake | 32 +++++++++++++++++++- src/native/libs/Common/pal_config.h.in | 2 ++ src/native/libs/System.Native/CMakeLists.txt | 7 ++--- src/native/libs/configure.cmake | 2 ++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index ace8fd5fe426f3..7543194c58932c 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -350,8 +350,38 @@ elseif(CLR_CMAKE_HOST_APPLE) endif() endif() elseif(CLR_CMAKE_HOST_HAIKU) + # Haiku uses the GNU toolchain, which supports WHOLE_ARCHIVE, but only CMake 3.31.0+ recognizes this. + if(CMAKE_VERSION VERSION_LESS 3.31) + if(NOT DEFINED _CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED) + execute_process(COMMAND "${CMAKE_LINKER}" --help + OUTPUT_VARIABLE __linker_help + ERROR_VARIABLE __linker_help) + if(__linker_help MATCHES "--push-state" AND __linker_help MATCHES "--pop-state") + set(_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED TRUE CACHE INTERNAL "linker supports push/pop state") + else() + set(_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED FALSE CACHE INTERNAL "linker supports push/pop state") + endif() + unset(__linker_help) + endif() + if(_CMAKE_LINKER_PUSHPOP_STATE_SUPPORTED) + set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE "LINKER:--push-state,--whole-archive" + "" + "LINKER:--pop-state") + else() + set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE "LINKER:--whole-archive" + "" + "LINKER:--no-whole-archive") + endif() + set(CMAKE_LINK_LIBRARY_USING_WHOLE_ARCHIVE_SUPPORTED TRUE) + set(CMAKE_LINK_LIBRARY_WHOLE_ARCHIVE_ATTRIBUTES LIBRARY_TYPE=STATIC DEDUPLICATION=YES OVERRIDE=DEFAULT) + endif() + # Haiku uses the GNU toolchain, which supports RESCAN, but only CMake 4.4.0+ recognizes this. + if(CMAKE_VERSION VERSION_LESS 4.4) + set(CMAKE_LINK_GROUP_USING_RESCAN "LINKER:--start-group" "LINKER:--end-group") + set(CMAKE_LINK_GROUP_USING_RESCAN_SUPPORTED TRUE) + endif() add_compile_options($<$:-Wa,--noexecstack>) - add_linker_flag("-Wl,--no-undefined") + add_linker_flag("-Wl,--build-id=sha1") endif() #------------------------------------ diff --git a/src/native/libs/Common/pal_config.h.in b/src/native/libs/Common/pal_config.h.in index 58f883951f0397..3dc4aee6e2aa3d 100644 --- a/src/native/libs/Common/pal_config.h.in +++ b/src/native/libs/Common/pal_config.h.in @@ -106,6 +106,8 @@ #cmakedefine01 HAVE_CLOCK_GETTIME_NSEC_NP #cmakedefine01 HAVE_PTHREAD_CONDATTR_SETCLOCK #cmakedefine01 HAVE_PTHREAD_MUTEX_CLOCKLOCK +#cmakedefine01 HAVE_PTHREAD_MUTEX_CONSISTENT +#cmakedefine01 HAVE_PTHREAD_MUTEXATTR_SETROBUST #cmakedefine01 HAVE_TCP_H_TCPSTATE_ENUM #cmakedefine01 HAVE_TCP_FSM_H #cmakedefine01 HAVE_GSSFW_HEADERS diff --git a/src/native/libs/System.Native/CMakeLists.txt b/src/native/libs/System.Native/CMakeLists.txt index 52a4dccbdd9b96..51b2a12082de01 100644 --- a/src/native/libs/System.Native/CMakeLists.txt +++ b/src/native/libs/System.Native/CMakeLists.txt @@ -57,13 +57,12 @@ else() # WASI ) endif() -if (CLR_CMAKE_TARGET_APPLE OR CLR_CMAKE_TARGET_ANDROID OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI OR CLR_CMAKE_TARGET_OPENBSD) +if (HAVE_PTHREAD_MUTEXATTR_SETROBUST AND HAVE_PTHREAD_MUTEX_CONSISTENT) list (APPEND NATIVE_SOURCES - pal_crossprocessmutex_unsupported.c) + pal_crossprocessmutex.c) else() list (APPEND NATIVE_SOURCES - pal_crossprocessmutex.c - ) + pal_crossprocessmutex_unsupported.c) endif() if (CLR_CMAKE_TARGET_APPLE) diff --git a/src/native/libs/configure.cmake b/src/native/libs/configure.cmake index ba504df4834918..7c6211d55e4dea 100644 --- a/src/native/libs/configure.cmake +++ b/src/native/libs/configure.cmake @@ -656,6 +656,8 @@ endif() if (NOT CLR_CMAKE_TARGET_WASI) check_library_exists(${PTHREAD_LIBRARY} pthread_condattr_setclock "" HAVE_PTHREAD_CONDATTR_SETCLOCK) check_library_exists(${PTHREAD_LIBRARY} pthread_mutex_clocklock "" HAVE_PTHREAD_MUTEX_CLOCKLOCK) + check_library_exists(${PTHREAD_LIBRARY} pthread_mutex_consistent "" HAVE_PTHREAD_MUTEX_CONSISTENT) + check_library_exists(${PTHREAD_LIBRARY} pthread_mutexattr_setrobust "" HAVE_PTHREAD_MUTEXATTR_SETROBUST) endif() check_symbol_exists( From 4d245791e631a8163f98c9a03f717800ac6b5d93 Mon Sep 17 00:00:00 2001 From: Trung Nguyen <57174311+trungnt2910@users.noreply.github.com> Date: Tue, 28 Apr 2026 20:24:09 +1000 Subject: [PATCH 2/2] Haiku: Revert to OS-based hardcoding Seems like the priority is runtime code size, not portability. Reverted the cross-process mutex implementation choice to a OS-based list instead of a dynamic configure-time check. Also tell the managed counterpart that Haiku does not support this feature to prevent future issues. --- .../src/System/OperatingSystem.cs | 11 +++++++++++ .../src/System/Threading/NamedMutex.Unix.cs | 3 ++- src/native/libs/Common/pal_config.h.in | 2 -- src/native/libs/System.Native/CMakeLists.txt | 11 ++++++++--- src/native/libs/configure.cmake | 2 -- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs index 8134e38145590a..8c4ce4d07d3360 100644 --- a/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs +++ b/src/libraries/System.Private.CoreLib/src/System/OperatingSystem.cs @@ -209,6 +209,17 @@ internal static bool IsOpenBSD() => false; #endif + /// + /// Indicates whether the current application is running on Haiku. + /// + [NonVersionable] + internal static bool IsHaiku() => +#if TARGET_HAIKU + true; +#else + false; +#endif + /// /// Indicates whether the current application is running on Android. /// diff --git a/src/libraries/System.Private.CoreLib/src/System/Threading/NamedMutex.Unix.cs b/src/libraries/System.Private.CoreLib/src/System/Threading/NamedMutex.Unix.cs index 46ddab7933869f..c6771d8909ca67 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Threading/NamedMutex.Unix.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Threading/NamedMutex.Unix.cs @@ -81,7 +81,8 @@ internal abstract class NamedMutexProcessDataBase(SharedMemoryProcessDataHeader< // On FreeBSD, pthread process-shared robust mutexes cannot be placed in shared memory mapped // independently by the processes involved. See https://github.com/dotnet/runtime/issues/10519. // On OpenBSD, cross process mutexes are not supported in the pthread implementation. See https://github.com/dotnet/runtime/pull/125089. - private static bool UsePThreadMutexes => !OperatingSystem.IsApplePlatform() && !OperatingSystem.IsFreeBSD() && !OperatingSystem.IsOpenBSD(); + // On Haiku, robust mutexes are WIP. See https://github.com/dotnet/runtime/pull/126701#issuecomment-4334338213. + private static bool UsePThreadMutexes => !OperatingSystem.IsApplePlatform() && !OperatingSystem.IsFreeBSD() && !OperatingSystem.IsOpenBSD() && !OperatingSystem.IsHaiku(); private readonly SharedMemoryProcessDataHeader _processDataHeader = header; protected nuint _lockCount; diff --git a/src/native/libs/Common/pal_config.h.in b/src/native/libs/Common/pal_config.h.in index 3dc4aee6e2aa3d..58f883951f0397 100644 --- a/src/native/libs/Common/pal_config.h.in +++ b/src/native/libs/Common/pal_config.h.in @@ -106,8 +106,6 @@ #cmakedefine01 HAVE_CLOCK_GETTIME_NSEC_NP #cmakedefine01 HAVE_PTHREAD_CONDATTR_SETCLOCK #cmakedefine01 HAVE_PTHREAD_MUTEX_CLOCKLOCK -#cmakedefine01 HAVE_PTHREAD_MUTEX_CONSISTENT -#cmakedefine01 HAVE_PTHREAD_MUTEXATTR_SETROBUST #cmakedefine01 HAVE_TCP_H_TCPSTATE_ENUM #cmakedefine01 HAVE_TCP_FSM_H #cmakedefine01 HAVE_GSSFW_HEADERS diff --git a/src/native/libs/System.Native/CMakeLists.txt b/src/native/libs/System.Native/CMakeLists.txt index 51b2a12082de01..5930703021940b 100644 --- a/src/native/libs/System.Native/CMakeLists.txt +++ b/src/native/libs/System.Native/CMakeLists.txt @@ -57,12 +57,17 @@ else() # WASI ) endif() -if (HAVE_PTHREAD_MUTEXATTR_SETROBUST AND HAVE_PTHREAD_MUTEX_CONSISTENT) +if (CLR_CMAKE_TARGET_APPLE OR CLR_CMAKE_TARGET_ANDROID OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI OR CLR_CMAKE_TARGET_OPENBSD OR CLR_CMAKE_TARGET_HAIKU) + # These platforms do not support robust mutexes. + # Keep an OS list instead of CMake configure checks since we also need to synchronize this with + # the compile-time guards on the managed code side at + # src/libraries/System.Private.CoreLib/src/System/Threading/NamedMutex.Unix.cs. list (APPEND NATIVE_SOURCES - pal_crossprocessmutex.c) + pal_crossprocessmutex_unsupported.c) else() list (APPEND NATIVE_SOURCES - pal_crossprocessmutex_unsupported.c) + pal_crossprocessmutex.c + ) endif() if (CLR_CMAKE_TARGET_APPLE) diff --git a/src/native/libs/configure.cmake b/src/native/libs/configure.cmake index 7c6211d55e4dea..ba504df4834918 100644 --- a/src/native/libs/configure.cmake +++ b/src/native/libs/configure.cmake @@ -656,8 +656,6 @@ endif() if (NOT CLR_CMAKE_TARGET_WASI) check_library_exists(${PTHREAD_LIBRARY} pthread_condattr_setclock "" HAVE_PTHREAD_CONDATTR_SETCLOCK) check_library_exists(${PTHREAD_LIBRARY} pthread_mutex_clocklock "" HAVE_PTHREAD_MUTEX_CLOCKLOCK) - check_library_exists(${PTHREAD_LIBRARY} pthread_mutex_consistent "" HAVE_PTHREAD_MUTEX_CONSISTENT) - check_library_exists(${PTHREAD_LIBRARY} pthread_mutexattr_setrobust "" HAVE_PTHREAD_MUTEXATTR_SETROBUST) endif() check_symbol_exists(