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 #include - std::atomic n8 (0); // riscv64 - std::atomic n64 (0); // armel, mipsel, powerpc + std::atomic n8(0); // riscv64 + std::atomic 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)