]> git.draconx.ca Git - dxcommon.git/blob - tests/libs.at
DX_C_ALIGNAS: Work around bash-5 parsing bug.
[dxcommon.git] / tests / libs.at
1 dnl Copyright © 2019-2020, 2022-2023 Nick Bowler
2 dnl
3 dnl License WTFPL2: Do What The Fuck You Want To Public License, version 2.
4 dnl This is free software: you are free to do what the fuck you want to.
5 dnl There is NO WARRANTY, to the extent permitted by law.
6
7 AT_BANNER([Library tests])
8
9 dnl TEST_DUMMY_PKGCONFIG([cflags], [libs])
10 dnl
11 dnl Create a hack pkg-config script in the current working directory which
12 dnl responds to --cflags and --libs with the provided values.  The macro
13 dnl arguments should each be a single shell word, suitable for the right
14 dnl hand side of a shell assignment.
15 m4_define([TEST_DUMMY_PKGCONFIG],
16 [[cat >pkg-config <<EOF
17 #!/bin/sh
18 cflags= libs=
19 for arg
20 do
21   case \$arg in
22   --cflags) cflags=]$1[;;
23   --libs) libs=]$2[;;
24   --atleast-pkgconfig-version) exit;;
25   esac
26 done
27 printf '%s %s\n' "\$cflags" "\$libs"
28 EOF
29 chmod +x pkg-config
30 ]])
31
32 AT_SETUP([libdiscid probes])
33 AT_KEYWORDS([lib libdiscid])
34
35 mkdir discid
36 AT_DATA([discid/discid.h],
37 [[typedef void DiscId;
38 DiscId *discid_new(void);
39 void discid_free(DiscId *);
40 #ifndef DISCID_VERSION_MAJOR
41 #  define DISCID_VERSION_MAJOR 2
42 #endif
43 ]])
44
45 AT_DATA([test.in],
46 [[@HAVE_LIBDISCID@
47 @LIBDISCID_CFLAGS@
48 @LIBDISCID_LIBS@
49 ]])
50
51 TEST_CONFIGURE_AC([[DX_LIB_LIBDISCID([1.2.3], [HAVE_LIBDISCID=yes],
52                                               [HAVE_LIBDISCID=no])
53 AC_SUBST([HAVE_LIBDISCID])
54 AC_CONFIG_FILES([test])
55 ]])
56 TEST_AUTORECONF
57
58 # Check the search via explicit flags
59 TEST_CONFIGURE([LIBDISCID_CFLAGS=-I. LIBDISCID_LIBS="$builddir/t/libdummy.a"])
60 AT_CHECK_UNQUOTED([cat test], [0], [yes
61 -I.
62 $builddir/t/libdummy.a
63 ])
64
65 # Check the search via pkg-config
66 TEST_DUMMY_PKGCONFIG([-I.], [$builddir/t/libdummy.a])
67 TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config])
68 AT_CHECK_UNQUOTED([cat test], [0], [yes
69 -I.
70 $builddir/t/libdummy.a
71 ])
72
73 # Check the default -ldiscid search
74 cp "$builddir/t/libdummy.a" libdiscid.a
75 TEST_CONFIGURE([PKG_CONFIG=false CFLAGS=-I. LDFLAGS=-L.])
76 AT_CHECK_UNQUOTED([cat test], [0], [yes
77
78 -ldiscid
79 ])
80
81 # Check the failure case
82 TEST_CONFIGURE([PKG_CONFIG=false CFLAGS='-I. -DDISCID_VERSION_MAJOR=0'])
83 AT_CHECK_UNQUOTED([cat test], [0], [no
84
85
86 ])
87
88 AT_CLEANUP
89
90 AT_SETUP([curses probes])
91 AT_KEYWORDS([lib curses ncurses])
92
93 AT_DATA([curses.h],
94 [[void initscr(void) { }
95 void endwin(void) { }
96 void curs_set(int);
97 ]])
98
99 AT_DATA([test.in],
100 [[@HAVE_CURSES@
101 @CURSES_CFLAGS@
102 @CURSES_LIBS@
103 ]])
104
105 TEST_CONFIGURE_AC([[DX_LIB_CURSES([HAVE_CURSES=yes], [HAVE_CURSES=no])
106 AC_SUBST([HAVE_CURSES])
107 AC_CONFIG_FILES([test])
108 ]])
109 TEST_AUTORECONF
110
111 # Check the search via explicit flags
112 TEST_CONFIGURE([CURSES_CFLAGS=-I. CURSES_LIBS="$builddir/t/libdummy.a"])
113 AT_CHECK_UNQUOTED([cat test], [0], [yes
114 -I.
115 $builddir/t/libdummy.a
116 ])
117
118 # Check the search via pkg-config
119 TEST_DUMMY_PKGCONFIG([-I.], [$builddir/t/libdummy.a])
120 TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config])
121 AT_CHECK_UNQUOTED([cat test], [0], [yes
122 -I.
123 $builddir/t/libdummy.a
124 ])
125
126 # Check the default -lcurses search
127 cp "$builddir/t/libdummy.a" libcurses.a
128 TEST_CONFIGURE([PKG_CONFIG=false CFLAGS=-I. LDFLAGS=-L.])
129 AT_CHECK_UNQUOTED([cat test], [0], [yes
130
131 -lcurses
132 ])
133
134 # Check the failure case
135 cp "$builddir/t/libempty.a" libcurses.a
136 TEST_CONFIGURE([PKG_CONFIG=false CFLAGS=-I. LDFLAGS=-L.])
137 AT_CHECK_UNQUOTED([cat test], [0], [no
138
139
140 ])
141
142 AT_CLEANUP
143
144 AT_SETUP([DX_CHECK_CURSES_GETMOUSE_NCURSES])
145 AT_KEYWORDS([lib curses ncurses])
146
147 mkdir ncurses sysv bogus
148 AT_DATA([ncurses/curses.h],
149 [[typedef struct MEVENT { int x; } MEVENT;
150 int getmouse_nc_(MEVENT *);
151 #define getmouse getmouse_nc_
152 ]])
153
154 AT_DATA([sysv/curses.h],
155 [[unsigned getmouse(void);
156 ]])
157
158 AT_DATA([bogus/curses.h],
159 [[typedef int MEVENT;
160 int getmouse_bogus_(void *);
161 #define getmouse getmouse_bogus_
162 ]])
163
164 AT_DATA([test.in],
165 [[@dx_cv_curses_have_getmouse_ncurses@
166 ]])
167
168 TEST_CONFIGURE_AC([[AC_CONFIG_HEADERS([config.h])
169 DX_CHECK_CURSES_GETMOUSE_NCURSES
170 AC_SUBST([dx_cv_curses_have_getmouse_ncurses])
171 AC_CONFIG_FILES([test])
172 ]])
173 TEST_AUTORECONF
174
175 TEST_CONFIGURE([CURSES_CFLAGS=-Incurses CURSES_LIBS="$builddir/t/libdummy.a"])
176 AT_CHECK([cat test && grep HAVE_CURSES config.h], [0], [yes
177 #define HAVE_CURSES_GETMOUSE_NCURSES 1
178 ])
179
180 TEST_CONFIGURE([CURSES_CFLAGS=-Isysv CURSES_LIBS="$builddir/t/libdummy.a"])
181 AT_CHECK([cat test && grep HAVE_CURSES config.h], [0], [no
182 /* #undef HAVE_CURSES_GETMOUSE_NCURSES */
183 ])
184
185 TEST_CONFIGURE([CURSES_CFLAGS=-Ibogus CURSES_LIBS="$builddir/t/libdummy.a"])
186 AT_CHECK([cat test && grep HAVE_CURSES config.h], [0], [no
187 /* #undef HAVE_CURSES_GETMOUSE_NCURSES */
188 ])
189
190 AT_CLEANUP
191
192 AT_SETUP([DX_CHECK_CURSES_MOUSE_SUPPORT])
193 AT_KEYWORDS([lib curses ncurses])
194
195 mkdir hp ncurses sysv
196
197 # HP-UX 11 curses contains definitions of mouse functions in the library but
198 # is missing declarations and associated macros in <curses.h>, although they
199 # are present in the alternate "cur_colr" implementation.
200 #
201 # Regardless, neither implementation seems to have working mouse support with
202 # any X terminal emulator so for now no workarounds are provided and the checks
203 # are expected to return "no".
204 AT_DATA([hp/curses.h],
205 [[int mouse_set(unsigned long);
206 int request_mouse_pos(void);
207 ]])
208
209 # Ncurses-like mouse functions.
210 AT_DATA([ncurses/curses.h],
211 [[unsigned long mousemask(unsigned long, unsigned long *);
212 typedef int MEVENT;
213 int getmouse_nc_(MEVENT *);
214 #define getmouse getmouse_nc_
215 #define BUTTON1_RELEASED 1L
216 #define BUTTON1_PRESSED 2L
217
218 /* rename this to avoid false positives in the test */
219 #define mouse_set mouse_set_bogus_
220 ]])
221
222 # SysV-like mouse funcitons.
223 AT_DATA([sysv/curses.h],
224 [[int mouse_set(unsigned long);
225 int request_mouse_pos(void);
226
227 #define BUTTON_STATUS(x) 0
228 #define BUTTON_RELEASED 0
229 #define BUTTON_PRESSED 1
230
231 #define BUTTON1_RELEASED 1L
232 #define BUTTON1_PRESSED 2L
233 ]])
234
235 AT_DATA([test.in],
236 [[@dx_cv_curses_have_mouse_set@
237 @dx_cv_curses_have_mousemask@
238 @dx_cv_curses_have_getmouse_ncurses@
239 @dx_cv_curses_have_request_mouse_pos@
240 ]])
241
242 TEST_CONFIGURE_AC([[AC_CONFIG_HEADERS([config.h])
243 DX_CHECK_CURSES_MOUSE_SUPPORT
244 AC_SUBST([dx_cv_curses_have_mouse_set])
245 AC_SUBST([dx_cv_curses_have_mousemask])
246 AC_SUBST([dx_cv_curses_have_request_mouse_pos])
247 AC_SUBST([dx_cv_curses_have_getmouse_ncurses])
248 AC_CONFIG_FILES([test])
249 ]])
250 TEST_AUTORECONF
251
252 TEST_CONFIGURE([CURSES_CFLAGS=-Ihp CURSES_LIBS="$builddir/t/libdummy.a"])
253 AT_CHECK([cat test && grep CURSES_MOUSE_SUPPORT config.h], [0], [no
254 no
255
256
257 /* #undef HAVE_CURSES_MOUSE_SUPPORT */
258 ])
259
260 TEST_CONFIGURE([CURSES_CFLAGS=-Incurses CURSES_LIBS="$builddir/t/libdummy.a"])
261 AT_CHECK([cat test && grep CURSES_MOUSE_SUPPORT config.h], [0], [no
262 yes
263 yes
264
265 #define HAVE_CURSES_MOUSE_SUPPORT 1
266 ])
267
268 TEST_CONFIGURE([CURSES_CFLAGS=-Isysv CURSES_LIBS="$builddir/t/libdummy.a"])
269 AT_CHECK([cat test && grep CURSES_MOUSE_SUPPORT config.h], [0], [yes
270
271 no
272 yes
273 #define HAVE_CURSES_MOUSE_SUPPORT 1
274 ])
275
276 AT_CLEANUP
277
278 AT_SETUP([GLib GNU inline workaround])
279
280 TEST_DUMMY_PKGCONFIG([-I.], [$builddir/t/libdummy.a])
281
282 # This test will only work if we have a version of GCC that implements
283 # C99 inline semantics by default.
284 AT_DATA([a.c],
285 [[#if __GNUC__
286 extern inline void my_dup_fn(void) { }
287 #endif
288 int main(void) { return 0; }
289 ]])
290 AT_DATA([b.c],
291 [[#if __GNUC__
292 extern inline void my_dup_fn(void) { }
293 #endif
294 ]])
295
296 AT_DATA([test.sh.in],
297 [[#!/bin/sh
298 @CC@ @CPPFLAGS@ @CFLAGS@ -c a.c || exit 77
299 @CC@ @CPPFLAGS@ @CFLAGS@ -c b.c || exit 77
300 @CC@ @CFLAGS@ @LDFLAGS@ a.o b.o || exit 0
301 exit 77
302 ]])
303
304 AT_DATA([glib.h],
305 [[#define GLIB_CHECK_VERSION(x, y, z) 1
306 const char *g_get_prgname(void);
307 ]])
308
309 TEST_CONFIGURE_AC([[AC_CONFIG_HEADERS([config.h])
310 DX_LIB_GLIB2
311 AC_CONFIG_FILES([test.sh], [chmod +x test.sh])
312 ]])
313 TEST_AUTORECONF
314 TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config])
315 AT_CHECK([./test.sh], [0], [ignore], [ignore])
316
317 AT_CHECK([grep '#.*G_INLINE_FUNC' config.h], [0],
318 [/* #undef G_INLINE_FUNC */
319 ])
320 AT_CHECK([grep '#.*G_IMPLEMENT_INLINES' config.h], [0],
321 [/* #undef G_IMPLEMENT_INLINES */
322 ])
323
324 cp glib.h glib-orig.h
325 cat glib-orig.h - >glib.h <<'EOF'
326 #ifndef G_INLINE_FUNC
327 #  define G_INLINE_FUNC extern inline
328 #endif
329 G_INLINE_FUNC void break_things(void) { }
330 EOF
331
332 TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config])
333 AT_CHECK([grep '#.*G_INLINE_FUNC' config.h], [0],
334 [#define G_INLINE_FUNC static inline
335 ])
336 AT_CHECK([grep '#.*G_IMPLEMENT_INLINES' config.h], [0],
337 [/* #undef G_IMPLEMENT_INLINES */
338 ])
339
340 cat glib-orig.h - >glib.h <<'EOF'
341 #define G_INLINE_FUNC extern inline
342 #ifdef G_IMPLEMENT_INLINES
343 extern void break_things(void);
344 #else
345 G_INLINE_FUNC void break_things(void) { }
346 #endif
347 EOF
348
349 TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config])
350 AT_CHECK([grep '#.*G_INLINE_FUNC' config.h], [0],
351 [/* #undef G_INLINE_FUNC */
352 ])
353 AT_CHECK([grep '#.*G_IMPLEMENT_INLINES' config.h], [0],
354 [#define G_IMPLEMENT_INLINES 1
355 ])
356
357 AT_CLEANUP
358
359 AT_SETUP([DX_CHECK_SYSLOG])
360
361 AT_DATA([syslog.h],
362 [[/* since syslog is normally in the standard C library, to make negative
363 link tests possible we use a dummy external name */
364 extern void dx_closelog(void);
365
366 static void openlog(const char *, int, int) { dx_closelog(); }
367 static void syslog(int, const char *, ...) { dx_closelog(); }
368 static void closelog(void) { dx_closelog(); }
369
370 #define LOG_PID  1
371 #define LOG_USER 2
372 #define LOG_ERR  0
373 ]])
374
375 AT_DATA([test.in],
376 [[@ac_cv_header_syslog_h@
377 @dx_cv_have_syslog@
378 ]])
379
380 TEST_CONFIGURE_AC([[DX_CHECK_SYSLOG
381 AC_SUBST([ac_cv_header_syslog_h])
382 AC_SUBST([dx_cv_have_syslog])
383 AC_CONFIG_FILES([test])
384 ]])
385 TEST_AUTORECONF
386
387 TEST_CONFIGURE([CFLAGS=-I.])
388 AT_CHECK([cat test], [0], [yes
389 no
390 ])
391
392 TEST_CONFIGURE([CFLAGS=-I. LIBS="$builddir/t/libdummy.a"])
393 AT_CHECK([cat test], [0], [yes
394 yes
395 ])
396
397 AT_CLEANUP