diff options
author | Sergey Sharybin <sergey@blender.org> | 2022-02-22 18:08:38 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2022-02-22 18:08:38 +0300 |
commit | b861d3e4c133e5ef2f9acb3fa39096a20addb32a (patch) | |
tree | be3dc8f5ec62da2fc480e64b071068964c52c93c /build_files/cmake | |
parent | 37fb69e02033b59895173aa2f47858ff3923afad (diff) | |
parent | ca991e3012854ce53d8c78c537910d3f858a9d28 (diff) |
Merge branch 'blender-v3.1-release'
Diffstat (limited to 'build_files/cmake')
-rw-r--r-- | build_files/cmake/platform/platform_unix.cmake | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index f68878c5913..77d1db97997 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -849,3 +849,45 @@ if(WITH_COMPILER_CCACHE) set(WITH_COMPILER_CCACHE OFF) endif() endif() + +# On some platforms certain atomic operations are not possible with assembly and/or intrinsics and +# they are emulated in software with locks. For example, on armel there is no intrinsics to grant +# 64 bit atomic operations and STL library uses libatomic to offload software emulation of atomics +# to. +# This function will check whether libatomic is required and if so will configure linker flags. +# If atomic operations are possible without libatomic then linker flags are left as-is. +function(CONFIGURE_ATOMIC_LIB_IF_NEEDED) + # Source which is used to enforce situation when software emulation of atomics is required. + # Assume that using 64bit integer gives a definitive asnwer (as in, if 64bit atomic operations + # are possible using assembly/intrinsics 8, 16, and 32 bit operations will also be possible. + set(_source + "#include <atomic> + #include <cstdint> + int main(int argc, char **argv) { + std::atomic<uint64_t> uint64; uint64++; + return 0; + }") + + include(CheckCXXSourceCompiles) + check_cxx_source_compiles("${_source}" ATOMIC_OPS_WITHOUT_LIBATOMIC) + + if(NOT ATOMIC_OPS_WITHOUT_LIBATOMIC) + # Compilation of the test program has failed. + # Try it again with -latomic to see if this is what is needed, or whether something else is + # going on. + + set(CMAKE_REQUIRED_LIBRARIES atomic) + check_cxx_source_compiles("${_source}" ATOMIC_OPS_WITH_LIBATOMIC) + + if(ATOMIC_OPS_WITH_LIBATOMIC) + set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -latomic" PARENT_SCOPE) + else() + # Atomic operations are required part of Blender and it is not possible to process forward. + # We expect that either standard library or libatomic will make atomics to work. If both + # cases has failed something fishy o na bigger scope is going on. + message(FATAL_ERROR "Failed to detect required configuration for atomic operations") + endif() + endif() +endfunction() + +CONFIGURE_ATOMIC_LIB_IF_NEEDED() |