1dnl
2dnl SOX_NAME_TAG(NAME-TAG, [BODY])
3dnl
4dnl Define using m4_pushdef:
5dnl   N               First word of NAME-TAG
6dnl   L               N sanitised for use as shell variable
7dnl   T               Second word of NAME-TAG, if present, else
8dnl                   L converted to upper case
9dnl
10dnl If BODY is provided, substitute it and m4_popdef N, L, and T.
11dnl Otherwise, leave these macros defined.
12dnl
13AC_DEFUN([SOX_NAME_TAG], [
14    m4_pushdef([nt], m4_split(m4_normalize($1)))
15    m4_pushdef([N], m4_car(nt))
16    m4_pushdef([L], m4_bpatsubst(N, [[^0-9A-Za-z]], [_]))
17    m4_pushdef([T], m4_default(m4_argn([2], nt), m4_toupper(L)))
18    m4_popdef([nt])
19    m4_ifnblank([$2], [$2 m4_popdef([N], [L], [T])])
20])
21
22dnl
23dnl SOX_INCLUDE(HEADER)
24dnl
25dnl Expands to "#include <HEADER>" followed by a newline.
26dnl
27AC_DEFUN([SOX_INCLUDE], [[#include <]]$1[[>
28]])
29
30dnl
31dnl SOX_CHECK_HEADERS(HEADERS, [DECL], [IF-FOUND], [IF-NOT-FOUND],
32dnl                   [EXTRA-HEADERS])
33dnl
34dnl Check for presence of headers.
35dnl
36dnl HEADERS        List of headers to try, stopping when one is found
37dnl DECL           Optional symbol to check for
38dnl IF-FOUND       Action to take if one of HEADERS is found
39dnl IF-NOT-FOUND   Action to take if none of HEADERS are found
40dnl EXTRA-HEADERS  Additional headers to #include
41dnl
42dnl Outputs:
43dnl HAVE_HEADER:   Set with AC_DEFINE to 1 for the first header found
44dnl
45AC_DEFUN([SOX_CHECK_HEADERS], [
46    sox_ch_found=no
47    AC_CHECK_HEADERS([$1], [sox_ch_found=$ac_header; break], [],
48        [m4_map([SOX_INCLUDE], m4_split([$5]))])
49    AS_CASE([$sox_ch_found], [no], [$4], [m4_ifblank([$2], [$3],
50        [AC_CHECK_DECL([$2], [$3], [$4], [SOX_INCLUDE([$sox_ch_found])])])])
51])
52
53dnl
54dnl SOX_CHECK_LIB(TAG, HEADERS, LIB, FUNC, [IF-FOUND], [IF-NOT-FOUND],
55dnl               [EXTRA-HEADERS], [EXTRA-LIBS])
56dnl
57dnl Check for presence of headers and library.
58dnl
59dnl Arguments:
60dnl   TAG             Prefix/suffix for output variable
61dnl   HEADERS         List of headers searched with SOX_CHECK_HEADERS
62dnl   LIB             Name of library to check
63dnl   FUNC            Name of function in library
64dnl   IF-FOUND        Action to take on success
65dnl   IF-NOT-FOUND    Action to take on failure
66dnl   EXTRA-HEADERS   Passed to SOX_CHECK_HEADERS
67dnl   EXTRA-LIBS      Additional libraries (-lLIB) and linker flags
68dnl
69dnl Outputs:
70dnl   HAVE_TAG        AC_DEFINE to 1 if found
71dnl                   Set shell variable to 'yes' on success, 'no' otherwise
72dnl   TAG_LIBS        Add '-lLIB EXTRA-LIBS' to start of shell variable
73dnl
74AC_DEFUN([SOX_CHECK_LIB], [
75    m4_pushdef([lib], [m4_default([$3], [c])])
76    m4_pushdef([flags], [m4_ifnblank([$3], [-l$3 $8], [$8])])
77    HAVE_[]$1=no
78    SOX_CHECK_HEADERS([$2], [], [AC_CHECK_LIB(lib, [$4],
79        [HAVE_[]$1=yes], [], [$8 $$1[]_LIBS])], [], [$7])
80    AS_CASE([$HAVE_[]$1], [yes], [
81        AC_DEFINE([HAVE_]$1, [1], [Define if $4 exists in ]flags)
82        $1[]_LIBS="flags $$1[]_LIBS"
83        $5], [$6])
84    AC_SUBST($1[_CFLAGS])
85    AC_SUBST($1[_LIBS])
86    m4_popdef([lib], [flags])
87])
88
89dnl
90dnl SOX_NEED_DL(VAL, DEP)
91dnl
92dnl Exit with an error message if VAL equals 'dyn' and dynamic loading
93dnl is not available.
94dnl
95AC_DEFUN([SOX_NEED_DL], [
96    AS_CASE([$1-$HAVE_LIBLTDL], [dyn-no],
97        [AC_MSG_ERROR([dynamic loading not available, needed by $2])])
98])
99
100dnl
101dnl SOX_ARG(TYPE, NAME, DESC, [TEST], [IF-YES], [IF-NO], [IF-FAIL],
102dnl         [EXTRA-CHOICES], [DEFAULT])
103dnl
104AC_DEFUN([SOX_ARG], [SOX_NAME_TAG([$2], [
105    m4_pushdef([ATU], m4_toupper($1))
106    m4_pushdef([ATL], m4_tolower($1))
107    m4_pushdef([optdef], m4_default([$9], [yes]))
108    m4_pushdef([opts], m4_split([yes no $8]))
109    m4_pushdef([opts_help], m4_bpatsubst(m4_apply([m4_join], [[/], opts]),
110        \<optdef\>, m4_toupper(optdef)))
111    m4_pushdef([opts_sh], m4_apply([m4_join], [[|], opts]))
112    m4_indir(AC_ARG_[]ATU, [N], AS_HELP_STRING([--ATL-N], [$3 (opts_help)]))
113    HAVE_[]T=${ATL[]_[]L:-optdef}
114    AS_CASE([$HAVE_[]T],
115        [no],       [],
116        [opts_sh],  [$4],
117                    [AC_MSG_ERROR([invalid value for --ATL-N])])
118    AS_CASE([$ATL[]_[]L-$HAVE_[]T],
119        [no-*|-no], [$6],
120        [*-no],     [$7],
121                    [$5])
122    AM_CONDITIONAL([HAVE_]T, [test $HAVE_[]T != no])
123    m4_popdef([ATU], [ATL], [optdef], [opts], [opts_help], [opts_sh])
124])])
125
126dnl
127dnl SOX_ENABLE(NAME, DESC, [TEST], [IF-YES], [IF-NO], [IF-FAIL],
128dnl            [EXTRA-CHOICES], [DEFAULT])
129dnl
130AC_DEFUN([SOX_ENABLE], [
131    SOX_ARG([enable], $@)
132])
133
134dnl
135dnl SOX_WITH(NAME, DESC, [TEST], [IF-YES], [IF-NO], [IF-FAIL],
136dnl          [EXTRA-CHOICES], [DEFAULT])
137dnl
138AC_DEFUN([SOX_WITH], [
139    SOX_ARG([with], $@)
140])
141
142dnl
143dnl SOX_WITH_LIB(NAME, HEADERS, LIB, FUNC, [IF-FOUND], [IF-NOT-FOUND],
144dnl              [INCLUDES], [EXTRA-LIBS], [EXTRA-CHOICES], [DEFAULT])
145dnl
146AC_DEFUN([SOX_WITH_LIB], [SOX_NAME_TAG([$1], [
147    SOX_WITH([$1], [Use N],
148        [AS_CASE([$HAVE_[]T], [yes|dyn], [sox_wl=$3], [sox_wl=$HAVE_[]T])
149         SOX_CHECK_LIB([T], [$2], [$sox_wl], [$4], [], [], [$7], [$8])],
150        [$5], [$6], [AC_MSG_FAILURE([N not found])],
151        [$9 *], m4_argn([8], m4_shift2($@))) dnl BSD m4 can't count to 10
152    SOX_REPORT([with_libs], [N], [$HAVE_]T)
153])])
154
155dnl
156dnl SOX_DL_LIB(NAME, HEADERS, LIB, FUNC, [IF-STATIC], [IF-DL], [IF-NOT-FOUND],
157dnl            [EXTRA-HEADERS], [EXTRA-LIBS])
158dnl
159AC_DEFUN([SOX_DL_LIB], [SOX_NAME_TAG([$1], [
160    SOX_NEED_DL([$with_[]L], [--with-L=dyn])
161    SOX_WITH_LIB([$1], [$2], [$3], [$4], [], [$7], [$8], [$9], [dyn])
162    AS_CASE([$with_[]L-$HAVE_[]T],
163         [dyn-*], [AC_DEFINE([DL_]T, 1, [Define to dlopen() ]N)
164                   HAVE_[]T=dyn; $6],
165         [*-yes], [$5])
166])])
167
168dnl
169dnl SOX_REQUIRE1(FEATURE, TAG, [IF-FOUND])
170dnl
171AC_DEFUN([SOX_REQUIRE1], [
172    AS_CASE([$HAVE_$1],
173        [yes|dyn],  [$2_CFLAGS="$$2_CFLAGS $$1_CFLAGS"; $3])
174    AS_CASE([$HAVE_$1],
175        [yes],      [$2_LIBS="$$2_LIBS $$1_LIBS"])
176])
177
178dnl
179dnl SOX_REQUIRE(FEATURES, TAG, [IF-NOT-FOUND])
180dnl
181AC_DEFUN([SOX_REQUIRE], [
182    sox_req_found=no
183    m4_map_args_w([$1], [SOX_REQUIRE1(], [, $2, [sox_req_found=yes])])
184    AS_CASE([$sox_req_found], [yes], [], [$3])
185])
186
187dnl
188dnl SOX_FMT(NAME, [TEST], [SECTION])
189dnl
190dnl Add an optional format with corresponding --enable flag.
191dnl
192dnl Arguments:
193dnl   NAME            Name of format, passed to SOX_NAME_TAG setting N and T
194dnl   TEST            Test for prerequisites, must set HAVE_T to 'no' if not met
195dnl   SECTION         Section format belongs to, default 'formats'
196dnl
197dnl Outputs:
198dnl   HAVE_T          Set shell variable to 'yes', 'no', or 'dyn'
199dnl                   AC_DEFINE and AM_CONDITIONAL true if not 'no'
200dnl   STATIC_T        AC_DEFINE and AM_CONDITIONAL true if HAVE_T = 'yes'
201dnl
202AC_DEFUN([SOX_FMT], [SOX_NAME_TAG([$1], [
203    m4_pushdef([section], m4_default([$3], [formats]))
204    SOX_NEED_DL([$with_[]L], [--enable-L=dyn])
205    SOX_ENABLE([$1], [Enable N], [$2],
206        [AC_DEFINE([HAVE_]T, [1], [Define if ]N[ is enabled])
207         sox_[]section="$sox_[]section L"], [],
208        [AC_MSG_FAILURE([N not available])],
209        [dyn], [${HAVE_FORMATS:-yes}])
210    AS_CASE([$HAVE_[]T],
211        [yes],      [AC_DEFINE([STATIC_]T, [1], [Define if ]N[ is linked in])])
212    AC_SUBST(T[_CFLAGS])
213    AC_SUBST(T[_LIBS])
214    AM_CONDITIONAL([STATIC_]T, [test $HAVE_[]T = yes])
215    SOX_REPORT(section, [N], [$HAVE_]T)
216    m4_popdef([section])
217])])
218
219dnl
220dnl SOX_FMT_REQ(NAME, FEATURES, [SECTION])
221dnl
222AC_DEFUN([SOX_FMT_REQ], [
223    SOX_FMT([$1], [SOX_REQUIRE([$2], [T], [HAVE_[]T=no])], [$3])
224])
225
226dnl
227dnl SOX_FMT_HEADERS(NAME, HEADERS, [DECL], [EXTRA-HEADERS], [SECTION])
228dnl
229dnl Wrapper for SOX_FMT with SOX_CHECK_HEADERS as test.
230dnl
231AC_DEFUN([SOX_FMT_HEADERS], [
232    SOX_FMT([$1],
233        [SOX_CHECK_HEADERS([$2], [$3], [], [HAVE_[]T=no], [$4])], [$5])
234])
235
236dnl
237dnl SOX_FMT_LIB(NAME, HEADERS, LIB, FUNC, [EXTRA-HEADERS], [EXTRA-LIBS],
238dnl             [SECTION])
239dnl
240dnl Wrapper for SOX_FMT with SOX_CHECK_LIB as test.
241dnl
242AC_DEFUN([SOX_FMT_LIB], [
243    SOX_FMT([$1], [
244        SOX_CHECK_LIB([LIB[]T], [$2], [$3], [$4], [], [HAVE_[]T=no], [$5], [$6])
245        T[]_CFLAGS=$LIB[]T[]_CFLAGS
246        T[]_LIBS=$LIB[]T[]_LIBS], [$7])
247])
248
249dnl
250dnl SOX_FMT_PKG(NAME, PKG)
251dnl
252AC_DEFUN([SOX_FMT_PKG], [
253    SOX_FMT([$1], [PKG_CHECK_MODULES(T, [$2], [], [HAVE_[]T=no])])
254])
255
256dnl
257dnl SOX_REPORT_SECTION(NAME, TITLE, [FILTER])
258dnl
259AC_DEFUN([SOX_REPORT_SECTION], [
260    m4_append([sox_rep_sections], [$1], [ ])
261    m4_define([sox_rep_title_$1], [$2])
262    m4_define([sox_rep_filter_$1], m4_default([$3], [cat]))
263])
264
265dnl
266dnl SOX_REPORT(SECTION, DESC, VAL)
267dnl
268AC_DEFUN([SOX_REPORT], [
269    m4_append([sox_rep_text_$1], AS_HELP_STRING([$2], [$3]), m4_newline)
270])
271
272dnl
273dnl SOX_REPORT_PRINT1(SECTION)
274dnl
275AC_DEFUN([SOX_REPORT_PRINT1], [
276    echo; echo "sox_rep_title_$1"
277    sox_rep_filter_$1 <<EOF
278sox_rep_text_$1
279EOF
280])
281
282dnl
283dnl SOX_REPORT_PRINT
284dnl
285AC_DEFUN([SOX_REPORT_PRINT], [
286    m4_map([SOX_REPORT_PRINT1], m4_split(sox_rep_sections))
287])
288