1dnl Process this file with autoconf to produce a configure script. -*-m4-*- 2 3dnl The package_version file will be automatically synced to the git revision 4dnl by the update_version script when configured in the repository, but will 5dnl remain constant in tarball releases unless it is manually edited. 6m4_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 15AC_INIT([opus],[CURRENT_VERSION],[opus@xiph.org]) 16 17AC_CONFIG_SRCDIR(src/opus_encoder.c) 18AC_CONFIG_MACRO_DIR([m4]) 19 20dnl enable silent rules on automake 1.11 and later 21m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) 22 23# For libtool. 24dnl Please update these for releases. 25OPUS_LT_CURRENT=8 26OPUS_LT_REVISION=0 27OPUS_LT_AGE=8 28 29AC_SUBST(OPUS_LT_CURRENT) 30AC_SUBST(OPUS_LT_REVISION) 31AC_SUBST(OPUS_LT_AGE) 32 33AM_INIT_AUTOMAKE([no-define]) 34AM_MAINTAINER_MODE([enable]) 35 36AC_CANONICAL_HOST 37AC_MINGW32 38AM_PROG_LIBTOOL 39AM_PROG_CC_C_O 40 41AC_PROG_CC_C99 42AC_C_CONST 43AC_C_INLINE 44 45AM_PROG_AS 46 47AC_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. 53AC_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 71AH_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 86case $ac_cv_c_restrict in 87 restrict) ;; 88 no) AC_DEFINE([restrict], []) ;; 89 *) AC_DEFINE_UNQUOTED([restrict], [$ac_cv_c_restrict]) ;; 90esac 91 92AC_MSG_CHECKING(for C99 variable-size arrays) 93AC_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 ]) 101AC_MSG_RESULT([$has_var_arrays]) 102 103AS_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 117LT_LIB_M 118 119AC_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 124AS_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 133AM_CONDITIONAL([FIXED_POINT], [test "$enable_fixed_point" = "yes"]) 134 135AC_ARG_ENABLE([fixed-point-debug], 136 [AS_HELP_STRING([--enable-fixed-point-debug], [debug fixed-point implementation])],, 137 [enable_fixed_point_debug=no]) 138 139AS_IF([test "$enable_fixed_point_debug" = "yes"],[ 140 AC_DEFINE([FIXED_DEBUG], [1], [Debug fixed-point implementation]) 141]) 142 143AC_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 148AM_CONDITIONAL([DISABLE_FLOAT_API], [test "$enable_float_api" = "no"]) 149 150AS_IF([test "$enable_float_api" = "no"],[ 151 AC_DEFINE([DISABLE_FLOAT_API], [1], [Do not build the float API]) 152]) 153 154AC_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 158AS_IF([test "$enable_custom_modes" = "yes"],[ 159 AC_DEFINE([CUSTOM_MODES], [1], [Custom modes]) 160 PC_BUILD="$PC_BUILD, custom modes" 161]) 162 163AM_CONDITIONAL([CUSTOM_MODES], [test "$enable_custom_modes" = "yes"]) 164 165has_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 172AC_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 180AS_IF([test "$enable_float_approx" = "yes"],[ 181 AC_DEFINE([FLOAT_APPROX], [1], [Float approximations]) 182]) 183 184AC_ARG_ENABLE([asm], 185 [AS_HELP_STRING([--disable-asm], [Disable assembly optimizations])],, 186 [enable_asm=yes]) 187 188AC_ARG_ENABLE([rtcd], 189 [AS_HELP_STRING([--disable-rtcd], [Disable run-time CPU capabilities detection])],, 190 [enable_rtcd=yes]) 191 192AC_ARG_ENABLE([intrinsics], 193 [AS_HELP_STRING([--disable-intrinsics], [Disable intrinsics optimizations])],, 194 [enable_intrinsics=yes]) 195 196rtcd_support=no 197cpu_arm=no 198 199AS_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 346AM_CONDITIONAL([OPUS_ARM_INLINE_ASM], 347 [test x"${inline_optimization%% *}" = x"ARM"]) 348AM_CONDITIONAL([OPUS_ARM_EXTERNAL_ASM], 349 [test x"${asm_optimization%% *}" = x"ARM"]) 350 351AM_CONDITIONAL([HAVE_SSE], [false]) 352AM_CONDITIONAL([HAVE_SSE2], [false]) 353AM_CONDITIONAL([HAVE_SSE4_1], [false]) 354AM_CONDITIONAL([HAVE_AVX], [false]) 355 356m4_define([DEFAULT_X86_SSE_CFLAGS], [-msse]) 357m4_define([DEFAULT_X86_SSE2_CFLAGS], [-msse2]) 358m4_define([DEFAULT_X86_SSE4_1_CFLAGS], [-msse4.1]) 359m4_define([DEFAULT_X86_AVX_CFLAGS], [-mavx]) 360m4_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. 366m4_define([DEFAULT_ARM_NEON_SOFTFP_INTR_CFLAGS], [-mfpu=neon -mfloat-abi=softfp]) 367 368AS_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 373AC_ARG_VAR([X86_SSE_CFLAGS], [C compiler flags to compile SSE intrinsics @<:@default=]DEFAULT_X86_SSE_CFLAGS[@:>@]) 374AC_ARG_VAR([X86_SSE2_CFLAGS], [C compiler flags to compile SSE2 intrinsics @<:@default=]DEFAULT_X86_SSE2_CFLAGS[@:>@]) 375AC_ARG_VAR([X86_SSE4_1_CFLAGS], [C compiler flags to compile SSE4.1 intrinsics @<:@default=]DEFAULT_X86_SSE4_1_CFLAGS[@:>@]) 376AC_ARG_VAR([X86_AVX_CFLAGS], [C compiler flags to compile AVX intrinsics @<:@default=]DEFAULT_X86_AVX_CFLAGS[@:>@]) 377AC_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 379AS_VAR_SET_IF([X86_SSE_CFLAGS], [], [AS_VAR_SET([X86_SSE_CFLAGS], "DEFAULT_X86_SSE_CFLAGS")]) 380AS_VAR_SET_IF([X86_SSE2_CFLAGS], [], [AS_VAR_SET([X86_SSE2_CFLAGS], "DEFAULT_X86_SSE2_CFLAGS")]) 381AS_VAR_SET_IF([X86_SSE4_1_CFLAGS], [], [AS_VAR_SET([X86_SSE4_1_CFLAGS], "DEFAULT_X86_SSE4_1_CFLAGS")]) 382AS_VAR_SET_IF([X86_AVX_CFLAGS], [], [AS_VAR_SET([X86_AVX_CFLAGS], "DEFAULT_X86_AVX_CFLAGS")]) 383AS_VAR_SET_IF([ARM_NEON_INTR_CFLAGS], [], [AS_VAR_SET([ARM_NEON_INTR_CFLAGS], ["$RESOLVED_DEFAULT_ARM_NEON_INTR_CFLAGS"])]) 384 385AC_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 459AS_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 #if defined(__i386__) && defined(__PIC__) 695 __asm__ __volatile__ ( 696 "xchg %%ebx, %1\n" 697 "cpuid\n" 698 "xchg %%ebx, %1\n": 699 "=a" (CPUInfo0), 700 "=r" (CPUInfo1), 701 "=c" (CPUInfo2), 702 "=d" (CPUInfo3) : 703 "a" (InfoType), "c" (0) 704 ); 705 #else 706 __asm__ __volatile__ ( 707 "cpuid": 708 "=a" (CPUInfo0), 709 "=b" (CPUInfo1), 710 "=c" (CPUInfo2), 711 "=d" (CPUInfo3) : 712 "a" (InfoType), "c" (0) 713 ); 714 #endif 715 ]])], 716 [get_cpuid_by_asm="yes" 717 AC_MSG_RESULT([Inline Assembly]) 718 AC_DEFINE([CPU_INFO_BY_ASM], [1], [Get CPU Info by asm method])], 719 [AC_LINK_IFELSE([AC_LANG_PROGRAM([[ 720 #include <cpuid.h> 721 ]],[[ 722 unsigned int CPUInfo0; 723 unsigned int CPUInfo1; 724 unsigned int CPUInfo2; 725 unsigned int CPUInfo3; 726 unsigned int InfoType; 727 __get_cpuid(InfoType, &CPUInfo0, &CPUInfo1, &CPUInfo2, &CPUInfo3); 728 ]])], 729 [AC_MSG_RESULT([C method]) 730 AC_DEFINE([CPU_INFO_BY_C], [1], [Get CPU Info by c method])], 731 [AC_MSG_ERROR([no supported Get CPU Info method, please disable run-time CPU capabilities detection or intrinsics])])])]) 732 ], 733 [ 734 AC_MSG_WARN([No intrinsics support for your architecture]) 735 intrinsics_support="no" 736 ]) 737], 738[ 739 intrinsics_support="no" 740]) 741 742AM_CONDITIONAL([CPU_ARM], [test "$cpu_arm" = "yes"]) 743AM_CONDITIONAL([HAVE_ARM_NEON_INTR], 744 [test x"$OPUS_ARM_MAY_HAVE_NEON_INTR" = x"1"]) 745AM_CONDITIONAL([HAVE_ARM_NE10], 746 [test x"$HAVE_ARM_NE10" = x"1"]) 747AM_CONDITIONAL([HAVE_SSE], 748 [test x"$OPUS_X86_MAY_HAVE_SSE" = x"1"]) 749AM_CONDITIONAL([HAVE_SSE2], 750 [test x"$OPUS_X86_MAY_HAVE_SSE2" = x"1"]) 751AM_CONDITIONAL([HAVE_SSE4_1], 752 [test x"$OPUS_X86_MAY_HAVE_SSE4_1" = x"1"]) 753AM_CONDITIONAL([HAVE_AVX], 754 [test x"$OPUS_X86_MAY_HAVE_AVX" = x"1"]) 755 756AS_IF([test x"$enable_rtcd" = x"yes"],[ 757 AS_IF([test x"$rtcd_support" != x"no"],[ 758 AC_DEFINE([OPUS_HAVE_RTCD], [1], 759 [Use run-time CPU capabilities detection]) 760 OPUS_HAVE_RTCD=1 761 AC_SUBST(OPUS_HAVE_RTCD) 762 ]) 763],[ 764 rtcd_support="disabled" 765]) 766 767AC_ARG_ENABLE([assertions], 768 [AS_HELP_STRING([--enable-assertions],[enable additional software error checking])],, 769 [enable_assertions=no]) 770 771AS_IF([test "$enable_assertions" = "yes"], [ 772 AC_DEFINE([ENABLE_ASSERTIONS], [1], [Assertions]) 773]) 774 775AC_ARG_ENABLE([hardening], 776 [AS_HELP_STRING([--disable-hardening],[disable run-time checks that are cheap and safe for use in production])],, 777 [enable_hardening=yes]) 778 779AS_IF([test "$enable_hardening" = "yes"], [ 780 AC_DEFINE([ENABLE_HARDENING], [1], [Hardening]) 781]) 782 783AC_ARG_ENABLE([fuzzing], 784 [AS_HELP_STRING([--enable-fuzzing],[causes the encoder to make random decisions (do not use in production)])],, 785 [enable_fuzzing=no]) 786 787AS_IF([test "$enable_fuzzing" = "yes"], [ 788 AC_DEFINE([FUZZING], [1], [Fuzzing]) 789]) 790 791AC_ARG_ENABLE([check-asm], 792 [AS_HELP_STRING([--enable-check-asm], 793 [enable bit-exactness checks between optimized and c implementations])],, 794 [enable_check_asm=no]) 795 796AS_IF([test "$enable_check_asm" = "yes"], [ 797 AC_DEFINE([OPUS_CHECK_ASM], [1], [Run bit-exactness checks between optimized and c implementations]) 798]) 799 800AC_ARG_ENABLE([doc], 801 [AS_HELP_STRING([--disable-doc], [Do not build API documentation])],, 802 [enable_doc=yes]) 803 804AS_IF([test "$enable_doc" = "yes"], [ 805 AC_CHECK_PROG(HAVE_DOXYGEN, [doxygen], [yes], [no]) 806 AC_CHECK_PROG(HAVE_DOT, [dot], [yes], [no]) 807],[ 808 HAVE_DOXYGEN=no 809]) 810 811AM_CONDITIONAL([HAVE_DOXYGEN], [test "$HAVE_DOXYGEN" = "yes"]) 812 813AC_ARG_ENABLE([extra-programs], 814 [AS_HELP_STRING([--disable-extra-programs], [Do not build extra programs (demo and tests)])],, 815 [enable_extra_programs=yes]) 816 817AM_CONDITIONAL([EXTRA_PROGRAMS], [test "$enable_extra_programs" = "yes"]) 818 819 820AC_ARG_ENABLE([rfc8251], 821 AS_HELP_STRING([--disable-rfc8251], [Disable bitstream fixes from RFC 8251]),, 822 [enable_rfc8251=yes]) 823 824AS_IF([test "$enable_rfc8251" = "no"], [ 825 AC_DEFINE([DISABLE_UPDATE_DRAFT], [1], [Disable bitstream fixes from RFC 8251]) 826]) 827 828 829saved_CFLAGS="$CFLAGS" 830CFLAGS="$CFLAGS -fvisibility=hidden" 831AC_MSG_CHECKING([if ${CC} supports -fvisibility=hidden]) 832AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], 833 [ AC_MSG_RESULT([yes]) ], 834 [ AC_MSG_RESULT([no]) 835 CFLAGS="$saved_CFLAGS" 836 ]) 837 838on_x86=no 839case "$host_cpu" in 840i[[3456]]86 | x86_64) 841 on_x86=yes 842 ;; 843esac 844 845on_windows=no 846case $host in 847*cygwin*|*mingw*) 848 on_windows=yes 849 ;; 850esac 851 852dnl Enable stack-protector-all only on x86 where it's well supported. 853dnl on some platforms it causes crashes. Hopefully the OS's default's 854dnl include this on platforms that work but have been missed here. 855AC_ARG_ENABLE([stack-protector], 856 [AS_HELP_STRING([--disable-stack-protector],[Disable compiler stack hardening])],, 857 [ 858 AS_IF([test "$ac_cv_c_compiler_gnu" = "yes" && test "$on_x86" = "yes" && test "$on_windows" = "no"], 859 [enable_stack_protector=yes],[enable_stack_protector=no]) 860 ]) 861 862AS_IF([test "$enable_stack_protector" = "yes"], 863 [ 864 saved_CFLAGS="$CFLAGS" 865 CFLAGS="$CFLAGS -fstack-protector-strong" 866 AC_MSG_CHECKING([if ${CC} supports -fstack-protector-strong]) 867 AC_LINK_IFELSE([AC_LANG_PROGRAM([],[[char foo;]])], 868 [ AC_MSG_RESULT([yes]) ], 869 [ 870 AC_MSG_RESULT([no]) 871 enable_stack_protector=no 872 CFLAGS="$saved_CFLAGS" 873 ]) 874 ]) 875 876AS_IF([test x$ac_cv_c_compiler_gnu = xyes], 877 [AX_ADD_FORTIFY_SOURCE] 878) 879 880CFLAGS="$CFLAGS -W" 881 882warn_CFLAGS="-Wall -Wextra -Wcast-align -Wnested-externs -Wshadow -Wstrict-prototypes" 883saved_CFLAGS="$CFLAGS" 884CFLAGS="$CFLAGS $warn_CFLAGS" 885AC_MSG_CHECKING([if ${CC} supports ${warn_CFLAGS}]) 886AC_COMPILE_IFELSE([AC_LANG_SOURCE([[char foo;]])], 887 [ AC_MSG_RESULT([yes]) ], 888 [ AC_MSG_RESULT([no]) 889 CFLAGS="$saved_CFLAGS" 890 ]) 891 892saved_LIBS="$LIBS" 893LIBS="$LIBS $LIBM" 894AC_CHECK_FUNCS([lrintf]) 895AC_CHECK_FUNCS([lrint]) 896LIBS="$saved_LIBS" 897 898AC_CHECK_FUNCS([__malloc_hook]) 899 900AC_SUBST([PC_BUILD]) 901 902AC_CONFIG_FILES([ 903 Makefile 904 opus.pc 905 opus-uninstalled.pc 906 celt/arm/armopts.s 907 doc/Makefile 908 doc/Doxyfile 909]) 910AC_CONFIG_HEADERS([config.h]) 911 912AC_OUTPUT 913 914AC_MSG_NOTICE([ 915------------------------------------------------------------------------ 916 $PACKAGE_NAME $PACKAGE_VERSION: Automatic configuration OK. 917 918 Compiler support: 919 920 C99 var arrays: ................ ${has_var_arrays} 921 C99 lrintf: .................... ${ac_cv_func_lrintf} 922 Use alloca: .................... ${use_alloca} 923 924 General configuration: 925 926 Floating point support: ........ ${enable_float} 927 Fast float approximations: ..... ${enable_float_approx} 928 Fixed point debugging: ......... ${enable_fixed_point_debug} 929 Inline Assembly Optimizations: . ${inline_optimization} 930 External Assembly Optimizations: ${asm_optimization} 931 Intrinsics Optimizations: ...... ${intrinsics_support} 932 Run-time CPU detection: ........ ${rtcd_support} 933 Custom modes: .................. ${enable_custom_modes} 934 Assertion checking: ............ ${enable_assertions} 935 Hardening: ..................... ${enable_hardening} 936 Fuzzing: ....................... ${enable_fuzzing} 937 Check ASM: ..................... ${enable_check_asm} 938 939 API documentation: ............. ${enable_doc} 940 Extra programs: ................ ${enable_extra_programs} 941------------------------------------------------------------------------ 942 943 Type "make; make install" to compile and install 944 Type "make check" to run the test suite 945]) 946 947