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:
Diffstat (limited to 'build_files/cmake/platform/platform_unix.cmake')
-rw-r--r--build_files/cmake/platform/platform_unix.cmake43
1 files changed, 43 insertions, 0 deletions
diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake
index 96c402760b7..77d1db97997 100644
--- a/build_files/cmake/platform/platform_unix.cmake
+++ b/build_files/cmake/platform/platform_unix.cmake
@@ -345,6 +345,7 @@ if(WITH_BOOST)
find_package(IcuLinux)
endif()
mark_as_advanced(Boost_DIR) # why doesn't boost do this?
+ mark_as_advanced(Boost_INCLUDE_DIR) # why doesn't boost do this?
endif()
set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS})
@@ -848,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()