diff options
Diffstat (limited to 'src/contrib/SDL-3.2.20/cmake/sdlchecks.cmake')
-rw-r--r-- | src/contrib/SDL-3.2.20/cmake/sdlchecks.cmake | 1308 |
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 @@ | |||
1 | macro(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}") | ||
43 | endmacro() | ||
44 | |||
45 | macro(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() | ||
59 | endmacro() | ||
60 | |||
61 | macro(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) | ||
66 | endmacro() | ||
67 | |||
68 | # Requires: | ||
69 | # - n/a | ||
70 | macro(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() | ||
86 | endmacro() | ||
87 | |||
88 | # Requires: | ||
89 | # - n/a | ||
90 | # Optional: | ||
91 | # - SDL_ALSA_SHARED opt | ||
92 | # - HAVE_SDL_LOADSO opt | ||
93 | macro(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() | ||
128 | endmacro() | ||
129 | |||
130 | # Requires: | ||
131 | # - PkgCheckModules | ||
132 | # Optional: | ||
133 | # - SDL_PIPEWIRE_SHARED opt | ||
134 | # - HAVE_SDL_LOADSO opt | ||
135 | macro(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() | ||
163 | endmacro() | ||
164 | |||
165 | # Requires: | ||
166 | # - PkgCheckModules | ||
167 | # Optional: | ||
168 | # - SDL_PULSEAUDIO_SHARED opt | ||
169 | # - HAVE_SDL_LOADSO opt | ||
170 | macro(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() | ||
195 | endmacro() | ||
196 | |||
197 | # Requires: | ||
198 | # - PkgCheckModules | ||
199 | # Optional: | ||
200 | # - SDL_JACK_SHARED opt | ||
201 | # - HAVE_SDL_LOADSO opt | ||
202 | macro(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() | ||
227 | endmacro() | ||
228 | |||
229 | # Requires: | ||
230 | # - PkgCheckModules | ||
231 | # Optional: | ||
232 | # - SDL_SNDIO_SHARED opt | ||
233 | # - HAVE_SDL_LOADSO opt | ||
234 | macro(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() | ||
259 | endmacro() | ||
260 | |||
261 | # Requires: | ||
262 | # - n/a | ||
263 | # Optional: | ||
264 | # - SDL_X11_SHARED opt | ||
265 | # - HAVE_SDL_LOADSO opt | ||
266 | macro(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() | ||
482 | endmacro() | ||
483 | |||
484 | macro(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}") | ||
503 | endmacro() | ||
504 | |||
505 | # Requires: | ||
506 | # - EGL | ||
507 | # - PkgCheckModules | ||
508 | # Optional: | ||
509 | # - SDL_WAYLAND_SHARED opt | ||
510 | # - HAVE_SDL_LOADSO opt | ||
511 | macro(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() | ||
617 | endmacro() | ||
618 | |||
619 | # Requires: | ||
620 | # - n/a | ||
621 | # | ||
622 | macro(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() | ||
634 | endmacro() | ||
635 | |||
636 | # Requires: | ||
637 | # - n/a | ||
638 | macro(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() | ||
667 | endmacro() | ||
668 | |||
669 | # Requires: | ||
670 | # - n/a | ||
671 | macro(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() | ||
682 | endmacro() | ||
683 | |||
684 | # Requires: | ||
685 | # - nada | ||
686 | macro(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() | ||
695 | endmacro() | ||
696 | |||
697 | # Requires: | ||
698 | # - PkgCheckModules | ||
699 | macro(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() | ||
718 | endmacro() | ||
719 | |||
720 | # Requires: | ||
721 | # - nada | ||
722 | macro(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() | ||
733 | endmacro() | ||
734 | |||
735 | # Requires: | ||
736 | # - nada | ||
737 | macro(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() | ||
760 | endmacro() | ||
761 | |||
762 | macro(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() | ||
771 | endmacro() | ||
772 | |||
773 | # Requires: | ||
774 | # - EGL | ||
775 | macro(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() | ||
786 | endmacro() | ||
787 | |||
788 | # Requires: | ||
789 | # - nada | ||
790 | # Optional: | ||
791 | # - THREADS opt | ||
792 | # Sets: | ||
793 | # PTHREAD_CFLAGS | ||
794 | # PTHREAD_LIBS | ||
795 | macro(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() | ||
937 | endmacro() | ||
938 | |||
939 | # Requires | ||
940 | # - nada | ||
941 | # Optional: | ||
942 | # Sets: | ||
943 | # USB_LIBS | ||
944 | # USB_CFLAGS | ||
945 | macro(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() | ||
1076 | endmacro() | ||
1077 | |||
1078 | # Check for HIDAPI support | ||
1079 | macro(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() | ||
1134 | endmacro() | ||
1135 | |||
1136 | # Requires: | ||
1137 | # - n/a | ||
1138 | macro(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() | ||
1163 | endmacro() | ||
1164 | |||
1165 | # Requires: | ||
1166 | # - n/a | ||
1167 | macro(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() | ||
1182 | endmacro() | ||
1183 | |||
1184 | # Requires: | ||
1185 | # - EGL | ||
1186 | # - PkgCheckModules | ||
1187 | # Optional: | ||
1188 | # - SDL_KMSDRM_SHARED opt | ||
1189 | # - HAVE_SDL_LOADSO opt | ||
1190 | macro(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() | ||
1229 | endmacro() | ||
1230 | |||
1231 | macro(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() | ||
1243 | endmacro() | ||
1244 | |||
1245 | macro(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() | ||
1308 | endmacro() | ||