Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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()

Expand Down
50 changes: 50 additions & 0 deletions cmake/StdAtomicCheck.cmake
Original file line number Diff line number Diff line change
@@ -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 <stdatomic.h>
_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()
2 changes: 1 addition & 1 deletion libkqueue.pc.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Loading