summaryrefslogtreecommitdiff
path: root/media-tv/kodi/files/kodi-19.4-atomic.patch
blob: 3811fda8886df129b29d81da1056cb7bf63054d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
From ac3213e683e4c62c50dc02fef3b168d883245094 Mon Sep 17 00:00:00 2001
From: Yixun Lan <dlan@gentoo.org>
Date: Tue, 9 Aug 2022 16:45:09 +0800
Subject: [PATCH] [cmake] link atomic library for certain CPU architectures

For those CPU architectures:
RISC-V lack 8-bit and 16-bit atomic instructions, and
ARM/MIPS/PPC lack 64-bit atomic instruction.

GCC is supposed  to convert these atomics via masking and shifting
like LLVM, which means anything that wants to use these instructions
needs the link option -latomic.

In this patch, we will try to detect if 8-bit, 64-bit atomic instructions exist,
otherwise the atomic library will append to the DEPLIBS list.

Original issue:
* https://gitlab.kitware.com/cmake/cmake/-/issues/23021#note_1098733

For reference:
* https://gcc.gnu.org/wiki/Atomic/GCCMM

riscv64 specific:
* https://lists.debian.org/debian-riscv/2022/01/msg00009.html

Signed-off-by: Yixun Lan <dlan@gentoo.org>
---
 cmake/modules/FindAtomic.cmake      | 56 +++++++++++++++++++++++++++++
 cmake/scripts/linux/ArchSetup.cmake |  3 ++
 2 files changed, 59 insertions(+)
 create mode 100644 cmake/modules/FindAtomic.cmake

diff --git a/cmake/modules/FindAtomic.cmake b/cmake/modules/FindAtomic.cmake
new file mode 100644
index 0000000000..8ea3c815d7
--- /dev/null
+++ b/cmake/modules/FindAtomic.cmake
@@ -0,0 +1,56 @@
+#.rst:
+# FindAtomic
+# -----
+# Finds the ATOMIC library
+#
+# This will define the following variables::
+#
+# ATOMIC_FOUND - system has ATOMIC
+# ATOMIC_LIBRARIES - the ATOMIC libraries
+#
+# and the following imported targets::
+#
+#   ATOMIC::ATOMIC    - The ATOMIC library
+
+
+include(CheckCXXSourceCompiles)
+
+set(atomic_code
+    "
+     #include <atomic>
+     #include <cstdint>
+     std::atomic<uint8_t> n8 (0); // riscv64
+     std::atomic<uint64_t> n64 (0); // armel, mipsel, powerpc
+     int main() {
+       ++n8;
+       ++n64;
+       return 0;
+     }")
+
+check_cxx_source_compiles("${atomic_code}" ATOMIC_LOCK_FREE_INSTRUCTIONS)
+
+if(ATOMIC_LOCK_FREE_INSTRUCTIONS)
+  set(ATOMIC_FOUND TRUE)
+  set(ATOMIC_LIBRARIES)
+else()
+  set(CMAKE_REQUIRED_LIBRARIES "-latomic")
+  check_cxx_source_compiles("${atomic_code}" ATOMIC_IN_LIBRARY)
+  set(CMAKE_REQUIRED_LIBRARIES)
+  if(ATOMIC_IN_LIBRARY)
+    set(ATOMIC_LIBRARY atomic)
+    include(FindPackageHandleStandardArgs)
+    find_package_handle_standard_args(Atomic DEFAULT_MSG ATOMIC_LIBRARY)
+    set(ATOMIC_LIBRARIES ${ATOMIC_LIBRARY})
+    if(NOT TARGET ATOMIC::ATOMIC)
+      add_library(ATOMIC::ATOMIC UNKNOWN IMPORTED)
+      set_target_properties(ATOMIC::ATOMIC PROPERTIES
+	      IMPORTED_LOCATION "${ATOMIC_LIBRARY}")
+    endif()
+    unset(ATOMIC_LIBRARY)
+  else()
+    if(Atomic_FIND_REQUIRED)
+      message(FATAL_ERROR "Neither lock free instructions nor -latomic found.")
+    endif()
+  endif()
+endif()
+unset(atomic_code)
diff --git a/cmake/scripts/linux/ArchSetup.cmake b/cmake/scripts/linux/ArchSetup.cmake
index 35ab1402f5..848723af1f 100644
--- a/cmake/scripts/linux/ArchSetup.cmake
+++ b/cmake/scripts/linux/ArchSetup.cmake
@@ -199,3 +199,6 @@ if(NOT USE_INTERNAL_LIBS)
     set(USE_INTERNAL_LIBS OFF)
   endif()
 endif()
+
+# Atomic library
+list(APPEND PLATFORM_REQUIRED_DEPS Atomic)
-- 
2.35.1