opusdec: Use literal format strings
[opus-tools.git] / configure.ac
1 dnl Process this file with autoconf to produce a configure script. -*-m4-*-
2
3 dnl The package_version file will be automatically synced to the git revision
4 dnl by the update_version script when configured in the repository, but will
5 dnl remain constant in tarball releases unless it is manually edited.
6 m4_define([CURRENT_VERSION],
7           m4_esyscmd([ ./update_version 2>/dev/null || true
8                        if test -e package_version; then
9                            . ./package_version
10                            printf "$PACKAGE_VERSION"
11                        else
12                            printf "unknown"
13                        fi ]))
14
15 AC_INIT([opus-tools],[CURRENT_VERSION],[opus@xiph.org])
16 AC_CONFIG_SRCDIR([src/opusenc.c])
17 AC_CONFIG_MACRO_DIR([m4])
18
19 dnl enable silent rules on automake 1.11 and later
20 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
21
22 AM_INIT_AUTOMAKE([1.11 foreign no-define])
23 AM_MAINTAINER_MODE([enable])
24
25 AC_CANONICAL_HOST
26 AM_PROG_CC_C_O
27
28 AC_PROG_CC_C99
29 AC_CHECK_HEADERS([inttypes.h])
30 AC_C_BIGENDIAN
31 AC_C_CONST
32 AC_C_INLINE
33
34 LT_INIT
35
36 #Use a hacked up version of autoconf's AC_C_RESTRICT because it's not
37 #strong enough a test to detect old buggy versions of GCC (e.g. 2.95.3)
38 #Note: Both this and the test for variable-size arrays below are also
39 #      done by AC_PROG_CC_C99, but not thoroughly enough apparently.
40 AC_CACHE_CHECK([for C/C++ restrict keyword], ac_cv_c_restrict,
41   [ac_cv_c_restrict=no
42    # The order here caters to the fact that C++ does not require restrict.
43    for ac_kw in __restrict __restrict__ _Restrict restrict; do
44      AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
45       [[typedef int * int_ptr;
46         int foo (int_ptr $ac_kw ip, int * $ac_kw baz[]) {
47         return ip[0];
48        }]],
49       [[int s[1];
50         int * $ac_kw t = s;
51         t[0] = 0;
52         return foo(t, (void *)0)]])],
53       [ac_cv_c_restrict=$ac_kw])
54      test "$ac_cv_c_restrict" != no && break
55    done
56   ])
57
58 AH_VERBATIM([restrict],
59 [/* Define to the equivalent of the C99 'restrict' keyword, or to
60    nothing if this is not supported.  Do not define if restrict is
61    supported directly.  */
62 #undef restrict
63 /* Work around a bug in Sun C++: it does not support _Restrict or
64    __restrict__, even though the corresponding Sun C compiler ends up with
65    "#define restrict _Restrict" or "#define restrict __restrict__" in the
66    previous line.  Perhaps some future version of Sun C++ will work with
67    restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
68 #if defined __SUNPRO_CC && !defined __RESTRICT
69 # define _Restrict
70 # define __restrict__
71 #endif])
72
73 case $ac_cv_c_restrict in
74    restrict) ;;
75    no) AC_DEFINE([restrict], []) ;;
76    *)  AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
77 esac
78
79 AC_MSG_CHECKING(for C99 variable-size arrays)
80 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
81                    [[static int x; char a[++x]; a[sizeof a - 1] = 0; int N; return a[0];]])],
82     [ has_var_arrays=yes
83       AC_DEFINE([VAR_ARRAYS], [1], [Use C99 variable-size arrays])
84     ],[
85       has_var_arrays=no
86     ])
87 AC_MSG_RESULT([$has_var_arrays])
88
89 AC_ARG_ENABLE([assertions],
90     [AS_HELP_STRING([--enable-assertions],[enable additional software error checking])],,
91     [enable_assertions=no])
92
93 AS_IF([test "$enable_assertions" = "yes"], [
94   AC_DEFINE([ENABLE_ASSERTIONS], [1], [Assertions])
95 ])
96
97 if test "$CFLAGS" = "-g -O2"; then
98     saved_CFLAGS="$CFLAGS"
99     CFLAGS="-O3 -ffast-math"
100     AC_MSG_CHECKING([if ${CC} supports -O3 -g -ffast-math])
101     AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
102         [ AC_MSG_RESULT([yes])
103           saved_CFLAGS="-O3 -g -ffast-math"
104         ],[
105           AC_MSG_RESULT([no])
106         ])
107     CFLAGS="$saved_CFLAGS"
108 fi
109
110 LT_LIB_M
111 AC_CHECK_LIB([winmm], [main])
112
113 dnl check for pkg-config itself so we don't try the m4 macro without pkg-config
114 AC_CHECK_PROG(HAVE_PKG_CONFIG, pkg-config, yes)
115
116 dnl check for Ogg
117 AS_IF([test "$HAVE_PKG_CONFIG" = "yes"],
118   dnl first try via pkg-config
119  [PKG_CHECK_MODULES([OGG],[ogg >= 1.3])],
120  [
121   dnl fall back to the old school test
122   XIPH_PATH_OGG(, AC_MSG_ERROR([
123     libogg is required to build this package!
124     Please see https://www.xiph.org/ for how to obtain a copy.
125   ]))
126   saved_CFLAGS="$CFLAGS"
127   saved_LIBS="$LIBS"
128   CFLAGS="$CFLAGS $OGG_CFLAGS"
129   LIBS="$LIBS $OGG_LIBS"
130   AC_CHECK_FUNC([ogg_stream_flush_fill],,[
131     AC_MSG_ERROR([newer libogg version (1.3 or later) required])
132   ])
133   CFLAGS="$saved_CFLAGS"
134   LIBS="$saved_LIBS"
135  ])
136
137 dnl check for Opus
138 AS_IF([test "$HAVE_PKG_CONFIG" = "yes"],
139  [PKG_CHECK_MODULES([OPUS],[opus >= 1.1])],
140  [
141   dnl fall back to the old school test
142   XIPH_PATH_OPUS(, AC_MSG_ERROR([
143     Opus is required to build this package!
144     Please see https://opus-codec.org/ for how to obtain a copy.
145   ]))
146  ])
147
148 dnl check for opusfile (specifically, we need libopusurl)
149 AS_IF([test "$HAVE_PKG_CONFIG" = "yes"],
150  [
151   dnl checking for opusfile first will offer a more helpful message if it is
152   dnl not installed, since the package that is needed is likely opusfile
153   PKG_CHECK_MODULES([OPUSFILE],[opusfile >= 0.5])
154   PKG_CHECK_MODULES([OPUSURL],[opusurl >= 0.5])
155  ],
156  [
157   dnl fall back to the old school test
158   XIPH_PATH_OPUSFILE(, AC_MSG_ERROR([
159     libopusfile is required to build this package!
160     Please see https://opus-codec.org/ for how to obtain a copy.
161   ]))
162   OPUSURL_CFLAGS="$OPUSFILE_CFLAGS"
163   OPUSURL_LIBS="$OPUSFILE_LIBS -lopusurl"
164  ])
165
166 dnl check for libopusenc
167 AS_IF([test "$HAVE_PKG_CONFIG" = "yes"],
168  [PKG_CHECK_MODULES([LIBOPUSENC],[libopusenc >= 0.1.1])],
169  [
170   dnl fall back to the old school test
171   XIPH_PATH_LIBOPUSENC(, AC_MSG_ERROR([
172     libopusenc is required to build this package!
173     Please see https://opus-codec.org/ for how to obtain a copy.
174   ]))
175  ])
176
177 dnl check for OSS
178 HAVE_OSS=no
179 AC_CHECK_HEADERS([sys/soundcard.h soundcard.h machine/soundcard.h],[
180   HAVE_OSS=yes
181   break
182 ])
183
184 dnl check for sndio
185 AC_CHECK_LIB([sndio], [sio_open])
186
187 if test "$HAVE_OSS" != "yes" && test "$ac_cv_lib_sndio_sio_open" != "yes"; then
188   AC_MSG_WARN([Audio support not found -- no direct audio output in opusdec])
189 fi
190
191 dnl check for flac
192 AC_ARG_WITH([flac],
193     [AS_HELP_STRING([--without-flac],[disable FLAC support])],,
194     [with_flac=yes])
195
196 AS_IF([test "$with_flac" = "yes"],
197  [
198   AS_IF([test "$HAVE_PKG_CONFIG" = "yes"],
199    [PKG_CHECK_MODULES([FLAC],[flac >= 1.1.3])],
200    [
201     dnl fall back to AC_CHECK_LIB
202     AC_CHECK_LIB([FLAC],[FLAC__stream_decoder_init_ogg_stream],
203       [
204         FLAC_LIBS="-lFLAC"
205       ],
206       [
207         AC_MSG_ERROR([
208           FLAC 1.1.3 or later is required to build this package!
209           Please install it or configure with --disable-flac.
210         ])
211       ]
212     )
213     AC_CHECK_HEADER([FLAC/stream_decoder.h],,
214       [
215         AC_MSG_ERROR([
216           FLAC headers are required to build this package!
217           Please install the development version of FLAC
218           or configure with --disable-flac.
219         ])
220       ]
221     )
222    ])
223
224   AC_DEFINE([HAVE_LIBFLAC],[1],[FLAC])
225  ])
226
227 dnl check for pcap
228 AC_CHECK_LIB([pcap], [pcap_open_live], [
229   AC_DEFINE([HAVE_PCAP], 1, [Define if building with libpcap support])
230   LIBPCAP="-lpcap"
231 ])
232
233 dnl check for wpcap
234 AC_CHECK_LIB(wpcap, pcap_open_live, [
235   AC_DEFINE([HAVE_PCAP], 1, [Define if building with libwpcap support])
236   LIBPCAP="-lwpcap"
237 ])
238
239 AC_SUBST(LIBPCAP)
240
241 on_x86=no
242 case "$host_cpu" in
243 i[[3456]]86 | x86_64)
244   on_x86=yes
245   ;;
246 esac
247
248 on_windows=no
249 case $host in
250 *cygwin*|*mingw*)
251   on_windows=yes
252   ;;
253 esac
254
255 dnl check for sse
256 AC_ARG_ENABLE([sse],
257     [AS_HELP_STRING([--enable-sse],[Build binaries that require SSE])],,
258     [enable_sse=no])
259
260 AS_IF([test "$on_x86" = "yes" && test "$enable_sse" = "yes"],
261  [
262   saved_CFLAGS="$CFLAGS"
263   CFLAGS="$CFLAGS -msse"
264   AC_MSG_CHECKING([if ${CC} supports -msse])
265   AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[char foo;]])],
266     [ AC_MSG_RESULT([yes]) ],
267     [
268       AC_MSG_RESULT([no])
269       enable_sse=no
270       CFLAGS="$saved_CFLAGS"
271     ])
272  ])
273
274 dnl Enable stack-protector-strong only on x86 where it's well supported,
275 dnl but not on Windows because it creates a dependency on libssp.dll.
276 dnl On some platforms it causes crashes. Hopefully the OS defaults to
277 dnl enabling this on platforms that work but have been missed here.
278 AC_ARG_ENABLE([stack-protector],
279     [AS_HELP_STRING([--disable-stack-protector],[Disable compiler stack hardening])],,
280     [
281       AS_IF([test "$ac_cv_c_compiler_gnu" = "yes" && test "$on_x86" = "yes" && test "$on_windows" = "no"],
282             [enable_stack_protector=yes],[enable_stack_protector=no])
283     ])
284
285 AS_IF([test "$enable_stack_protector" = "yes"],
286  [
287   saved_CFLAGS="$CFLAGS"
288   CFLAGS="$CFLAGS -fstack-protector-strong"
289   AC_MSG_CHECKING([if ${CC} supports -fstack-protector-strong])
290   AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[char foo;]])],
291     [ AC_MSG_RESULT([yes]) ],
292     [
293       AC_MSG_RESULT([no])
294       enable_stack_protector=no
295       CFLAGS="$saved_CFLAGS"
296     ])
297  ])
298
299
300 AC_ARG_ENABLE([pie],
301     [AS_HELP_STRING([--disable-pie],[Disable PIE/RELRO hardening])],,
302     [enable_pie=yes])
303
304 AS_IF([test "$enable_pie" = "yes"],
305  [
306   saved_CFLAGS="$CFLAGS"
307   saved_LDFLAGS="$LDFLAGS"
308   saved_LIBS="$LIBS"
309   CFLAGS="$CFLAGS $OPUS_CFLAGS -fPIE"
310   LDFLAGS="$LDFLAGS -pie -Wl,-z,relro -Wl,-z,now"
311   LIBS="$LIBS $OPUS_LIBS"
312   AC_MSG_CHECKING([for PIE support])
313   AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <opus.h>]],
314                                   [[OpusDecoder *dec = opus_decoder_create(48000, 2, 0L)]])],
315     [ AC_MSG_RESULT([yes]) ],
316     [ AC_MSG_RESULT([no])
317       enable_pie=no
318       CFLAGS="$saved_CFLAGS"
319       LDFLAGS="$saved_LDFLAGS"
320     ])
321   LIBS="$saved_LIBS"
322  ])
323
324 CFLAGS="$CFLAGS -W"
325
326 saved_CFLAGS="$CFLAGS"
327 CFLAGS="$CFLAGS -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-sign-compare"
328 AC_MSG_CHECKING([if ${CC} supports -Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes -Wno-sign-compare])
329 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
330     [ AC_MSG_RESULT([yes]) ],
331     [ AC_MSG_RESULT([no])
332       CFLAGS="$saved_CFLAGS"
333     ])
334
335 AC_FUNC_FSEEKO
336 AC_CHECK_FUNCS([clock_gettime mach_absolute_time])
337 AC_CHECK_FUNCS([usleep nanosleep clock_nanosleep])
338
339 saved_LIBS="$LIBS"
340 LIBS="$LIBS $LIBM"
341 AC_CHECK_FUNCS([lrintf])
342 AC_CHECK_FUNCS([fminf])
343 AC_CHECK_FUNCS([fmaxf])
344 LIBS="$saved_LIBS"
345
346 AC_CONFIG_FILES([Makefile])
347 AC_CONFIG_HEADERS([config.h])
348 AC_OUTPUT
349
350 AC_MSG_NOTICE([
351 ------------------------------------------------------------------------
352   $PACKAGE_NAME $PACKAGE_VERSION:  Automatic configuration OK.
353
354     Compiler support:
355
356       C99 var arrays: ................ ${has_var_arrays}
357       C99 lrintf: .................... ${ac_cv_func_lrintf}
358       Stack protector: ............... ${enable_stack_protector}
359       PIE: ........................... ${enable_pie}
360
361     General configuration:
362
363       Assertion checking: ............ ${enable_assertions}
364       FLAC input: .................... ${with_flac}
365
366 ------------------------------------------------------------------------
367
368  Type "make; make install" to compile and install
369 ])