Skip to content

Commit 2fbc849

Browse files
sobomaxarr2036
authored andcommitted
Check if libstdatomic is needed to link on the platform, this is
still a separate library on linux/arm/v5.
1 parent f20217a commit 2fbc849

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON)
7575
set(CMAKE_C_STANDARD_REQUIRED ON)
7676
set(CMAKE_C_STANDARD 11)
7777

78+
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
79+
7880
if(NOT CMAKE_BUILD_TYPE)
7981
set(CMAKE_BUILD_TYPE RelWithDebInfo)
8082
endif()
@@ -283,6 +285,7 @@ if(WIN32)
283285
target_compile_definitions(objlib PRIVATE _CRT_SECURE_NO_WARNINGS)
284286
target_compile_definitions(objlib PRIVATE WIN32_LEAN_AND_MEAN)
285287
else()
288+
include(StdAtomicCheck)
286289
target_compile_definitions(objlib PRIVATE _XOPEN_SOURCE=600)
287290
endif()
288291

cmake/StdAtomicCheck.cmake

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Check if _Atomic needs -latomic
2+
3+
set(LIBATOMIC_STATIC_PATH "" CACHE PATH "Directory containing static libatomic.a")
4+
5+
include(CheckCSourceCompiles)
6+
7+
set(
8+
check_std_atomic_source_code
9+
[=[
10+
#include <stdatomic.h>
11+
_Atomic long long x = 0;
12+
atomic_uint y = 0;
13+
void test(_Atomic long long *x, long long v) {
14+
atomic_store(x, v);
15+
y = v + 1;
16+
}
17+
int main(int argc, char **argv) {
18+
test(&x, argc);
19+
return 0;
20+
}
21+
]=])
22+
23+
check_c_source_compiles("${check_std_atomic_source_code}" std_atomic_without_libatomic)
24+
25+
if(NOT std_atomic_without_libatomic)
26+
set(CMAKE_REQUIRED_LIBRARIES atomic)
27+
check_c_source_compiles("${check_std_atomic_source_code}" std_atomic_with_libatomic)
28+
set(CMAKE_REQUIRED_LIBRARIES)
29+
if(NOT std_atomic_with_libatomic)
30+
message(FATAL_ERROR "Toolchain doesn't support C11 _Atomic with nor without -latomic")
31+
else()
32+
find_library(ATOMIC_STATIC NAMES libatomic.a PATHS /usr/lib /usr/local/lib ${LIBATOMIC_STATIC_PATH} NO_DEFAULT_PATH)
33+
if(ATOMIC_STATIC)
34+
get_filename_component(ATOMIC_STATIC_DIR "${ATOMIC_STATIC}" DIRECTORY)
35+
get_filename_component(ATOMIC_STATIC_NAME "${ATOMIC_STATIC}" NAME)
36+
message(STATUS "Linking static libatomic: -L${ATOMIC_STATIC_DIR} -l:${ATOMIC_STATIC_NAME}")
37+
set(EXTRA_PRIVATE_LIBS "-L${ATOMIC_STATIC_DIR} -l:${ATOMIC_STATIC_NAME}")
38+
if(ENABLE_SHARED)
39+
target_link_directories(kqueue PRIVATE "${ATOMIC_STATIC_DIR}")
40+
target_link_libraries(kqueue PRIVATE "-l:${ATOMIC_STATIC_NAME}")
41+
endif()
42+
else()
43+
message(WARNING "static libatomic not found; falling back to -latomic")
44+
set(EXTRA_PRIVATE_LIBS "-latomic")
45+
if(ENABLE_SHARED)
46+
target_link_libraries(kqueue PRIVATE atomic)
47+
endif()
48+
endif()
49+
endif()
50+
endif()

libkqueue.pc.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ Description: Emulates FreeBSD kqueue(2) on other platforms
88
Version: @PROJECT_VERSION@
99
Requires:
1010
Libs: -L${libdir} -lkqueue
11-
Libs.private: -lpthread -lrt
11+
Libs.private: -lpthread -lrt @EXTRA_PRIVATE_LIBS@
1212
Cflags: -I${includedir}/kqueue

0 commit comments

Comments
 (0)