X-Git-Url: http://git.draconx.ca/gitweb/dxcommon.git/blobdiff_plain/c2c6b8f8e7a8d4edfd45f09855444bca51488a9f..bb43879990642c8b745a64597186207ab85ad05f:/tests/libs.at diff --git a/tests/libs.at b/tests/libs.at index ab348de..1d327cc 100644 --- a/tests/libs.at +++ b/tests/libs.at @@ -1,4 +1,4 @@ -dnl Copyright © 2019 Nick Bowler +dnl Copyright © 2019-2020, 2022 Nick Bowler dnl dnl License WTFPL2: Do What The Fuck You Want To Public License, version 2. dnl This is free software: you are free to do what the fuck you want to. @@ -21,6 +21,7 @@ do case \$arg in --cflags) cflags=]$1[;; --libs) libs=]$2[;; + --atleast-pkgconfig-version) exit;; esac done printf '%s %s\n' "\$cflags" "\$libs" @@ -29,7 +30,7 @@ chmod +x pkg-config ]]) AT_SETUP([libdiscid probes]) -AT_KEYWORDS([libdiscid]) +AT_KEYWORDS([lib libdiscid]) mkdir discid AT_DATA([discid/discid.h], @@ -85,3 +86,272 @@ AT_CHECK_UNQUOTED([cat test], [0], [no ]) AT_CLEANUP + +AT_SETUP([curses probes]) +AT_KEYWORDS([lib curses ncurses]) + +AT_DATA([curses.h], +[[void initscr(void) { } +void endwin(void) { } +void curs_set(int); +]]) + +AT_DATA([test.in], +[[@HAVE_CURSES@ +@CURSES_CFLAGS@ +@CURSES_LIBS@ +]]) + +TEST_CONFIGURE_AC([[DX_LIB_CURSES([HAVE_CURSES=yes], [HAVE_CURSES=no]) +AC_SUBST([HAVE_CURSES]) +AC_CONFIG_FILES([test]) +]]) +TEST_AUTORECONF + +# Check the search via explicit flags +TEST_CONFIGURE([CURSES_CFLAGS=-I. CURSES_LIBS="$builddir/t/libdummy.a"]) +AT_CHECK_UNQUOTED([cat test], [0], [yes +-I. +$builddir/t/libdummy.a +]) + +# Check the search via pkg-config +TEST_DUMMY_PKGCONFIG([-I.], [$builddir/t/libdummy.a]) +TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config]) +AT_CHECK_UNQUOTED([cat test], [0], [yes +-I. +$builddir/t/libdummy.a +]) + +# Check the default -lcurses search +cp "$builddir/t/libdummy.a" libcurses.a +TEST_CONFIGURE([PKG_CONFIG=false CFLAGS=-I. LDFLAGS=-L.]) +AT_CHECK_UNQUOTED([cat test], [0], [yes + +-lcurses +]) + +# Check the failure case +cp "$builddir/t/libempty.a" libcurses.a +TEST_CONFIGURE([PKG_CONFIG=false CFLAGS=-I. LDFLAGS=-L.]) +AT_CHECK_UNQUOTED([cat test], [0], [no + + +]) + +AT_CLEANUP + +AT_SETUP([DX_CHECK_CURSES_GETMOUSE_NCURSES]) +AT_KEYWORDS([lib curses ncurses]) + +mkdir ncurses sysv bogus +AT_DATA([ncurses/curses.h], +[[typedef struct MEVENT { int x; } MEVENT; +int getmouse_nc_(MEVENT *); +#define getmouse getmouse_nc_ +]]) + +AT_DATA([sysv/curses.h], +[[unsigned getmouse(void); +]]) + +AT_DATA([bogus/curses.h], +[[typedef int MEVENT; +int getmouse_bogus_(void *); +#define getmouse getmouse_bogus_ +]]) + +AT_DATA([test.in], +[[@dx_cv_curses_have_getmouse_ncurses@ +]]) + +TEST_CONFIGURE_AC([[AC_CONFIG_HEADERS([config.h]) +DX_CHECK_CURSES_GETMOUSE_NCURSES +AC_SUBST([dx_cv_curses_have_getmouse_ncurses]) +AC_CONFIG_FILES([test]) +]]) +TEST_AUTORECONF + +TEST_CONFIGURE([CURSES_CFLAGS=-Incurses CURSES_LIBS="$builddir/t/libdummy.a"]) +AT_CHECK([cat test && grep HAVE_CURSES config.h], [0], [yes +#define HAVE_CURSES_GETMOUSE_NCURSES 1 +]) + +TEST_CONFIGURE([CURSES_CFLAGS=-Isysv CURSES_LIBS="$builddir/t/libdummy.a"]) +AT_CHECK([cat test && grep HAVE_CURSES config.h], [0], [no +/* #undef HAVE_CURSES_GETMOUSE_NCURSES */ +]) + +TEST_CONFIGURE([CURSES_CFLAGS=-Ibogus CURSES_LIBS="$builddir/t/libdummy.a"]) +AT_CHECK([cat test && grep HAVE_CURSES config.h], [0], [no +/* #undef HAVE_CURSES_GETMOUSE_NCURSES */ +]) + +AT_CLEANUP + +AT_SETUP([DX_CHECK_CURSES_MOUSE_SUPPORT]) +AT_KEYWORDS([lib curses ncurses]) + +mkdir hp ncurses sysv + +# HP-UX 11 curses contains definitions of mouse functions in the library but +# is missing declarations and associated macros in , although they +# are present in the alternate "cur_colr" implementation. +# +# Regardless, neither implementation seems to have working mouse support with +# any X terminal emulator so for now no workarounds are provided and the checks +# are expected to return "no". +AT_DATA([hp/curses.h], +[[int mouse_set(unsigned long); +int request_mouse_pos(void); +]]) + +# Ncurses-like mouse functions. +AT_DATA([ncurses/curses.h], +[[unsigned long mousemask(unsigned long, unsigned long *); +typedef int MEVENT; +int getmouse_nc_(MEVENT *); +#define getmouse getmouse_nc_ +#define BUTTON1_RELEASED 1L +#define BUTTON1_PRESSED 2L + +/* rename this to avoid false positives in the test */ +#define mouse_set mouse_set_bogus_ +]]) + +# SysV-like mouse funcitons. +AT_DATA([sysv/curses.h], +[[int mouse_set(unsigned long); +int request_mouse_pos(void); + +#define BUTTON_STATUS(x) 0 +#define BUTTON_RELEASED 0 +#define BUTTON_PRESSED 1 + +#define BUTTON1_RELEASED 1L +#define BUTTON1_PRESSED 2L +]]) + +AT_DATA([test.in], +[[@dx_cv_curses_have_mouse_set@ +@dx_cv_curses_have_mousemask@ +@dx_cv_curses_have_getmouse_ncurses@ +@dx_cv_curses_have_request_mouse_pos@ +]]) + +TEST_CONFIGURE_AC([[AC_CONFIG_HEADERS([config.h]) +DX_CHECK_CURSES_MOUSE_SUPPORT +AC_SUBST([dx_cv_curses_have_mouse_set]) +AC_SUBST([dx_cv_curses_have_mousemask]) +AC_SUBST([dx_cv_curses_have_request_mouse_pos]) +AC_SUBST([dx_cv_curses_have_getmouse_ncurses]) +AC_CONFIG_FILES([test]) +]]) +TEST_AUTORECONF + +TEST_CONFIGURE([CURSES_CFLAGS=-Ihp CURSES_LIBS="$builddir/t/libdummy.a"]) +AT_CHECK([cat test && grep CURSES_MOUSE_SUPPORT config.h], [0], [no +no + + +/* #undef HAVE_CURSES_MOUSE_SUPPORT */ +]) + +TEST_CONFIGURE([CURSES_CFLAGS=-Incurses CURSES_LIBS="$builddir/t/libdummy.a"]) +AT_CHECK([cat test && grep CURSES_MOUSE_SUPPORT config.h], [0], [no +yes +yes + +#define HAVE_CURSES_MOUSE_SUPPORT 1 +]) + +TEST_CONFIGURE([CURSES_CFLAGS=-Isysv CURSES_LIBS="$builddir/t/libdummy.a"]) +AT_CHECK([cat test && grep CURSES_MOUSE_SUPPORT config.h], [0], [yes + +no +yes +#define HAVE_CURSES_MOUSE_SUPPORT 1 +]) + +AT_CLEANUP + +AT_SETUP([GLib GNU inline workaround]) + +TEST_DUMMY_PKGCONFIG([-I.], [$builddir/t/libdummy.a]) + +# This test will only work if we have a version of GCC that implements +# C99 inline semantics by default. +AT_DATA([a.c], +[[#if __GNUC__ +extern inline void my_dup_fn(void) { } +#endif +int main(void) { return 0; } +]]) +AT_DATA([b.c], +[[#if __GNUC__ +extern inline void my_dup_fn(void) { } +#endif +]]) + +AT_DATA([test.sh.in], +[[#!/bin/sh +@CC@ @CPPFLAGS@ @CFLAGS@ -c a.c || exit 77 +@CC@ @CPPFLAGS@ @CFLAGS@ -c b.c || exit 77 +@CC@ @CFLAGS@ @LDFLAGS@ a.o b.o || exit 0 +exit 77 +]]) + +AT_DATA([glib.h], +[[#define GLIB_CHECK_VERSION(x, y, z) 1 +const char *g_get_prgname(void); +]]) + +TEST_CONFIGURE_AC([[AC_CONFIG_HEADERS([config.h]) +DX_LIB_GLIB2 +AC_CONFIG_FILES([test.sh], [chmod +x test.sh]) +]]) +TEST_AUTORECONF +TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config]) +AT_CHECK([./test.sh], [0], [ignore], [ignore]) + +AT_CHECK([grep '#.*G_INLINE_FUNC' config.h], [0], +[/* #undef G_INLINE_FUNC */ +]) +AT_CHECK([grep '#.*G_IMPLEMENT_INLINES' config.h], [0], +[/* #undef G_IMPLEMENT_INLINES */ +]) + +cp glib.h glib-orig.h +cat glib-orig.h - >glib.h <<'EOF' +#ifndef G_INLINE_FUNC +# define G_INLINE_FUNC extern inline +#endif +G_INLINE_FUNC void break_things(void) { } +EOF + +TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config]) +AT_CHECK([grep '#.*G_INLINE_FUNC' config.h], [0], +[#define G_INLINE_FUNC static inline +]) +AT_CHECK([grep '#.*G_IMPLEMENT_INLINES' config.h], [0], +[/* #undef G_IMPLEMENT_INLINES */ +]) + +cat glib-orig.h - >glib.h <<'EOF' +#define G_INLINE_FUNC extern inline +#ifdef G_IMPLEMENT_INLINES +extern void break_things(void); +#else +G_INLINE_FUNC void break_things(void) { } +#endif +EOF + +TEST_CONFIGURE([PKG_CONFIG=$PWD/pkg-config]) +AT_CHECK([grep '#.*G_INLINE_FUNC' config.h], [0], +[/* #undef G_INLINE_FUNC */ +]) +AT_CHECK([grep '#.*G_IMPLEMENT_INLINES' config.h], [0], +[#define G_IMPLEMENT_INLINES 1 +]) + +AT_CLEANUP