From 8eaa6cc6b9db97f956cd1eb072827deadc6cd439 Mon Sep 17 00:00:00 2001 From: Maksym Sobolyev Date: Sat, 14 Jun 2025 10:23:17 -0700 Subject: [PATCH] Check if libstdatomic is needed to link on the platform, this is still a separate library on linux/arm/v5. --- CMakeLists.txt | 3 +++ cmake/StdAtomicCheck.cmake | 50 ++++++++++++++++++++++++++++++++++++++ libkqueue.pc.in | 2 +- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 cmake/StdAtomicCheck.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 84ccf913..6495c75b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,6 +72,8 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD 11) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo) endif() @@ -277,6 +279,7 @@ if(WIN32) target_compile_definitions(objlib PRIVATE _CRT_SECURE_NO_WARNINGS) target_compile_definitions(objlib PRIVATE WIN32_LEAN_AND_MEAN) else() + include(StdAtomicCheck) target_compile_definitions(objlib PRIVATE _XOPEN_SOURCE=600) endif() diff --git a/cmake/StdAtomicCheck.cmake b/cmake/StdAtomicCheck.cmake new file mode 100644 index 00000000..38937587 --- /dev/null +++ b/cmake/StdAtomicCheck.cmake @@ -0,0 +1,50 @@ +# Check if _Atomic needs -latomic + +set(LIBATOMIC_STATIC_PATH "" CACHE PATH "Directory containing static libatomic.a") + +include(CheckCSourceCompiles) + +set( + check_std_atomic_source_code + [=[ + #include + _Atomic long long x = 0; + atomic_uint y = 0; + void test(_Atomic long long *x, long long v) { + atomic_store(x, v); + y = v + 1; + } + int main(int argc, char **argv) { + test(&x, argc); + return 0; + } + ]=]) + +check_c_source_compiles("${check_std_atomic_source_code}" std_atomic_without_libatomic) + +if(NOT std_atomic_without_libatomic) + set(CMAKE_REQUIRED_LIBRARIES atomic) + check_c_source_compiles("${check_std_atomic_source_code}" std_atomic_with_libatomic) + set(CMAKE_REQUIRED_LIBRARIES) + if(NOT std_atomic_with_libatomic) + message(FATAL_ERROR "Toolchain doesn't support C11 _Atomic with nor without -latomic") + else() + find_library(ATOMIC_STATIC NAMES libatomic.a PATHS /usr/lib /usr/local/lib ${LIBATOMIC_STATIC_PATH} NO_DEFAULT_PATH) + if(ATOMIC_STATIC) + get_filename_component(ATOMIC_STATIC_DIR "${ATOMIC_STATIC}" DIRECTORY) + get_filename_component(ATOMIC_STATIC_NAME "${ATOMIC_STATIC}" NAME) + message(STATUS "Linking static libatomic: -L${ATOMIC_STATIC_DIR} -l:${ATOMIC_STATIC_NAME}") + set(EXTRA_PRIVATE_LIBS "-L${ATOMIC_STATIC_DIR} -l:${ATOMIC_STATIC_NAME}") + if(ENABLE_SHARED) + target_link_directories(kqueue PRIVATE "${ATOMIC_STATIC_DIR}") + target_link_libraries(kqueue PRIVATE "-l:${ATOMIC_STATIC_NAME}") + endif() + else() + message(WARNING "static libatomic not found; falling back to -latomic") + set(EXTRA_PRIVATE_LIBS "-latomic") + if(ENABLE_SHARED) + target_link_libraries(kqueue PRIVATE atomic) + endif() + endif() + endif() +endif() diff --git a/libkqueue.pc.in b/libkqueue.pc.in index 534d5791..cf250974 100644 --- a/libkqueue.pc.in +++ b/libkqueue.pc.in @@ -8,5 +8,5 @@ Description: Emulates FreeBSD kqueue(2) on other platforms Version: @PROJECT_VERSION@ Requires: Libs: -L${libdir} -lkqueue -Libs.private: -lpthread -lrt +Libs.private: -lpthread -lrt @EXTRA_PRIVATE_LIBS@ Cflags: -I${includedir}/kqueue