annotate SDL3/SDL_dlopennote.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 Simple DirectMedia Layer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 This software is provided 'as-is', without any express or implied
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 warranty. In no event will the authors be held liable for any damages
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 arising from the use of this software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 Permission is granted to anyone to use this software for any purpose,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 including commercial applications, and to alter it and redistribute it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 freely, subject to the following restrictions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 1. The origin of this software must not be misrepresented; you must not
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 claim that you wrote the original software. If you use this software
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 in a product, an acknowledgment in the product documentation would be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 appreciated but is not required.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 2. Altered source versions must be plainly marked as such, and must not be
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 misrepresented as being the original software.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 3. This notice may not be removed or altered from any source distribution.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 /* WIKI CATEGORY: DlopenNotes */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 * # CategoryDlopenNotes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 * This header allows you to annotate your code so external tools know about
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 * dynamic shared library dependencies.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 * If you determine that your toolchain doesn't support dlopen notes, you can
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 * disable this feature by defining `SDL_DISABLE_DLOPEN_NOTES`. You can use
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 * this CMake snippet to check for support:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 * ```cmake
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 * include(CheckCSourceCompiles)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 * find_package(SDL3 REQUIRED CONFIG COMPONENTS Headers)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 * list(APPEND CMAKE_REQUIRED_LIBRARIES SDL3::Headers)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 * check_c_source_compiles([==[
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 * #include <SDL3/SDL_dlopennote.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 * SDL_ELF_NOTE_DLOPEN("sdl-video",
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 * "Support for video through SDL",
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 * SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 * "libSDL-1.2.so.0", "libSDL-2.0.so.0", "libSDL3.so.0"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 * )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 * int main(int argc, char *argv[]) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 * return argc + argv[0][1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 * }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 * ]==] COMPILER_SUPPORTS_SDL_ELF_NOTE_DLOPEN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 * if(NOT COMPILER_SUPPORTS_SDL_ELF_NOTE_DLOPEN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 * add_compile_definitions(-DSDL_DISABLE_DLOPEN_NOTE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 * endif()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 #ifndef SDL_dlopennote_h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 #define SDL_dlopennote_h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 * Use this macro with SDL_ELF_NOTE_DLOPEN() to note that a dynamic shared
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 * library dependency is optional.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 * Optional functionality uses the dependency, the binary will work and the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 * dependency is only needed for full-featured installations.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 * \since This macro is available since SDL 3.4.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 * \sa SDL_ELF_NOTE_DLOPEN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 #define SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED "suggested"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 * Use this macro with SDL_ELF_NOTE_DLOPEN() to note that a dynamic shared
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 * library dependency is recommended.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 * Important functionality needs the dependency, the binary will work but in
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 * most cases the dependency should be provided.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 * \since This macro is available since SDL 3.4.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 * \sa SDL_ELF_NOTE_DLOPEN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 #define SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED "recommended"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 * Use this macro with SDL_ELF_NOTE_DLOPEN() to note that a dynamic shared
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 * library dependency is required.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 * Core functionality needs the dependency, the binary will not work if it
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 * cannot be found.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 * \since This macro is available since SDL 3.4.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 * \sa SDL_ELF_NOTE_DLOPEN
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 #define SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED "required"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 #if !defined(SDL_PLATFORM_UNIX) || defined(SDL_PLATFORM_ANDROID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 /* The dlopen note functionality isn't used on this platform */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 #ifndef SDL_DISABLE_DLOPEN_NOTES
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 #define SDL_DISABLE_DLOPEN_NOTES
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 #elif defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 /* gcc < 3.1 too old */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 #ifndef SDL_DISABLE_DLOPEN_NOTES
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 #define SDL_DISABLE_DLOPEN_NOTES
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 #endif /* SDL_PLATFORM_UNIX || SDL_PLATFORM_ANDROID */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 #if defined(__ELF__) && !defined(SDL_DISABLE_DLOPEN_NOTES)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 #include <SDL3/SDL_stdinc.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 #define SDL_ELF_NOTE_DLOPEN_VENDOR "FDO"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 #define SDL_ELF_NOTE_DLOPEN_TYPE 0x407c0c0aU
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 #define SDL_ELF_NOTE_INTERNAL2(json, variable_name) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 __attribute__((aligned(4), used, section(".note.dlopen"))) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 static const struct { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 struct { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 Uint32 n_namesz; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 Uint32 n_descsz; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 Uint32 n_type; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 } nhdr; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 char name[4]; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 __attribute__((aligned(4))) char dlopen_json[sizeof(json)]; \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 } variable_name = { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 { \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 sizeof(SDL_ELF_NOTE_DLOPEN_VENDOR), \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 sizeof(json), \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 SDL_ELF_NOTE_DLOPEN_TYPE \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 }, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 SDL_ELF_NOTE_DLOPEN_VENDOR, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 json \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 #define SDL_ELF_NOTE_INTERNAL(json, variable_name) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 SDL_ELF_NOTE_INTERNAL2(json, variable_name)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 #define SDL_DLNOTE_JSON_ARRAY1(N1) "[\"" N1 "\"]"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 #define SDL_DLNOTE_JSON_ARRAY2(N1,N2) "[\"" N1 "\",\"" N2 "\"]"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 #define SDL_DLNOTE_JSON_ARRAY3(N1,N2,N3) "[\"" N1 "\",\"" N2 "\",\"" N3 "\"]"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 #define SDL_DLNOTE_JSON_ARRAY4(N1,N2,N3,N4) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\"]"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 #define SDL_DLNOTE_JSON_ARRAY5(N1,N2,N3,N4,N5) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\"]"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 #define SDL_DLNOTE_JSON_ARRAY6(N1,N2,N3,N4,N5,N6) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\",\"" N6 "\"]"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 #define SDL_DLNOTE_JSON_ARRAY7(N1,N2,N3,N4,N5,N6,N7) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\",\"" N6 "\",\"" N7 "\"]"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 #define SDL_DLNOTE_JSON_ARRAY8(N1,N2,N3,N4,N5,N6,N7,N8) "[\"" N1 "\",\"" N2 "\",\"" N3 "\",\"" N4 "\",\"" N5 "\",\"" N6 "\",\"" N7 "\",\"" N8 "\"]"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 #define SDL_DLNOTE_JSON_ARRAY_GET(N1,N2,N3,N4,N5,N6,N7,N8,NAME,...) NAME
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 #define SDL_DLNOTE_JSON_ARRAY(...) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 SDL_DLNOTE_JSON_ARRAY_GET( \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 __VA_ARGS__, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 SDL_DLNOTE_JSON_ARRAY8, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 SDL_DLNOTE_JSON_ARRAY7, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 SDL_DLNOTE_JSON_ARRAY6, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 SDL_DLNOTE_JSON_ARRAY5, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 SDL_DLNOTE_JSON_ARRAY4, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 SDL_DLNOTE_JSON_ARRAY3, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 SDL_DLNOTE_JSON_ARRAY2, \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 SDL_DLNOTE_JSON_ARRAY1 \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 )(__VA_ARGS__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 /* Create "unique" variable name using __LINE__,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 * so creating multiple elf notes on the same line is not supported
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 #define SDL_DLNOTE_JOIN2(A,B) A##B
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 #define SDL_DLNOTE_JOIN(A,B) SDL_DLNOTE_JOIN2(A,B)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 #define SDL_DLNOTE_UNIQUE_NAME SDL_DLNOTE_JOIN(s_SDL_dlopen_note_, __LINE__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 /**
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 * Add a note that your application has dynamic shared library dependencies.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 * You can do this by adding the following to the global scope:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 * ```c
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 * SDL_ELF_NOTE_DLOPEN(
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 * "png",
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 * "Support for loading PNG images using libpng (required for APNG)",
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 * SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 * "libpng12.so.0"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 * )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 * A trailing semicolon is not needed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 * Or if you support multiple versions of a library, you can list them:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 * ```c
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 * // Our app supports SDL1, SDL2, and SDL3 by dynamically loading them
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 * SDL_ELF_NOTE_DLOPEN(
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 * "SDL",
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 * "Create windows through SDL video backend",
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 * SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 * "libSDL-1.2.so.0", "libSDL2-2.0.so.0", "libSDL3.so.0"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 * )
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 * ```
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 * This macro is not available for compilers that do not support variadic
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 * macro's.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 * \since This macro is available since SDL 3.4.0.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 *
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 * \sa SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 #define SDL_ELF_NOTE_DLOPEN(feature, description, priority, ...) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 SDL_ELF_NOTE_INTERNAL( \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 "[{\"feature\":\"" feature \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 "\",\"description\":\"" description \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 "\",\"priority\":\"" priority \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 "\",\"soname\":" SDL_DLNOTE_JSON_ARRAY(__VA_ARGS__) "}]", \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 SDL_DLNOTE_UNIQUE_NAME);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 #elif defined(__GNUC__) && __GNUC__ < 3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 #define SDL_ELF_NOTE_DLOPEN(args...)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 #elif defined(_MSC_VER) && _MSC_VER < 1400
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 /* Variadic macros are not supported */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 #define SDL_ELF_NOTE_DLOPEN(...)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 #endif /* SDL_dlopennote_h */