Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey@blender.org>2022-02-11 13:10:53 +0300
committerSergey Sharybin <sergey@blender.org>2022-02-22 17:47:43 +0300
commitca991e3012854ce53d8c78c537910d3f858a9d28 (patch)
tree267531eb133a7d54b72311e35ead5f6b53d3ee6d /build_files
parent1d4037645fb5467f71258883b12dc734532cde44 (diff)
Fix compilation error on certain platforms
Atomic operations performed by the C++ standard library might require libatomic on platforms which do not have hardware support for those operations. This change makes it that such configurations are automatically detected and -latomic is added when needed. Differential Revision: https://developer.blender.org/D14106
Diffstat (limited to 'build_files')
-rw-r--r--build_files/cmake/platform/platform_unix.cmake42
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 95d0e4de380..10f636296b7 100644
--- a/build_files/cmake/platform/platform_unix.cmake
+++ b/build_files/cmake/platform/platform_unix.cmake
@@ -866,3 +866,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()