From 619a2d89e264288717ce54b299b7fcfbea3a248d Mon Sep 17 00:00:00 2001 From: Sprite <SpriteOvO@gmail.com> Date: Mon, 4 Apr 2022 06:12:43 +0800 Subject: [PATCH] cmake: fix incorrectly linking to libatomic on macOS --- CMakeLists.txt | 4 ++++ cmake/CheckAtomic.cmake | 27 +++++++++++++++------------ cmake/DetermineGCCCompatible.cmake | 13 +++++++++++++ 3 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 cmake/DetermineGCCCompatible.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index bc971857..f2d8447a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -49,6 +49,10 @@ find_package(Doxygen) option (OPENDHT_DOCUMENTATION "Create and install the HTML based API documentation (requires Doxygen)" ${DOXYGEN_FOUND}) # Dependencies +if (NOT HAVE_CXX_ATOMICS_WITHOUT_LIB) + link_libraries (atomic) +endif () + list (APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") if (NOT MSVC) set (THREADS_PREFER_PTHREAD_FLAG TRUE) diff --git a/cmake/CheckAtomic.cmake b/cmake/CheckAtomic.cmake index b9ae7e4f..b6be817d 100644 --- a/cmake/CheckAtomic.cmake +++ b/cmake/CheckAtomic.cmake @@ -2,6 +2,7 @@ INCLUDE(CheckCXXSourceCompiles) INCLUDE(CheckLibraryExists) +INCLUDE("${CMAKE_CURRENT_LIST_DIR}/DetermineGCCCompatible.cmake") # Sometimes linking against libatomic is required for atomic ops, if # the platform doesn't support lock-free atomics. @@ -32,6 +33,7 @@ function(check_working_cxx_atomics64 varname) std::atomic<uint64_t> x (0); int main() { uint64_t i = x.load(std::memory_order_relaxed); + (void)i; return 0; } " ${varname}) @@ -39,9 +41,10 @@ int main() { endfunction(check_working_cxx_atomics64) -# This isn't necessary on MSVC, so avoid command-line switch annoyance -# by only running on GCC-like hosts. -if (LLVM_COMPILER_IS_GCC_COMPATIBLE) +# Check for (non-64-bit) atomic operations. +if(MSVC) + set(HAVE_CXX_ATOMICS_WITHOUT_LIB True) +elseif(LLVM_COMPILER_IS_GCC_COMPATIBLE OR CMAKE_CXX_COMPILER_ID MATCHES "XL") # First check if atomics work without the library. check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB) # If not, check if the library exists, and atomics work with it. @@ -57,16 +60,16 @@ endif() # Check for 64 bit atomic operations. if(MSVC) set(HAVE_CXX_ATOMICS64_WITHOUT_LIB True) -else() +elseif(LLVM_COMPILER_IS_GCC_COMPATIBLE OR CMAKE_CXX_COMPILER_ID MATCHES "XL") + # First check if atomics work without the library. check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) -endif() - -# If not, check if the library exists, and atomics work with it. -if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) - list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") - check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) - if (NOT HAVE_CXX_ATOMICS64_WITH_LIB) - message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!") + # If not, check if the library exists, and atomics work with it. + if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) + list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic") + check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB) + if (NOT HAVE_CXX_ATOMICS64_WITH_LIB) + message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!") + endif() endif() endif() diff --git a/cmake/DetermineGCCCompatible.cmake b/cmake/DetermineGCCCompatible.cmake new file mode 100644 index 00000000..1369ebe9 --- /dev/null +++ b/cmake/DetermineGCCCompatible.cmake @@ -0,0 +1,13 @@ +# Determine if the compiler has GCC-compatible command-line syntax. + +if(NOT DEFINED LLVM_COMPILER_IS_GCC_COMPATIBLE) + if(CMAKE_COMPILER_IS_GNUCXX) + set(LLVM_COMPILER_IS_GCC_COMPATIBLE ON) + elseif( MSVC ) + set(LLVM_COMPILER_IS_GCC_COMPATIBLE OFF) + elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) + set(LLVM_COMPILER_IS_GCC_COMPATIBLE ON) + elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel" ) + set(LLVM_COMPILER_IS_GCC_COMPATIBLE ON) + endif() +endif() -- GitLab