check_atomics: fix retval
[m6w6/libmemcached] / CMake / CheckAtomics.cmake
1 include(CheckCSourceRuns)
2 include(CheckCXXSourceRuns)
3
4 # sets HAVE_ATOMICS, checks for :
5 # - C++11 std::atomic: HAVE_CXX_STDATOMIC
6 # - C11 stdatomic: HAVE_C_STDATOMIC
7 # - builtin __atomic: HAVE_BUILTIN_ATOMIC
8 # - builtin __sync: HAVE_BUILTIN_SYNC
9 # - atomic_add_nv: HAVE_ATOMIC_ADD_NV
10 function(check_atomics)
11 check_cxx_source_runs("
12 #include <atomic>
13 int main() {
14 std::atomic<int> i(0);
15 return atomic_load(&i);
16 }"
17 HAVE_CXX_STDATOMIC)
18 check_c_source_runs("
19 #include <stdatomic.h>
20 int main() {
21 atomic_int i;
22 atomic_init(&i, 0);
23 return atomic_load(&i);
24 }"
25 HAVE_C_STDATOMIC)
26 foreach(BUILTIN_ATOMIC_PREFIX IN ITEMS _ __c11)
27 check_c_source_runs("
28 int main() {
29 long l = -1;
30 return ${BUILTIN_ATOMIC_PREFIX}_atomic_add_fetch(&l,1,__ATOMIC_RELAXED);
31 }"
32 HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX})
33 if (HAVE_BUILTIN_ATOMIC${BUILTIN_ATOMIC_PREFIX})
34 set(HAVE_BUILTIN_ATOMIC 1)
35 break()
36 endif()
37 endforeach()
38 check_c_source_runs("
39 int main() {
40 long l = -1;
41 return __sync_add_and_fetch(&l,1);
42 }"
43 HAVE_BUILTIN_SYNC)
44 check_c_source_runs("
45 #include <atomic.h>
46 int main() {
47 volatile uint_t i = 0;
48 return atomic_add_int_nv(&i, 1) == 1 ? 0 : -1;
49 }"
50 HAVE_ATOMIC_ADD_NV)
51 if ( HAVE_CXX_STDATOMIC
52 OR HAVE_C_STDATOMIC
53 OR HAVE_BUILTIN_ATOMIC
54 OR HAVE_BUILTIN_SYNC
55 OR HAVE_ATOMIC_ADD_NV)
56 set(HAVE_ATOMICS 1 PARENT_SCOPE)
57 endif()
58 endfunction()