rate: add some sanity checking
[sox.git] / m4 / sox.m4
blob2437d925a1c2c79fa17fd0a0c5c12661a1a0594d
1 dnl
2 dnl SOX_NAME_TAG(NAME-TAG, [BODY])
3 dnl
4 dnl Define using m4_pushdef:
5 dnl   N               First word of NAME-TAG
6 dnl   L               N sanitised for use as shell variable
7 dnl   T               Second word of NAME-TAG, if present, else
8 dnl                   L converted to upper case
9 dnl
10 dnl If BODY is provided, substitute it and m4_popdef N, L, and T.
11 dnl Otherwise, leave these macros defined.
12 dnl
13 AC_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])])
22 dnl
23 dnl SOX_INCLUDE(HEADER)
24 dnl
25 dnl Expands to "#include <HEADER>" followed by a newline.
26 dnl
27 AC_DEFUN([SOX_INCLUDE], [[#include <]]$1[[>
28 ]])
30 dnl
31 dnl SOX_CHECK_HEADERS(HEADERS, [DECL], [IF-FOUND], [IF-NOT-FOUND],
32 dnl                   [EXTRA-HEADERS])
33 dnl
34 dnl Check for presence of headers.
35 dnl
36 dnl HEADERS        List of headers to try, stopping when one is found
37 dnl DECL           Optional symbol to check for
38 dnl IF-FOUND       Action to take if one of HEADERS is found
39 dnl IF-NOT-FOUND   Action to take if none of HEADERS are found
40 dnl EXTRA-HEADERS  Additional headers to #include
41 dnl
42 dnl Outputs:
43 dnl HAVE_HEADER:   Set with AC_DEFINE to 1 for the first header found
44 dnl
45 AC_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])])])])
53 dnl
54 dnl SOX_CHECK_LIB(TAG, HEADERS, LIB, FUNC, [IF-FOUND], [IF-NOT-FOUND],
55 dnl               [EXTRA-HEADERS], [EXTRA-LIBS])
56 dnl
57 dnl Check for presence of headers and library.
58 dnl
59 dnl Arguments:
60 dnl   TAG             Prefix/suffix for output variable
61 dnl   HEADERS         List of headers searched with SOX_CHECK_HEADERS
62 dnl   LIB             Name of library to check
63 dnl   FUNC            Name of function in library
64 dnl   IF-FOUND        Action to take on success
65 dnl   IF-NOT-FOUND    Action to take on failure
66 dnl   EXTRA-HEADERS   Passed to SOX_CHECK_HEADERS
67 dnl   EXTRA-LIBS      Additional libraries (-lLIB) and linker flags
68 dnl
69 dnl Outputs:
70 dnl   HAVE_TAG        AC_DEFINE to 1 if found
71 dnl                   Set shell variable to 'yes' on success, 'no' otherwise
72 dnl   TAG_LIBS        Add '-lLIB EXTRA-LIBS' to start of shell variable
73 dnl
74 AC_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])
89 dnl
90 dnl SOX_NEED_DL(VAL, DEP)
91 dnl
92 dnl Exit with an error message if VAL equals 'dyn' and dynamic loading
93 dnl is not available.
94 dnl
95 AC_DEFUN([SOX_NEED_DL], [
96     AS_CASE([$1-$HAVE_LIBLTDL], [dyn-no],
97         [AC_MSG_ERROR([dynamic loading not available, needed by $2])])
101 dnl SOX_ARG(TYPE, NAME, DESC, [TEST], [IF-YES], [IF-NO], [IF-FAIL],
102 dnl         [EXTRA-CHOICES], [DEFAULT])
104 AC_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 ])])
127 dnl SOX_ENABLE(NAME, DESC, [TEST], [IF-YES], [IF-NO], [IF-FAIL],
128 dnl            [EXTRA-CHOICES], [DEFAULT])
130 AC_DEFUN([SOX_ENABLE], [
131     SOX_ARG([enable], $@)
135 dnl SOX_WITH(NAME, DESC, [TEST], [IF-YES], [IF-NO], [IF-FAIL],
136 dnl          [EXTRA-CHOICES], [DEFAULT])
138 AC_DEFUN([SOX_WITH], [
139     SOX_ARG([with], $@)
143 dnl SOX_WITH_LIB(NAME, HEADERS, LIB, FUNC, [IF-FOUND], [IF-NOT-FOUND],
144 dnl              [INCLUDES], [EXTRA-LIBS], [EXTRA-CHOICES], [DEFAULT])
146 AC_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 ])])
156 dnl SOX_DL_LIB(NAME, HEADERS, LIB, FUNC, [IF-STATIC], [IF-DL], [IF-NOT-FOUND],
157 dnl            [EXTRA-HEADERS], [EXTRA-LIBS])
159 AC_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 ])])
169 dnl SOX_REQUIRE1(FEATURE, TAG, [IF-FOUND])
171 AC_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"])
179 dnl SOX_REQUIRE(FEATURES, TAG, [IF-NOT-FOUND])
181 AC_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])
188 dnl SOX_FMT(NAME, [TEST], [SECTION])
190 dnl Add an optional format with corresponding --enable flag.
192 dnl Arguments:
193 dnl   NAME            Name of format, passed to SOX_NAME_TAG setting N and T
194 dnl   TEST            Test for prerequisites, must set HAVE_T to 'no' if not met
195 dnl   SECTION         Section format belongs to, default 'formats'
197 dnl Outputs:
198 dnl   HAVE_T          Set shell variable to 'yes', 'no', or 'dyn'
199 dnl                   AC_DEFINE and AM_CONDITIONAL true if not 'no'
200 dnl   STATIC_T        AC_DEFINE and AM_CONDITIONAL true if HAVE_T = 'yes'
202 AC_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 ])])
220 dnl SOX_FMT_REQ(NAME, FEATURES, [SECTION])
222 AC_DEFUN([SOX_FMT_REQ], [
223     SOX_FMT([$1], [SOX_REQUIRE([$2], [T], [HAVE_[]T=no])], [$3])
227 dnl SOX_FMT_HEADERS(NAME, HEADERS, [DECL], [EXTRA-HEADERS], [SECTION])
229 dnl Wrapper for SOX_FMT with SOX_CHECK_HEADERS as test.
231 AC_DEFUN([SOX_FMT_HEADERS], [
232     SOX_FMT([$1],
233         [SOX_CHECK_HEADERS([$2], [$3], [], [HAVE_[]T=no], [$4])], [$5])
237 dnl SOX_FMT_LIB(NAME, HEADERS, LIB, FUNC, [EXTRA-HEADERS], [EXTRA-LIBS],
238 dnl             [SECTION])
240 dnl Wrapper for SOX_FMT with SOX_CHECK_LIB as test.
242 AC_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])
250 dnl SOX_FMT_PKG(NAME, PKG)
252 AC_DEFUN([SOX_FMT_PKG], [
253     SOX_FMT([$1], [PKG_CHECK_MODULES(T, [$2], [], [HAVE_[]T=no])])
257 dnl SOX_REPORT_SECTION(NAME, TITLE, [FILTER])
259 AC_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]))
266 dnl SOX_REPORT(SECTION, DESC, VAL)
268 AC_DEFUN([SOX_REPORT], [
269     m4_append([sox_rep_text_$1], AS_HELP_STRING([$2], [$3]), m4_newline)
273 dnl SOX_REPORT_PRINT1(SECTION)
275 AC_DEFUN([SOX_REPORT_PRINT1], [
276     echo; echo "sox_rep_title_$1"
277     sox_rep_filter_$1 <<EOF
278 sox_rep_text_$1
283 dnl SOX_REPORT_PRINT
285 AC_DEFUN([SOX_REPORT_PRINT], [
286     m4_map([SOX_REPORT_PRINT1], m4_split(sox_rep_sections))