From e20a5d13935a41a856e8f71c49f2cc9d81b1d92c Mon Sep 17 00:00:00 2001 From: Changqing Li Date: Fri, 13 Nov 2020 17:07:00 +0800 Subject: [PATCH] support link against libatomic if no built-in atomic exist fix error: | framework/lib/ppc/libframework.a(device.cpp.o): in function `std::__atomic_base::load(std::memory_order) const': | /usr/include/c++/10.2.0/bits/atomic_base.h:426: undefined reference to `__atomic_load_8' Upstream-Status: Submitted [https://github.com/KhronosGroup/Vulkan-Samples/pull/212] Signed-off-by: Changqing Li --- CMakeLists.txt | 1 + bldsys/cmake/check_atomic.cmake | 62 +++++++++++++++++++++++++++++++++ framework/CMakeLists.txt | 4 +++ 3 files changed, 67 insertions(+) create mode 100644 bldsys/cmake/check_atomic.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index e72e829..466f51d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,6 +42,7 @@ endmacro(vulkan_samples_pch) include(utils) include(global_options) include(sample_helper) +include(check_atomic) # Add third party libraries add_subdirectory(third_party) diff --git a/bldsys/cmake/check_atomic.cmake b/bldsys/cmake/check_atomic.cmake new file mode 100644 index 0000000..6b47a7a --- /dev/null +++ b/bldsys/cmake/check_atomic.cmake @@ -0,0 +1,62 @@ +# check weither need to link atomic library explicitly +INCLUDE(CheckCXXSourceCompiles) +INCLUDE(CheckLibraryExists) + +if(NOT DEFINED VULKAN_COMPILER_IS_GCC_COMPATIBLE) + if(CMAKE_COMPILER_IS_GNUCXX) + set(VULKAN_COMPILER_IS_GCC_COMPATIBLE ON) + elseif( MSVC ) + set(VULKAN_COMPILER_IS_GCC_COMPATIBLE OFF) + elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" ) + set(VULKAN_COMPILER_IS_GCC_COMPATIBLE ON) + elseif( "${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel" ) + set(VULKAN_COMPILER_IS_GCC_COMPATIBLE ON) + endif() +endif() + +# Sometimes linking against libatomic is required for atomic ops, if +# the platform doesn't support lock-free atomics. + +function(check_working_cxx_atomics varname) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11") + CHECK_CXX_SOURCE_COMPILES(" +#include +std::atomic x; +std::atomic y; +std::atomic z; +int main() { + ++z; + ++y; + return ++x; +} +" ${varname}) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) +endfunction(check_working_cxx_atomics) + +function(check_working_cxx_atomics64 varname) + set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) + set(CMAKE_REQUIRED_FLAGS "-std=c++11 ${CMAKE_REQUIRED_FLAGS}") + CHECK_CXX_SOURCE_COMPILES(" +#include +#include +std::atomic x (0); +int main() { + uint64_t i = x.load(std::memory_order_relaxed); + (void)i; + return 0; +} +" ${varname}) + set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) +endfunction(check_working_cxx_atomics64) + +set(NEED_LINK_ATOMIC OFF CACHE BOOL "weither need to link against atomic library") +if(VULKAN_COMPILER_IS_GCC_COMPATIBLE) + # check if non-64-bit atomics work without the library. + check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB) + # check 64-bit atomics work without the library. + check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB) + if (NOT HAVE_CXX_ATOMICS_WITHOUT_LIB OR NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB) + set(NEED_LINK_ATOMIC ON CACHE BOOL "weither need to link to atomic library" FORCE) + endif() +endif() diff --git a/framework/CMakeLists.txt b/framework/CMakeLists.txt index bf26786..322526e 100644 --- a/framework/CMakeLists.txt +++ b/framework/CMakeLists.txt @@ -412,6 +412,10 @@ target_link_libraries(${PROJECT_NAME} ctpl docopt) +if(${NEED_LINK_ATOMIC}) + target_link_libraries(${PROJECT_NAME} atomic) +endif() + # Link platform specific libraries if(ANDROID) target_link_libraries(${PROJECT_NAME} log android native_app_glue) -- 2.17.1