aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--CMake/FindAtomics.cmake59
-rw-r--r--CMakeLists.txt4
2 files changed, 33 insertions, 30 deletions
diff --git a/CMake/FindAtomics.cmake b/CMake/FindAtomics.cmake
index 6cafdcde6..2601c7902 100644
--- a/CMake/FindAtomics.cmake
+++ b/CMake/FindAtomics.cmake
@@ -7,9 +7,12 @@
# riscv64 specific:
# * https://lists.debian.org/debian-riscv/2022/01/msg00009.html
#
-# ATOMICS_FOUND - system has c++ atomics
-# ATOMICS_LIBRARIES - libraries needed to use c++ atomics
-# ATOMICS_LIBRARY_FLAGS - flags required to link with c++ atomics library
+# ATOMICS_FOUND - system has C++ atomics
+# ATOMICS_LIBRARIES - libraries needed to use C++ atomics
+
+if (ATOMICS_FOUND)
+ return()
+endif()
include(CheckCXXSourceCompiles)
@@ -17,40 +20,40 @@ include(CheckCXXSourceCompiles)
# to convert smaller atomics to those larger ones via masking and
# shifting like LLVM, but it’s a known bug that it does not. This means
# anything that wants to use atomics on 1-byte or 2-byte types needs
-# -latomic, but not 4-byte or 8-byte (though it does no harm).
-set(atomic_code
+# to link atomic library, but not 4-byte or 8-byte (though it does no harm).
+set(ATOMIC_CODE
"
#include <atomic>
#include <cstdint>
- std::atomic<uint8_t> n8 (0); // riscv64
- std::atomic<uint64_t> n64 (0); // armel, mipsel, powerpc
+ std::atomic<std::uint8_t> n8(0); // riscv64
+ std::atomic<std::uint64_t> n64(0); // armel, mipsel, powerpc
int main() {
++n8;
++n64;
- return 0;
}")
-check_cxx_source_compiles("${atomic_code}" ATOMICS_LOCK_FREE_INSTRUCTIONS)
+set(ATOMICS_LIBS " " "-latomic")
-if (ATOMICS_LOCK_FREE_INSTRUCTIONS)
- set(ATOMICS_FOUND TRUE)
- set(ATOMICS_LIBRARIES)
- set(ATOMICS_LIBRARY_FLAGS)
-else()
- set(CMAKE_REQUIRED_LIBRARIES "-latomic")
- check_cxx_source_compiles("${atomic_code}" ATOMICS_IN_LIBRARY)
- set(CMAKE_REQUIRED_LIBRARIES)
- if (ATOMICS_IN_LIBRARY)
- set(ATOMICS_LIBRARY atomic)
- include(FindPackageHandleStandardArgs)
- find_package_handle_standard_args(Atomics DEFAULT_MSG ATOMICS_LIBRARY)
- set(ATOMICS_LIBRARIES ${ATOMICS_LIBRARY})
- set(ATOMICS_LIBRARY_FLAGS "-latomic")
- unset(ATOMICS_LIBRARY)
- else()
- if (Atomics_FIND_REQUIRED)
- message(FATAL_ERROR "Neither lock free instructions nor -latomic found.")
+foreach (ATOMICS_LIBRARY ${ATOMICS_LIBS})
+ unset(ATOMICS_FOUND CACHE)
+ set(CMAKE_REQUIRED_LIBRARIES "${ATOMICS_LIBRARY}")
+ check_cxx_source_compiles("${ATOMIC_CODE}" ATOMICS_FOUND)
+ unset(CMAKE_REQUIRED_LIBRARIES)
+ if (ATOMICS_FOUND)
+ if (NOT ATOMICS_LIBRARY STREQUAL " ")
+ include(FindPackageHandleStandardArgs)
+ find_package_handle_standard_args(Atomics DEFAULT_MSG ATOMICS_LIBRARY)
+ set(ATOMICS_LIBRARIES "${ATOMICS_LIBRARY}" CACHE STRING "Atomic library" FORCE)
+ else()
+ set(ATOMICS_LIBRARIES "" CACHE STRING "Atomic operations library" FORCE)
endif()
+ break()
endif()
+endforeach()
+if (Atomics_FIND_REQUIRED AND NOT ATOMICS_FOUND)
+ message(FATAL_ERROR "Atomic operations library isn't found.")
endif()
-unset(atomic_code)
+
+unset(ATOMICS_LIBRARY)
+unset(ATOMICS_LIBS)
+unset(ATOMIC_CODE)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e386de4e6..d17ede50a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -133,8 +133,8 @@ include(TdSetUpCompiler)
td_set_up_compiler()
find_package(Atomics REQUIRED)
-if (ATOMICS_LIBRARY_FLAGS)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ATOMICS_LIBRARY_FLAGS}")
+if (ATOMICS_LIBRARIES)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ATOMICS_LIBRARIES}")
endif()
if (MSVC)