And establish a basic scheme to cover these macros in the test suite.
AM_CFLAGS = -I$(top_srcdir)/src
+check_LIBRARIES = t/libdummy.a
+
check_PROGRAMS = t/packtestu t/packtests t/packtestu64 t/packtests64
t_packtestu_SOURCES = t/packtestu.c src/pack.c src/tap.c
AC_CONFIG_SRCDIR([m4/base.m4])
AC_PROG_CC
+AC_PROG_RANLIB
AM_INIT_AUTOMAKE([-Wall -Wno-portability foreign subdir-objects])
AM_SILENT_RULES([yes])
--- /dev/null
+AC_DEFUN([DX_LIB_LIBDISCID],
+[DX_LIB_SETUP([libdiscid])dnl
+DX_LIB_PKGCONFIG_FLAGS([libdiscid])
+AC_MSG_CHECKING([for libdiscid[]m4_ifnblank([$1], [ at least version $1])])
+DX_LIB_SEARCH_LINK([libdiscid],
+ [m4_apply([_DX_LIB_LIBDISCID_TEST], m4_split([$1], [\.]))],
+ [ [[$LIBDISCID_CFLAGS], [$LIBDISCID_LIBS]],
+ [[$dx_cv_libdiscid_pkg_cflags], [$dx_cv_libdiscid_pkg_libs],
+ [test x"$dx_cv_libdiscid_pkg_found" = x"yes"]],
+ [[], [-ldiscid]] ])
+AS_IF([test x"$dx_cv_libdiscid_lib_found" = x"yes"], [$2],
+ [m4_default([$3], [AC_MSG_FAILURE(
+[libdiscid[]m4_ifnblank([$1], [ version $1 or newer]) is required. The latest
+version may be found at <https://musicbrainz.org/doc/libdiscid>.
+m4_newline([DX_LIB_USERFLAG_BLURB([libdiscid])])
+m4_newline([DX_LIB_PKGCONFIG_BLURB([libdiscid])])
+])])])])
+
+dnl Internal test program for libdiscid. Check that the version numbers in the
+dnl header are sufficient and that some important functions are defined.
+m4_define([_DX_LIB_LIBDISCID_TEST], [AC_LANG_PROGRAM(
+[#include <discid/discid.h>
+m4_ifnblank([$1], [dnl
+#if DISCID_VERSION_MAJOR < $1
+DX_LIB_COMPILE_ERROR([major version insufficient])
+m4_ifnblank([$2], [dnl
+#elif DISCID_VERSION_MAJOR == $1
+# if DISCID_VERSION_MINOR < $2
+DX_LIB_COMPILE_ERROR([minor version insufficient])
+m4_ifnblank([$3], [dnl
+# elif DISCID_VERSION_MINOR == $2
+# if DISCID_VERSION_PATCH < $3
+DX_LIB_COMPILE_ERROR([patch version insufficient])
+# endif
+])dnl
+# endif
+])dnl
+#endif
+])], [discid_free(discid_new());])])
--- /dev/null
+/* Stub function definitions to satisfy link tests, as required. */
+void discid_new(void) {}
+void discid_free(void) {}
--- /dev/null
+dnl Copyright © 2019 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.
+dnl There is NO WARRANTY, to the extent permitted by law.
+
+AT_BANNER([Library tests])
+
+dnl TEST_DUMMY_PKGCONFIG([cflags], [libs])
+dnl
+dnl Create a hack pkg-config script in the current working directory which
+dnl responds to --cflags and --libs with the provided values. The macro
+dnl arguments should each be a single shell word, suitable for the right
+dnl hand side of a shell assignment.
+m4_define([TEST_DUMMY_PKGCONFIG],
+[[cat >pkg-config <<EOF
+#!/bin/sh
+cflags= libs=
+for arg
+do
+ case \$arg in
+ --cflags) cflags=]$1[;;
+ --libs) libs=]$2[;;
+ esac
+done
+printf '%s %s\n' "\$cflags" "\$libs"
+EOF
+chmod +x pkg-config
+]])
+
+AT_SETUP([libdiscid probes])
+AT_KEYWORDS([libdiscid])
+
+mkdir discid
+AT_DATA([discid/discid.h],
+[[typedef void DiscId;
+DiscId *discid_new(void);
+void discid_free(DiscId *);
+#ifndef DISCID_VERSION_MAJOR
+# define DISCID_VERSION_MAJOR 2
+#endif
+]])
+
+AT_DATA([test.in],
+[[@HAVE_LIBDISCID@
+@LIBDISCID_CFLAGS@
+@LIBDISCID_LIBS@
+]])
+
+TEST_CONFIGURE_AC([[DX_LIB_LIBDISCID([1.2.3], [HAVE_LIBDISCID=yes],
+ [HAVE_LIBDISCID=no])
+AC_SUBST([HAVE_LIBDISCID])
+AC_CONFIG_FILES([test])
+]])
+TEST_AUTORECONF
+
+# Check the search via explicit flags
+TEST_CONFIGURE([LIBDISCID_CFLAGS=-I. LIBDISCID_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 -ldiscid search
+cp "$builddir/t/libdummy.a" libdiscid.a
+TEST_CONFIGURE([PKG_CONFIG=false CFLAGS=-I. LDFLAGS=-L.])
+AT_CHECK_UNQUOTED([cat test], [0], [yes
+
+-ldiscid
+])
+
+# Check the failure case
+TEST_CONFIGURE([PKG_CONFIG=false CFLAGS='-I. -DDISCID_VERSION_MAJOR=0'])
+AT_CHECK_UNQUOTED([cat test], [0], [no
+
+
+])
+
+AT_CLEANUP
AT_BANNER([Autoconf macros])
-m4_define([TEST_CONFIGURE_AC], [AT_DATA([configure.ac],
-[[AC_INIT([test], [0])
-]$1[
-AC_OUTPUT
-]])
-cp "$srcdir/install-sh" \
- "$srcdir/config.guess" \
- "$srcdir/config.sub" \
- .
-])
-
-m4_define([TEST_AUTORECONF],
- [AT_CHECK([autoreconf -I "$srcdir/m4"], [0], [], [stderr])])
-
-m4_define([TEST_CONFIGURE], [AT_CHECK([./configure $1], [0], [ignore])])
-
dnl Verify that the DX_BASEDIR macro expands correctly during argument
dnl collection. Crucially, the output must not contain any other text.
AT_SETUP([DX_BASEDIR during argument collection])
AT_TESTED([prove])
+m4_define([TEST_CONFIGURE_AC], [AT_KEYWORDS([autoconf m4])dnl
+AT_DATA([configure.ac],
+[[AC_INIT([test], [0])
+]$1[
+AC_OUTPUT
+]])
+cp "$srcdir/install-sh" \
+ "$srcdir/config.guess" \
+ "$srcdir/config.sub" \
+ .
+])
+m4_define([TEST_AUTORECONF], [AT_KEYWORDS([autoconf])dnl
+AT_CHECK([autoreconf -I "$srcdir/m4"], [0], [], [stderr])])
+
+m4_define([TEST_CONFIGURE], [AT_KEYWORDS([configure])dnl
+AT_CHECK([./configure $1], [0], [ignore])])
+
m4_include([tests/macros.at])
m4_include([tests/functions.at])
+m4_include([tests/libs.at])