--- /dev/null
+# Checks if atomic operations are supported natively or if linking against
+# libatomic is needed.
+
+# Check inspired by LLVMs cmake/modules/CheckAtomic.cmake
+
+INCLUDE(CheckCXXSourceCompiles)
+INCLUDE(CheckLibraryExists)
+
+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;
+int main() {
+ 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);
+ return 0;
+}
+" ${varname})
+ set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
+endfunction(check_working_cxx_atomics64)
+
+# Check if atomics work without libatomic
+check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB)
+
+if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
+ check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
+ if( HAVE_LIBATOMIC )
+ list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
+ check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB)
+ if (NOT HAVE_CXX_ATOMICS_WITH_LIB)
+ message(FATAL_ERROR "Host compiler must support std::atomic!")
+ endif()
+ else()
+ message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.")
+ endif()
+endif()
+
+# Check if 64bit atomics work without libatomic
+check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB)
+
+if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB)
+ check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64)
+ if(HAVE_CXX_LIBATOMICS64)
+ list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
+ check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB)
+ if (NOT HAVE_CXX_ATOMICS64_WITH_LIB)
+ message(FATAL_ERROR "Host compiler must support std::atomic!")
+ endif()
+ else()
+ message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.")
+ endif()
+endif()
set(C_STANDARD_REQUIRED ON)
endif()
+# check if linking against libatomic is necessary
+include(CheckAtomic)
+if(HAVE_CXX_ATOMIC_WITH_LIB OR HAVE_CXX_ATOMICS64_WITH_LIB)
+ set(ATOMIC_LIBRARIES atomic)
+endif()
+
## Handle diagnostics color if compiler supports them.
CHECK_C_COMPILER_FLAG("-fdiagnostics-color=always"
COMPILER_SUPPORTS_DIAGNOSTICS_COLOR)
endif(HAVE_ARMV8_CRC)
add_library(common STATIC ${ceph_common_objs})
-target_link_libraries(common ${ceph_common_deps})
+target_link_libraries(common ${ceph_common_deps} ${ATOMIC_LIBRARIES})
add_library(ceph-common SHARED ${ceph_common_objs})
-target_link_libraries(ceph-common ${ceph_common_deps})
+target_link_libraries(ceph-common ${ceph_common_deps} ${ATOMIC_LIBRARIES})
# appease dpkg-shlibdeps
set_target_properties(ceph-common PROPERTIES
SOVERSION 0
add_library(rocksdb STATIC IMPORTED)
add_dependencies(rocksdb rocksdb_ext)
set_property(TARGET rocksdb PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/rocksdb/librocksdb.a")
- set(ROCKSDB_LIBRARIES rocksdb)
+ set(ROCKSDB_LIBRARIES rocksdb ${ATOMIC_LIBRARIES})
endif(NOT WITH_SYSTEM_ROCKSDB)
posix_acl.cc
Delegation.cc)
add_library(client STATIC ${libclient_srcs})
-target_link_libraries(client osdc)
+target_link_libraries(client osdc ${ATOMIC_LIBRARIES})
add_dependencies(dmc_sim dmclock)
-target_link_libraries(ssched_sim LINK_PRIVATE pthread)
-target_link_libraries(dmc_sim LINK_PRIVATE pthread $<TARGET_FILE:dmclock>)
+target_link_libraries(ssched_sim LINK_PRIVATE pthread ${ATOMIC_LIBRARIES})
+target_link_libraries(dmc_sim LINK_PRIVATE pthread $<TARGET_FILE:dmclock> ${ATOMIC_LIBRARIES})
add_custom_target(dmclock-sims DEPENDS ssched_sim dmc_sim)
LINK_PRIVATE $<TARGET_FILE:dmclock>
pthread
$<TARGET_FILE:gtest>
- $<TARGET_FILE:gtest_main>)
+ $<TARGET_FILE:gtest_main>
+ ${ATOMICS_LIBRARIES})
else()
target_link_libraries(dmclock-tests
- LINK_PRIVATE $<TARGET_FILE:dmclock> pthread ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES})
+ LINK_PRIVATE $<TARGET_FILE:dmclock>
+ pthread
+ ${GTEST_LIBRARIES}
+ ${GTEST_MAIN_LIBRARIES}
+ ${ATMOIC_LIBRARIES})
endif()
add_dependencies(dmclock-tests dmclock)
ObjectRecorder.cc
Utils.cc)
add_library(journal STATIC ${journal_srcs})
-target_link_libraries(journal cls_journal_client)
+target_link_libraries(journal cls_journal_client ${ATOMIC_LIBRARIES})
add_library(kv STATIC $<TARGET_OBJECTS:kv_objs>)
target_include_directories(kv_objs BEFORE PUBLIC ${ROCKSDB_INCLUDE_DIR})
target_include_directories(kv BEFORE PUBLIC ${ROCKSDB_INCLUDE_DIR})
-target_link_libraries(kv ${LEVELDB_LIBRARIES} ${ROCKSDB_LIBRARIES} ${ALLOC_LIBS} ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES})
+target_link_libraries(kv ${LEVELDB_LIBRARIES} ${ROCKSDB_LIBRARIES} ${ATOMIC_LIBRARIES} ${ALLOC_LIBS} ${SNAPPY_LIBRARIES} ${ZLIB_LIBRARIES})
# rocksdb detects bzlib and lz4 in its Makefile, which forces us to do the same.
find_package(BZip2 QUIET)
$<TARGET_OBJECTS:librados_objs>
$<TARGET_OBJECTS:common_buffer_obj>)
target_link_libraries(rados_a osdc ceph-common cls_lock_client
- ${BLKID_LIBRARIES} ${CRYPTO_LIBS} ${EXTRALIBS})
+ ${BLKID_LIBRARIES} ${CRYPTO_LIBS} ${EXTRALIBS} ${ATOMIC_LIBRARIES})
if(WITH_LTTNG)
add_dependencies(librados_api_obj librados-tp)
endif()
$<TARGET_OBJECTS:common_buffer_obj>)
# LINK_PRIVATE instead of PRIVATE is used to backward compatibility with cmake 2.8.11
target_link_libraries(librados LINK_PRIVATE osdc ceph-common cls_lock_client
- ${BLKID_LIBRARIES} ${CRYPTO_LIBS} ${EXTRALIBS})
+ ${BLKID_LIBRARIES} ${CRYPTO_LIBS} ${EXTRALIBS} ${ATOMIC_LIBRARIES})
set_target_properties(librados PROPERTIES
OUTPUT_NAME rados
VERSION 2.0.0
ceph-common
pthread
${CMAKE_DL_LIBS}
- ${EXTRALIBS})
+ ${EXTRALIBS}
+ ${ATOMIC_LIBRARIES})
if(HAVE_UDEV)
target_link_libraries(librbd LINK_PRIVATE
udev)
add_dependencies(os objectstore-tp)
endif()
-target_link_libraries(os kv)
+target_link_libraries(os kv ${ATOMIC_LIBRARIES})
add_dependencies(os compressor_plugins)
add_dependencies(os crypto_plugins)
add_executable(ceph-bluestore-tool
bluestore/bluestore_tool.cc)
target_link_libraries(ceph-bluestore-tool
- os global)
+ os global ${ATOMIC_LIBRARIES})
install(TARGETS ceph-bluestore-tool
DESTINATION bin)
endif()
$<TARGET_OBJECTS:cls_references_objs>
$<TARGET_OBJECTS:global_common_objs>
$<TARGET_OBJECTS:heap_profiler_objs>)
-target_link_libraries(osd ${LEVELDB_LIBRARIES} dmclock ${CMAKE_DL_LIBS} ${ALLOC_LIBS})
+target_link_libraries(osd ${LEVELDB_LIBRARIES} dmclock ${CMAKE_DL_LIBS} ${ALLOC_LIBS} ${ATOMIC_LIBRARIES})
if(WITH_LTTNG)
add_dependencies(osd osd-tp pg-tp)
endif()
cls_replica_log_client cls_user_client ceph-common common_utf8 global
${CURL_LIBRARIES}
${EXPAT_LIBRARIES}
- ${OPENLDAP_LIBRARIES} ${CRYPTO_LIBS})
+ ${OPENLDAP_LIBRARIES} ${CRYPTO_LIBS} ${ATMOIC_LIBRARIES})
if (WITH_CURL_OPENSSL OR (WITH_RADOSGW_BEAST_FRONTEND AND WITH_RADOSGW_BEAST_OPENSSL))
target_link_libraries(rgw_a ${OPENSSL_LIBRARIES})
cls_version_client cls_replica_log_client cls_user_client
global ${FCGI_LIBRARY} ${LIB_RESOLV}
${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${BLKID_LIBRARIES}
- ${ALLOC_LIBS})
+ ${ALLOC_LIBS} ${ATMOIC_LIBRARIES})
# radosgw depends on cls libraries at runtime, but not as link dependencies
add_dependencies(radosgw cls_rgw cls_lock cls_refcount
cls_log cls_statelog cls_timeindex
cls_log_client cls_statelog_client cls_timeindex_client
cls_version_client cls_replica_log_client cls_user_client
global ${FCGI_LIBRARY} ${LIB_RESOLV}
- ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${SSL_LIBRARIES} ${BLKID_LIBRARIES})
+ ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${SSL_LIBRARIES} ${BLKID_LIBRARIES} ${ATMOIC_LIBRARIES})
install(TARGETS radosgw-admin DESTINATION bin)
set(radosgw_es_srcs
cls_log_client cls_statelog_client cls_timeindex_client
cls_version_client cls_replica_log_client cls_user_client
global ${FCGI_LIBRARY} ${LIB_RESOLV}
- ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${SSL_LIBRARIES} ${BLKID_LIBRARIES})
+ ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${SSL_LIBRARIES} ${BLKID_LIBRARIES} ${ATMOIC_LIBRARIES})
install(TARGETS radosgw-es DESTINATION bin)
set(radosgw_token_srcs
cls_log_client cls_statelog_client cls_timeindex_client
cls_version_client cls_replica_log_client cls_user_client
global ${FCGI_LIBRARY} ${LIB_RESOLV}
- ${CURL_LIBRARIES} ${EXPAT_LIBRARIES})
+ ${CURL_LIBRARIES} ${EXPAT_LIBRARIES} ${ATMOIC_LIBRARIES})
install(TARGETS radosgw-object-expirer DESTINATION bin)
set(librgw_srcs
global
${LIB_RESOLV}
${CURL_LIBRARIES}
- ${EXPAT_LIBRARIES})
+ ${EXPAT_LIBRARIES}
+ ${ATMOIC_LIBRARIES})
set_target_properties(rgw PROPERTIES OUTPUT_NAME rgw VERSION 2.0.0
SOVERSION 2)
install(TARGETS rgw DESTINATION ${CMAKE_INSTALL_LIBDIR})
fi
fi
+if [ "$TARGET_ARCHITECTURE" = "mips" ] ; then
+ PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -latomic"
+fi
+
PLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS"
PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS"
set_target_properties(ceph_perf_local PROPERTIES COMPILE_FLAGS
${PERF_LOCAL_FLAGS})
endif()
-target_link_libraries(ceph_perf_local os global ${UNITTEST_LIBS})
+target_link_libraries(ceph_perf_local os global ${UNITTEST_LIBS} ${ATMOIC_LIBRARIES})
# ceph_xattr_bench
add_executable(ceph_xattr_bench
${EXTRALIBS}
${BLKID_LIBRARIES}
${CMAKE_DL_LIBS}
+ ${ATMOIC_LIBRARIES}
)
install(TARGETS
ceph_test_stress_watch
target_link_libraries(unittest_prioritized_queue global ${BLKID_LIBRARIES})
# unittest_mclock_priority_queue
-add_executable(unittest_mclock_priority_queue
+add_executable(unittest_mclock_priority_queue EXCLUDE_FROM_ALL
test_mclock_priority_queue.cc
)
add_ceph_unittest(unittest_mclock_priority_queue ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_mclock_priority_queue)
$<TARGET_OBJECTS:unit-main>
)
add_ceph_unittest(unittest_throttle ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/unittest_throttle)
-target_link_libraries(unittest_throttle global)
+target_link_libraries(unittest_throttle global ${ATMOIC_LIBRARIES})
# unittest_lru
add_executable(unittest_lru
${UNITTEST_LIBS}
${EXTRALIBS}
${CMAKE_DL_LIBS}
+ ${ATMOIC_LIBRARIES}
)
install(TARGETS ceph_test_libcephfs
DESTINATION ${CMAKE_INSTALL_BINDIR})
TestRadosClient.cc
TestWatchNotify.cc)
add_library(rados_test_stub STATIC ${librados_test_stub_srcs})
-
+target_link_libraries(rados_test_stub ${ATMOIC_LIBRARIES})
)
set_target_properties(ceph_test_async_driver PROPERTIES COMPILE_FLAGS
${UNITTEST_CXX_FLAGS})
-target_link_libraries(ceph_test_async_driver os global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} ${UNITTEST_LIBS})
+target_link_libraries(ceph_test_async_driver os global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} ${UNITTEST_LIBS} ${ATMOIC_LIBRARIES})
# ceph_test_msgr
add_executable(ceph_test_msgr
)
set_target_properties(ceph_test_msgr PROPERTIES COMPILE_FLAGS
${UNITTEST_CXX_FLAGS})
-target_link_libraries(ceph_test_msgr os global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} ${UNITTEST_LIBS})
+target_link_libraries(ceph_test_msgr os global ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} ${UNITTEST_LIBS} ${ATMOIC_LIBRARIES})
# ceph_test_async_networkstack
add_executable(ceph_test_async_networkstack
)
set_target_properties(ceph_test_async_networkstack PROPERTIES COMPILE_FLAGS
${UNITTEST_CXX_FLAGS})
-target_link_libraries(ceph_test_async_networkstack global ${CRYPTO_LIBS} ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} ${UNITTEST_LIBS})
+target_link_libraries(ceph_test_async_networkstack global ${CRYPTO_LIBS} ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} ${UNITTEST_LIBS} ${ATMOIC_LIBRARIES})
#ceph_perf_msgr_server
add_executable(ceph_perf_msgr_server perf_msgr_server.cc)
add_executable(ceph_perf_msgr_client perf_msgr_client.cc)
set_target_properties(ceph_perf_msgr_client PROPERTIES COMPILE_FLAGS
${UNITTEST_CXX_FLAGS})
-target_link_libraries(ceph_perf_msgr_client os global ${UNITTEST_LIBS})
+target_link_libraries(ceph_perf_msgr_client os global ${UNITTEST_LIBS} ${ATMOIC_LIBRARIES})
# test_userspace_event
if(HAVE_DPDK)
${EXTRALIBS}
${BLKID_LIBRARIES}
${CMAKE_DL_LIBS}
+ ${ATMOIC_LIBRARIES}
)
# ceph_test_filestore_idempotent
global
${EXTRALIBS}
${CMAKE_DL_LIBS}
+ ${ATMOIC_LIBRARIES}
)
install(TARGETS ceph_test_objectcacher_stress
DESTINATION ${CMAKE_INSTALL_BINDIR})
st_rados_watch.cc
st_rados_notify.cc)
add_library(systest STATIC ${libsystest_srcs})
+target_link_libraries(systest ${ATMOIC_LIBRARIES})
# test_rados_list_parallel
add_executable(ceph_test_rados_list_parallel
rbd_types
journal
ceph-common global
- ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS})
+ ${BLKID_LIBRARIES} ${CMAKE_DL_LIBS} ${ATMOIC_LIBRARIES})
if(WITH_KRBD)
target_link_libraries(rbd
krbd)
service_daemon/Types.cc)
add_library(rbd_mirror_internal STATIC
${rbd_mirror_internal})
+target_link_libraries(rbd_mirror_internal ${ATMOIC_LIBRARIES})
add_executable(rbd-mirror
main.cc)