Rewrite FindAtomics.cmake.
This commit is contained in:
parent
3967634933
commit
69908ae3c4
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user