| From e20a5d13935a41a856e8f71c49f2cc9d81b1d92c Mon Sep 17 00:00:00 2001 |
| From: Changqing Li <changqing.li@windriver.com> |
| 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<unsigned long long>::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 <changqing.li@windriver.com> |
| --- |
| 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 <atomic> |
| +std::atomic<int> x; |
| +std::atomic<short> y; |
| +std::atomic<char> 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 <atomic> |
| +#include <cstdint> |
| +std::atomic<uint64_t> 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 |
| |