1
+
#
2
+
# SRT - Secure, Reliable, Transport
3
+
# Copyright (c) 2021 Haivision Systems Inc.
4
+
#
5
+
# This Source Code Form is subject to the terms of the Mozilla Public
6
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
7
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
+
#
9
+
10
+
# Check for GCC Atomic Intrinsics and whether libatomic is required.
11
+
#
12
+
# Sets:
13
+
# HAVE_LIBATOMIC
14
+
# HAVE_GCCATOMIC_INTRINSICS
15
+
# HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC
16
+
# HAVE_GCCATOMIC_INTRINSICS_STATIC
17
+
# HAVE_GCCATOMIC_INTRINSICS_STATIC_REQUIRES_LIBATOMIC
18
+
#
19
+
# See
20
+
# https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
21
+
# https://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync
22
+
23
+
include(CheckCSourceCompiles)
24
+
include(CheckLibraryExists)
25
+
26
+
function(CheckGCCAtomicIntrinsics)
27
+
28
+
unset(HAVE_LIBATOMIC)
29
+
unset(HAVE_LIBATOMIC PARENT_SCOPE)
30
+
unset(HAVE_LIBATOMIC CACHE)
31
+
32
+
unset(HAVE_GCCATOMIC_INTRINSICS)
33
+
unset(HAVE_GCCATOMIC_INTRINSICS PARENT_SCOPE)
34
+
unset(HAVE_GCCATOMIC_INTRINSICS CACHE)
35
+
36
+
unset(HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC)
37
+
unset(HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC PARENT_SCOPE)
38
+
unset(HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC CACHE)
39
+
40
+
unset(HAVE_GCCATOMIC_INTRINSICS_STATIC)
41
+
unset(HAVE_GCCATOMIC_INTRINSICS_STATIC PARENT_SCOPE)
42
+
unset(HAVE_GCCATOMIC_INTRINSICS_STATIC CACHE)
43
+
44
+
unset(HAVE_GCCATOMIC_INTRINSICS_STATIC_REQUIRES_LIBATOMIC)
45
+
unset(HAVE_GCCATOMIC_INTRINSICS_STATIC_REQUIRES_LIBATOMIC PARENT_SCOPE)
46
+
unset(HAVE_GCCATOMIC_INTRINSICS_STATIC_REQUIRES_LIBATOMIC CACHE)
47
+
48
+
unset(CMAKE_REQUIRED_FLAGS)
49
+
unset(CMAKE_REQUIRED_LIBRARIES)
50
+
unset(CMAKE_REQUIRED_LINK_OPTIONS)
51
+
52
+
set(CheckGCCAtomicIntrinsics_CODE
53
+
"
54
+
#include<stddef.h>
55
+
#include<stdint.h>
56
+
int main(void)
57
+
{
58
+
ptrdiff_t x = 0;
59
+
intmax_t y = 0;
60
+
__atomic_add_fetch(&x, 1, __ATOMIC_SEQ_CST);
61
+
__atomic_add_fetch(&y, 1, __ATOMIC_SEQ_CST);
62
+
return __atomic_sub_fetch(&x, 1, __ATOMIC_SEQ_CST)
63
+
+ __atomic_sub_fetch(&y, 1, __ATOMIC_SEQ_CST);
64
+
}
65
+
")
66
+
67
+
check_library_exists(
68
+
atomic __atomic_fetch_add_8 "" HAVE_LIBATOMIC)
69
+
70
+
check_c_source_compiles(
71
+
"${CheckGCCAtomicIntrinsics_CODE}"
72
+
HAVE_GCCATOMIC_INTRINSICS)
73
+
74
+
if (NOT HAVE_GCCATOMIC_INTRINSICS
75
+
AND HAVE_LIBATOMIC)
76
+
set(CMAKE_REQUIRED_LIBRARIES "atomic")
77
+
check_c_source_compiles(
78
+
"${CheckGCCAtomicIntrinsics_CODE}"
79
+
HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC)
80
+
if (HAVE_GCCATOMIC_INTRINSICS_REQUIRES_LIBATOMIC)
81
+
set(HAVE_GCCATOMIC_INTRINSICS TRUE PARENT_SCOPE)
82
+
endif()
83
+
endif()
84
+
85
+
unset(CMAKE_REQUIRED_FLAGS)
86
+
unset(CMAKE_REQUIRED_LIBRARIES)
87
+
unset(CMAKE_REQUIRED_LINK_OPTIONS)
88
+
89
+
if (HAVE_GCCATOMIC_INTRINSICS)
90
+
set(CMAKE_REQUIRED_LINK_OPTIONS "-static")
91
+
check_c_source_compiles(
92
+
"${CheckGCCAtomicIntrinsics_CODE}"
93
+
HAVE_GCCATOMIC_INTRINSICS_STATIC)
94
+
if (NOT HAVE_GCCATOMIC_INTRINSICS_STATIC
95
+
AND HAVE_LIBATOMIC)
96
+
set(CMAKE_REQUIRED_LIBRARIES "atomic")
97
+
check_c_source_compiles(
98
+
"${CheckGCCAtomicIntrinsics_CODE}"
99
+
HAVE_GCCATOMIC_INTRINSICS_STATIC)
100
+
if (HAVE_GCCATOMIC_INTRINSICS_STATIC)
101
+
set(HAVE_GCCATOMIC_INTRINSICS_STATIC_REQUIRES_LIBATOMIC TRUE PARENT_SCOPE)
102
+
endif()
103
+
endif()
104
+
endif()
105
+
106
+
unset(CMAKE_REQUIRED_FLAGS)
107
+
unset(CMAKE_REQUIRED_LIBRARIES)
108
+
unset(CMAKE_REQUIRED_LINK_OPTIONS)
109
+
110
+
endfunction(CheckGCCAtomicIntrinsics)
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4