summaryrefslogtreecommitdiff
path: root/src/contrib/SDL-3.2.20/cmake/sdlchecks.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'src/contrib/SDL-3.2.20/cmake/sdlchecks.cmake')
-rw-r--r--src/contrib/SDL-3.2.20/cmake/sdlchecks.cmake1308
1 files changed, 1308 insertions, 0 deletions
diff --git a/src/contrib/SDL-3.2.20/cmake/sdlchecks.cmake b/src/contrib/SDL-3.2.20/cmake/sdlchecks.cmake
new file mode 100644
index 0000000..d321e71
--- /dev/null
+++ b/src/contrib/SDL-3.2.20/cmake/sdlchecks.cmake
@@ -0,0 +1,1308 @@
1macro(FindLibraryAndSONAME _LIB)
2 cmake_parse_arguments(_FLAS "" "" "LIBDIRS" ${ARGN})
3
4 string(TOUPPER ${_LIB} _UPPERLNAME)
5 string(REGEX REPLACE "\\-" "_" _LNAME "${_UPPERLNAME}")
6
7 find_library(${_LNAME}_LIB ${_LIB} PATHS ${_FLAS_LIBDIRS})
8
9 # FIXME: fail FindLibraryAndSONAME when library is not shared.
10 if(${_LNAME}_LIB MATCHES ".*\\${CMAKE_SHARED_LIBRARY_SUFFIX}.*" AND NOT ${_LNAME}_LIB MATCHES ".*\\${CMAKE_STATIC_LIBRARY_SUFFIX}.*")
11 set(${_LNAME}_SHARED TRUE)
12 else()
13 set(${_LNAME}_SHARED FALSE)
14 endif()
15
16 if(${_LNAME}_LIB)
17 # reduce the library name for shared linking
18
19 get_filename_component(_LIB_REALPATH ${${_LNAME}_LIB} REALPATH) # resolves symlinks
20 get_filename_component(_LIB_LIBDIR ${_LIB_REALPATH} DIRECTORY)
21 get_filename_component(_LIB_JUSTNAME ${_LIB_REALPATH} NAME)
22
23 if(APPLE)
24 string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*dylib$" "\\1.dylib" _LIB_REGEXD "${_LIB_JUSTNAME}")
25 else()
26 string(REGEX REPLACE "(\\.[0-9]*)\\.[0-9\\.]*$" "\\1" _LIB_REGEXD "${_LIB_JUSTNAME}")
27 endif()
28
29 if(NOT EXISTS "${_LIB_LIBDIR}/${_LIB_REGEXD}")
30 set(_LIB_REGEXD "${_LIB_JUSTNAME}")
31 endif()
32 set(${_LNAME}_LIBDIR "${_LIB_LIBDIR}")
33
34 message(STATUS "dynamic lib${_LIB} -> ${_LIB_REGEXD}")
35 set(${_LNAME}_LIB_SONAME ${_LIB_REGEXD})
36 endif()
37
38 message(DEBUG "DYNLIB OUTPUTVAR: ${_LIB} ... ${_LNAME}_LIB")
39 message(DEBUG "DYNLIB ORIGINAL LIB: ${_LIB} ... ${${_LNAME}_LIB}")
40 message(DEBUG "DYNLIB REALPATH LIB: ${_LIB} ... ${_LIB_REALPATH}")
41 message(DEBUG "DYNLIB JUSTNAME LIB: ${_LIB} ... ${_LIB_JUSTNAME}")
42 message(DEBUG "DYNLIB SONAME LIB: ${_LIB} ... ${_LIB_REGEXD}")
43endmacro()
44
45macro(CheckDLOPEN)
46 check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN_IN_LIBC)
47 if(NOT HAVE_DLOPEN_IN_LIBC)
48 cmake_push_check_state()
49 list(APPEND CMAKE_REQUIRED_LIBRARIES dl)
50 check_symbol_exists(dlopen "dlfcn.h" HAVE_DLOPEN_IN_LIBDL)
51 cmake_pop_check_state()
52 if(HAVE_DLOPEN_IN_LIBDL)
53 sdl_link_dependency(dl LIBS dl)
54 endif()
55 endif()
56 if(HAVE_DLOPEN_IN_LIBC OR HAVE_DLOPEN_IN_LIBDL)
57 set(HAVE_DLOPEN TRUE)
58 endif()
59endmacro()
60
61macro(CheckO_CLOEXEC)
62 check_c_source_compiles("
63 #include <fcntl.h>
64 int flag = O_CLOEXEC;
65 int main(int argc, char **argv) { return 0; }" HAVE_O_CLOEXEC)
66endmacro()
67
68# Requires:
69# - n/a
70macro(CheckOSS)
71 if(SDL_OSS)
72 check_c_source_compiles("
73 #include <sys/soundcard.h>
74 int main(int argc, char **argv) { int arg = SNDCTL_DSP_SETFRAGMENT; return 0; }" HAVE_OSS_SYS_SOUNDCARD_H)
75
76 if(HAVE_OSS_SYS_SOUNDCARD_H)
77 set(HAVE_OSS TRUE)
78 sdl_glob_sources(${SDL3_SOURCE_DIR}/src/audio/dsp/*.c)
79 set(SDL_AUDIO_DRIVER_OSS 1)
80 if(NETBSD)
81 sdl_link_dependency(oss LIBS ossaudio)
82 endif()
83 set(HAVE_SDL_AUDIO TRUE)
84 endif()
85 endif()
86endmacro()
87
88# Requires:
89# - n/a
90# Optional:
91# - SDL_ALSA_SHARED opt
92# - HAVE_SDL_LOADSO opt
93macro(CheckALSA)
94 if(SDL_ALSA)
95 set(ALSA_PKG_CONFIG_SPEC "alsa")
96 find_package(ALSA MODULE)
97 if(ALSA_FOUND)
98 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/alsa/*.c")
99 set(SDL_AUDIO_DRIVER_ALSA 1)
100 set(HAVE_ALSA TRUE)
101 set(HAVE_ALSA_SHARED FALSE)
102 if(SDL_ALSA_SHARED)
103 if(HAVE_SDL_LOADSO)
104 FindLibraryAndSONAME("asound")
105 if(ASOUND_LIB AND ASOUND_SHARED)
106 sdl_link_dependency(alsa INCLUDES $<TARGET_PROPERTY:ALSA::ALSA,INTERFACE_INCLUDE_DIRECTORIES>)
107 set(SDL_AUDIO_DRIVER_ALSA_DYNAMIC "\"${ASOUND_LIB_SONAME}\"")
108 set(HAVE_ALSA_SHARED TRUE)
109 else()
110 message(WARNING "Unable to find asound shared object")
111 endif()
112 else()
113 message(WARNING "You must have SDL_LoadObject() support for dynamic ALSA loading")
114 endif()
115 endif()
116 if(NOT HAVE_ALSA_SHARED)
117 #FIXME: remove this line and property generate sdl3.pc
118 list(APPEND SDL_PC_PRIVATE_REQUIRES alsa)
119 sdl_link_dependency(alsa LIBS ALSA::ALSA CMAKE_MODULE ALSA PKG_CONFIG_SPECS "${ALSA_PKG_CONFIG_SPEC}")
120 endif()
121 set(HAVE_SDL_AUDIO TRUE)
122 else()
123 message(WARNING "Unable to find the alsa development library")
124 endif()
125 else()
126 set(HAVE_ALSA FALSE)
127 endif()
128endmacro()
129
130# Requires:
131# - PkgCheckModules
132# Optional:
133# - SDL_PIPEWIRE_SHARED opt
134# - HAVE_SDL_LOADSO opt
135macro(CheckPipewire)
136 if(SDL_PIPEWIRE)
137 set(PipeWire_PKG_CONFIG_SPEC libpipewire-0.3>=0.3.44)
138 set(PC_PIPEWIRE_FOUND FALSE)
139 if(PKG_CONFIG_FOUND)
140 pkg_check_modules(PC_PIPEWIRE IMPORTED_TARGET ${PipeWire_PKG_CONFIG_SPEC})
141 endif()
142 if(PC_PIPEWIRE_FOUND)
143 set(HAVE_PIPEWIRE TRUE)
144 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/pipewire/*.c")
145 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/camera/pipewire/*.c")
146 set(SDL_AUDIO_DRIVER_PIPEWIRE 1)
147 set(SDL_CAMERA_DRIVER_PIPEWIRE 1)
148 if(SDL_PIPEWIRE_SHARED AND NOT HAVE_SDL_LOADSO)
149 message(WARNING "You must have SDL_LoadObject() support for dynamic PipeWire loading")
150 endif()
151 FindLibraryAndSONAME("pipewire-0.3" LIBDIRS ${PC_PIPEWIRE_LIBRARY_DIRS})
152 if(SDL_PIPEWIRE_SHARED AND PIPEWIRE_0.3_LIB AND HAVE_SDL_LOADSO)
153 set(SDL_AUDIO_DRIVER_PIPEWIRE_DYNAMIC "\"${PIPEWIRE_0.3_LIB_SONAME}\"")
154 set(SDL_CAMERA_DRIVER_PIPEWIRE_DYNAMIC "\"${PIPEWIRE_0.3_LIB_SONAME}\"")
155 set(HAVE_PIPEWIRE_SHARED TRUE)
156 sdl_link_dependency(pipewire INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_PIPEWIRE,INTERFACE_INCLUDE_DIRECTORIES>)
157 else()
158 sdl_link_dependency(pipewire LIBS PkgConfig::PC_PIPEWIRE PKG_CONFIG_PREFIX PC_PIPEWIRE PKG_CONFIG_SPECS ${PipeWire_PKG_CONFIG_SPEC})
159 endif()
160 set(HAVE_SDL_AUDIO TRUE)
161 endif()
162 endif()
163endmacro()
164
165# Requires:
166# - PkgCheckModules
167# Optional:
168# - SDL_PULSEAUDIO_SHARED opt
169# - HAVE_SDL_LOADSO opt
170macro(CheckPulseAudio)
171 if(SDL_PULSEAUDIO)
172 set(PulseAudio_PKG_CONFIG_SPEC "libpulse>=0.9.15")
173 set(PC_PULSEAUDIO_FOUND FALSE)
174 if(PKG_CONFIG_FOUND)
175 pkg_check_modules(PC_PULSEAUDIO IMPORTED_TARGET ${PulseAudio_PKG_CONFIG_SPEC})
176 endif()
177 if(PC_PULSEAUDIO_FOUND)
178 set(HAVE_PULSEAUDIO TRUE)
179 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/pulseaudio/*.c")
180 set(SDL_AUDIO_DRIVER_PULSEAUDIO 1)
181 if(SDL_PULSEAUDIO_SHARED AND NOT HAVE_SDL_LOADSO)
182 message(WARNING "You must have SDL_LoadObject() support for dynamic PulseAudio loading")
183 endif()
184 FindLibraryAndSONAME("pulse" LIBDIRS ${PC_PULSEAUDIO_LIBRARY_DIRS})
185 if(SDL_PULSEAUDIO_SHARED AND PULSE_LIB AND HAVE_SDL_LOADSO)
186 set(SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC "\"${PULSE_LIB_SONAME}\"")
187 set(HAVE_PULSEAUDIO_SHARED TRUE)
188 sdl_link_dependency(pulseaudio INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_PULSEAUDIO,INTERFACE_INCLUDE_DIRECTORIES>)
189 else()
190 sdl_link_dependency(pulseaudio LIBS PkgConfig::PC_PULSEAUDIO PKG_CONFIG_PREFIX PC_PULSEAUDIO PKG_CONFIG_SPECS "${PulseAudio_PKG_CONFIG_SPEC}")
191 endif()
192 set(HAVE_SDL_AUDIO TRUE)
193 endif()
194 endif()
195endmacro()
196
197# Requires:
198# - PkgCheckModules
199# Optional:
200# - SDL_JACK_SHARED opt
201# - HAVE_SDL_LOADSO opt
202macro(CheckJACK)
203 if(SDL_JACK)
204 set(Jack_PKG_CONFIG_SPEC jack)
205 set(PC_JACK_FOUND FALSE)
206 if(PKG_CONFIG_FOUND)
207 pkg_check_modules(PC_JACK IMPORTED_TARGET ${Jack_PKG_CONFIG_SPEC})
208 endif()
209 if(PC_JACK_FOUND)
210 set(HAVE_JACK TRUE)
211 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/jack/*.c")
212 set(SDL_AUDIO_DRIVER_JACK 1)
213 if(SDL_JACK_SHARED AND NOT HAVE_SDL_LOADSO)
214 message(WARNING "You must have SDL_LoadObject() support for dynamic JACK audio loading")
215 endif()
216 FindLibraryAndSONAME("jack" LIBDIRS ${PC_JACK_LIBRARY_DIRS})
217 if(SDL_JACK_SHARED AND JACK_LIB AND HAVE_SDL_LOADSO)
218 set(SDL_AUDIO_DRIVER_JACK_DYNAMIC "\"${JACK_LIB_SONAME}\"")
219 set(HAVE_JACK_SHARED TRUE)
220 sdl_link_dependency(jack INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_JACK,INTERFACE_INCLUDE_DIRECTORIES>)
221 else()
222 sdl_link_dependency(jack LIBS PkgConfig::PC_JACK PKG_CONFIG_PREFIX PC_JACK PKG_CONFIG_SPECS ${Jack_PKG_CONFIG_SPEC})
223 endif()
224 set(HAVE_SDL_AUDIO TRUE)
225 endif()
226 endif()
227endmacro()
228
229# Requires:
230# - PkgCheckModules
231# Optional:
232# - SDL_SNDIO_SHARED opt
233# - HAVE_SDL_LOADSO opt
234macro(CheckSNDIO)
235 if(SDL_SNDIO)
236 set(SndIO_PKG_CONFIG_SPEC sndio)
237 set(PC_SNDIO_FOUND FALSE)
238 if(PKG_CONFIG_FOUND)
239 pkg_check_modules(PC_SNDIO IMPORTED_TARGET ${SndIO_PKG_CONFIG_SPEC})
240 endif()
241 if(PC_SNDIO_FOUND)
242 set(HAVE_SNDIO TRUE)
243 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/audio/sndio/*.c")
244 set(SDL_AUDIO_DRIVER_SNDIO 1)
245 if(SDL_SNDIO_SHARED AND NOT HAVE_SDL_LOADSO)
246 message(WARNING "You must have SDL_LoadObject() support for dynamic sndio loading")
247 endif()
248 FindLibraryAndSONAME("sndio" LIBDIRS ${PC_SNDIO_LIBRARY_DIRS})
249 if(SDL_SNDIO_SHARED AND SNDIO_LIB AND HAVE_SDL_LOADSO)
250 set(SDL_AUDIO_DRIVER_SNDIO_DYNAMIC "\"${SNDIO_LIB_SONAME}\"")
251 set(HAVE_SNDIO_SHARED TRUE)
252 sdl_include_directories(PRIVATE SYSTEM $<TARGET_PROPERTY:PkgConfig::PC_SNDIO,INTERFACE_INCLUDE_DIRECTORIES>)
253 else()
254 sdl_link_dependency(sndio LIBS PkgConfig::PC_SNDIO PKG_CONFIG_PREFIX PC_SNDIO PKG_CONFIG_SPECS ${SndIO_PKG_CONFIG_SPEC})
255 endif()
256 set(HAVE_SDL_AUDIO TRUE)
257 endif()
258 endif()
259endmacro()
260
261# Requires:
262# - n/a
263# Optional:
264# - SDL_X11_SHARED opt
265# - HAVE_SDL_LOADSO opt
266macro(CheckX11)
267 cmake_push_check_state()
268 if(SDL_X11)
269 set(X11_PKG_CONFIG_SPEC x11)
270 set(Xext_PKG_CONFIG_SPEC xext)
271 set(Xcursor_PKG_CONFIG_SPEC xcursor)
272 set(Xi_PKG_CONFIG_SPEC xi)
273 set(Xfixes_PKG_CONFIG_SPEC xfixes)
274 set(Xrandr_PKG_CONFIG_SPEC xrandr)
275 set(Xrender_PKG_CONFIG_SPEC xrender)
276 set(Xss_PKG_CONFIG_SPEC xscrnsaver)
277
278 find_package(X11)
279
280 foreach(_LIB X11 Xext Xcursor Xi Xfixes Xrandr Xrender Xss)
281 get_filename_component(_libdir "${X11_${_LIB}_LIB}" DIRECTORY)
282 FindLibraryAndSONAME("${_LIB}" LIBDIRS ${_libdir})
283 endforeach()
284
285 find_path(X11_INCLUDEDIR
286 NAMES X11/Xlib.h
287 PATHS
288 ${X11_INCLUDE_DIR}
289 /usr/pkg/xorg/include
290 /usr/X11R6/include
291 /usr/X11R7/include
292 /usr/local/include/X11
293 /usr/include/X11
294 /usr/openwin/include
295 /usr/openwin/share/include
296 /opt/graphics/OpenGL/include
297 /opt/X11/include
298 )
299
300 if(X11_INCLUDEDIR)
301 sdl_include_directories(PRIVATE SYSTEM "${X11_INCLUDEDIR}")
302 list(APPEND CMAKE_REQUIRED_INCLUDES ${X11_INCLUDEDIR})
303 endif()
304
305 find_file(HAVE_XCURSOR_H NAMES "X11/Xcursor/Xcursor.h" HINTS "${X11_INCLUDEDIR}")
306 find_file(HAVE_XINPUT2_H NAMES "X11/extensions/XInput2.h" HINTS "${X11_INCLUDEDIR}")
307 find_file(HAVE_XRANDR_H NAMES "X11/extensions/Xrandr.h" HINTS "${X11_INCLUDEDIR}")
308 find_file(HAVE_XFIXES_H_ NAMES "X11/extensions/Xfixes.h" HINTS "${X11_INCLUDEDIR}")
309 find_file(HAVE_XRENDER_H NAMES "X11/extensions/Xrender.h" HINTS "${X11_INCLUDEDIR}")
310 find_file(HAVE_XSYNC_H NAMES "X11/extensions/sync.h" HINTS "${X11_INCLUDEDIR}")
311 find_file(HAVE_XSS_H NAMES "X11/extensions/scrnsaver.h" HINTS "${X11_INCLUDEDIR}")
312 find_file(HAVE_XSHAPE_H NAMES "X11/extensions/shape.h" HINTS "${X11_INCLUDEDIR}")
313 find_file(HAVE_XDBE_H NAMES "X11/extensions/Xdbe.h" HINTS "${X11_INCLUDEDIR}")
314 find_file(HAVE_XEXT_H NAMES "X11/extensions/Xext.h" HINTS "${X11_INCLUDEDIR}")
315
316 if(X11_LIB AND HAVE_XEXT_H)
317
318 set(HAVE_X11 TRUE)
319 set(HAVE_SDL_VIDEO TRUE)
320
321 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/x11/*.c")
322 set(SDL_VIDEO_DRIVER_X11 1)
323
324 # Note: Disabled on Apple because the dynamic mode backend for X11 doesn't
325 # work properly on Apple during several issues like inconsistent paths
326 # among platforms. See #6778 (https://github.com/libsdl-org/SDL/issues/6778)
327 if(APPLE)
328 set(SDL_X11_SHARED OFF)
329 endif()
330
331 check_symbol_exists(shmat "sys/shm.h" HAVE_SHMAT_IN_LIBC)
332 if(NOT HAVE_SHMAT_IN_LIBC)
333 check_library_exists(ipc shmat "" HAVE_SHMAT_IN_LIBIPC)
334 if(HAVE_SHMAT_IN_LIBIPC)
335 sdl_link_dependency(x11_ipc LIBS ipc)
336 endif()
337 if(NOT HAVE_SHMAT_IN_LIBIPC)
338 sdl_compile_definitions(PRIVATE "NO_SHARED_MEMORY")
339 endif()
340 endif()
341
342 if(SDL_X11_SHARED)
343 if(NOT HAVE_SDL_LOADSO)
344 message(WARNING "You must have SDL_LoadObject() support for dynamic X11 loading")
345 set(HAVE_X11_SHARED FALSE)
346 else()
347 set(HAVE_X11_SHARED TRUE)
348 endif()
349 if(X11_LIB)
350 if(HAVE_X11_SHARED)
351 set(SDL_VIDEO_DRIVER_X11_DYNAMIC "\"${X11_LIB_SONAME}\"")
352 else()
353 sdl_link_dependency(x11 LIBS X11::X11 CMAKE_MODULE X11 PKG_CONFIG_SPECS ${X11_PKG_CONFIG_SPEC})
354 endif()
355 endif()
356 if(XEXT_LIB)
357 if(HAVE_X11_SHARED)
358 set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "\"${XEXT_LIB_SONAME}\"")
359 else()
360 sdl_link_dependency(xext LIBS X11::Xext CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xext_PKG_CONFIG_SPEC})
361 endif()
362 endif()
363 else()
364 sdl_link_dependency(x11 LIBS X11::X11 CMAKE_MODULE X11 PKG_CONFIG_SPECS ${X11_PKG_CONFIG_SPEC})
365 sdl_link_dependency(xext LIBS X11::Xext CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xext_PKG_CONFIG_SPEC})
366 endif()
367
368 list(APPEND CMAKE_REQUIRED_LIBRARIES ${X11_LIB})
369
370 check_c_source_compiles("
371 #include <X11/Xlib.h>
372 int main(int argc, char **argv) {
373 Display *display;
374 XEvent event;
375 XGenericEventCookie *cookie = &event.xcookie;
376 XNextEvent(display, &event);
377 XGetEventData(display, cookie);
378 XFreeEventData(display, cookie);
379 return 0; }" HAVE_XGENERICEVENT)
380 if(HAVE_XGENERICEVENT)
381 set(SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1)
382 endif()
383
384 check_symbol_exists(XkbLookupKeySym "X11/Xlib.h;X11/XKBlib.h" SDL_VIDEO_DRIVER_X11_HAS_XKBLOOKUPKEYSYM)
385
386 if(SDL_X11_XCURSOR AND HAVE_XCURSOR_H AND XCURSOR_LIB)
387 set(HAVE_X11_XCURSOR TRUE)
388 if(HAVE_X11_SHARED)
389 set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR "\"${XCURSOR_LIB_SONAME}\"")
390 else()
391 sdl_link_dependency(xcursor LIBS X11::Xcursor CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xcursor_PKG_CONFIG_SPEC})
392 endif()
393 set(SDL_VIDEO_DRIVER_X11_XCURSOR 1)
394 endif()
395
396 if(SDL_X11_XDBE AND HAVE_XDBE_H)
397 set(HAVE_X11_XDBE TRUE)
398 set(SDL_VIDEO_DRIVER_X11_XDBE 1)
399 endif()
400
401 if(SDL_X11_XINPUT AND HAVE_XINPUT2_H AND XI_LIB)
402 set(HAVE_X11_XINPUT TRUE)
403 if(HAVE_X11_SHARED)
404 set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "\"${XI_LIB_SONAME}\"")
405 else()
406 sdl_link_dependency(xi LIBS X11::Xi CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xi_PKG_CONFIG_SPEC})
407 endif()
408 set(SDL_VIDEO_DRIVER_X11_XINPUT2 1)
409
410 # Check for multitouch
411 check_c_source_compiles("
412 #include <X11/Xlib.h>
413 #include <X11/Xproto.h>
414 #include <X11/extensions/XInput2.h>
415 int event_type = XI_TouchBegin;
416 XITouchClassInfo *t;
417 Status XIAllowTouchEvents(Display *a,int b,unsigned int c,Window d,int f) {
418 return (Status)0;
419 }
420 int main(int argc, char **argv) { return 0; }" HAVE_XINPUT2_MULTITOUCH)
421 if(HAVE_XINPUT2_MULTITOUCH)
422 set(SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH 1)
423 endif()
424 endif()
425
426 # check along with XInput2.h because we use Xfixes with XIBarrierReleasePointer
427 if(SDL_X11_XFIXES AND HAVE_XFIXES_H_ AND HAVE_XINPUT2_H)
428 check_c_source_compiles("
429 #include <X11/Xlib.h>
430 #include <X11/Xproto.h>
431 #include <X11/extensions/XInput2.h>
432 #include <X11/extensions/Xfixes.h>
433 BarrierEventID b;
434 int main(int argc, char **argv) { return 0; }" HAVE_XFIXES_H)
435 endif()
436 if(SDL_X11_XFIXES AND HAVE_XFIXES_H AND HAVE_XINPUT2_H AND XFIXES_LIB)
437 if(HAVE_X11_SHARED)
438 set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XFIXES "\"${XFIXES_LIB_SONAME}\"")
439 else()
440 sdl_link_dependency(xfixes LIBS X11::Xfixes CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xfixes_PKG_CONFIG_SPEC})
441 endif()
442 set(SDL_VIDEO_DRIVER_X11_XFIXES 1)
443 set(HAVE_X11_XFIXES TRUE)
444 endif()
445
446 if(SDL_X11_XSYNC AND HAVE_XSYNC_H AND XEXT_LIB)
447 set(SDL_VIDEO_DRIVER_X11_XSYNC 1)
448 set(HAVE_X11_XSYNC TRUE)
449 endif()
450
451 if(SDL_X11_XRANDR AND HAVE_XRANDR_H AND XRANDR_LIB)
452 if(HAVE_X11_SHARED)
453 set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "\"${XRANDR_LIB_SONAME}\"")
454 else()
455 sdl_link_dependency(xrandr LIBS X11::Xrandr CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xrandr_PKG_CONFIG_SPEC})
456 endif()
457 set(SDL_VIDEO_DRIVER_X11_XRANDR 1)
458 set(HAVE_X11_XRANDR TRUE)
459 endif()
460
461 if(SDL_X11_XSCRNSAVER AND HAVE_XSS_H AND XSS_LIB)
462 if(HAVE_X11_SHARED)
463 set(SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS "\"${XSS_LIB_SONAME}\"")
464 else()
465 sdl_link_dependency(xss LIBS X11::Xss CMAKE_MODULE X11 PKG_CONFIG_SPECS ${Xss_PKG_CONFIG_SPEC})
466 endif()
467 set(SDL_VIDEO_DRIVER_X11_XSCRNSAVER 1)
468 set(HAVE_X11_XSCRNSAVER TRUE)
469 endif()
470
471 if(SDL_X11_XSHAPE AND HAVE_XSHAPE_H)
472 set(SDL_VIDEO_DRIVER_X11_XSHAPE 1)
473 set(HAVE_X11_XSHAPE TRUE)
474 endif()
475 endif()
476 endif()
477 if(NOT HAVE_X11)
478 # Prevent Mesa from including X11 headers
479 sdl_compile_definitions(PRIVATE "MESA_EGL_NO_X11_HEADERS" "EGL_NO_X11")
480 endif()
481 cmake_pop_check_state()
482endmacro()
483
484macro(WaylandProtocolGen _SCANNER _CODE_MODE _XML _PROTL)
485 set(_WAYLAND_PROT_C_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-protocol.c")
486 set(_WAYLAND_PROT_H_CODE "${CMAKE_CURRENT_BINARY_DIR}/wayland-generated-protocols/${_PROTL}-client-protocol.h")
487
488 add_custom_command(
489 OUTPUT "${_WAYLAND_PROT_H_CODE}"
490 DEPENDS "${_XML}"
491 COMMAND "${_SCANNER}"
492 ARGS client-header "${_XML}" "${_WAYLAND_PROT_H_CODE}"
493 )
494
495 add_custom_command(
496 OUTPUT "${_WAYLAND_PROT_C_CODE}"
497 DEPENDS "${_WAYLAND_PROT_H_CODE}"
498 COMMAND "${_SCANNER}"
499 ARGS "${_CODE_MODE}" "${_XML}" "${_WAYLAND_PROT_C_CODE}"
500 )
501
502 sdl_sources("${_WAYLAND_PROT_C_CODE}")
503endmacro()
504
505# Requires:
506# - EGL
507# - PkgCheckModules
508# Optional:
509# - SDL_WAYLAND_SHARED opt
510# - HAVE_SDL_LOADSO opt
511macro(CheckWayland)
512 if(SDL_WAYLAND)
513 set(WAYLAND_PKG_CONFIG_SPEC "wayland-client>=1.18" wayland-egl wayland-cursor egl "xkbcommon>=0.5.0")
514 set(PC_WAYLAND_FOUND FALSE)
515 if(PKG_CONFIG_FOUND)
516 pkg_check_modules(PC_WAYLAND IMPORTED_TARGET ${WAYLAND_PKG_CONFIG_SPEC})
517 endif()
518 find_program(WAYLAND_SCANNER NAMES wayland-scanner)
519
520 set(WAYLAND_FOUND FALSE)
521 if(PC_WAYLAND_FOUND AND WAYLAND_SCANNER)
522 execute_process(
523 COMMAND ${WAYLAND_SCANNER} --version
524 RESULT_VARIABLE WAYLAND_SCANNER_VERSION_RC
525 ERROR_VARIABLE WAYLAND_SCANNER_VERSION_STDERR
526 ERROR_STRIP_TRAILING_WHITESPACE
527 )
528 if(NOT WAYLAND_SCANNER_VERSION_RC EQUAL 0)
529 message(WARNING "Failed to get wayland-scanner version")
530 else()
531 if(WAYLAND_SCANNER_VERSION_STDERR MATCHES [[([0-9.]+)$]])
532 set(WAYLAND_FOUND TRUE)
533 set(WAYLAND_SCANNER_VERSION ${CMAKE_MATCH_1})
534 if(WAYLAND_SCANNER_VERSION VERSION_LESS "1.15.0")
535 set(WAYLAND_SCANNER_CODE_MODE "code")
536 else()
537 set(WAYLAND_SCANNER_CODE_MODE "private-code")
538 endif()
539 endif()
540 endif()
541 endif()
542
543 if(WAYLAND_FOUND)
544 set(HAVE_WAYLAND TRUE)
545 set(HAVE_SDL_VIDEO TRUE)
546
547 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/wayland/*.c")
548
549 # We have to generate some protocol interface code for some unstable Wayland features.
550 file(MAKE_DIRECTORY "${SDL3_BINARY_DIR}/wayland-generated-protocols")
551 # Prepend to include path to make sure they override installed protocol headers
552 sdl_include_directories(PRIVATE SYSTEM BEFORE "${SDL3_BINARY_DIR}/wayland-generated-protocols")
553
554 file(GLOB WAYLAND_PROTOCOLS_XML RELATIVE "${SDL3_SOURCE_DIR}/wayland-protocols/" "${SDL3_SOURCE_DIR}/wayland-protocols/*.xml")
555 foreach(_XML IN LISTS WAYLAND_PROTOCOLS_XML)
556 string(REGEX REPLACE "\\.xml$" "" _PROTL "${_XML}")
557 WaylandProtocolGen("${WAYLAND_SCANNER}" "${WAYLAND_SCANNER_CODE_MODE}" "${SDL3_SOURCE_DIR}/wayland-protocols/${_XML}" "${_PROTL}")
558 endforeach()
559
560 if(SDL_WAYLAND_SHARED AND NOT HAVE_SDL_LOADSO)
561 message(WARNING "You must have SDL_LoadObject() support for dynamic Wayland loading")
562 endif()
563 FindLibraryAndSONAME(wayland-client LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS})
564 FindLibraryAndSONAME(wayland-egl LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS})
565 FindLibraryAndSONAME(wayland-cursor LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS})
566 FindLibraryAndSONAME(xkbcommon LIBDIRS ${PC_WAYLAND_LIBRARY_DIRS})
567 if(SDL_WAYLAND_SHARED AND WAYLAND_CLIENT_LIB AND WAYLAND_EGL_LIB AND WAYLAND_CURSOR_LIB AND XKBCOMMON_LIB AND HAVE_SDL_LOADSO)
568 set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC "\"${WAYLAND_CLIENT_LIB_SONAME}\"")
569 set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL "\"${WAYLAND_EGL_LIB_SONAME}\"")
570 set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR "\"${WAYLAND_CURSOR_LIB_SONAME}\"")
571 set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON "\"${XKBCOMMON_LIB_SONAME}\"")
572 set(HAVE_WAYLAND_SHARED TRUE)
573 sdl_link_dependency(wayland INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_WAYLAND,INTERFACE_INCLUDE_DIRECTORIES>)
574 else()
575 sdl_link_dependency(wayland LIBS PkgConfig::PC_WAYLAND PKG_CONFIG_PREFIX PC_WAYLAND PKG_CONFIG_SPECS ${WAYLAND_PKG_CONFIG_SPEC})
576 endif()
577
578 if(SDL_WAYLAND_LIBDECOR)
579 set(LibDecor_PKG_CONFIG_SPEC libdecor-0)
580 pkg_check_modules(PC_LIBDECOR IMPORTED_TARGET ${LibDecor_PKG_CONFIG_SPEC})
581 if(PC_LIBDECOR_FOUND)
582
583 # Libdecor doesn't provide internal version defines, so generate them here.
584 if (PC_LIBDECOR_VERSION MATCHES "^([0-9]+)\\.([0-9]+)\\.([0-9]+)")
585 set(SDL_LIBDECOR_VERSION_MAJOR ${CMAKE_MATCH_1})
586 set(SDL_LIBDECOR_VERSION_MINOR ${CMAKE_MATCH_2})
587 set(SDL_LIBDECOR_VERSION_PATCH ${CMAKE_MATCH_3})
588 else()
589 message(WARNING "Failed to parse libdecor version; defaulting to lowest supported (0.1.0)")
590 set(SDL_LIBDECOR_VERSION_MAJOR 0)
591 set(SDL_LIBDECOR_VERSION_MINOR 1)
592 set(SDL_LIBDECOR_VERSION_PATCH 0)
593 endif()
594
595 if(PC_LIBDECOR_VERSION VERSION_GREATER_EQUAL "0.2.0")
596 set(LibDecor_PKG_CONFIG_SPEC "libdecor-0>=0.2.0")
597 endif()
598 set(HAVE_WAYLAND_LIBDECOR TRUE)
599 set(HAVE_LIBDECOR_H 1)
600 if(SDL_WAYLAND_LIBDECOR_SHARED AND NOT HAVE_SDL_LOADSO)
601 message(WARNING "You must have SDL_LoadObject() support for dynamic libdecor loading")
602 endif()
603 FindLibraryAndSONAME(decor-0 LIBDIRS ${PC_LIBDECOR_LIBRARY_DIRS})
604 if(SDL_WAYLAND_LIBDECOR_SHARED AND DECOR_0_LIB AND HAVE_SDL_LOADSO)
605 set(HAVE_WAYLAND_LIBDECOR_SHARED TRUE)
606 set(SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_LIBDECOR "\"${DECOR_0_LIB_SONAME}\"")
607 sdl_link_dependency(libdecor INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_LIBDECOR,INTERFACE_INCLUDE_DIRECTORIES>)
608 else()
609 sdl_link_dependency(libdecor LIBS PkgConfig::PC_LIBDECOR PKG_CONFIG_PREFIX PC_LIBDECOR PKG_CONFIG_SPECS ${LibDecor_PKG_CONFIG_SPEC})
610 endif()
611 endif()
612 endif()
613
614 set(SDL_VIDEO_DRIVER_WAYLAND 1)
615 endif()
616 endif()
617endmacro()
618
619# Requires:
620# - n/a
621#
622macro(CheckCOCOA)
623 if(SDL_COCOA)
624 if(APPLE) # Apple always has Cocoa.
625 set(HAVE_COCOA TRUE)
626 endif()
627 if(HAVE_COCOA)
628 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/cocoa/*.m")
629 set(SDL_FRAMEWORK_IOKIT 1)
630 set(SDL_VIDEO_DRIVER_COCOA 1)
631 set(HAVE_SDL_VIDEO TRUE)
632 endif()
633 endif()
634endmacro()
635
636# Requires:
637# - n/a
638macro(CheckVivante)
639 if(SDL_VIVANTE)
640 check_c_source_compiles("
641 #include <gc_vdk.h>
642 int main(int argc, char** argv) { return 0; }" HAVE_VIVANTE_VDK)
643 check_c_source_compiles("
644 #define LINUX
645 #define EGL_API_FB
646 #include <EGL/eglvivante.h>
647 int main(int argc, char** argv) { return 0; }" HAVE_VIVANTE_EGL_FB)
648 if(HAVE_VIVANTE_VDK OR HAVE_VIVANTE_EGL_FB)
649 set(HAVE_VIVANTE TRUE)
650 set(HAVE_SDL_VIDEO TRUE)
651
652 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/vivante/*.c")
653 set(SDL_VIDEO_DRIVER_VIVANTE 1)
654 # FIXME: Use Find module
655 if(HAVE_VIVANTE_VDK)
656 set(SDL_VIDEO_DRIVER_VIVANTE_VDK 1)
657 find_library(VIVANTE_LIBRARY REQUIRED NAMES VIVANTE vivante drm_vivante)
658 find_library(VIVANTE_VDK_LIBRARY VDK REQUIRED)
659 sdl_link_dependency(vivante LIBS ${VIVANTE_LIBRARY} ${VIVANTE_VDK_LIBRARY})
660 else()
661 # these defines are needed when including the system EGL headers, which SDL does
662 sdl_compile_definitions(PUBLIC "LINUX" "EGL_API_FB")
663 sdl_link_dependency(vivante LIBS EGL)
664 endif(HAVE_VIVANTE_VDK)
665 endif()
666 endif()
667endmacro()
668
669# Requires:
670# - n/a
671macro(CheckOpenVR)
672 if(SDL_OPENVR)
673 set(HAVE_OPENVR TRUE)
674 set(HAVE_OPENVR_VIDEO TRUE)
675
676 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/openvr/*.c")
677 set(SDL_VIDEO_DRIVER_OPENVR 1)
678 if(NOT WINDOWS)
679 sdl_link_dependency(egl LIBS EGL)
680 endif()
681 endif()
682endmacro()
683
684# Requires:
685# - nada
686macro(CheckGLX)
687 if(SDL_OPENGL)
688 check_c_source_compiles("
689 #include <GL/glx.h>
690 int main(int argc, char** argv) { return 0; }" HAVE_OPENGL_GLX)
691 if(HAVE_OPENGL_GLX AND NOT HAVE_ROCKCHIP)
692 set(SDL_VIDEO_OPENGL_GLX 1)
693 endif()
694 endif()
695endmacro()
696
697# Requires:
698# - PkgCheckModules
699macro(CheckEGL)
700 if(SDL_OPENGL OR SDL_OPENGLES)
701 cmake_push_check_state()
702 find_package(OpenGL MODULE)
703 list(APPEND CMAKE_REQUIRED_INCLUDES ${OPENGL_EGL_INCLUDE_DIRS})
704 list(APPEND CMAKE_REQUIRED_INCLUDES "${SDL3_SOURCE_DIR}/src/video/khronos")
705 check_c_source_compiles("
706 #define EGL_API_FB
707 #define MESA_EGL_NO_X11_HEADERS
708 #define EGL_NO_X11
709 #include <EGL/egl.h>
710 #include <EGL/eglext.h>
711 int main (int argc, char** argv) { return 0; }" HAVE_OPENGL_EGL)
712 cmake_pop_check_state()
713 if(HAVE_OPENGL_EGL)
714 set(SDL_VIDEO_OPENGL_EGL 1)
715 sdl_link_dependency(egl INCLUDES ${OPENGL_EGL_INCLUDE_DIRS})
716 endif()
717 endif()
718endmacro()
719
720# Requires:
721# - nada
722macro(CheckOpenGL)
723 if(SDL_OPENGL)
724 check_c_source_compiles("
725 #include <GL/gl.h>
726 #include <GL/glext.h>
727 int main(int argc, char** argv) { return 0; }" HAVE_OPENGL)
728 if(HAVE_OPENGL)
729 set(SDL_VIDEO_OPENGL 1)
730 set(SDL_VIDEO_RENDER_OGL 1)
731 endif()
732 endif()
733endmacro()
734
735# Requires:
736# - nada
737macro(CheckOpenGLES)
738 if(SDL_OPENGLES)
739 cmake_push_check_state()
740 list(APPEND CMAKE_REQUIRED_INCLUDES "${SDL3_SOURCE_DIR}/src/video/khronos")
741 check_c_source_compiles("
742 #include <GLES/gl.h>
743 #include <GLES/glext.h>
744 int main (int argc, char** argv) { return 0; }" HAVE_OPENGLES_V1)
745 check_c_source_compiles("
746 #include <GLES2/gl2.h>
747 #include <GLES2/gl2ext.h>
748 int main (int argc, char** argv) { return 0; }" HAVE_OPENGLES_V2)
749 cmake_pop_check_state()
750 if(HAVE_OPENGLES_V1)
751 set(HAVE_OPENGLES TRUE)
752 set(SDL_VIDEO_OPENGL_ES 1)
753 endif()
754 if(HAVE_OPENGLES_V2)
755 set(HAVE_OPENGLES TRUE)
756 set(SDL_VIDEO_OPENGL_ES2 1)
757 set(SDL_VIDEO_RENDER_OGL_ES2 1)
758 endif()
759 endif()
760endmacro()
761
762macro(CheckVulkan)
763 if(SDL_VULKAN)
764 set(SDL_VIDEO_VULKAN 1)
765 set(HAVE_VULKAN TRUE)
766 if(SDL_RENDER_VULKAN)
767 set(SDL_VIDEO_RENDER_VULKAN 1)
768 set(HAVE_RENDER_VULKAN TRUE)
769 endif()
770 endif()
771endmacro()
772
773# Requires:
774# - EGL
775macro(CheckQNXScreen)
776 if(QNX AND HAVE_OPENGL_EGL)
777 check_c_source_compiles("
778 #include <screen/screen.h>
779 int main (int argc, char** argv) { return 0; }" HAVE_QNX_SCREEN)
780 if(HAVE_QNX_SCREEN)
781 set(SDL_VIDEO_DRIVER_QNX 1)
782 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/qnx/*.c")
783 sdl_link_dependency(qnxscreen LIBS screen EGL)
784 endif()
785 endif()
786endmacro()
787
788# Requires:
789# - nada
790# Optional:
791# - THREADS opt
792# Sets:
793# PTHREAD_CFLAGS
794# PTHREAD_LIBS
795macro(CheckPTHREAD)
796 cmake_push_check_state()
797 if(SDL_PTHREADS)
798 if(ANDROID)
799 # the android libc provides built-in support for pthreads, so no
800 # additional linking or compile flags are necessary
801 elseif(LINUX)
802 set(PTHREAD_CFLAGS "-D_REENTRANT")
803 set(PTHREAD_LDFLAGS "-pthread")
804 elseif(BSDI)
805 set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
806 set(PTHREAD_LDFLAGS "")
807 elseif(DARWIN)
808 set(PTHREAD_CFLAGS "-D_THREAD_SAFE")
809 # causes Carbon.p complaints?
810 # set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
811 set(PTHREAD_LDFLAGS "")
812 elseif(FREEBSD)
813 set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
814 set(PTHREAD_LDFLAGS "-pthread")
815 elseif(NETBSD)
816 set(PTHREAD_CFLAGS "-D_REENTRANT -D_THREAD_SAFE")
817 set(PTHREAD_LDFLAGS "-lpthread")
818 elseif(OPENBSD)
819 set(PTHREAD_CFLAGS "-D_REENTRANT")
820 set(PTHREAD_LDFLAGS "-lpthread")
821 elseif(SOLARIS)
822 set(PTHREAD_CFLAGS "-D_REENTRANT")
823 if(CMAKE_C_COMPILER_ID MATCHES "SunPro")
824 set(PTHREAD_LDFLAGS "-mt -lpthread")
825 else()
826 set(PTHREAD_LDFLAGS "-pthread")
827 endif()
828 elseif(SYSV5)
829 set(PTHREAD_CFLAGS "-D_REENTRANT -Kthread")
830 set(PTHREAD_LDFLAGS "")
831 elseif(AIX)
832 set(PTHREAD_CFLAGS "-D_REENTRANT -mthreads")
833 set(PTHREAD_LDFLAGS "-pthread")
834 elseif(HPUX)
835 set(PTHREAD_CFLAGS "-D_REENTRANT")
836 set(PTHREAD_LDFLAGS "-L/usr/lib -pthread")
837 elseif(HAIKU)
838 set(PTHREAD_CFLAGS "-D_REENTRANT")
839 set(PTHREAD_LDFLAGS "")
840 elseif(EMSCRIPTEN)
841 set(PTHREAD_CFLAGS "-D_REENTRANT -pthread")
842 set(PTHREAD_LDFLAGS "-pthread")
843 elseif(QNX)
844 # pthread support is baked in
845 else()
846 set(PTHREAD_CFLAGS "-D_REENTRANT")
847 set(PTHREAD_LDFLAGS "-lpthread")
848 endif()
849
850 # Run some tests
851 string(APPEND CMAKE_REQUIRED_FLAGS " ${PTHREAD_CFLAGS} ${PTHREAD_LDFLAGS}")
852 check_c_source_compiles("
853 #include <pthread.h>
854 int main(int argc, char** argv) {
855 pthread_attr_t type;
856 pthread_attr_init(&type);
857 return 0;
858 }" HAVE_PTHREADS)
859 if(HAVE_PTHREADS)
860 set(SDL_THREAD_PTHREAD 1)
861 separate_arguments(PTHREAD_CFLAGS)
862 sdl_compile_options(PRIVATE ${PTHREAD_CFLAGS})
863 sdl_link_dependency(pthread LINK_OPTIONS ${PTHREAD_LDFLAGS})
864
865 check_c_source_compiles("
866 #include <pthread.h>
867 int main(int argc, char **argv) {
868 pthread_mutexattr_t attr;
869 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
870 return 0;
871 }" HAVE_RECURSIVE_MUTEXES)
872 if(HAVE_RECURSIVE_MUTEXES)
873 set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1)
874 else()
875 check_c_source_compiles("
876 #include <pthread.h>
877 int main(int argc, char **argv) {
878 pthread_mutexattr_t attr;
879 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
880 return 0;
881 }" HAVE_RECURSIVE_MUTEXES_NP)
882 if(HAVE_RECURSIVE_MUTEXES_NP)
883 set(SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 1)
884 endif()
885 endif()
886
887 if(SDL_PTHREADS_SEM)
888 check_c_source_compiles("#include <pthread.h>
889 #include <semaphore.h>
890 int main(int argc, char **argv) { return 0; }" HAVE_PTHREADS_SEM)
891 if(HAVE_PTHREADS_SEM)
892 check_c_source_compiles("
893 #include <pthread.h>
894 #include <semaphore.h>
895 int main(int argc, char **argv) {
896 sem_timedwait(NULL, NULL);
897 return 0;
898 }" COMPILER_HAS_SEM_TIMEDWAIT)
899 set(HAVE_SEM_TIMEDWAIT ${COMPILER_HAS_SEM_TIMEDWAIT})
900 endif()
901 endif()
902
903 check_include_file(pthread.h HAVE_PTHREAD_H)
904 check_include_file(pthread_np.h HAVE_PTHREAD_NP_H)
905 if (HAVE_PTHREAD_H)
906 check_c_source_compiles("
907 #include <pthread.h>
908 int main(int argc, char **argv) {
909 #ifdef __APPLE__
910 pthread_setname_np(\"\");
911 #else
912 pthread_setname_np(pthread_self(),\"\");
913 #endif
914 return 0;
915 }" HAVE_PTHREAD_SETNAME_NP)
916 if (HAVE_PTHREAD_NP_H)
917 check_symbol_exists(pthread_set_name_np "pthread.h;pthread_np.h" HAVE_PTHREAD_SET_NAME_NP)
918 endif()
919 endif()
920
921 sdl_sources(
922 "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_systhread.c"
923 "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_sysmutex.c" # Can be faked, if necessary
924 "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_syscond.c" # Can be faked, if necessary
925 "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_sysrwlock.c" # Can be faked, if necessary
926 "${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_systls.c"
927 )
928 if(HAVE_PTHREADS_SEM)
929 sdl_sources("${SDL3_SOURCE_DIR}/src/thread/pthread/SDL_syssem.c")
930 else()
931 sdl_sources("${SDL3_SOURCE_DIR}/src/thread/generic/SDL_syssem.c")
932 endif()
933 set(HAVE_SDL_THREADS TRUE)
934 endif()
935 endif()
936 cmake_pop_check_state()
937endmacro()
938
939# Requires
940# - nada
941# Optional:
942# Sets:
943# USB_LIBS
944# USB_CFLAGS
945macro(CheckUSBHID)
946 cmake_push_check_state()
947 check_library_exists(usbhid hid_init "" LIBUSBHID)
948 if(LIBUSBHID)
949 check_include_file(usbhid.h HAVE_USBHID_H)
950 if(HAVE_USBHID_H)
951 set(USB_CFLAGS "-DHAVE_USBHID_H")
952 endif()
953
954 check_include_file(libusbhid.h HAVE_LIBUSBHID_H)
955 if(HAVE_LIBUSBHID_H)
956 string(APPEND USB_CFLAGS " -DHAVE_LIBUSBHID_H")
957 endif()
958 set(USB_LIBS ${USB_LIBS} usbhid)
959 else()
960 check_include_file(usb.h HAVE_USB_H)
961 if(HAVE_USB_H)
962 set(USB_CFLAGS "-DHAVE_USB_H")
963 endif()
964 check_include_file(libusb.h HAVE_LIBUSB_H)
965 if(HAVE_LIBUSB_H)
966 string(APPEND USB_CFLAGS " -DHAVE_LIBUSB_H")
967 endif()
968 check_library_exists(usb hid_init "" LIBUSB)
969 if(LIBUSB)
970 list(APPEND USB_LIBS usb)
971 endif()
972 endif()
973
974 string(APPEND CMAKE_REQUIRED_FLAGS " ${USB_CFLAGS}")
975 list(APPEND CMAKE_REQUIRED_LIBRARIES ${USB_LIBS})
976 check_c_source_compiles("
977 #include <sys/types.h>
978 #if defined(HAVE_USB_H)
979 #include <usb.h>
980 #endif
981 #ifdef __DragonFly__
982 # include <bus/u4b/usb.h>
983 # include <bus/u4b/usbhid.h>
984 #else
985 # include <dev/usb/usb.h>
986 # include <dev/usb/usbhid.h>
987 #endif
988 #if defined(HAVE_USBHID_H)
989 #include <usbhid.h>
990 #elif defined(HAVE_LIBUSB_H)
991 #include <libusb.h>
992 #elif defined(HAVE_LIBUSBHID_H)
993 #include <libusbhid.h>
994 #endif
995 int main(int argc, char **argv) {
996 struct report_desc *repdesc;
997 struct usb_ctl_report *repbuf;
998 hid_kind_t hidkind;
999 return 0;
1000 }" HAVE_USBHID)
1001 if(HAVE_USBHID)
1002 check_c_source_compiles("
1003 #include <sys/types.h>
1004 #if defined(HAVE_USB_H)
1005 #include <usb.h>
1006 #endif
1007 #ifdef __DragonFly__
1008 # include <bus/u4b/usb.h>
1009 # include <bus/u4b/usbhid.h>
1010 #else
1011 # include <dev/usb/usb.h>
1012 # include <dev/usb/usbhid.h>
1013 #endif
1014 #if defined(HAVE_USBHID_H)
1015 #include <usbhid.h>
1016 #elif defined(HAVE_LIBUSB_H)
1017 #include <libusb.h>
1018 #elif defined(HAVE_LIBUSBHID_H)
1019 #include <libusbhid.h>
1020 #endif
1021 int main(int argc, char** argv) {
1022 struct usb_ctl_report buf;
1023 if (buf.ucr_data) { }
1024 return 0;
1025 }" HAVE_USBHID_UCR_DATA)
1026 if(HAVE_USBHID_UCR_DATA)
1027 string(APPEND USB_CFLAGS " -DUSBHID_UCR_DATA")
1028 endif()
1029
1030 check_c_source_compiles("
1031 #include <sys/types.h>
1032 #if defined(HAVE_USB_H)
1033 #include <usb.h>
1034 #endif
1035 #ifdef __DragonFly__
1036 #include <bus/u4b/usb.h>
1037 #include <bus/u4b/usbhid.h>
1038 #else
1039 #include <dev/usb/usb.h>
1040 #include <dev/usb/usbhid.h>
1041 #endif
1042 #if defined(HAVE_USBHID_H)
1043 #include <usbhid.h>
1044 #elif defined(HAVE_LIBUSB_H)
1045 #include <libusb.h>
1046 #elif defined(HAVE_LIBUSBHID_H)
1047 #include <libusbhid.h>
1048 #endif
1049 int main(int argc, char **argv) {
1050 report_desc_t d;
1051 hid_start_parse(d, 1, 1);
1052 return 0;
1053 }" HAVE_USBHID_NEW)
1054 if(HAVE_USBHID_NEW)
1055 string(APPEND USB_CFLAGS " -DUSBHID_NEW")
1056 endif()
1057
1058 check_c_source_compiles("
1059 #include <machine/joystick.h>
1060 int main(int argc, char** argv) {
1061 struct joystick t;
1062 return 0;
1063 }" HAVE_MACHINE_JOYSTICK)
1064 if(HAVE_MACHINE_JOYSTICK)
1065 set(SDL_HAVE_MACHINE_JOYSTICK_H 1)
1066 endif()
1067 set(SDL_JOYSTICK_USBHID 1)
1068 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/bsd/*.c")
1069 separate_arguments(USB_CFLAGS)
1070 sdl_compile_options(PRIVATE ${USB_CFLAGS})
1071 #FIXME: properly add usb libs with pkg-config or whatever
1072 sdl_link_dependency(usbhid LIBS ${USB_LIBS})
1073 set(HAVE_SDL_JOYSTICK TRUE)
1074 endif()
1075 cmake_pop_check_state()
1076endmacro()
1077
1078# Check for HIDAPI support
1079macro(CheckHIDAPI)
1080 if(ANDROID)
1081 enable_language(CXX)
1082 sdl_sources("${SDL3_SOURCE_DIR}/src/hidapi/android/hid.cpp")
1083 endif()
1084 if(IOS OR TVOS)
1085 sdl_sources("${SDL3_SOURCE_DIR}/src/hidapi/ios/hid.m")
1086 set(SDL_FRAMEWORK_COREBLUETOOTH 1)
1087 endif()
1088 if(SDL_HIDAPI)
1089 set(HAVE_HIDAPI ON)
1090 if(SDL_HIDAPI_LIBUSB)
1091 set(HAVE_LIBUSB FALSE)
1092 find_package(LibUSB)
1093 if(LibUSB_FOUND)
1094 cmake_push_check_state()
1095 list(APPEND CMAKE_REQUIRED_LIBRARIES LibUSB::LibUSB)
1096 check_c_source_compiles("
1097 #include <stddef.h>
1098 #include <libusb.h>
1099 int main(int argc, char **argv) {
1100 libusb_close(NULL);
1101 return 0;
1102 }" HAVE_LIBUSB_H)
1103 cmake_pop_check_state()
1104 if(HAVE_LIBUSB_H)
1105 set(HAVE_LIBUSB TRUE)
1106 target_get_dynamic_library(dynamic_libusb LibUSB::LibUSB)
1107 if(SDL_HIDAPI_LIBUSB_SHARED AND dynamic_libusb)
1108 set(HAVE_HIDAPI_LIBUSB_SHARED ON)
1109 set(SDL_LIBUSB_DYNAMIC "\"${dynamic_libusb}\"")
1110 sdl_link_dependency(hidapi INCLUDES $<TARGET_PROPERTY:LibUSB::LibUSB,INTERFACE_INCLUDE_DIRECTORIES>)
1111 else()
1112 sdl_link_dependency(hidapi LIBS LibUSB::LibUSB PKG_CONFIG_SPECS "${LibUSB_PKG_CONFIG_SPEC}" CMAKE_MODULE LibUSB)
1113 endif()
1114 endif()
1115 endif()
1116 set(HAVE_HIDAPI_LIBUSB ${HAVE_LIBUSB})
1117 endif()
1118
1119 if(HAVE_HIDAPI)
1120 set(HAVE_SDL_HIDAPI TRUE)
1121
1122 if(SDL_JOYSTICK AND SDL_HIDAPI_JOYSTICK)
1123 set(SDL_JOYSTICK_HIDAPI 1)
1124 set(HAVE_SDL_JOYSTICK TRUE)
1125 set(HAVE_HIDAPI_JOYSTICK TRUE)
1126 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/joystick/hidapi/*.c")
1127 endif()
1128 else()
1129 set(SDL_HIDAPI_DISABLED 1)
1130 endif()
1131 else()
1132 set(SDL_HIDAPI_DISABLED 1)
1133 endif()
1134endmacro()
1135
1136# Requires:
1137# - n/a
1138macro(CheckRPI)
1139 if(SDL_RPI)
1140 set(BCM_HOST_PKG_CONFIG_SPEC bcm_host)
1141 set(BRCMEGL_PKG_CONFIG_SPEC brcmegl)
1142
1143 set(original_PKG_CONFIG_PATH $ENV{PKG_CONFIG_PATH})
1144 set(ENV{PKG_CONFIG_PATH} "${original_PKG_CONFIG_PATH}:/opt/vc/lib/pkgconfig")
1145 set(PC_BCM_HOST_FOUND FALSE)
1146 set(PC_BRCMEGL_FOUND FALSE)
1147 if(PKG_CONFIG_FOUND)
1148 pkg_check_modules(PC_BCM_HOST IMPORTED_TARGET QUIET ${BCM_HOST_PKG_CONFIG_SPEC})
1149 pkg_check_modules(PC_BRCMEGL IMPORTED_TARGET QUIET ${BRCMEGL_PKG_CONFIG_SPEC})
1150 endif()
1151 set(ENV{PKG_CONFIG_PATH} "${original_PKG_CONFIG_PATH}")
1152
1153 if(TARGET PkgConfig::PC_BCM_HOST AND TARGET PkgConfig::PC_BRCMEGL)
1154 set(HAVE_RPI TRUE)
1155 if(SDL_VIDEO)
1156 set(HAVE_SDL_VIDEO TRUE)
1157 set(SDL_VIDEO_DRIVER_RPI 1)
1158 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/raspberry/*.c")
1159 sdl_link_dependency(rpi-video LIBS PkgConfig::PC_BCM_HOST PKG_CONFIG_PREFIX PC_BCM_HOST PKG_CONFIG_SPECS ${BCM_HOST_PKG_CONFIG_SPEC})
1160 endif()
1161 endif()
1162 endif()
1163endmacro()
1164
1165# Requires:
1166# - n/a
1167macro(CheckROCKCHIP)
1168 if(SDL_ROCKCHIP)
1169 set(MALI_PKG_CONFIG_SPEC mali)
1170 set(PC_MALI_FOUND FALSE)
1171 if(PKG_CONFIG_FOUND)
1172 pkg_check_modules(PC_MALI QUIET ${MALI_PKG_CONFIG_SPEC})
1173 endif()
1174 if(PC_MALI_FOUND)
1175 set(HAVE_ROCKCHIP TRUE)
1176 endif()
1177 if(SDL_VIDEO AND HAVE_ROCKCHIP)
1178 set(HAVE_SDL_VIDEO TRUE)
1179 set(SDL_VIDEO_DRIVER_ROCKCHIP 1)
1180 endif()
1181 endif()
1182endmacro()
1183
1184# Requires:
1185# - EGL
1186# - PkgCheckModules
1187# Optional:
1188# - SDL_KMSDRM_SHARED opt
1189# - HAVE_SDL_LOADSO opt
1190macro(CheckKMSDRM)
1191 if(SDL_KMSDRM)
1192 set(PKG_CONFIG_LIBDRM_SPEC libdrm)
1193 set(PKG_CONFIG_GBM_SPEC gbm)
1194 set(PC_LIBDRM_FOUND FALSE)
1195 set(PC_GBM_FOUND FALSE)
1196 if(PKG_CONFIG_FOUND)
1197 pkg_check_modules(PC_LIBDRM IMPORTED_TARGET ${PKG_CONFIG_LIBDRM_SPEC})
1198 pkg_check_modules(PC_GBM IMPORTED_TARGET ${PKG_CONFIG_GBM_SPEC})
1199 endif()
1200 if(PC_LIBDRM_FOUND AND PC_GBM_FOUND AND HAVE_OPENGL_EGL)
1201 set(HAVE_KMSDRM TRUE)
1202 set(HAVE_SDL_VIDEO TRUE)
1203
1204 sdl_glob_sources("${SDL3_SOURCE_DIR}/src/video/kmsdrm/*.c")
1205
1206 set(SDL_VIDEO_DRIVER_KMSDRM 1)
1207
1208 if(SDL_KMSDRM_SHARED AND NOT HAVE_SDL_LOADSO)
1209 message(WARNING "You must have SDL_LoadObject() support for dynamic KMS/DRM loading")
1210 endif()
1211 set(HAVE_KMSDRM_SHARED FALSE)
1212 if(SDL_KMSDRM_SHARED AND HAVE_SDL_LOADSO)
1213 FindLibraryAndSONAME(drm LIBDIRS ${PC_LIBDRM_LIBRARY_DIRS})
1214 FindLibraryAndSONAME(gbm LIBDIRS ${PC_GBM_LIBRARY_DIRS})
1215 if(DRM_LIB AND DRM_SHARED AND GBM_LIB AND GBM_SHARED)
1216 set(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC "\"${DRM_LIB_SONAME}\"")
1217 set(SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM "\"${GBM_LIB_SONAME}\"")
1218 set(HAVE_KMSDRM_SHARED TRUE)
1219 sdl_link_dependency(kmsdrm-drm INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_LIBDRM,INTERFACE_INCLUDE_DIRECTORIES>)
1220 sdl_link_dependency(kmsdrm-gbm INCLUDES $<TARGET_PROPERTY:PkgConfig::PC_GBM,INTERFACE_INCLUDE_DIRECTORIES>)
1221 endif()
1222 endif()
1223 if(NOT HAVE_KMSDRM_SHARED)
1224 sdl_link_dependency(kmsdrm-libdrm LIBS PkgConfig::PC_LIBDRM PKG_CONFIG_PREFIX PC_LIBDRM PKG_CONFIG_SPECS ${PKG_CONFIG_LIBDRM_SPEC})
1225 sdl_link_dependency(kmsdrm-gbm LIBS PkgConfig::PC_GBM PKG_CONFIG_PREFIX PC_GBM PKG_CONFIG_SPECS ${PKG_CONFIG_GBM_SPEC})
1226 endif()
1227 endif()
1228 endif()
1229endmacro()
1230
1231macro(CheckLibUDev)
1232 if(SDL_LIBUDEV)
1233 check_include_file("libudev.h" HAVE_LIBUDEV_HEADER)
1234 if(HAVE_LIBUDEV_HEADER)
1235 set(HAVE_LIBUDEV_H TRUE)
1236 FindLibraryAndSONAME(udev)
1237 if(UDEV_LIB_SONAME)
1238 set(SDL_UDEV_DYNAMIC "\"${UDEV_LIB_SONAME}\"")
1239 set(HAVE_LIBUDEV TRUE)
1240 endif()
1241 endif()
1242 endif()
1243endmacro()
1244
1245macro(CheckLibUnwind)
1246 if(TARGET SDL3_test)
1247 set(found_libunwind FALSE)
1248 set(_libunwind_src [==[
1249 #include <libunwind.h>
1250 int main(int argc, char *argv[]) {
1251 (void)argc; (void)argv;
1252 unw_context_t context;
1253 unw_cursor_t cursor;
1254 unw_word_t pc;
1255 char sym[256];
1256 unw_word_t offset;
1257 unw_getcontext(&context);
1258 unw_step(&cursor);
1259 unw_get_reg(&cursor, UNW_REG_IP, &pc);
1260 unw_get_proc_name(&cursor, sym, sizeof(sym), &offset);
1261 return 0;
1262 }]==])
1263
1264 if(NOT found_libunwind)
1265 cmake_push_check_state()
1266 check_c_source_compiles("${_libunwind_src}" LIBC_HAS_WORKING_LIBUNWIND)
1267 cmake_pop_check_state()
1268 if(LIBC_HAS_WORKING_LIBUNWIND)
1269 set(found_libunwind TRUE)
1270 target_compile_definitions(SDL3_test PRIVATE HAVE_LIBUNWIND_H)
1271 endif()
1272 endif()
1273
1274 if(NOT found_libunwind)
1275 cmake_push_check_state()
1276 list(APPEND CMAKE_REQUIRED_LIBRARIES "unwind")
1277 check_c_source_compiles("${_libunwind_src}" LIBUNWIND_HAS_WORKINGLIBUNWIND)
1278 cmake_pop_check_state()
1279 if(LIBUNWIND_HAS_WORKINGLIBUNWIND)
1280 set(found_libunwind TRUE)
1281 sdl_test_link_dependency(UNWIND LIBS unwind)
1282 endif()
1283 endif()
1284
1285 if(NOT found_libunwind)
1286 set(LibUnwind_PKG_CONFIG_SPEC libunwind libunwind-generic)
1287 set(PC_LIBUNWIND_FOUND FALSE)
1288 if(PKG_CONFIG_FOUND)
1289 pkg_check_modules(PC_LIBUNWIND IMPORTED_TARGET ${LibUnwind_PKG_CONFIG_SPEC})
1290 endif()
1291 if(PC_LIBUNWIND_FOUND)
1292 cmake_push_check_state()
1293 list(APPEND CMAKE_REQUIRED_LIBRARIES ${PC_LIBUNWIND_LIBRARIES})
1294 list(APPEND CMAKE_REQUIRED_INCLUDES ${PC_LIBUNWIND_INCLUDE_DIRS})
1295 check_c_source_compiles("${_libunwind_src}" PC_LIBUNWIND_HAS_WORKING_LIBUNWIND)
1296 cmake_pop_check_state()
1297 if(PC_LIBUNWIND_HAS_WORKING_LIBUNWIND)
1298 set(found_libunwind TRUE)
1299 sdl_test_link_dependency(UNWIND LIBS PkgConfig::PC_LIBUNWIND PKG_CONFIG_PREFIX PC_LIBUNWIND PKG_CONFIG_SPECS ${LibUnwind_PKG_CONFIG_SPEC})
1300 endif()
1301 endif()
1302 endif()
1303
1304 if(found_libunwind)
1305 target_compile_definitions(SDL3_test PRIVATE HAVE_LIBUNWIND_H)
1306 endif()
1307 endif()
1308endmacro()