comparison src/opus-1.3/configure.ac @ 69:7aeed7906520

Add Opus sources and macOS builds
author Chris Cannam
date Wed, 23 Jan 2019 13:48:08 +0000
parents
children
comparison
equal deleted inserted replaced
68:85d5306e114e 69:7aeed7906520
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],[CURRENT_VERSION],[opus@xiph.org])
16
17 AC_CONFIG_SRCDIR(src/opus_encoder.c)
18 AC_CONFIG_MACRO_DIR([m4])
19
20 dnl enable silent rules on automake 1.11 and later
21 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
22
23 # For libtool.
24 dnl Please update these for releases.
25 OPUS_LT_CURRENT=7
26 OPUS_LT_REVISION=0
27 OPUS_LT_AGE=7
28
29 AC_SUBST(OPUS_LT_CURRENT)
30 AC_SUBST(OPUS_LT_REVISION)
31 AC_SUBST(OPUS_LT_AGE)
32
33 AM_INIT_AUTOMAKE([no-define])
34 AM_MAINTAINER_MODE([enable])
35
36 AC_CANONICAL_HOST
37 AC_MINGW32
38 AM_PROG_LIBTOOL
39 AM_PROG_CC_C_O
40
41 AC_PROG_CC_C99
42 AC_C_CONST
43 AC_C_INLINE
44
45 AM_PROG_AS
46
47 AC_DEFINE([OPUS_BUILD], [], [This is a build of OPUS])
48
49 #Use a hacked up version of autoconf's AC_C_RESTRICT because it's not
50 #strong enough a test to detect old buggy versions of GCC (e.g. 2.95.3)
51 #Note: Both this and the test for variable-size arrays below are also
52 # done by AC_PROG_CC_C99, but not thoroughly enough apparently.
53 AC_CACHE_CHECK([for C/C++ restrict keyword], ac_cv_c_restrict,
54 [ac_cv_c_restrict=no
55 # The order here caters to the fact that C++ does not require restrict.
56 for ac_kw in __restrict __restrict__ _Restrict restrict; do
57 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
58 [[typedef int * int_ptr;
59 int foo (int_ptr $ac_kw ip, int * $ac_kw baz[]) {
60 return ip[0];
61 }]],
62 [[int s[1];
63 int * $ac_kw t = s;
64 t[0] = 0;
65 return foo(t, (void *)0)]])],
66 [ac_cv_c_restrict=$ac_kw])
67 test "$ac_cv_c_restrict" != no && break
68 done
69 ])
70
71 AH_VERBATIM([restrict],
72 [/* Define to the equivalent of the C99 'restrict' keyword, or to
73 nothing if this is not supported. Do not define if restrict is
74 supported directly. */
75 #undef restrict
76 /* Work around a bug in Sun C++: it does not support _Restrict or
77 __restrict__, even though the corresponding Sun C compiler ends up with
78 "#define restrict _Restrict" or "#define restrict __restrict__" in the
79 previous line. Perhaps some future version of Sun C++ will work with
80 restrict; if so, hopefully it defines __RESTRICT like Sun C does. */
81 #if defined __SUNPRO_CC && !defined __RESTRICT
82 # define _Restrict
83 # define __restrict__
84 #endif])
85
86 case $ac_cv_c_restrict in
87 restrict) ;;
88 no) AC_DEFINE([restrict], []) ;;
89 *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;;
90 esac
91
92 AC_MSG_CHECKING(for C99 variable-size arrays)
93 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([],
94 [[static int x; char a[++x]; a[sizeof a - 1] = 0; int N; return a[0];]])],
95 [ has_var_arrays=yes
96 use_alloca="no (using var arrays)"
97 AC_DEFINE([VAR_ARRAYS], [1], [Use C99 variable-size arrays])
98 ],[
99 has_var_arrays=no
100 ])
101 AC_MSG_RESULT([$has_var_arrays])
102
103 AS_IF([test "$has_var_arrays" = "no"],
104 [
105 AC_CHECK_HEADERS([alloca.h])
106 AC_MSG_CHECKING(for alloca)
107 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <alloca.h>]],
108 [[int foo=10; int *array = alloca(foo);]])],
109 [ use_alloca=yes;
110 AC_DEFINE([USE_ALLOCA], [], [Make use of alloca])
111 ],[
112 use_alloca=no
113 ])
114 AC_MSG_RESULT([$use_alloca])
115 ])
116
117 LT_LIB_M
118
119 AC_ARG_ENABLE([fixed-point],
120 [AS_HELP_STRING([--enable-fixed-point],
121 [compile without floating point (for machines without a fast enough FPU)])],,
122 [enable_fixed_point=no])
123
124 AS_IF([test "$enable_fixed_point" = "yes"],[
125 enable_float="no"
126 AC_DEFINE([FIXED_POINT], [1], [Compile as fixed-point (for machines without a fast enough FPU)])
127 PC_BUILD="fixed-point"
128 ],[
129 enable_float="yes";
130 PC_BUILD="floating-point"
131 ])
132
133 AM_CONDITIONAL([FIXED_POINT], [test "$enable_fixed_point" = "yes"])
134
135 AC_ARG_ENABLE([fixed-point-debug],
136 [AS_HELP_STRING([--enable-fixed-point-debug], [debug fixed-point implementation])],,
137 [enable_fixed_point_debug=no])
138
139 AS_IF([test "$enable_fixed_point_debug" = "yes"],[
140 AC_DEFINE([FIXED_DEBUG], [1], [Debug fixed-point implementation])
141 ])
142
143 AC_ARG_ENABLE([float_api],
144 [AS_HELP_STRING([--disable-float-api],
145 [compile without the floating point API (for machines with no float library)])],,
146 [enable_float_api=yes])
147
148 AM_CONDITIONAL([DISABLE_FLOAT_API], [test "$enable_float_api" = "no"])
149
150 AS_IF([test "$enable_float_api" = "no"],[
151 AC_DEFINE([DISABLE_FLOAT_API], [1], [Do not build the float API])
152 ])
153
154 AC_ARG_ENABLE([custom-modes],
155 [AS_HELP_STRING([--enable-custom-modes], [enable non-Opus modes, e.g. 44.1 kHz & 2^n frames])],,
156 [enable_custom_modes=no])
157
158 AS_IF([test "$enable_custom_modes" = "yes"],[
159 AC_DEFINE([CUSTOM_MODES], [1], [Custom modes])
160 PC_BUILD="$PC_BUILD, custom modes"
161 ])
162
163 AM_CONDITIONAL([CUSTOM_MODES], [test "$enable_custom_modes" = "yes"])
164
165 has_float_approx=no
166 #case "$host_cpu" in
167 #i[[3456]]86 | x86_64 | powerpc64 | powerpc32 | ia64)
168 # has_float_approx=yes
169 # ;;
170 #esac
171
172 AC_ARG_ENABLE([float-approx],
173 [AS_HELP_STRING([--enable-float-approx], [enable fast approximations for floating point])],
174 [if test "$enable_float_approx" = "yes"; then
175 AC_WARN([Floating point approximations are not supported on all platforms.])
176 fi
177 ],
178 [enable_float_approx=$has_float_approx])
179
180 AS_IF([test "$enable_float_approx" = "yes"],[
181 AC_DEFINE([FLOAT_APPROX], [1], [Float approximations])
182 ])
183
184 AC_ARG_ENABLE([asm],
185 [AS_HELP_STRING([--disable-asm], [Disable assembly optimizations])],,
186 [enable_asm=yes])
187
188 AC_ARG_ENABLE([rtcd],
189 [AS_HELP_STRING([--disable-rtcd], [Disable run-time CPU capabilities detection])],,
190 [enable_rtcd=yes])
191
192 AC_ARG_ENABLE([intrinsics],
193 [AS_HELP_STRING([--disable-intrinsics], [Disable intrinsics optimizations])],,
194 [enable_intrinsics=yes])
195
196 rtcd_support=no
197 cpu_arm=no
198
199 AS_IF([test x"${enable_asm}" = x"yes"],[
200 inline_optimization="No inline ASM for your platform, please send patches"
201 case $host_cpu in
202 arm*)
203 dnl Currently we only have asm for fixed-point
204 AS_IF([test "$enable_float" != "yes"],[
205 cpu_arm=yes
206 AC_DEFINE([OPUS_ARM_ASM], [], [Make use of ARM asm optimization])
207 AS_GCC_INLINE_ASSEMBLY(
208 [inline_optimization="ARM"],
209 [inline_optimization="disabled"]
210 )
211 AS_ASM_ARM_EDSP([OPUS_ARM_INLINE_EDSP=1],[OPUS_ARM_INLINE_EDSP=0])
212 AS_ASM_ARM_MEDIA([OPUS_ARM_INLINE_MEDIA=1],
213 [OPUS_ARM_INLINE_MEDIA=0])
214 AS_ASM_ARM_NEON([OPUS_ARM_INLINE_NEON=1],[OPUS_ARM_INLINE_NEON=0])
215 AS_IF([test x"$inline_optimization" = x"ARM"],[
216 AM_CONDITIONAL([OPUS_ARM_INLINE_ASM],[true])
217 AC_DEFINE([OPUS_ARM_INLINE_ASM], 1,
218 [Use generic ARMv4 inline asm optimizations])
219 AS_IF([test x"$OPUS_ARM_INLINE_EDSP" = x"1"],[
220 AC_DEFINE([OPUS_ARM_INLINE_EDSP], [1],
221 [Use ARMv5E inline asm optimizations])
222 inline_optimization="$inline_optimization (EDSP)"
223 ])
224 AS_IF([test x"$OPUS_ARM_INLINE_MEDIA" = x"1"],[
225 AC_DEFINE([OPUS_ARM_INLINE_MEDIA], [1],
226 [Use ARMv6 inline asm optimizations])
227 inline_optimization="$inline_optimization (Media)"
228 ])
229 AS_IF([test x"$OPUS_ARM_INLINE_NEON" = x"1"],[
230 AC_DEFINE([OPUS_ARM_INLINE_NEON], 1,
231 [Use ARM NEON inline asm optimizations])
232 inline_optimization="$inline_optimization (NEON)"
233 ])
234 ])
235 dnl We need Perl to translate RVCT-syntax asm to gas syntax.
236 AC_CHECK_PROG([HAVE_PERL], perl, yes, no)
237 AS_IF([test x"$HAVE_PERL" = x"yes"],[
238 AM_CONDITIONAL([OPUS_ARM_EXTERNAL_ASM],[true])
239 asm_optimization="ARM"
240 AS_IF([test x"$OPUS_ARM_INLINE_EDSP" = x"1"], [
241 OPUS_ARM_PRESUME_EDSP=1
242 OPUS_ARM_MAY_HAVE_EDSP=1
243 ],
244 [
245 OPUS_ARM_PRESUME_EDSP=0
246 OPUS_ARM_MAY_HAVE_EDSP=0
247 ])
248 AS_IF([test x"$OPUS_ARM_INLINE_MEDIA" = x"1"], [
249 OPUS_ARM_PRESUME_MEDIA=1
250 OPUS_ARM_MAY_HAVE_MEDIA=1
251 ],
252 [
253 OPUS_ARM_PRESUME_MEDIA=0
254 OPUS_ARM_MAY_HAVE_MEDIA=0
255 ])
256 AS_IF([test x"$OPUS_ARM_INLINE_NEON" = x"1"], [
257 OPUS_ARM_PRESUME_NEON=1
258 OPUS_ARM_MAY_HAVE_NEON=1
259 ],
260 [
261 OPUS_ARM_PRESUME_NEON=0
262 OPUS_ARM_MAY_HAVE_NEON=0
263 ])
264 AS_IF([test x"$enable_rtcd" = x"yes"],[
265 AS_IF([test x"$OPUS_ARM_MAY_HAVE_EDSP" != x"1"],[
266 AC_MSG_NOTICE(
267 [Trying to force-enable armv5e EDSP instructions...])
268 AS_ASM_ARM_EDSP_FORCE([OPUS_ARM_MAY_HAVE_EDSP=1])
269 ])
270 AS_IF([test x"$OPUS_ARM_MAY_HAVE_MEDIA" != x"1"],[
271 AC_MSG_NOTICE(
272 [Trying to force-enable ARMv6 media instructions...])
273 AS_ASM_ARM_MEDIA_FORCE([OPUS_ARM_MAY_HAVE_MEDIA=1])
274 ])
275 AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON" != x"1"],[
276 AC_MSG_NOTICE(
277 [Trying to force-enable NEON instructions...])
278 AS_ASM_ARM_NEON_FORCE([OPUS_ARM_MAY_HAVE_NEON=1])
279 ])
280 ])
281 rtcd_support=
282 AS_IF([test x"$OPUS_ARM_MAY_HAVE_EDSP" = x"1"],[
283 AC_DEFINE(OPUS_ARM_MAY_HAVE_EDSP, 1,
284 [Define if assembler supports EDSP instructions])
285 AS_IF([test x"$OPUS_ARM_PRESUME_EDSP" = x"1"],[
286 AC_DEFINE(OPUS_ARM_PRESUME_EDSP, 1,
287 [Define if binary requires EDSP instruction support])
288 asm_optimization="$asm_optimization (EDSP)"
289 ],
290 [rtcd_support="$rtcd_support (EDSP)"]
291 )
292 ])
293 AC_SUBST(OPUS_ARM_MAY_HAVE_EDSP)
294 AS_IF([test x"$OPUS_ARM_MAY_HAVE_MEDIA" = x"1"],[
295 AC_DEFINE(OPUS_ARM_MAY_HAVE_MEDIA, 1,
296 [Define if assembler supports ARMv6 media instructions])
297 AS_IF([test x"$OPUS_ARM_PRESUME_MEDIA" = x"1"],[
298 AC_DEFINE(OPUS_ARM_PRESUME_MEDIA, 1,
299 [Define if binary requires ARMv6 media instruction support])
300 asm_optimization="$asm_optimization (Media)"
301 ],
302 [rtcd_support="$rtcd_support (Media)"]
303 )
304 ])
305 AC_SUBST(OPUS_ARM_MAY_HAVE_MEDIA)
306 AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON" = x"1"],[
307 AC_DEFINE(OPUS_ARM_MAY_HAVE_NEON, 1,
308 [Define if compiler supports NEON instructions])
309 AS_IF([test x"$OPUS_ARM_PRESUME_NEON" = x"1"], [
310 AC_DEFINE(OPUS_ARM_PRESUME_NEON, 1,
311 [Define if binary requires NEON instruction support])
312 asm_optimization="$asm_optimization (NEON)"
313 ],
314 [rtcd_support="$rtcd_support (NEON)"]
315 )
316 ])
317 AC_SUBST(OPUS_ARM_MAY_HAVE_NEON)
318 dnl Make sure turning on RTCD gets us at least one
319 dnl instruction set.
320 AS_IF([test x"$rtcd_support" != x""],
321 [rtcd_support=ARM"$rtcd_support"],
322 [rtcd_support="no"]
323 )
324 AC_MSG_CHECKING([for apple style tools])
325 AC_PREPROC_IFELSE([AC_LANG_PROGRAM([
326 #ifndef __APPLE__
327 #error 1
328 #endif],[])],
329 [AC_MSG_RESULT([yes]); ARM2GNU_PARAMS="--apple"],
330 [AC_MSG_RESULT([no]); ARM2GNU_PARAMS=""])
331 AC_SUBST(ARM2GNU_PARAMS)
332 ],
333 [
334 AC_MSG_WARN(
335 [*** ARM assembly requires perl -- disabling optimizations])
336 asm_optimization="(missing perl dependency for ARM)"
337 ])
338 ])
339 ;;
340 esac
341 ],[
342 inline_optimization="disabled"
343 asm_optimization="disabled"
344 ])
345
346 AM_CONDITIONAL([OPUS_ARM_INLINE_ASM],
347 [test x"${inline_optimization%% *}" = x"ARM"])
348 AM_CONDITIONAL([OPUS_ARM_EXTERNAL_ASM],
349 [test x"${asm_optimization%% *}" = x"ARM"])
350
351 AM_CONDITIONAL([HAVE_SSE], [false])
352 AM_CONDITIONAL([HAVE_SSE2], [false])
353 AM_CONDITIONAL([HAVE_SSE4_1], [false])
354 AM_CONDITIONAL([HAVE_AVX], [false])
355
356 m4_define([DEFAULT_X86_SSE_CFLAGS], [-msse])
357 m4_define([DEFAULT_X86_SSE2_CFLAGS], [-msse2])
358 m4_define([DEFAULT_X86_SSE4_1_CFLAGS], [-msse4.1])
359 m4_define([DEFAULT_X86_AVX_CFLAGS], [-mavx])
360 m4_define([DEFAULT_ARM_NEON_INTR_CFLAGS], [-mfpu=neon])
361 # With GCC on ARM32 softfp architectures (e.g. Android, or older Ubuntu) you need to specify
362 # -mfloat-abi=softfp for -mfpu=neon to work. However, on ARM32 hardfp architectures (e.g. newer Ubuntu),
363 # this option will break things.
364
365 # As a heuristic, if host matches arm*eabi* but not arm*hf*, it's probably soft-float.
366 m4_define([DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS], [-mfpu=neon -mfloat-abi=softfp])
367
368 AS_CASE([$host],
369 [arm*hf*], [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_INTR_CFLAGS")],
370 [arm*eabi*], [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS")],
371 [AS_VAR_SET([RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS], "DEFAULT_ARM_NEON_INTR_CFLAGS")])
372
373 AC_ARG_VAR([X86_SSE_CFLAGS], [C compiler flags to compile SSE intrinsics @<:@default=]DEFAULT_X86_SSE_CFLAGS[@:>@])
374 AC_ARG_VAR([X86_SSE2_CFLAGS], [C compiler flags to compile SSE2 intrinsics @<:@default=]DEFAULT_X86_SSE2_CFLAGS[@:>@])
375 AC_ARG_VAR([X86_SSE4_1_CFLAGS], [C compiler flags to compile SSE4.1 intrinsics @<:@default=]DEFAULT_X86_SSE4_1_CFLAGS[@:>@])
376 AC_ARG_VAR([X86_AVX_CFLAGS], [C compiler flags to compile AVX intrinsics @<:@default=]DEFAULT_X86_AVX_CFLAGS[@:>@])
377 AC_ARG_VAR([ARM_NEON_INTR_CFLAGS], [C compiler flags to compile ARM NEON intrinsics @<:@default=]DEFAULT_ARM_NEON_INTR_CFLAGS / DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS[@:>@])
378
379 AS_VAR_SET_IF([X86_SSE_CFLAGS], [], [AS_VAR_SET([X86_SSE_CFLAGS], "DEFAULT_X86_SSE_CFLAGS")])
380 AS_VAR_SET_IF([X86_SSE2_CFLAGS], [], [AS_VAR_SET([X86_SSE2_CFLAGS], "DEFAULT_X86_SSE2_CFLAGS")])
381 AS_VAR_SET_IF([X86_SSE4_1_CFLAGS], [], [AS_VAR_SET([X86_SSE4_1_CFLAGS], "DEFAULT_X86_SSE4_1_CFLAGS")])
382 AS_VAR_SET_IF([X86_AVX_CFLAGS], [], [AS_VAR_SET([X86_AVX_CFLAGS], "DEFAULT_X86_AVX_CFLAGS")])
383 AS_VAR_SET_IF([ARM_NEON_INTR_CFLAGS], [], [AS_VAR_SET([ARM_NEON_INTR_CFLAGS], ["$RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS"])])
384
385 AC_DEFUN([OPUS_PATH_NE10],
386 [
387 AC_ARG_WITH(NE10,
388 AC_HELP_STRING([--with-NE10=PFX],[Prefix where libNE10 is installed (optional)]),
389 NE10_prefix="$withval", NE10_prefix="")
390 AC_ARG_WITH(NE10-libraries,
391 AC_HELP_STRING([--with-NE10-libraries=DIR],
392 [Directory where libNE10 library is installed (optional)]),
393 NE10_libraries="$withval", NE10_libraries="")
394 AC_ARG_WITH(NE10-includes,
395 AC_HELP_STRING([--with-NE10-includes=DIR],
396 [Directory where libNE10 header files are installed (optional)]),
397 NE10_includes="$withval", NE10_includes="")
398
399 if test "x$NE10_libraries" != "x" ; then
400 NE10_LIBS="-L$NE10_libraries"
401 elif test "x$NE10_prefix" = "xno" || test "x$NE10_prefix" = "xyes" ; then
402 NE10_LIBS=""
403 elif test "x$NE10_prefix" != "x" ; then
404 NE10_LIBS="-L$NE10_prefix/lib"
405 elif test "x$prefix" != "xNONE" ; then
406 NE10_LIBS="-L$prefix/lib"
407 fi
408
409 if test "x$NE10_prefix" != "xno" ; then
410 NE10_LIBS="$NE10_LIBS -lNE10"
411 fi
412
413 if test "x$NE10_includes" != "x" ; then
414 NE10_CFLAGS="-I$NE10_includes"
415 elif test "x$NE10_prefix" = "xno" || test "x$NE10_prefix" = "xyes" ; then
416 NE10_CFLAGS=""
417 elif test "x$NE10_prefix" != "x" ; then
418 NE10_CFLAGS="-I$NE10_prefix/include"
419 elif test "x$prefix" != "xNONE"; then
420 NE10_CFLAGS="-I$prefix/include"
421 fi
422
423 AC_MSG_CHECKING(for NE10)
424 save_CFLAGS="$CFLAGS"; CFLAGS="$CFLAGS $NE10_CFLAGS"
425 save_LIBS="$LIBS"; LIBS="$LIBS $NE10_LIBS $LIBM"
426 AC_LINK_IFELSE(
427 [
428 AC_LANG_PROGRAM(
429 [[#include <NE10_dsp.h>
430 ]],
431 [[
432 ne10_fft_cfg_float32_t cfg;
433 cfg = ne10_fft_alloc_c2c_float32_neon(480);
434 ]]
435 )
436 ],[
437 HAVE_ARM_NE10=1
438 AC_MSG_RESULT([yes])
439 ],[
440 HAVE_ARM_NE10=0
441 AC_MSG_RESULT([no])
442 NE10_CFLAGS=""
443 NE10_LIBS=""
444 ]
445 )
446 CFLAGS="$save_CFLAGS"; LIBS="$save_LIBS"
447 #Now we know if libNE10 is installed or not
448 AS_IF([test x"$HAVE_ARM_NE10" = x"1"],
449 [
450 AC_DEFINE([HAVE_ARM_NE10], 1, [NE10 library is installed on host. Make sure it is on target!])
451 AC_SUBST(HAVE_ARM_NE10)
452 AC_SUBST(NE10_CFLAGS)
453 AC_SUBST(NE10_LIBS)
454 ]
455 )
456 ]
457 )
458
459 AS_IF([test x"$enable_intrinsics" = x"yes"],[
460 intrinsics_support=""
461 AS_CASE([$host_cpu],
462 [arm*|aarch64*],
463 [
464 cpu_arm=yes
465 OPUS_CHECK_INTRINSICS(
466 [ARM Neon],
467 [$ARM_NEON_INTR_CFLAGS],
468 [OPUS_ARM_MAY_HAVE_NEON_INTR],
469 [OPUS_ARM_PRESUME_NEON_INTR],
470 [[#include <arm_neon.h>
471 ]],
472 [[
473 static float32x4_t A0, A1, SUMM;
474 SUMM = vmlaq_f32(SUMM, A0, A1);
475 return (int)vgetq_lane_f32(SUMM, 0);
476 ]]
477 )
478 AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1" && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"],
479 [
480 OPUS_ARM_NEON_INTR_CFLAGS="$ARM_NEON_INTR_CFLAGS"
481 AC_SUBST([OPUS_ARM_NEON_INTR_CFLAGS])
482 ]
483 )
484
485 AS_IF([test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"],
486 [
487 AC_DEFINE([OPUS_ARM_MAY_HAVE_NEON_INTR], 1, [Compiler supports ARMv7/Aarch64 Neon Intrinsics])
488 intrinsics_support="$intrinsics_support (NEON)"
489
490 AS_IF([test x"$enable_rtcd" != x"no" && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"],
491 [AS_IF([test x"$rtcd_support" = x"no"],
492 [rtcd_support="ARM (NEON Intrinsics)"],
493 [rtcd_support="$rtcd_support (NEON Intrinsics)"])])
494
495 AS_IF([test x"$OPUS_ARM_PRESUME_NEON_INTR" = x"1"],
496 [AC_DEFINE([OPUS_ARM_PRESUME_NEON_INTR], 1, [Define if binary requires NEON intrinsics support])])
497
498 OPUS_PATH_NE10()
499 AS_IF([test x"$NE10_LIBS" != x""],
500 [
501 intrinsics_support="$intrinsics_support (NE10)"
502 AS_IF([test x"enable_rtcd" != x"" \
503 && test x"$OPUS_ARM_PRESUME_NEON_INTR" != x"1"],
504 [rtcd_support="$rtcd_support (NE10)"])
505 ])
506
507 OPUS_CHECK_INTRINSICS(
508 [Aarch64 Neon],
509 [$ARM_NEON_INTR_CFLAGS],
510 [OPUS_ARM_MAY_HAVE_AARCH64_NEON_INTR],
511 [OPUS_ARM_PRESUME_AARCH64_NEON_INTR],
512 [[#include <arm_neon.h>
513 ]],
514 [[
515 static int32_t IN;
516 static int16_t OUT;
517 OUT = vqmovns_s32(IN);
518 ]]
519 )
520
521 AS_IF([test x"$OPUS_ARM_PRESUME_AARCH64_NEON_INTR" = x"1"],
522 [
523 AC_DEFINE([OPUS_ARM_PRESUME_AARCH64_NEON_INTR], 1, [Define if binary requires Aarch64 Neon Intrinsics])
524 intrinsics_support="$intrinsics_support (NEON [Aarch64])"
525 ])
526
527 AS_IF([test x"$intrinsics_support" = x""],
528 [intrinsics_support=no],
529 [intrinsics_support="ARM$intrinsics_support"])
530 ],
531 [
532 AC_MSG_WARN([Compiler does not support ARM intrinsics])
533 intrinsics_support=no
534 ])
535 ],
536 [i?86|x86_64],
537 [
538 OPUS_CHECK_INTRINSICS(
539 [SSE],
540 [$X86_SSE_CFLAGS],
541 [OPUS_X86_MAY_HAVE_SSE],
542 [OPUS_X86_PRESUME_SSE],
543 [[#include <xmmintrin.h>
544 #include <time.h>
545 ]],
546 [[
547 __m128 mtest;
548 mtest = _mm_set1_ps((float)time(NULL));
549 mtest = _mm_mul_ps(mtest, mtest);
550 return _mm_cvtss_si32(mtest);
551 ]]
552 )
553 AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE" = x"1" && test x"$OPUS_X86_PRESUME_SSE" != x"1"],
554 [
555 OPUS_X86_SSE_CFLAGS="$X86_SSE_CFLAGS"
556 AC_SUBST([OPUS_X86_SSE_CFLAGS])
557 ]
558 )
559 OPUS_CHECK_INTRINSICS(
560 [SSE2],
561 [$X86_SSE2_CFLAGS],
562 [OPUS_X86_MAY_HAVE_SSE2],
563 [OPUS_X86_PRESUME_SSE2],
564 [[#include <emmintrin.h>
565 #include <time.h>
566 ]],
567 [[
568 __m128i mtest;
569 mtest = _mm_set1_epi32((int)time(NULL));
570 mtest = _mm_mul_epu32(mtest, mtest);
571 return _mm_cvtsi128_si32(mtest);
572 ]]
573 )
574 AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1" && test x"$OPUS_X86_PRESUME_SSE2" != x"1"],
575 [
576 OPUS_X86_SSE2_CFLAGS="$X86_SSE2_CFLAGS"
577 AC_SUBST([OPUS_X86_SSE2_CFLAGS])
578 ]
579 )
580 OPUS_CHECK_INTRINSICS(
581 [SSE4.1],
582 [$X86_SSE4_1_CFLAGS],
583 [OPUS_X86_MAY_HAVE_SSE4_1],
584 [OPUS_X86_PRESUME_SSE4_1],
585 [[#include <smmintrin.h>
586 #include <time.h>
587 ]],
588 [[
589 __m128i mtest;
590 mtest = _mm_set1_epi32((int)time(NULL));
591 mtest = _mm_mul_epi32(mtest, mtest);
592 return _mm_cvtsi128_si32(mtest);
593 ]]
594 )
595 AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1" && test x"$OPUS_X86_PRESUME_SSE4_1" != x"1"],
596 [
597 OPUS_X86_SSE4_1_CFLAGS="$X86_SSE4_1_CFLAGS"
598 AC_SUBST([OPUS_X86_SSE4_1_CFLAGS])
599 ]
600 )
601 OPUS_CHECK_INTRINSICS(
602 [AVX],
603 [$X86_AVX_CFLAGS],
604 [OPUS_X86_MAY_HAVE_AVX],
605 [OPUS_X86_PRESUME_AVX],
606 [[#include <immintrin.h>
607 #include <time.h>
608 ]],
609 [[
610 __m256 mtest;
611 mtest = _mm256_set1_ps((float)time(NULL));
612 mtest = _mm256_addsub_ps(mtest, mtest);
613 return _mm_cvtss_si32(_mm256_extractf128_ps(mtest, 0));
614 ]]
615 )
616 AS_IF([test x"$OPUS_X86_MAY_HAVE_AVX" = x"1" && test x"$OPUS_X86_PRESUME_AVX" != x"1"],
617 [
618 OPUS_X86_AVX_CFLAGS="$X86_AVX_CFLAGS"
619 AC_SUBST([OPUS_X86_AVX_CFLAGS])
620 ]
621 )
622 AS_IF([test x"$rtcd_support" = x"no"], [rtcd_support=""])
623 AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"],
624 [
625 AC_DEFINE([OPUS_X86_MAY_HAVE_SSE], 1, [Compiler supports X86 SSE Intrinsics])
626 intrinsics_support="$intrinsics_support SSE"
627
628 AS_IF([test x"$OPUS_X86_PRESUME_SSE" = x"1"],
629 [AC_DEFINE([OPUS_X86_PRESUME_SSE], 1, [Define if binary requires SSE intrinsics support])],
630 [rtcd_support="$rtcd_support SSE"])
631 ],
632 [
633 AC_MSG_WARN([Compiler does not support SSE intrinsics])
634 ])
635
636 AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"],
637 [
638 AC_DEFINE([OPUS_X86_MAY_HAVE_SSE2], 1, [Compiler supports X86 SSE2 Intrinsics])
639 intrinsics_support="$intrinsics_support SSE2"
640
641 AS_IF([test x"$OPUS_X86_PRESUME_SSE2" = x"1"],
642 [AC_DEFINE([OPUS_X86_PRESUME_SSE2], 1, [Define if binary requires SSE2 intrinsics support])],
643 [rtcd_support="$rtcd_support SSE2"])
644 ],
645 [
646 AC_MSG_WARN([Compiler does not support SSE2 intrinsics])
647 ])
648
649 AS_IF([test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"],
650 [
651 AC_DEFINE([OPUS_X86_MAY_HAVE_SSE4_1], 1, [Compiler supports X86 SSE4.1 Intrinsics])
652 intrinsics_support="$intrinsics_support SSE4.1"
653
654 AS_IF([test x"$OPUS_X86_PRESUME_SSE4_1" = x"1"],
655 [AC_DEFINE([OPUS_X86_PRESUME_SSE4_1], 1, [Define if binary requires SSE4.1 intrinsics support])],
656 [rtcd_support="$rtcd_support SSE4.1"])
657 ],
658 [
659 AC_MSG_WARN([Compiler does not support SSE4.1 intrinsics])
660 ])
661 AS_IF([test x"$OPUS_X86_MAY_HAVE_AVX" = x"1"],
662 [
663 AC_DEFINE([OPUS_X86_MAY_HAVE_AVX], 1, [Compiler supports X86 AVX Intrinsics])
664 intrinsics_support="$intrinsics_support AVX"
665
666 AS_IF([test x"$OPUS_X86_PRESUME_AVX" = x"1"],
667 [AC_DEFINE([OPUS_X86_PRESUME_AVX], 1, [Define if binary requires AVX intrinsics support])],
668 [rtcd_support="$rtcd_support AVX"])
669 ],
670 [
671 AC_MSG_WARN([Compiler does not support AVX intrinsics])
672 ])
673
674 AS_IF([test x"$intrinsics_support" = x""],
675 [intrinsics_support=no],
676 [intrinsics_support="x86$intrinsics_support"]
677 )
678 AS_IF([test x"$rtcd_support" = x""],
679 [rtcd_support=no],
680 [rtcd_support="x86$rtcd_support"],
681 )
682
683 AS_IF([test x"$enable_rtcd" = x"yes" && test x"$rtcd_support" != x""],[
684 get_cpuid_by_asm="no"
685 AC_MSG_CHECKING([How to get X86 CPU Info])
686 AC_LINK_IFELSE([AC_LANG_PROGRAM([[
687 #include <stdio.h>
688 ]],[[
689 unsigned int CPUInfo0;
690 unsigned int CPUInfo1;
691 unsigned int CPUInfo2;
692 unsigned int CPUInfo3;
693 unsigned int InfoType;
694 __asm__ __volatile__ (
695 "cpuid":
696 "=a" (CPUInfo0),
697 "=b" (CPUInfo1),
698 "=c" (CPUInfo2),
699 "=d" (CPUInfo3) :
700 "a" (InfoType), "c" (0)
701 );
702 ]])],
703 [get_cpuid_by_asm="yes"
704 AC_MSG_RESULT([Inline Assembly])
705 AC_DEFINE([CPU_INFO_BY_ASM], [1], [Get CPU Info by asm method])],
706 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
707 #include <cpuid.h>
708 ]],[[
709 unsigned int CPUInfo0;
710 unsigned int CPUInfo1;
711 unsigned int CPUInfo2;
712 unsigned int CPUInfo3;
713 unsigned int InfoType;
714 __get_cpuid(InfoType, &CPUInfo0, &CPUInfo1, &CPUInfo2, &CPUInfo3);
715 ]])],
716 [AC_MSG_RESULT([C method])
717 AC_DEFINE([CPU_INFO_BY_C], [1], [Get CPU Info by c method])],
718 [AC_MSG_ERROR([no supported Get CPU Info method, please disable run-time CPU capabilities detection or intrinsics])])])])
719 ],
720 [
721 AC_MSG_WARN([No intrinsics support for your architecture])
722 intrinsics_support="no"
723 ])
724 ],
725 [
726 intrinsics_support="no"
727 ])
728
729 AM_CONDITIONAL([CPU_ARM], [test "$cpu_arm" = "yes"])
730 AM_CONDITIONAL([HAVE_ARM_NEON_INTR],
731 [test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"])
732 AM_CONDITIONAL([HAVE_ARM_NE10],
733 [test x"$HAVE_ARM_NE10" = x"1"])
734 AM_CONDITIONAL([HAVE_SSE],
735 [test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"])
736 AM_CONDITIONAL([HAVE_SSE2],
737 [test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"])
738 AM_CONDITIONAL([HAVE_SSE4_1],
739 [test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"])
740 AM_CONDITIONAL([HAVE_AVX],
741 [test x"$OPUS_X86_MAY_HAVE_AVX" = x"1"])
742
743 AS_IF([test x"$enable_rtcd" = x"yes"],[
744 AS_IF([test x"$rtcd_support" != x"no"],[
745 AC_DEFINE([OPUS_HAVE_RTCD], [1],
746 [Use run-time CPU capabilities detection])
747 OPUS_HAVE_RTCD=1
748 AC_SUBST(OPUS_HAVE_RTCD)
749 ])
750 ],[
751 rtcd_support="disabled"
752 ])
753
754 AC_ARG_ENABLE([assertions],
755 [AS_HELP_STRING([--enable-assertions],[enable additional software error checking])],,
756 [enable_assertions=no])
757
758 AS_IF([test "$enable_assertions" = "yes"], [
759 AC_DEFINE([ENABLE_ASSERTIONS], [1], [Assertions])
760 ])
761
762 AC_ARG_ENABLE([hardening],
763 [AS_HELP_STRING([--disable-hardening],[disable run-time checks that are cheap and safe for use in production])],,
764 [enable_hardening=yes])
765
766 AS_IF([test "$enable_hardening" = "yes"], [
767 AC_DEFINE([ENABLE_HARDENING], [1], [Hardening])
768 ])
769
770 AC_ARG_ENABLE([fuzzing],
771 [AS_HELP_STRING([--enable-fuzzing],[causes the encoder to make random decisions (do not use in production)])],,
772 [enable_fuzzing=no])
773
774 AS_IF([test "$enable_fuzzing" = "yes"], [
775 AC_DEFINE([FUZZING], [1], [Fuzzing])
776 ])
777
778 AC_ARG_ENABLE([check-asm],
779 [AS_HELP_STRING([--enable-check-asm],
780 [enable bit-exactness checks between optimized and c implementations])],,
781 [enable_check_asm=no])
782
783 AS_IF([test "$enable_check_asm" = "yes"], [
784 AC_DEFINE([OPUS_CHECK_ASM], [1], [Run bit-exactness checks between optimized and c implementations])
785 ])
786
787 AC_ARG_ENABLE([doc],
788 [AS_HELP_STRING([--disable-doc], [Do not build API documentation])],,
789 [enable_doc=yes])
790
791 AS_IF([test "$enable_doc" = "yes"], [
792 AC_CHECK_PROG(HAVE_DOXYGEN, [doxygen], [yes], [no])
793 AC_CHECK_PROG(HAVE_DOT, [dot], [yes], [no])
794 ],[
795 HAVE_DOXYGEN=no
796 ])
797
798 AM_CONDITIONAL([HAVE_DOXYGEN], [test "$HAVE_DOXYGEN" = "yes"])
799
800 AC_ARG_ENABLE([extra-programs],
801 [AS_HELP_STRING([--disable-extra-programs], [Do not build extra programs (demo and tests)])],,
802 [enable_extra_programs=yes])
803
804 AM_CONDITIONAL([EXTRA_PROGRAMS], [test "$enable_extra_programs" = "yes"])
805
806
807 AC_ARG_ENABLE([rfc8251],
808 AS_HELP_STRING([--disable-rfc8251], [Disable bitstream fixes from RFC 8251]),,
809 [enable_rfc8251=yes])
810
811 AS_IF([test "$enable_rfc8251" = "no"], [
812 AC_DEFINE([DISABLE_UPDATE_DRAFT], [1], [Disable bitstream fixes from RFC 8251])
813 ])
814
815
816 saved_CFLAGS="$CFLAGS"
817 CFLAGS="$CFLAGS -fvisibility=hidden"
818 AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden])
819 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
820 [ AC_MSG_RESULT([yes]) ],
821 [ AC_MSG_RESULT([no])
822 CFLAGS="$saved_CFLAGS"
823 ])
824
825 on_x86=no
826 case "$host_cpu" in
827 i[[3456]]86 | x86_64)
828 on_x86=yes
829 ;;
830 esac
831
832 on_windows=no
833 case $host in
834 *cygwin*|*mingw*)
835 on_windows=yes
836 ;;
837 esac
838
839 dnl Enable stack-protector-all only on x86 where it's well supported.
840 dnl on some platforms it causes crashes. Hopefully the OS's default's
841 dnl include this on platforms that work but have been missed here.
842 AC_ARG_ENABLE([stack-protector],
843 [AS_HELP_STRING([--disable-stack-protector],[Disable compiler stack hardening])],,
844 [
845 AS_IF([test "$ac_cv_c_compiler_gnu" = "yes" && test "$on_x86" = "yes" && test "$on_windows" = "no"],
846 [enable_stack_protector=yes],[enable_stack_protector=no])
847 ])
848
849 AS_IF([test "$enable_stack_protector" = "yes"],
850 [
851 saved_CFLAGS="$CFLAGS"
852 CFLAGS="$CFLAGS -fstack-protector-strong"
853 AC_MSG_CHECKING([if ${CC} supports -fstack-protector-strong])
854 AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[char foo;]])],
855 [ AC_MSG_RESULT([yes]) ],
856 [
857 AC_MSG_RESULT([no])
858 enable_stack_protector=no
859 CFLAGS="$saved_CFLAGS"
860 ])
861 ])
862
863 AS_IF([test x$ac_cv_c_compiler_gnu = xyes],
864 [AX_ADD_FORTIFY_SOURCE]
865 )
866
867 CFLAGS="$CFLAGS -W"
868
869 warn_CFLAGS="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes"
870 saved_CFLAGS="$CFLAGS"
871 CFLAGS="$CFLAGS $warn_CFLAGS"
872 AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}])
873 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])],
874 [ AC_MSG_RESULT([yes]) ],
875 [ AC_MSG_RESULT([no])
876 CFLAGS="$saved_CFLAGS"
877 ])
878
879 saved_LIBS="$LIBS"
880 LIBS="$LIBS $LIBM"
881 AC_CHECK_FUNCS([lrintf])
882 AC_CHECK_FUNCS([lrint])
883 LIBS="$saved_LIBS"
884
885 AC_CHECK_FUNCS([__malloc_hook])
886
887 AC_SUBST([PC_BUILD])
888
889 AC_CONFIG_FILES([
890 Makefile
891 opus.pc
892 opus-uninstalled.pc
893 celt/arm/armopts.s
894 doc/Makefile
895 doc/Doxyfile
896 ])
897 AC_CONFIG_HEADERS([config.h])
898
899 AC_OUTPUT
900
901 AC_MSG_NOTICE([
902 ------------------------------------------------------------------------
903 $PACKAGE_NAME $PACKAGE_VERSION: Automatic configuration OK.
904
905 Compiler support:
906
907 C99 var arrays: ................ ${has_var_arrays}
908 C99 lrintf: .................... ${ac_cv_func_lrintf}
909 Use alloca: .................... ${use_alloca}
910
911 General configuration:
912
913 Floating point support: ........ ${enable_float}
914 Fast float approximations: ..... ${enable_float_approx}
915 Fixed point debugging: ......... ${enable_fixed_point_debug}
916 Inline Assembly Optimizations: . ${inline_optimization}
917 External Assembly Optimizations: ${asm_optimization}
918 Intrinsics Optimizations: ...... ${intrinsics_support}
919 Run-time CPU detection: ........ ${rtcd_support}
920 Custom modes: .................. ${enable_custom_modes}
921 Assertion checking: ............ ${enable_assertions}
922 Hardening: ..................... ${enable_hardening}
923 Fuzzing: ....................... ${enable_fuzzing}
924 Check ASM: ..................... ${enable_check_asm}
925
926 API documentation: ............. ${enable_doc}
927 Extra programs: ................ ${enable_extra_programs}
928 ------------------------------------------------------------------------
929
930 Type "make; make install" to compile and install
931 Type "make check" to run the test suite
932 ])
933