diff options
Diffstat (limited to 'build_files/cmake/platform/platform_unix.cmake')
-rw-r--r-- | build_files/cmake/platform/platform_unix.cmake | 43 |
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() |