configure: rework dxva in avconv handling
[ffmpeg.git] / configure
1 #!/bin/sh
2 #
3 # Libav configure script
4 #
5 # Copyright (c) 2000-2002 Fabrice Bellard
6 # Copyright (c) 2005-2008 Diego Biurrun
7 # Copyright (c) 2005-2008 Mans Rullgard
8 #
9
10 # Prevent locale nonsense from breaking basic text processing.
11 LC_ALL=C
12 export LC_ALL
13
14 # make sure we are running under a compatible shell
15 # try to make this part work with most shells
16
17 try_exec(){
18     echo "Trying shell $1"
19     type "$1" > /dev/null 2>&1 && exec "$@"
20 }
21
22 unset foo
23 (: ${foo%%bar}) 2> /dev/null
24 E1="$?"
25
26 (: ${foo?}) 2> /dev/null
27 E2="$?"
28
29 if test "$E1" != 0 || test "$E2" = 0; then
30     echo "Broken shell detected.  Trying alternatives."
31     export FF_CONF_EXEC
32     if test "0$FF_CONF_EXEC" -lt 1; then
33         FF_CONF_EXEC=1
34         try_exec bash "$0" "$@"
35     fi
36     if test "0$FF_CONF_EXEC" -lt 2; then
37         FF_CONF_EXEC=2
38         try_exec ksh "$0" "$@"
39     fi
40     if test "0$FF_CONF_EXEC" -lt 3; then
41         FF_CONF_EXEC=3
42         try_exec /usr/xpg4/bin/sh "$0" "$@"
43     fi
44     echo "No compatible shell script interpreter found."
45     echo "This configure script requires a POSIX-compatible shell"
46     echo "such as bash or ksh."
47     echo "THIS IS NOT A BUG IN LIBAV, DO NOT REPORT IT AS SUCH."
48     echo "Instead, install a working POSIX-compatible shell."
49     echo "Disabling this configure test will create a broken Libav."
50     if test "$BASH_VERSION" = '2.04.0(1)-release'; then
51         echo "This bash version ($BASH_VERSION) is broken on your platform."
52         echo "Upgrade to a later version if available."
53     fi
54     exit 1
55 fi
56
57 test -d /usr/xpg4/bin && PATH=/usr/xpg4/bin:$PATH
58
59 show_help(){
60     cat <<EOF
61 Usage: configure [options]
62 Options: [defaults in brackets after descriptions]
63
64 Help options:
65   --help                   print this message
66   --list-decoders          show all available decoders
67   --list-encoders          show all available encoders
68   --list-hwaccels          show all available hardware accelerators
69   --list-demuxers          show all available demuxers
70   --list-muxers            show all available muxers
71   --list-parsers           show all available parsers
72   --list-protocols         show all available protocols
73   --list-bsfs              show all available bitstream filters
74   --list-indevs            show all available input devices
75   --list-outdevs           show all available output devices
76   --list-filters           show all available filters
77
78 Standard options:
79   --logfile=FILE           log tests and output to FILE [config.log]
80   --disable-logging        do not log configure debug information
81   --prefix=PREFIX          install in PREFIX [$prefix]
82   --bindir=DIR             install binaries in DIR [PREFIX/bin]
83   --datadir=DIR            install data files in DIR [PREFIX/share/avconv]
84   --docdir=DIR             install documentation in DIR [PREFIX/share/doc/libav]
85   --libdir=DIR             install libs in DIR [PREFIX/lib]
86   --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
87   --incdir=DIR             install includes in DIR [PREFIX/include]
88   --mandir=DIR             install man page in DIR [PREFIX/share/man]
89
90 Licensing options:
91   --enable-gpl             allow use of GPL code, the resulting libs
92                            and binaries will be under GPL [no]
93   --enable-version3        upgrade (L)GPL to version 3 [no]
94   --enable-nonfree         allow use of nonfree code, the resulting libs
95                            and binaries will be unredistributable [no]
96
97 Configuration options:
98   --disable-static         do not build static libraries [no]
99   --enable-shared          build shared libraries [no]
100   --enable-small           optimize for size instead of speed
101   --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary)
102   --enable-gray            enable full grayscale support (slower color)
103   --disable-swscale-alpha  disable alpha channel support in swscale
104   --disable-all            disable building components, libraries and programs
105
106 Program options:
107   --disable-programs       do not build command line programs
108   --disable-avconv         disable avconv build
109   --disable-avplay         disable avplay build
110   --disable-avprobe        disable avprobe build
111   --disable-avserver       disable avserver build
112
113 Component options:
114   --disable-doc            do not build documentation
115   --disable-avdevice       disable libavdevice build
116   --disable-avcodec        disable libavcodec build
117   --disable-avformat       disable libavformat build
118   --disable-avutil         disable libavutil build
119   --disable-swscale        disable libswscale build
120   --disable-avfilter       disable video filter support [no]
121   --disable-avresample     disable libavresample build [no]
122   --disable-pthreads       disable pthreads [auto]
123   --disable-w32threads     disable Win32 threads [auto]
124   --disable-network        disable network support [no]
125   --disable-dct            disable DCT code
126   --disable-error-resilience disable error resilience code
127   --disable-lsp            disable LSP code
128   --disable-lzo            disable LZO decoder code
129   --disable-mdct           disable MDCT code
130   --disable-rdft           disable RDFT code
131   --disable-fft            disable FFT code
132
133 Hardware accelerators:
134   --enable-dxva2           enable DXVA2 code
135   --enable-vaapi           enable VAAPI code
136   --enable-vda             enable VDA code
137   --enable-vdpau           enable VDPAU code
138
139 Individual component options:
140   --disable-everything     disable all components listed below
141   --disable-encoder=NAME   disable encoder NAME
142   --enable-encoder=NAME    enable encoder NAME
143   --disable-encoders       disable all encoders
144   --disable-decoder=NAME   disable decoder NAME
145   --enable-decoder=NAME    enable decoder NAME
146   --disable-decoders       disable all decoders
147   --disable-hwaccel=NAME   disable hwaccel NAME
148   --enable-hwaccel=NAME    enable hwaccel NAME
149   --disable-hwaccels       disable all hwaccels
150   --disable-muxer=NAME     disable muxer NAME
151   --enable-muxer=NAME      enable muxer NAME
152   --disable-muxers         disable all muxers
153   --disable-demuxer=NAME   disable demuxer NAME
154   --enable-demuxer=NAME    enable demuxer NAME
155   --disable-demuxers       disable all demuxers
156   --enable-parser=NAME     enable parser NAME
157   --disable-parser=NAME    disable parser NAME
158   --disable-parsers        disable all parsers
159   --enable-bsf=NAME        enable bitstream filter NAME
160   --disable-bsf=NAME       disable bitstream filter NAME
161   --disable-bsfs           disable all bitstream filters
162   --enable-protocol=NAME   enable protocol NAME
163   --disable-protocol=NAME  disable protocol NAME
164   --disable-protocols      disable all protocols
165   --enable-indev=NAME      enable input device NAME
166   --disable-indev=NAME     disable input device NAME
167   --disable-indevs         disable input devices
168   --enable-outdev=NAME     enable output device NAME
169   --disable-outdev=NAME    disable output device NAME
170   --disable-outdevs        disable output devices
171   --disable-devices        disable all devices
172   --enable-filter=NAME     enable filter NAME
173   --disable-filter=NAME    disable filter NAME
174   --disable-filters        disable all filters
175
176 External library support:
177   --enable-avisynth        enable reading of AviSynth script files [no]
178   --enable-bzlib           enable bzlib [autodetect]
179   --enable-frei0r          enable frei0r video filtering
180   --enable-gnutls          enable gnutls [no]
181   --enable-libcdio         enable audio CD grabbing with libcdio
182   --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
183                            and libraw1394 [no]
184   --enable-libfaac         enable AAC encoding via libfaac [no]
185   --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
186   --enable-libfreetype     enable libfreetype [no]
187   --enable-libgsm          enable GSM de/encoding via libgsm [no]
188   --enable-libilbc         enable iLBC de/encoding via libilbc [no]
189   --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
190   --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
191   --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
192   --enable-libopencv       enable video filtering via libopencv [no]
193   --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
194   --enable-libopus         enable Opus decoding via libopus [no]
195   --enable-libpulse        enable Pulseaudio input via libpulse [no]
196   --enable-librtmp         enable RTMP[E] support via librtmp [no]
197   --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
198   --enable-libspeex        enable Speex de/encoding via libspeex [no]
199   --enable-libtheora       enable Theora encoding via libtheora [no]
200   --enable-libtwolame      enable MP2 encoding via libtwolame [no]
201   --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
202   --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
203   --enable-libvorbis       enable Vorbis encoding via libvorbis [no]
204   --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
205   --enable-libwavpack      enable wavpack encoding via libwavpack [no]
206   --enable-libwebp         enable WebP encoding via libwebp [no]
207   --enable-libx264         enable H.264 encoding via x264 [no]
208   --enable-libx265         enable HEVC encoding via x265 [no]
209   --enable-libxavs         enable AVS encoding via xavs [no]
210   --enable-libxvid         enable Xvid encoding via xvidcore,
211                            native MPEG-4/Xvid encoder exists [no]
212   --enable-openssl         enable openssl [no]
213   --enable-x11grab         enable X11 grabbing [no]
214   --enable-zlib            enable zlib [autodetect]
215
216 Toolchain options:
217   --arch=ARCH              select architecture [$arch]
218   --cpu=CPU                select the minimum required CPU (affects
219                            instruction selection, may crash on older CPUs)
220   --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
221   --enable-cross-compile   assume a cross-compiler is used
222   --sysroot=PATH           root of cross-build tree
223   --sysinclude=PATH        location of cross-build system headers
224   --target-os=OS           compiler targets OS [$target_os]
225   --target-exec=CMD        command to run executables on target
226   --target-path=DIR        path to view of build directory on target
227   --target-samples=DIR     path to samples directory on target
228   --toolchain=NAME         set tool defaults according to NAME
229   --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [$pkg_config_default]
230   --nm=NM                  use nm tool
231   --ar=AR                  use archive tool AR [$ar_default]
232   --as=AS                  use assembler AS [$as_default]
233   --cc=CC                  use C compiler CC [$cc_default]
234   --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
235   --ld=LD                  use linker LD
236   --pkg-config=PKGCONF     use pkg-config PKGCONF [$pkg_config_default]
237   --pkg-config-flags=FLAGS pass additional flags to pkgconf []
238   --host-cc=HOSTCC         use host C compiler HOSTCC
239   --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
240   --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
241   --host-ld=HOSTLD         use host linker HOSTLD
242   --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
243   --host-libs=HLIBS        use libs HLIBS when linking for host
244   --host-os=OS             compiler host OS [$target_os]
245   --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
246   --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
247   --extra-libs=ELIBS       add ELIBS [$ELIBS]
248   --extra-version=STRING   version string suffix []
249   --optflags=OPTFLAGS      override optimization-related compiler flags
250   --build-suffix=SUFFIX    library name suffix []
251   --enable-pic             build position-independent code
252   --enable-thumb           compile for Thumb instruction set
253   --enable-lto             use link-time optimization
254
255 Advanced options (experts only):
256   --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
257   --disable-symver         disable symbol versioning
258   --enable-hardcoded-tables use hardcoded tables instead of runtime generation
259   --disable-safe-bitstream-reader
260                            disable buffer boundary checking in bitreaders
261                            (faster, but may crash)
262   --enable-memalign-hack   emulate memalign, interferes with memory debuggers
263   --enable-sram            allow use of on-chip SRAM
264
265 Optimization options (experts only):
266   --disable-asm            disable all assembler optimizations
267   --disable-altivec        disable AltiVec optimizations
268   --disable-amd3dnow       disable 3DNow! optimizations
269   --disable-amd3dnowext    disable 3DNow! extended optimizations
270   --disable-mmx            disable MMX optimizations
271   --disable-mmxext         disable MMXEXT optimizations
272   --disable-sse            disable SSE optimizations
273   --disable-sse2           disable SSE2 optimizations
274   --disable-sse3           disable SSE3 optimizations
275   --disable-ssse3          disable SSSE3 optimizations
276   --disable-sse4           disable SSE4 optimizations
277   --disable-sse42          disable SSE4.2 optimizations
278   --disable-avx            disable AVX optimizations
279   --disable-xop            disable XOP optimizations
280   --disable-fma3           disable FMA3 optimizations
281   --disable-fma4           disable FMA4 optimizations
282   --disable-avx2           disable AVX2 optimizations
283   --disable-armv5te        disable armv5te optimizations
284   --disable-armv6          disable armv6 optimizations
285   --disable-armv6t2        disable armv6t2 optimizations
286   --disable-vfp            disable VFP optimizations
287   --disable-neon           disable NEON optimizations
288   --disable-inline-asm     disable use of inline assembler
289   --disable-yasm           disable use of yasm assembler
290
291 Developer options (useful when working on Libav itself):
292   --disable-debug          disable debugging symbols
293   --enable-debug=LEVEL     set the debug level [$debuglevel]
294   --disable-optimizations  disable compiler optimizations
295   --enable-extra-warnings  enable more compiler warnings
296   --samples=PATH           location of test samples for FATE, if not set use
297                            \$LIBAV_SAMPLES at make invocation time.
298   --enable-neon-clobber-test check NEON registers for clobbering (should be
299                            used only for debugging purposes)
300   --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
301                            should be used only for debugging purposes)
302   --enable-random          randomly enable/disable components
303   --disable-random
304   --enable-random=LIST     randomly enable/disable specific components or
305   --disable-random=LIST    component groups. LIST is a comma-separated list
306                            of NAME[:PROB] entries where NAME is a component
307                            (group) and PROB the probability associated with
308                            NAME (default 0.5).
309   --random-seed=VALUE      seed value for --enable/disable-random
310
311 NOTE: Object files are built at the place where configure is launched.
312 EOF
313   exit 0
314 }
315
316 quotes='""'
317
318 log(){
319     echo "$@" >> $logfile
320 }
321
322 log_file(){
323     log BEGIN $1
324     pr -n -t $1 >> $logfile
325     log END $1
326 }
327
328 echolog(){
329     log "$@"
330     echo "$@"
331 }
332
333 warn(){
334     log "WARNING: $*"
335     WARNINGS="${WARNINGS}WARNING: $*\n"
336 }
337
338 die(){
339     echolog "$@"
340     cat <<EOF
341
342 If you think configure made a mistake, make sure you are using the latest
343 version from Git.  If the latest version fails, report the problem to the
344 libav-tools@libav.org mailing list or IRC #libav on irc.freenode.net.
345 EOF
346     if disabled logging; then
347         cat <<EOF
348 Rerun configure with logging enabled (do not use --disable-logging), and
349 include the log this produces with your report.
350 EOF
351     else
352         cat <<EOF
353 Include the log file "$logfile" produced by configure as this will help
354 solving the problem.
355 EOF
356     fi
357     exit 1
358 }
359
360 # Avoid locale weirdness, besides we really just want to translate ASCII.
361 toupper(){
362     echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
363 }
364
365 tolower(){
366     echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
367 }
368
369 c_escape(){
370     echo "$*" | sed 's/["\\]/\\\0/g'
371 }
372
373 sh_quote(){
374     v=$(echo "$1" | sed "s/'/'\\\\''/g")
375     test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
376     echo "$v"
377 }
378
379 cleanws(){
380     echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//'
381 }
382
383 filter(){
384     pat=$1
385     shift
386     for v; do
387         eval "case $v in $pat) echo $v ;; esac"
388     done
389 }
390
391 filter_out(){
392     pat=$1
393     shift
394     for v; do
395         eval "case $v in $pat) ;; *) echo $v ;; esac"
396     done
397 }
398
399 map(){
400     m=$1
401     shift
402     for v; do eval $m; done
403 }
404
405 add_suffix(){
406     suffix=$1
407     shift
408     for v; do echo ${v}${suffix}; done
409 }
410
411 set_all(){
412     value=$1
413     shift
414     for var in $*; do
415         eval $var=$value
416     done
417 }
418
419 set_weak(){
420     value=$1
421     shift
422     for var; do
423         eval : \${$var:=$value}
424     done
425 }
426
427 sanitize_var_name(){
428     echo $@ | sed 's/[^A-Za-z0-9_]/_/g'
429 }
430
431 set_safe(){
432     var=$1
433     shift
434     eval $(sanitize_var_name "$var")='$*'
435 }
436
437 get_safe(){
438     eval echo \$$(sanitize_var_name "$1")
439 }
440
441 pushvar(){
442     for pvar in $*; do
443         eval level=\${${pvar}_level:=0}
444         eval ${pvar}_${level}="\$$pvar"
445         eval ${pvar}_level=$(($level+1))
446     done
447 }
448
449 popvar(){
450     for pvar in $*; do
451         eval level=\${${pvar}_level:-0}
452         test $level = 0 && continue
453         eval level=$(($level-1))
454         eval $pvar="\${${pvar}_${level}}"
455         eval ${pvar}_level=$level
456         eval unset ${pvar}_${level}
457     done
458 }
459
460 enable(){
461     set_all yes $*
462 }
463
464 disable(){
465     set_all no $*
466 }
467
468 enable_weak(){
469     set_weak yes $*
470 }
471
472 disable_weak(){
473     set_weak no $*
474 }
475
476 enable_safe(){
477     for var; do
478         enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
479     done
480 }
481
482 disable_safe(){
483     for var; do
484         disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
485     done
486 }
487
488 do_enable_deep(){
489     for var; do
490         enabled $var && continue
491         eval sel="\$${var}_select"
492         eval sgs="\$${var}_suggest"
493         pushvar var sgs
494         enable_deep $sel
495         popvar sgs
496         enable_deep_weak $sgs
497         popvar var
498     done
499 }
500
501 enable_deep(){
502     do_enable_deep $*
503     enable $*
504 }
505
506 enable_deep_weak(){
507     for var; do
508         disabled $var && continue
509         pushvar var
510         do_enable_deep $var
511         popvar var
512         enable_weak $var
513     done
514 }
515
516 enabled(){
517     test "${1#!}" = "$1" && op== || op=!=
518     eval test "x\$${1#!}" $op "xyes"
519 }
520
521 disabled(){
522     test "${1#!}" = "$1" && op== || op=!=
523     eval test "x\$${1#!}" $op "xno"
524 }
525
526 enabled_all(){
527     for opt; do
528         enabled $opt || return 1
529     done
530 }
531
532 disabled_all(){
533     for opt; do
534         disabled $opt || return 1
535     done
536 }
537
538 enabled_any(){
539     for opt; do
540         enabled $opt && return 0
541     done
542 }
543
544 disabled_any(){
545     for opt; do
546         disabled $opt && return 0
547     done
548     return 1
549 }
550
551 set_default(){
552     for opt; do
553         eval : \${$opt:=\$${opt}_default}
554     done
555 }
556
557 is_in(){
558     value=$1
559     shift
560     for var in $*; do
561         [ $var = $value ] && return 0
562     done
563     return 1
564 }
565
566 do_check_deps(){
567     for cfg; do
568         cfg="${cfg#!}"
569         enabled ${cfg}_checking && die "Circular dependency for $cfg."
570         disabled ${cfg}_checking && continue
571         enable ${cfg}_checking
572         append allopts $cfg
573
574         eval dep_all="\$${cfg}_deps"
575         eval dep_any="\$${cfg}_deps_any"
576         eval dep_sel="\$${cfg}_select"
577         eval dep_sgs="\$${cfg}_suggest"
578         eval dep_ifa="\$${cfg}_if"
579         eval dep_ifn="\$${cfg}_if_any"
580
581         pushvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
582         do_check_deps $dep_all $dep_any $dep_sel $dep_sgs $dep_ifa $dep_ifn
583         popvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
584
585         [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
586         [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
587         enabled_all  $dep_all || disable $cfg
588         enabled_any  $dep_any || disable $cfg
589         disabled_any $dep_sel && disable $cfg
590
591         if enabled $cfg; then
592             enable_deep $dep_sel
593             enable_deep_weak $dep_sgs
594         fi
595
596         disable ${cfg}_checking
597     done
598 }
599
600 check_deps(){
601     unset allopts
602
603     do_check_deps "$@"
604
605     for cfg in $allopts; do
606         enabled $cfg || continue
607         eval dep_extralibs="\$${cfg}_extralibs"
608         test -n "$dep_extralibs" && add_extralibs $dep_extralibs
609     done
610 }
611
612 print_config(){
613     pfx=$1
614     files=$2
615     shift 2
616     map 'eval echo "$v \${$v:-no}"' "$@" |
617     awk "BEGIN { split(\"$files\", files) }
618         {
619             c = \"$pfx\" toupper(\$1);
620             v = \$2;
621             sub(/yes/, 1, v);
622             sub(/no/,  0, v);
623             for (f in files) {
624                 file = files[f];
625                 if (file ~ /\\.h\$/) {
626                     printf(\"#define %s %d\\n\", c, v) >>file;
627                 } else if (file ~ /\\.asm\$/) {
628                     printf(\"%%define %s %d\\n\", c, v) >>file;
629                 } else if (file ~ /\\.mak\$/) {
630                     n = -v ? \"\" : \"!\";
631                     printf(\"%s%s=yes\\n\", n, c) >>file;
632                 }
633             }
634         }"
635 }
636
637 print_enabled(){
638     suf=$1
639     shift
640     for v; do
641         enabled $v && printf "%s\n" ${v%$suf};
642     done
643 }
644
645 append(){
646     var=$1
647     shift
648     eval "$var=\"\$$var $*\""
649 }
650
651 prepend(){
652     var=$1
653     shift
654     eval "$var=\"$* \$$var\""
655 }
656
657 add_cppflags(){
658     append CPPFLAGS "$@"
659 }
660
661 add_cflags(){
662     append CFLAGS $($cflags_filter "$@")
663 }
664
665 add_asflags(){
666     append ASFLAGS $($asflags_filter "$@")
667 }
668
669 add_ldflags(){
670     append LDFLAGS $($ldflags_filter "$@")
671 }
672
673 add_stripflags(){
674     append STRIPFLAGS "$@"
675 }
676
677 add_extralibs(){
678     prepend extralibs $($ldflags_filter "$@")
679 }
680
681 add_host_cppflags(){
682     append host_cppflags "$@"
683 }
684
685 add_host_cflags(){
686     append host_cflags $($host_cflags_filter "$@")
687 }
688
689 add_host_ldflags(){
690     append host_ldflags $($host_ldflags_filter "$@")
691 }
692
693 add_compat(){
694     append compat_objs $1
695     shift
696     map 'add_cppflags -D$v' "$@"
697 }
698
699 check_cmd(){
700     log "$@"
701     "$@" >> $logfile 2>&1
702 }
703
704 cc_o(){
705     eval printf '%s\\n' $CC_O
706 }
707
708 cc_e(){
709     eval printf '%s\\n' $CC_E
710 }
711
712 check_cc(){
713     log check_cc "$@"
714     cat > $TMPC
715     log_file $TMPC
716     check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
717 }
718
719 check_cpp(){
720     log check_cpp "$@"
721     cat > $TMPC
722     log_file $TMPC
723     check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
724 }
725
726 as_o(){
727     eval printf '%s\\n' $AS_O
728 }
729
730 check_as(){
731     log check_as "$@"
732     cat > $TMPS
733     log_file $TMPS
734     check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
735 }
736
737 check_inline_asm(){
738     log check_inline_asm "$@"
739     name="$1"
740     code="$2"
741     shift 2
742     disable $name
743     check_cc "$@" <<EOF && enable $name
744 void foo(void){ __asm__ volatile($code); }
745 EOF
746 }
747
748 check_insn(){
749     log check_insn "$@"
750     check_inline_asm ${1}_inline "\"$2\""
751     echo "$2" | check_as && enable ${1}_external || disable ${1}_external
752 }
753
754 check_yasm(){
755     log check_yasm "$@"
756     echo "$1" > $TMPS
757     log_file $TMPS
758     shift 1
759     check_cmd $yasmexe $YASMFLAGS "$@" -o $TMPO $TMPS
760 }
761
762 ld_o(){
763     eval printf '%s\\n' $LD_O
764 }
765
766 check_ld(){
767     log check_ld "$@"
768     flags=$(filter_out '-l*' "$@")
769     libs=$(filter '-l*' "$@")
770     check_cc $($cflags_filter $flags) || return
771     flags=$($ldflags_filter $flags)
772     libs=$($ldflags_filter $libs)
773     check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
774 }
775
776 print_include(){
777     hdr=$1
778     test "${hdr%.h}" = "${hdr}" &&
779         echo "#include $hdr"    ||
780         echo "#include <$hdr>"
781 }
782
783 check_code(){
784     log check_code "$@"
785     check=$1
786     headers=$2
787     code=$3
788     shift 3
789     {
790         for hdr in $headers; do
791             print_include $hdr
792         done
793         echo "int main(void) { $code; return 0; }"
794     } | check_$check "$@"
795 }
796
797 check_cppflags(){
798     log check_cppflags "$@"
799     check_cc "$@" <<EOF && append CPPFLAGS "$@"
800 int x;
801 EOF
802 }
803
804 test_cflags(){
805     log test_cflags "$@"
806     set -- $($cflags_filter "$@")
807     check_cc "$@" <<EOF
808 int x;
809 EOF
810 }
811
812 check_cflags(){
813     log check_cflags "$@"
814     test_cflags "$@" && add_cflags "$@"
815 }
816
817 test_ldflags(){
818     log test_ldflags "$@"
819     check_ld "$@" <<EOF
820 int main(void){ return 0; }
821 EOF
822 }
823
824 check_ldflags(){
825     log check_ldflags "$@"
826     test_ldflags "$@" && add_ldflags "$@"
827 }
828
829 test_stripflags(){
830     log test_stripflags "$@"
831     # call check_cc to get a fresh TMPO
832     check_cc <<EOF
833 int main(void) { return 0; }
834 EOF
835     check_cmd $strip $STRIPFLAGS "$@" $TMPO
836 }
837
838 check_stripflags(){
839     log check_stripflags "$@"
840     test_stripflags "$@" && add_stripflags "$@"
841 }
842
843 check_header(){
844     log check_header "$@"
845     header=$1
846     shift
847     disable_safe $header
848     check_cpp "$@" <<EOF && enable_safe $header
849 #include <$header>
850 int x;
851 EOF
852 }
853
854 check_func(){
855     log check_func "$@"
856     func=$1
857     shift
858     disable $func
859     check_ld "$@" <<EOF && enable $func
860 extern int $func();
861 int main(void){ $func(); }
862 EOF
863 }
864
865 check_mathfunc(){
866     log check_mathfunc "$@"
867     func=$1
868     narg=$2
869     shift 2
870     test $narg = 2 && args="f, g" || args="f"
871     disable $func
872     check_ld "$@" <<EOF && enable $func
873 #include <math.h>
874 float foo(float f, float g) { return $func($args); }
875 int main(void){ return 0; }
876 EOF
877 }
878
879 check_func_headers(){
880     log check_func_headers "$@"
881     headers=$1
882     funcs=$2
883     shift 2
884     {
885         for hdr in $headers; do
886             print_include $hdr
887         done
888         for func in $funcs; do
889             echo "long check_$func(void) { return (long) $func; }"
890         done
891         echo "int main(void) { return 0; }"
892     } | check_ld "$@" && enable $funcs && enable_safe $headers
893 }
894
895 check_cpp_condition(){
896     log check_cpp_condition "$@"
897     header=$1
898     condition=$2
899     shift 2
900     check_cpp "$@" <<EOF
901 #include <$header>
902 #if !($condition)
903 #error "unsatisfied condition: $condition"
904 #endif
905 EOF
906 }
907
908 check_lib(){
909     log check_lib "$@"
910     header="$1"
911     func="$2"
912     shift 2
913     check_header $header && check_func $func "$@" && add_extralibs "$@"
914 }
915
916 check_lib2(){
917     log check_lib2 "$@"
918     headers="$1"
919     funcs="$2"
920     shift 2
921     check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
922 }
923
924 check_pkg_config(){
925     log check_pkg_config "$@"
926     pkg="$1"
927     headers="$2"
928     funcs="$3"
929     shift 3
930     check_cmd $pkg_config --exists --print-errors $pkg || return
931     pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
932     pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
933     check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
934         set_safe ${pkg}_cflags $pkg_cflags   &&
935         set_safe ${pkg}_libs   $pkg_libs
936 }
937
938 check_exec(){
939     check_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
940 }
941
942 check_exec_crash(){
943     code=$(cat)
944
945     # exit() is not async signal safe.  _Exit (C99) and _exit (POSIX)
946     # are safe but may not be available everywhere.  Thus we use
947     # raise(SIGTERM) instead.  The check is run in a subshell so we
948     # can redirect the "Terminated" message from the shell.  SIGBUS
949     # is not defined by standard C so it is used conditionally.
950
951     (check_exec "$@") >> $logfile 2>&1 <<EOF
952 #include <signal.h>
953 static void sighandler(int sig){
954     raise(SIGTERM);
955 }
956 int foo(void){
957     $code
958 }
959 int (*func_ptr)(void) = foo;
960 int main(void){
961     signal(SIGILL, sighandler);
962     signal(SIGFPE, sighandler);
963     signal(SIGSEGV, sighandler);
964 #ifdef SIGBUS
965     signal(SIGBUS, sighandler);
966 #endif
967     return func_ptr();
968 }
969 EOF
970 }
971
972 check_type(){
973     log check_type "$@"
974     headers=$1
975     type=$2
976     shift 2
977     disable_safe "$type"
978     check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
979 }
980
981 check_struct(){
982     log check_struct "$@"
983     headers=$1
984     struct=$2
985     member=$3
986     shift 3
987     disable_safe "${struct}_${member}"
988     check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
989         enable_safe "${struct}_${member}"
990 }
991
992 check_builtin(){
993     log check_builtin "$@"
994     name=$1
995     headers=$2
996     builtin=$3
997     shift 3
998     disable "$name"
999     check_code ld "$headers" "$builtin" "$@" && enable "$name"
1000 }
1001
1002 check_compile_assert(){
1003     log check_compile_assert "$@"
1004     name=$1
1005     headers=$2
1006     condition=$3
1007     shift 3
1008     disable "$name"
1009     check_code cc "$headers" "char c[2 * !!($condition) - 1]" "$@" && enable "$name"
1010 }
1011
1012 require(){
1013     name="$1"
1014     header="$2"
1015     func="$3"
1016     shift 3
1017     check_lib $header $func "$@" || die "ERROR: $name not found"
1018 }
1019
1020 require2(){
1021     name="$1"
1022     headers="$2"
1023     func="$3"
1024     shift 3
1025     check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
1026 }
1027
1028 require_pkg_config(){
1029     pkg="$1"
1030     check_pkg_config "$@" || die "ERROR: $pkg not found"
1031     add_cflags    $(get_safe ${pkg}_cflags)
1032     add_extralibs $(get_safe ${pkg}_libs)
1033 }
1034
1035 hostcc_e(){
1036     eval printf '%s\\n' $HOSTCC_E
1037 }
1038
1039 hostcc_o(){
1040     eval printf '%s\\n' $HOSTCC_O
1041 }
1042
1043 check_host_cc(){
1044     log check_host_cc "$@"
1045     cat > $TMPC
1046     log_file $TMPC
1047     check_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
1048 }
1049
1050 check_host_cpp(){
1051     log check_host_cpp "$@"
1052     cat > $TMPC
1053     log_file $TMPC
1054     check_cmd $host_cc $HOSTCPPFLAGS $HOSTCFLAGS "$@" $(hostcc_e $TMPO) $TMPC
1055 }
1056
1057 check_host_cppflags(){
1058     log check_host_cppflags "$@"
1059     check_host_cc "$@" <<EOF && append host_cppflags "$@"
1060 int x;
1061 EOF
1062 }
1063
1064 check_host_cflags(){
1065     log check_host_cflags "$@"
1066     set -- $($host_cflags_filter "$@")
1067     check_host_cc "$@" <<EOF && append host_cflags "$@"
1068 int x;
1069 EOF
1070 }
1071
1072 check_host_cpp_condition(){
1073     log check_host_cpp_condition "$@"
1074     header=$1
1075     condition=$2
1076     shift 2
1077     check_host_cpp "$@" <<EOF
1078 #include <$header>
1079 #if !($condition)
1080 #error "unsatisfied condition: $condition"
1081 #endif
1082 EOF
1083 }
1084
1085 apply(){
1086     file=$1
1087     shift
1088     "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
1089 }
1090
1091 cp_if_changed(){
1092     cmp -s "$1" "$2" && echo "$2 is unchanged" && return
1093     mkdir -p "$(dirname $2)"
1094     $cp_f "$1" "$2"
1095 }
1096
1097 # CONFIG_LIST contains configurable options, while HAVE_LIST is for
1098 # system-dependent things.
1099
1100 COMPONENT_LIST="
1101     bsfs
1102     decoders
1103     demuxers
1104     encoders
1105     filters
1106     hwaccels
1107     indevs
1108     muxers
1109     outdevs
1110     parsers
1111     protocols
1112 "
1113
1114 EXAMPLE_LIST="
1115     avcodec_example
1116     filter_audio_example
1117     metadata_example
1118     output_example
1119     transcode_aac_example
1120 "
1121
1122 EXTERNAL_LIBRARY_LIST="
1123     avisynth
1124     bzlib
1125     frei0r
1126     gnutls
1127     libcdio
1128     libdc1394
1129     libfaac
1130     libfdk_aac
1131     libfontconfig
1132     libfreetype
1133     libgsm
1134     libilbc
1135     libmp3lame
1136     libopencore_amrnb
1137     libopencore_amrwb
1138     libopencv
1139     libopenjpeg
1140     libopus
1141     libpulse
1142     librtmp
1143     libschroedinger
1144     libspeex
1145     libtheora
1146     libtwolame
1147     libvo_aacenc
1148     libvo_amrwbenc
1149     libvorbis
1150     libvpx
1151     libwavpack
1152     libwebp
1153     libx264
1154     libx265
1155     libxavs
1156     libxvid
1157     openssl
1158     x11grab
1159     zlib
1160 "
1161
1162 FEATURE_LIST="
1163     gray
1164     hardcoded_tables
1165     runtime_cpudetect
1166     safe_bitstream_reader
1167     shared
1168     small
1169     sram
1170     static
1171     swscale_alpha
1172 "
1173
1174 HWACCEL_LIST="
1175     dxva2
1176     vaapi
1177     vda
1178     vdpau
1179 "
1180
1181 LIBRARY_LIST="
1182     avcodec
1183     avdevice
1184     avfilter
1185     avformat
1186     avresample
1187     avutil
1188     swscale
1189 "
1190
1191 LICENSE_LIST="
1192     gpl
1193     nonfree
1194     version3
1195 "
1196
1197 PROGRAM_LIST="
1198     avconv
1199     avplay
1200     avprobe
1201     avserver
1202 "
1203
1204 SUBSYSTEM_LIST="
1205     dct
1206     doc
1207     error_resilience
1208     fft
1209     lsp
1210     lzo
1211     mdct
1212     network
1213     rdft
1214 "
1215
1216 CONFIG_LIST="
1217     $COMPONENT_LIST
1218     $EXAMPLE_LIST
1219     $EXTERNAL_LIBRARY_LIST
1220     $FEATURE_LIST
1221     $HWACCEL_LIST
1222     $LICENSE_LIST
1223     $LIBRARY_LIST
1224     $PROGRAM_LIST
1225     $SUBSYSTEM_LIST
1226     memalign_hack
1227     neon_clobber_test
1228     pic
1229     pod2man
1230     texi2html
1231     thumb
1232     xmm_clobber_test
1233 "
1234
1235 THREADS_LIST="
1236     pthreads
1237     w32threads
1238 "
1239
1240 ATOMICS_LIST="
1241     atomics_gcc
1242     atomics_suncc
1243     atomics_win32
1244 "
1245
1246 ARCH_LIST="
1247     aarch64
1248     alpha
1249     arm
1250     avr32
1251     avr32_ap
1252     avr32_uc
1253     bfin
1254     ia64
1255     m68k
1256     mips
1257     mips64
1258     parisc
1259     ppc
1260     ppc64
1261     s390
1262     sh4
1263     sparc
1264     sparc64
1265     tilegx
1266     tilepro
1267     tomi
1268     x86
1269     x86_32
1270     x86_64
1271 "
1272
1273 ARCH_EXT_LIST_ARM="
1274     armv5te
1275     armv6
1276     armv6t2
1277     armv8
1278     neon
1279     vfp
1280     vfpv3
1281 "
1282
1283 ARCH_EXT_LIST_X86_SIMD="
1284     amd3dnow
1285     amd3dnowext
1286     avx
1287     avx2
1288     fma3
1289     fma4
1290     mmx
1291     mmxext
1292     sse
1293     sse2
1294     sse3
1295     sse4
1296     sse42
1297     ssse3
1298     xop
1299 "
1300
1301 ARCH_EXT_LIST_PPC="
1302     altivec
1303     dcbzl
1304     ldbrx
1305     ppc4xx
1306 "
1307
1308 ARCH_EXT_LIST_X86="
1309     $ARCH_EXT_LIST_X86_SIMD
1310     cpunop
1311     i686
1312 "
1313
1314 ARCH_EXT_LIST="
1315     $ARCH_EXT_LIST_ARM
1316     $ARCH_EXT_LIST_PPC
1317     $ARCH_EXT_LIST_X86
1318     loongson
1319     vis
1320 "
1321
1322 ARCH_FEATURES="
1323     aligned_stack
1324     fast_64bit
1325     fast_clz
1326     fast_cmov
1327     local_aligned_8
1328     local_aligned_16
1329 "
1330
1331 BUILTIN_LIST="
1332     atomic_cas_ptr
1333     machine_rw_barrier
1334     MemoryBarrier
1335     mm_empty
1336     rdtsc
1337     sync_val_compare_and_swap
1338 "
1339 HAVE_LIST_CMDLINE="
1340     inline_asm
1341     symver
1342     yasm
1343 "
1344
1345 HAVE_LIST_PUB="
1346     bigendian
1347     fast_unaligned
1348 "
1349
1350 HEADERS_LIST="
1351     alsa_asoundlib_h
1352     altivec_h
1353     arpa_inet_h
1354     cdio_paranoia_h
1355     cdio_paranoia_paranoia_h
1356     dev_bktr_ioctl_bt848_h
1357     dev_bktr_ioctl_meteor_h
1358     dev_ic_bt8xx_h
1359     dev_video_bktr_ioctl_bt848_h
1360     dev_video_meteor_ioctl_meteor_h
1361     direct_h
1362     dlfcn_h
1363     dxva_h
1364     gsm_h
1365     io_h
1366     mach_mach_time_h
1367     machine_ioctl_bt848_h
1368     machine_ioctl_meteor_h
1369     malloc_h
1370     poll_h
1371     sndio_h
1372     soundcard_h
1373     sys_mman_h
1374     sys_param_h
1375     sys_resource_h
1376     sys_select_h
1377     sys_soundcard_h
1378     sys_time_h
1379     sys_un_h
1380     sys_videoio_h
1381     unistd_h
1382     windows_h
1383     winsock2_h
1384 "
1385
1386 MATH_FUNCS="
1387     atanf
1388     atan2f
1389     cbrtf
1390     cosf
1391     exp2
1392     exp2f
1393     expf
1394     isinf
1395     isnan
1396     ldexpf
1397     llrint
1398     llrintf
1399     log2
1400     log2f
1401     log10f
1402     lrint
1403     lrintf
1404     powf
1405     rint
1406     round
1407     roundf
1408     sinf
1409     trunc
1410     truncf
1411 "
1412
1413 SYSTEM_FUNCS="
1414     aligned_malloc
1415     closesocket
1416     CommandLineToArgvW
1417     CoTaskMemFree
1418     CryptGenRandom
1419     dlopen
1420     fcntl
1421     flt_lim
1422     fork
1423     getaddrinfo
1424     gethrtime
1425     getopt
1426     GetProcessAffinityMask
1427     GetProcessMemoryInfo
1428     GetProcessTimes
1429     getrusage
1430     getservbyport
1431     GetSystemTimeAsFileTime
1432     gettimeofday
1433     inet_aton
1434     isatty
1435     jack_port_get_latency_range
1436     localtime_r
1437     mach_absolute_time
1438     MapViewOfFile
1439     memalign
1440     mkstemp
1441     mmap
1442     mprotect
1443     nanosleep
1444     posix_memalign
1445     sched_getaffinity
1446     SetConsoleTextAttribute
1447     setmode
1448     setrlimit
1449     Sleep
1450     strerror_r
1451     strptime
1452     sysconf
1453     sysctl
1454     usleep
1455     VirtualAlloc
1456 "
1457
1458 TOOLCHAIN_FEATURES="
1459     asm_mod_q
1460     attribute_may_alias
1461     attribute_packed
1462     ebp_available
1463     ebx_available
1464     gnu_as
1465     ibm_asm
1466     inline_asm_labels
1467     pragma_deprecated
1468     symver_asm_label
1469     symver_gnu_asm
1470     vfp_args
1471     xform_asm
1472     xmm_clobbers
1473 "
1474
1475 TYPES_LIST="
1476     socklen_t
1477     struct_addrinfo
1478     struct_group_source_req
1479     struct_ip_mreq_source
1480     struct_ipv6_mreq
1481     struct_pollfd
1482     struct_rusage_ru_maxrss
1483     struct_sockaddr_in6
1484     struct_sockaddr_sa_len
1485     struct_sockaddr_storage
1486     struct_v4l2_frmivalenum_discrete
1487 "
1488
1489 HAVE_LIST="
1490     $ARCH_EXT_LIST
1491     $(add_suffix _external $ARCH_EXT_LIST)
1492     $(add_suffix _inline   $ARCH_EXT_LIST)
1493     $ARCH_FEATURES
1494     $ATOMICS_LIST
1495     $BUILTIN_LIST
1496     $HAVE_LIST_CMDLINE
1497     $HAVE_LIST_PUB
1498     $HEADERS_LIST
1499     $MATH_FUNCS
1500     $SYSTEM_FUNCS
1501     $THREADS_LIST
1502     $TOOLCHAIN_FEATURES
1503     $TYPES_LIST
1504     atomics_native
1505     dos_paths
1506     dxva2_lib
1507     libc_msvcrt
1508     libdc1394_1
1509     libdc1394_2
1510     sdl
1511     threads
1512     vdpau_x11
1513     xlib
1514 "
1515
1516 # options emitted with CONFIG_ prefix but not available on the command line
1517 CONFIG_EXTRA="
1518     aandcttables
1519     ac3dsp
1520     audio_frame_queue
1521     cabac
1522     dsputil
1523     gcrypt
1524     golomb
1525     gplv3
1526     h263dsp
1527     h264chroma
1528     h264dsp
1529     h264pred
1530     h264qpel
1531     hpeldsp
1532     huffman
1533     intrax8
1534     lgplv3
1535     lpc
1536     mpegaudio
1537     mpegaudiodsp
1538     mpegvideo
1539     mpegvideoenc
1540     nettle
1541     rangecoder
1542     riffdec
1543     riffenc
1544     rtpdec
1545     rtpenc_chain
1546     sinewin
1547     tpeldsp
1548     videodsp
1549     vp3dsp
1550 "
1551
1552 CMDLINE_SELECT="
1553     $ARCH_EXT_LIST
1554     $CONFIG_LIST
1555     $HAVE_LIST_CMDLINE
1556     $THREADS_LIST
1557     asm
1558     cross_compile
1559     debug
1560     extra_warnings
1561     logging
1562     lto
1563     optimizations
1564 "
1565
1566 PATHS_LIST="
1567     bindir
1568     datadir
1569     docdir
1570     incdir
1571     libdir
1572     mandir
1573     prefix
1574     shlibdir
1575 "
1576
1577 CMDLINE_SET="
1578     $PATHS_LIST
1579     ar
1580     arch
1581     as
1582     build_suffix
1583     cc
1584     cpu
1585     cross_prefix
1586     dep_cc
1587     extra_version
1588     host_cc
1589     host_cflags
1590     host_ld
1591     host_ldflags
1592     host_libs
1593     host_os
1594     ld
1595     logfile
1596     malloc_prefix
1597     nm
1598     optflags
1599     pkg_config
1600     pkg_config_flags
1601     random_seed
1602     samples
1603     sysinclude
1604     sysroot
1605     target_exec
1606     target_os
1607     target_path
1608     target_samples
1609     toolchain
1610 "
1611
1612 CMDLINE_APPEND="
1613     extra_cflags
1614     host_cppflags
1615 "
1616
1617 # code dependency declarations
1618
1619 # architecture extensions
1620
1621 armv5te_deps="arm"
1622 armv6_deps="arm"
1623 armv6t2_deps="arm"
1624 armv8_deps="aarch64"
1625 neon_deps_any="aarch64 arm"
1626 vfp_deps_any="aarch64 arm"
1627 vfpv3_deps="vfp"
1628
1629 map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM
1630
1631 altivec_deps="ppc"
1632 ppc4xx_deps="ppc"
1633
1634 cpunop_deps="i686"
1635 x86_64_select="i686"
1636 x86_64_suggest="fast_cmov"
1637
1638 amd3dnow_deps="mmx"
1639 amd3dnowext_deps="amd3dnow"
1640 i686_deps="x86"
1641 mmx_deps="x86"
1642 mmxext_deps="mmx"
1643 sse_deps="mmxext"
1644 sse2_deps="sse"
1645 sse3_deps="sse2"
1646 ssse3_deps="sse3"
1647 sse4_deps="ssse3"
1648 sse42_deps="sse4"
1649 avx_deps="sse42"
1650 xop_deps="avx"
1651 fma3_deps="avx"
1652 fma4_deps="avx"
1653 avx2_deps="avx"
1654
1655 mmx_external_deps="yasm"
1656 mmx_inline_deps="inline_asm"
1657 mmx_suggest="mmx_external mmx_inline"
1658
1659 for ext in $(filter_out mmx $ARCH_EXT_LIST_X86_SIMD); do
1660     eval dep=\$${ext}_deps
1661     eval ${ext}_external_deps='"${dep}_external"'
1662     eval ${ext}_inline_deps='"${dep}_inline"'
1663     eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
1664 done
1665
1666 aligned_stack_if_any="aarch64 ppc x86"
1667 fast_64bit_if_any="aarch64 alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
1668 fast_clz_if_any="aarch64 alpha avr32 mips ppc x86"
1669 fast_unaligned_if_any="aarch64 ppc x86"
1670
1671 need_memalign="altivec neon sse"
1672
1673 # system capabilities
1674 log2_deps="!libc_msvcrt"
1675
1676 symver_if_any="symver_asm_label symver_gnu_asm"
1677
1678 # threading support
1679 atomics_gcc_if="sync_val_compare_and_swap"
1680 atomics_suncc_if="atomic_cas_ptr machine_rw_barrier"
1681 atomics_win32_if="MemoryBarrier"
1682 atomics_native_if_any="$ATOMICS_LIST"
1683 w32threads_deps="atomics_native"
1684 threads_if_any="$THREADS_LIST"
1685
1686 # subsystems
1687 dct_select="rdft"
1688 error_resilience_select="dsputil"
1689 mdct_select="fft"
1690 rdft_select="fft"
1691 mpegaudio_select="mpegaudiodsp"
1692 mpegaudiodsp_select="dct"
1693 mpegvideo_select="dsputil hpeldsp videodsp"
1694 mpegvideoenc_select="dsputil mpegvideo"
1695
1696 # decoders / encoders
1697 aac_decoder_select="mdct sinewin"
1698 aac_encoder_select="audio_frame_queue mdct sinewin"
1699 aac_latm_decoder_select="aac_decoder aac_latm_parser"
1700 ac3_decoder_select="mdct ac3dsp ac3_parser dsputil"
1701 ac3_encoder_select="mdct ac3dsp dsputil"
1702 ac3_fixed_encoder_select="mdct ac3dsp dsputil"
1703 aic_decoder_select="dsputil golomb"
1704 alac_encoder_select="lpc"
1705 als_decoder_select="dsputil"
1706 amrnb_decoder_select="lsp"
1707 amrwb_decoder_select="lsp"
1708 amv_decoder_select="sp5x_decoder"
1709 ape_decoder_select="dsputil"
1710 asv1_decoder_select="dsputil"
1711 asv1_encoder_select="dsputil"
1712 asv2_decoder_select="dsputil"
1713 asv2_encoder_select="dsputil"
1714 atrac1_decoder_select="mdct sinewin"
1715 atrac3_decoder_select="mdct"
1716 atrac3p_decoder_select="mdct sinewin"
1717 bink_decoder_select="dsputil hpeldsp"
1718 binkaudio_dct_decoder_select="mdct rdft dct sinewin"
1719 binkaudio_rdft_decoder_select="mdct rdft sinewin"
1720 cavs_decoder_select="dsputil golomb h264chroma videodsp"
1721 cllc_decoder_select="dsputil"
1722 comfortnoise_encoder_select="lpc"
1723 cook_decoder_select="dsputil mdct sinewin"
1724 cscd_decoder_select="lzo"
1725 cscd_decoder_suggest="zlib"
1726 dca_decoder_select="mdct"
1727 dnxhd_decoder_select="dsputil"
1728 dnxhd_encoder_select="aandcttables dsputil mpegvideoenc"
1729 dvvideo_decoder_select="dsputil"
1730 dvvideo_encoder_select="dsputil"
1731 dxa_decoder_deps="zlib"
1732 eac3_decoder_select="ac3_decoder"
1733 eac3_encoder_select="ac3_encoder"
1734 eamad_decoder_select="aandcttables dsputil mpegvideo"
1735 eatgq_decoder_select="aandcttables dsputil"
1736 eatqi_decoder_select="aandcttables dsputil error_resilience mpegvideo"
1737 exr_decoder_deps="zlib"
1738 ffv1_decoder_select="golomb rangecoder"
1739 ffv1_encoder_select="rangecoder"
1740 ffvhuff_decoder_select="huffyuv_decoder"
1741 ffvhuff_encoder_select="huffyuv_encoder"
1742 fic_decoder_select="golomb"
1743 flac_decoder_select="golomb"
1744 flac_encoder_select="dsputil golomb lpc"
1745 flashsv_decoder_deps="zlib"
1746 flashsv_encoder_deps="zlib"
1747 flashsv2_decoder_deps="zlib"
1748 flv_decoder_select="h263_decoder"
1749 flv_encoder_select="h263_encoder"
1750 fourxm_decoder_select="dsputil"
1751 fraps_decoder_select="dsputil huffman"
1752 g2m_decoder_deps="zlib"
1753 g2m_decoder_select="dsputil"
1754 h261_decoder_select="error_resilience mpegvideo"
1755 h261_encoder_select="aandcttables mpegvideoenc"
1756 h263_decoder_select="error_resilience h263_parser h263dsp mpegvideo"
1757 h263_encoder_select="aandcttables h263dsp mpegvideoenc"
1758 h263i_decoder_select="h263_decoder"
1759 h263p_encoder_select="h263_encoder"
1760 h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel videodsp"
1761 h264_decoder_suggest="error_resilience"
1762 hevc_decoder_select="cabac dsputil golomb videodsp"
1763 huffyuv_decoder_select="dsputil"
1764 huffyuv_encoder_select="dsputil huffman"
1765 iac_decoder_select="imc_decoder"
1766 imc_decoder_select="dsputil fft mdct sinewin"
1767 indeo3_decoder_select="hpeldsp"
1768 interplay_video_decoder_select="hpeldsp"
1769 jpegls_decoder_select="golomb mjpeg_decoder"
1770 jpegls_encoder_select="golomb"
1771 jv_decoder_select="dsputil"
1772 lagarith_decoder_select="dsputil"
1773 ljpeg_encoder_select="aandcttables mpegvideoenc"
1774 loco_decoder_select="golomb"
1775 mdec_decoder_select="dsputil error_resilience mpegvideo"
1776 metasound_decoder_select="lsp mdct sinewin"
1777 mimic_decoder_select="dsputil hpeldsp"
1778 mjpeg_decoder_select="dsputil hpeldsp"
1779 mjpeg_encoder_select="aandcttables mpegvideoenc"
1780 mjpegb_decoder_select="mjpeg_decoder"
1781 mlp_decoder_select="mlp_parser"
1782 motionpixels_decoder_select="dsputil"
1783 mp1_decoder_select="mpegaudio"
1784 mp1float_decoder_select="mpegaudio"
1785 mp2_decoder_select="mpegaudio"
1786 mp2float_decoder_select="mpegaudio"
1787 mp3_decoder_select="mpegaudio"
1788 mp3adu_decoder_select="mpegaudio"
1789 mp3adufloat_decoder_select="mpegaudio"
1790 mp3float_decoder_select="mpegaudio"
1791 mp3on4_decoder_select="mpegaudio"
1792 mp3on4float_decoder_select="mpegaudio"
1793 mpc7_decoder_select="dsputil mpegaudiodsp"
1794 mpc8_decoder_select="mpegaudiodsp"
1795 mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
1796 mpeg_xvmc_decoder_select="mpeg2video_decoder"
1797 mpeg1video_decoder_select="error_resilience mpegvideo"
1798 mpeg1video_encoder_select="aandcttables mpegvideoenc"
1799 mpeg2video_decoder_select="error_resilience mpegvideo"
1800 mpeg2video_encoder_select="aandcttables mpegvideoenc"
1801 mpeg4_decoder_select="h263_decoder mpeg4video_parser"
1802 mpeg4_encoder_select="h263_encoder"
1803 msmpeg4v1_decoder_select="h263_decoder"
1804 msmpeg4v2_decoder_select="h263_decoder"
1805 msmpeg4v2_encoder_select="h263_encoder"
1806 msmpeg4v3_decoder_select="h263_decoder"
1807 msmpeg4v3_encoder_select="h263_encoder"
1808 mss2_decoder_select="error_resilience vc1_decoder"
1809 mxpeg_decoder_select="mjpeg_decoder"
1810 nellymoser_decoder_select="mdct sinewin"
1811 nellymoser_encoder_select="audio_frame_queue mdct sinewin"
1812 nuv_decoder_select="dsputil lzo"
1813 on2avc_decoder_select="mdct"
1814 png_decoder_deps="zlib"
1815 png_encoder_deps="zlib"
1816 png_encoder_select="dsputil"
1817 prores_decoder_select="dsputil"
1818 prores_encoder_select="dsputil"
1819 qcelp_decoder_select="lsp"
1820 qdm2_decoder_select="mdct rdft mpegaudiodsp"
1821 ra_144_encoder_select="audio_frame_queue lpc"
1822 ralf_decoder_select="golomb"
1823 rv10_decoder_select="error_resilience h263_decoder h263dsp"
1824 rv10_encoder_select="h263_encoder"
1825 rv20_decoder_select="error_resilience h263_decoder h263dsp"
1826 rv20_encoder_select="h263_encoder"
1827 rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpegvideo videodsp"
1828 rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpegvideo videodsp"
1829 shorten_decoder_select="golomb"
1830 sipr_decoder_select="lsp"
1831 sp5x_decoder_select="mjpeg_decoder"
1832 svq1_decoder_select="hpeldsp"
1833 svq1_encoder_select="aandcttables dsputil hpeldsp mpegvideoenc"
1834 svq3_decoder_select="h264_decoder hpeldsp tpeldsp"
1835 svq3_decoder_suggest="zlib"
1836 tak_decoder_select="dsputil"
1837 theora_decoder_select="vp3_decoder"
1838 thp_decoder_select="mjpeg_decoder"
1839 tiff_decoder_suggest="zlib"
1840 tiff_encoder_suggest="zlib"
1841 truehd_decoder_select="mlp_decoder"
1842 truemotion2_decoder_select="dsputil"
1843 truespeech_decoder_select="dsputil"
1844 tscc_decoder_deps="zlib"
1845 twinvq_decoder_select="mdct lsp sinewin"
1846 utvideo_decoder_select="dsputil"
1847 utvideo_encoder_select="dsputil huffman"
1848 vble_decoder_select="dsputil"
1849 vc1_decoder_select="error_resilience h263_decoder h264chroma h264qpel intrax8"
1850 vc1image_decoder_select="vc1_decoder"
1851 vorbis_decoder_select="mdct"
1852 vorbis_encoder_select="mdct"
1853 vp3_decoder_select="hpeldsp vp3dsp videodsp"
1854 vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp"
1855 vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp"
1856 vp6a_decoder_select="vp6_decoder"
1857 vp6f_decoder_select="vp6_decoder"
1858 vp7_decoder_select="h264pred videodsp"
1859 vp8_decoder_select="h264pred videodsp"
1860 vp9_decoder_select="videodsp"
1861 webp_decoder_select="vp8_decoder"
1862 wmapro_decoder_select="mdct sinewin"
1863 wmav1_decoder_select="mdct sinewin"
1864 wmav1_encoder_select="mdct sinewin"
1865 wmav2_decoder_select="mdct sinewin"
1866 wmav2_encoder_select="mdct sinewin"
1867 wmavoice_decoder_select="lsp rdft dct mdct sinewin"
1868 wmv1_decoder_select="h263_decoder"
1869 wmv1_encoder_select="h263_encoder"
1870 wmv2_decoder_select="h263_decoder intrax8 videodsp"
1871 wmv2_encoder_select="h263_encoder"
1872 wmv3_decoder_select="vc1_decoder"
1873 wmv3image_decoder_select="wmv3_decoder"
1874 zerocodec_decoder_deps="zlib"
1875 zlib_decoder_deps="zlib"
1876 zlib_encoder_deps="zlib"
1877 zmbv_decoder_deps="zlib"
1878 zmbv_encoder_deps="zlib"
1879
1880 # hardware accelerators
1881 dxva2_deps="dxva2api_h"
1882 vaapi_deps="va_va_h"
1883 vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
1884 vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore"
1885 vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"
1886
1887 h263_vaapi_hwaccel_deps="vaapi"
1888 h263_vaapi_hwaccel_select="h263_decoder"
1889 h263_vdpau_hwaccel_deps="vdpau"
1890 h263_vdpau_hwaccel_select="h263_decoder"
1891 h264_dxva2_hwaccel_deps="dxva2"
1892 h264_dxva2_hwaccel_select="h264_decoder"
1893 h264_vaapi_hwaccel_deps="vaapi"
1894 h264_vaapi_hwaccel_select="h264_decoder"
1895 h264_vda_hwaccel_deps="vda"
1896 h264_vda_hwaccel_select="h264_decoder"
1897 h264_vdpau_hwaccel_deps="vdpau"
1898 h264_vdpau_hwaccel_select="h264_decoder"
1899 mpeg1_vdpau_hwaccel_deps="vdpau"
1900 mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
1901 mpeg2_dxva2_hwaccel_deps="dxva2"
1902 mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
1903 mpeg2_vaapi_hwaccel_deps="vaapi"
1904 mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
1905 mpeg2_vdpau_hwaccel_deps="vdpau"
1906 mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
1907 mpeg4_vaapi_hwaccel_deps="vaapi"
1908 mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
1909 mpeg4_vdpau_hwaccel_deps="vdpau"
1910 mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
1911 vc1_dxva2_hwaccel_deps="dxva2"
1912 vc1_dxva2_hwaccel_select="vc1_decoder"
1913 vc1_vaapi_hwaccel_deps="vaapi"
1914 vc1_vaapi_hwaccel_select="vc1_decoder"
1915 vc1_vdpau_hwaccel_deps="vdpau"
1916 vc1_vdpau_hwaccel_select="vc1_decoder"
1917 wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
1918 wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
1919 wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
1920
1921 # parsers
1922 h264_parser_select="h264_decoder"
1923 mpeg4video_parser_select="error_resilience h263dsp mpegvideo"
1924 mpegvideo_parser_select="error_resilience mpegvideo"
1925 vc1_parser_select="mpegvideo"
1926
1927 # external libraries
1928 libfaac_encoder_deps="libfaac"
1929 libfaac_encoder_select="audio_frame_queue"
1930 libfdk_aac_decoder_deps="libfdk_aac"
1931 libfdk_aac_encoder_deps="libfdk_aac"
1932 libfdk_aac_encoder_select="audio_frame_queue"
1933 libgsm_decoder_deps="libgsm"
1934 libgsm_encoder_deps="libgsm"
1935 libgsm_ms_decoder_deps="libgsm"
1936 libgsm_ms_encoder_deps="libgsm"
1937 libilbc_decoder_deps="libilbc"
1938 libilbc_encoder_deps="libilbc"
1939 libmp3lame_encoder_deps="libmp3lame"
1940 libmp3lame_encoder_select="audio_frame_queue"
1941 libopencore_amrnb_decoder_deps="libopencore_amrnb"
1942 libopencore_amrnb_encoder_deps="libopencore_amrnb"
1943 libopencore_amrnb_encoder_select="audio_frame_queue"
1944 libopencore_amrwb_decoder_deps="libopencore_amrwb"
1945 libopenjpeg_decoder_deps="libopenjpeg"
1946 libopenjpeg_encoder_deps="libopenjpeg"
1947 libopus_decoder_deps="libopus"
1948 libopus_encoder_deps="libopus"
1949 libopus_encoder_select="audio_frame_queue"
1950 libschroedinger_decoder_deps="libschroedinger"
1951 libschroedinger_encoder_deps="libschroedinger"
1952 libspeex_decoder_deps="libspeex"
1953 libspeex_encoder_deps="libspeex"
1954 libspeex_encoder_select="audio_frame_queue"
1955 libtheora_encoder_deps="libtheora"
1956 libtwolame_encoder_deps="libtwolame"
1957 libvo_aacenc_encoder_deps="libvo_aacenc"
1958 libvo_aacenc_encoder_select="audio_frame_queue"
1959 libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
1960 libvorbis_encoder_deps="libvorbis"
1961 libvorbis_encoder_select="audio_frame_queue"
1962 libvpx_vp8_decoder_deps="libvpx"
1963 libvpx_vp8_encoder_deps="libvpx"
1964 libvpx_vp9_decoder_deps="libvpx"
1965 libvpx_vp9_encoder_deps="libvpx"
1966 libwavpack_encoder_deps="libwavpack"
1967 libwebp_encoder_deps="libwebp"
1968 libx264_encoder_deps="libx264"
1969 libx265_encoder_deps="libx265"
1970 libxavs_encoder_deps="libxavs"
1971 libxvid_encoder_deps="libxvid"
1972
1973 # demuxers / muxers
1974 ac3_demuxer_select="ac3_parser"
1975 asf_demuxer_select="riffdec"
1976 asf_muxer_select="riffenc"
1977 asf_stream_muxer_select="asf_muxer"
1978 avi_demuxer_select="riffdec"
1979 avi_muxer_select="riffenc"
1980 avisynth_demuxer_deps="avisynth"
1981 avisynth_demuxer_select="riffdec"
1982 caf_demuxer_select="riffdec"
1983 dirac_demuxer_select="dirac_parser"
1984 dxa_demuxer_select="riffdec"
1985 eac3_demuxer_select="ac3_parser"
1986 f4v_muxer_select="mov_muxer"
1987 flac_demuxer_select="flac_parser"
1988 hds_muxer_select="flv_muxer"
1989 hls_muxer_select="mpegts_muxer"
1990 ipod_muxer_select="mov_muxer"
1991 ismv_muxer_select="mov_muxer"
1992 matroska_audio_muxer_select="matroska_muxer"
1993 matroska_demuxer_select="riffdec"
1994 matroska_demuxer_suggest="bzlib lzo zlib"
1995 matroska_muxer_select="riffenc"
1996 mmf_muxer_select="riffenc"
1997 mov_demuxer_select="riffdec"
1998 mov_demuxer_suggest="zlib"
1999 mov_muxer_select="riffenc rtpenc_chain"
2000 mp3_demuxer_select="mpegaudio_parser"
2001 mp4_muxer_select="mov_muxer"
2002 mpegts_muxer_select="adts_muxer latm_muxer"
2003 mpegtsraw_demuxer_select="mpegts_demuxer"
2004 mxf_d10_muxer_select="mxf_muxer"
2005 nut_muxer_select="riffenc"
2006 nuv_demuxer_select="riffdec"
2007 ogg_demuxer_select="golomb"
2008 psp_muxer_select="mov_muxer"
2009 rtp_demuxer_select="sdp_demuxer"
2010 rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
2011 rtsp_demuxer_select="http_protocol rtpdec"
2012 rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
2013 sap_demuxer_select="sdp_demuxer"
2014 sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
2015 sdp_demuxer_select="rtpdec"
2016 smoothstreaming_muxer_select="ismv_muxer"
2017 spdif_muxer_select="aac_parser"
2018 tak_demuxer_select="tak_parser"
2019 tg2_muxer_select="mov_muxer"
2020 tgp_muxer_select="mov_muxer"
2021 w64_demuxer_select="wav_demuxer"
2022 wav_demuxer_select="riffdec"
2023 wav_muxer_select="riffenc"
2024 webm_muxer_select="riffenc"
2025 wtv_demuxer_select="riffdec"
2026 xmv_demuxer_select="riffdec"
2027 xwma_demuxer_select="riffdec"
2028
2029 # indevs / outdevs
2030 alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
2031 alsa_outdev_deps="alsa_asoundlib_h"
2032 bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
2033 dv1394_indev_deps="dv1394"
2034 dv1394_indev_select="dv_demuxer"
2035 fbdev_indev_deps="linux_fb_h"
2036 jack_indev_deps="jack_jack_h pthreads"
2037 libcdio_indev_deps="libcdio"
2038 libdc1394_indev_deps="libdc1394"
2039 oss_indev_deps_any="soundcard_h sys_soundcard_h"
2040 oss_outdev_deps_any="soundcard_h sys_soundcard_h"
2041 pulse_indev_deps="libpulse"
2042 sndio_indev_deps="sndio_h"
2043 sndio_outdev_deps="sndio_h"
2044 v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
2045 vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
2046 vfwcap_indev_extralibs="-lavicap32"
2047 x11grab_indev_deps="x11grab XShmCreateImage"
2048
2049 # protocols
2050 ffrtmpcrypt_protocol_deps="!librtmp_protocol"
2051 ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
2052 ffrtmpcrypt_protocol_select="tcp_protocol"
2053 ffrtmphttp_protocol_deps="!librtmp_protocol"
2054 ffrtmphttp_protocol_select="http_protocol"
2055 gopher_protocol_select="network"
2056 http_protocol_select="tcp_protocol"
2057 httpproxy_protocol_select="tcp_protocol"
2058 https_protocol_select="tls_protocol"
2059 librtmp_protocol_deps="librtmp"
2060 librtmpe_protocol_deps="librtmp"
2061 librtmps_protocol_deps="librtmp"
2062 librtmpt_protocol_deps="librtmp"
2063 librtmpte_protocol_deps="librtmp"
2064 mmsh_protocol_select="http_protocol"
2065 mmst_protocol_select="network"
2066 rtmp_protocol_deps="!librtmp_protocol"
2067 rtmp_protocol_select="tcp_protocol"
2068 rtmpe_protocol_select="ffrtmpcrypt_protocol"
2069 rtmps_protocol_deps="!librtmp_protocol"
2070 rtmps_protocol_select="tls_protocol"
2071 rtmpt_protocol_select="ffrtmphttp_protocol"
2072 rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2073 rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2074 rtp_protocol_select="udp_protocol"
2075 sctp_protocol_deps="struct_sctp_event_subscribe"
2076 sctp_protocol_select="network"
2077 srtp_protocol_select="rtp_protocol"
2078 tcp_protocol_select="network"
2079 tls_protocol_deps_any="openssl gnutls"
2080 tls_protocol_select="tcp_protocol"
2081 udp_protocol_select="network"
2082 unix_protocol_deps="sys_un_h"
2083 unix_protocol_select="network"
2084
2085 # filters
2086 blackframe_filter_deps="gpl"
2087 boxblur_filter_deps="gpl"
2088 cropdetect_filter_deps="gpl"
2089 delogo_filter_deps="gpl"
2090 drawtext_filter_deps="libfreetype"
2091 frei0r_filter_deps="frei0r dlopen"
2092 frei0r_filter_extralibs='$ldl'
2093 frei0r_src_filter_deps="frei0r dlopen"
2094 frei0r_src_filter_extralibs='$ldl'
2095 hqdn3d_filter_deps="gpl"
2096 interlace_filter_deps="gpl"
2097 ocv_filter_deps="libopencv"
2098 resample_filter_deps="avresample"
2099 scale_filter_deps="swscale"
2100
2101 # examples
2102 avcodec_example_deps="avcodec avutil"
2103 filter_audio_example_deps="avfilter avutil"
2104 metadata_example_deps="avformat avutil"
2105 output_example_deps="avcodec avformat avutil swscale"
2106 transcode_aac_example_deps="avcodec avformat avresample"
2107
2108 # libraries
2109 avcodec_deps="avutil"
2110 avdevice_deps="avutil avcodec avformat"
2111 avfilter_deps="avutil"
2112 avformat_deps="avutil avcodec"
2113 avresample_deps="avutil"
2114 swscale_deps="avutil"
2115
2116 # programs
2117 avconv_deps="avcodec avfilter avformat avresample swscale"
2118 avconv_select="aformat_filter anull_filter asyncts_filter atrim_filter format_filter
2119                fps_filter null_filter resample_filter scale_filter
2120                setpts_filter trim_filter"
2121 avplay_deps="avcodec avformat avresample swscale sdl"
2122 avplay_libs='$sdl_libs'
2123 avplay_select="rdft"
2124 avprobe_deps="avcodec avformat"
2125 avserver_deps="avformat fork !shared"
2126 avserver_select="ffm_muxer rtp_protocol rtsp_demuxer"
2127
2128 # documentation
2129 pod2man_deps="doc"
2130 texi2html_deps="doc"
2131
2132 # default parameters
2133
2134 logfile="config.log"
2135
2136 # installation paths
2137 prefix_default="/usr/local"
2138 bindir_default='${prefix}/bin'
2139 datadir_default='${prefix}/share/avconv'
2140 docdir_default='${prefix}/share/doc/libav'
2141 incdir_default='${prefix}/include'
2142 libdir_default='${prefix}/lib'
2143 mandir_default='${prefix}/share/man'
2144 shlibdir_default="$libdir_default"
2145
2146 # toolchain
2147 ar_default="ar"
2148 cc_default="gcc"
2149 host_cc_default="gcc"
2150 cp_f="cp -f"
2151 ln_s="ln -s -f"
2152 nm_default="nm -g"
2153 objformat="elf"
2154 pkg_config_default=pkg-config
2155 ranlib="ranlib"
2156 strip="strip"
2157 yasmexe="yasm"
2158
2159 nogas=":"
2160
2161 # machine
2162 arch_default=$(uname -m)
2163 cpu="generic"
2164
2165 # OS
2166 target_os_default=$(tolower $(uname -s))
2167 host_os=$target_os_default
2168
2169 # configurable options
2170 enable $EXAMPLE_LIST $LIBRARY_LIST $PROGRAM_LIST
2171
2172 enable asm
2173 enable debug
2174 enable doc
2175 enable optimizations
2176 enable safe_bitstream_reader
2177 enable static
2178 enable swscale_alpha
2179
2180 # By default, enable only those hwaccels that have no external dependencies.
2181 enable dxva2 vdpau
2182
2183 # build settings
2184 SHFLAGS='-shared -Wl,-soname,$$(@F)'
2185 LIBPREF="lib"
2186 LIBSUF=".a"
2187 FULLNAME='$(NAME)$(BUILDSUF)'
2188 LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
2189 SLIBPREF="lib"
2190 SLIBSUF=".so"
2191 SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
2192 SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
2193 SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
2194 LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2195 SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
2196 SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2197
2198 asflags_filter=echo
2199 cflags_filter=echo
2200 ldflags_filter=echo
2201
2202 AS_C='-c'
2203 AS_O='-o $@'
2204 CC_C='-c'
2205 CC_E='-E -o $@'
2206 CC_O='-o $@'
2207 LD_O='-o $@'
2208 LD_LIB='-l%'
2209 LD_PATH='-L'
2210 HOSTCC_C='-c'
2211 HOSTCC_E='-E -o $@'
2212 HOSTCC_O='-o $@'
2213 HOSTLD_O='-o $@'
2214
2215 host_libs='-lm'
2216 host_cflags_filter=echo
2217 host_ldflags_filter=echo
2218
2219 target_path='$(CURDIR)'
2220
2221 # since the object filename is not given with the -MM flag, the compiler
2222 # is only able to print the basename, and we must add the path ourselves
2223 DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
2224 DEPFLAGS='-MM'
2225
2226 # find source path
2227 if test -f configure; then
2228     source_path=.
2229 else
2230     source_path=$(cd $(dirname "$0"); pwd)
2231     echo "$source_path" | grep -q '[[:blank:]]' &&
2232         die "Out of tree builds are impossible with whitespace in source path."
2233     test -e "$source_path/config.h" &&
2234         die "Out of tree builds are impossible with config.h in source dir."
2235 fi
2236
2237 for v in "$@"; do
2238     r=${v#*=}
2239     l=${v%"$r"}
2240     r=$(sh_quote "$r")
2241     LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
2242 done
2243
2244 find_things(){
2245     thing=$1
2246     pattern=$2
2247     file=$source_path/$3
2248     sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2249 }
2250
2251 ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
2252 DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2253 HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
2254 PARSER_LIST=$(find_things   parser   PARSER   libavcodec/allcodecs.c)
2255 BSF_LIST=$(find_things      bsf      BSF      libavcodec/allcodecs.c)
2256 MUXER_LIST=$(find_things    muxer    _MUX     libavformat/allformats.c)
2257 DEMUXER_LIST=$(find_things  demuxer  DEMUX    libavformat/allformats.c)
2258 OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
2259 INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2260 PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
2261 FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2262
2263 ALL_COMPONENTS="
2264     $BSF_LIST
2265     $DECODER_LIST
2266     $DEMUXER_LIST
2267     $ENCODER_LIST
2268     $FILTER_LIST
2269     $HWACCEL_LIST
2270     $INDEV_LIST
2271     $MUXER_LIST
2272     $OUTDEV_LIST
2273     $PARSER_LIST
2274     $PROTOCOL_LIST
2275 "
2276
2277 for n in $COMPONENT_LIST; do
2278     v=$(toupper ${n%s})_LIST
2279     eval enable \$$v
2280     eval ${n}_if_any="\$$v"
2281 done
2282
2283 enable $ARCH_EXT_LIST
2284
2285 die_unknown(){
2286     echo "Unknown option \"$1\"."
2287     echo "See $0 --help for available options."
2288     exit 1
2289 }
2290
2291 print_3_columns() {
2292     cat | tr ' ' '\n' | sort | pr -r -3 -t
2293 }
2294
2295 show_list() {
2296     suffix=_$1
2297     shift
2298     echo $* | sed s/$suffix//g | print_3_columns
2299     exit 0
2300 }
2301
2302 rand_list(){
2303     IFS=', '
2304     set -- $*
2305     unset IFS
2306     for thing; do
2307         comp=${thing%:*}
2308         prob=${thing#$comp}
2309         prob=${prob#:}
2310         is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
2311         echo "prob ${prob:-0.5}"
2312         printf '%s\n' $comp
2313     done
2314 }
2315
2316 do_random(){
2317     action=$1
2318     shift
2319     random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
2320     $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
2321 }
2322
2323 for opt do
2324     optval="${opt#*=}"
2325     case "$opt" in
2326         --extra-ldflags=*)
2327             add_ldflags $optval
2328         ;;
2329         --extra-libs=*)
2330             add_extralibs $optval
2331         ;;
2332         --disable-devices)
2333             disable $INDEV_LIST $OUTDEV_LIST
2334         ;;
2335         --enable-debug=*)
2336             debuglevel="$optval"
2337         ;;
2338         --disable-programs)
2339             disable $PROGRAM_LIST
2340         ;;
2341         --disable-everything)
2342             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2343         ;;
2344         --disable-all)
2345             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2346             disable $LIBRARY_LIST $PROGRAM_LIST doc
2347         ;;
2348         --enable-random|--disable-random)
2349             action=${opt%%-random}
2350             do_random ${action#--} $COMPONENT_LIST
2351         ;;
2352         --enable-random=*|--disable-random=*)
2353             action=${opt%%-random=*}
2354             do_random ${action#--} $optval
2355         ;;
2356         --enable-*=*|--disable-*=*)
2357             eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
2358             is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
2359             eval list=\$$(toupper $thing)_LIST
2360             name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
2361             $action $(filter "$name" $list)
2362         ;;
2363         --enable-?*|--disable-?*)
2364             eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
2365             if is_in $option $COMPONENT_LIST; then
2366                 test $action = disable && action=unset
2367                 eval $action \$$(toupper ${option%s})_LIST
2368             elif is_in $option $CMDLINE_SELECT; then
2369                 $action $option
2370             else
2371                 die_unknown $opt
2372             fi
2373         ;;
2374         --list-*)
2375             NAME="${opt#--list-}"
2376             is_in $NAME $COMPONENT_LIST || die_unknown $opt
2377             NAME=${NAME%s}
2378             eval show_list $NAME \$$(toupper $NAME)_LIST
2379         ;;
2380         --help|-h) show_help
2381         ;;
2382         *)
2383             optname="${opt%%=*}"
2384             optname="${optname#--}"
2385             optname=$(echo "$optname" | sed 's/-/_/g')
2386             if is_in $optname $CMDLINE_SET; then
2387                 eval $optname='$optval'
2388             elif is_in $optname $CMDLINE_APPEND; then
2389                 append $optname "$optval"
2390             else
2391                 die_unknown $opt
2392             fi
2393         ;;
2394     esac
2395 done
2396
2397 disabled logging && logfile=/dev/null
2398
2399 echo "# $0 $LIBAV_CONFIGURATION" > $logfile
2400 set >> $logfile
2401
2402 test -n "$cross_prefix" && enable cross_compile
2403
2404 if enabled cross_compile; then
2405     test -n "$arch" && test -n "$target_os" ||
2406         die "Must specify target arch and OS when cross-compiling"
2407 fi
2408
2409 ar_default="${cross_prefix}${ar_default}"
2410 cc_default="${cross_prefix}${cc_default}"
2411 nm_default="${cross_prefix}${nm_default}"
2412 pkg_config_default="${cross_prefix}${pkg_config_default}"
2413 ranlib="${cross_prefix}${ranlib}"
2414 strip="${cross_prefix}${strip}"
2415
2416 sysinclude_default="${sysroot}/usr/include"
2417
2418 case "$toolchain" in
2419     clang-asan)
2420         cc_default="clang"
2421         add_cflags  -fsanitize=address
2422         add_ldflags -fsanitize=address
2423     ;;
2424     clang-tsan)
2425         cc_default="clang"
2426         add_cflags  -fsanitize=thread -pie
2427         add_ldflags -fsanitize=thread -pie
2428     ;;
2429     clang-usan)
2430         cc_default="clang"
2431         add_cflags  -fsanitize=undefined
2432         add_ldflags -fsanitize=undefined
2433     ;;
2434     gcc-asan)
2435         cc_default="gcc"
2436         add_cflags  -fsanitize=address
2437         add_ldflags -fsanitize=address
2438     ;;
2439     gcc-tsan)
2440         cc_default="gcc"
2441         add_cflags  -fsanitize=thread -pie -fPIC
2442         add_ldflags -fsanitize=thread -pie -fPIC
2443     ;;
2444     gcc-usan)
2445         cc_default="gcc"
2446         add_cflags  -fsanitize=undefined
2447         add_ldflags -fsanitize=undefined
2448     ;;
2449     valgrind-massif)
2450         target_exec_default="valgrind"
2451         target_exec_args="--alloc-fn=av_malloc --alloc-fn=av_mallocz"
2452     ;;
2453     valgrind-memcheck)
2454         target_exec_default="valgrind"
2455         target_exec_args="--track-origins=yes --leak-check=full"
2456     ;;
2457     msvc)
2458         # Check whether the current MSVC version needs the C99 converter.
2459         # From MSVC 2013 (compiler major version 18) onwards, it does actually
2460         # support enough of C99 to build libav. Default to the new
2461         # behaviour if the regexp was unable to match anything, since this
2462         # successfully parses the version number of existing supported
2463         # versions that require the converter (MSVC 2010 and 2012).
2464         cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
2465         if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
2466             cc_default="cl"
2467         else
2468             cc_default="c99wrap cl"
2469         fi
2470         ld_default="link"
2471         nm_default="dumpbin -symbols"
2472         ar_default="lib"
2473         target_os_default="win32"
2474         # Use a relative path for TMPDIR. This makes sure all the
2475         # ffconf temp files are written with a relative path, avoiding
2476         # issues with msys/win32 path conversion for MSVC parameters
2477         # such as -Fo<file> or -out:<file>.
2478         TMPDIR=.
2479     ;;
2480     icl)
2481         cc_default="icl"
2482         ld_default="xilink"
2483         nm_default="dumpbin -symbols"
2484         ar_default="xilib"
2485         target_os_default="win32"
2486         TMPDIR=.
2487     ;;
2488     gcov)
2489         add_cflags  -fprofile-arcs -ftest-coverage
2490         add_ldflags -fprofile-arcs -ftest-coverage
2491     ;;
2492     hardened)
2493         add_cflags  -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all
2494         add_ldflags -Wl,-z,relro -Wl,-z,now
2495     ;;
2496     ?*)
2497         die "Unknown toolchain $toolchain"
2498     ;;
2499 esac
2500
2501 set_default arch cc pkg_config sysinclude target_exec target_os
2502 enabled cross_compile || host_cc_default=$cc
2503 set_default host_cc
2504
2505 if ! $pkg_config --version >/dev/null 2>&1; then
2506     warn "$pkg_config not found, library detection may fail."
2507     pkg_config=false
2508 fi
2509
2510 exesuf() {
2511     case $1 in
2512         mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
2513     esac
2514 }
2515
2516 EXESUF=$(exesuf $target_os)
2517 HOSTEXESUF=$(exesuf $host_os)
2518
2519 # set temporary file name
2520 : ${TMPDIR:=$TEMPDIR}
2521 : ${TMPDIR:=$TMP}
2522 : ${TMPDIR:=/tmp}
2523
2524 if ! check_cmd mktemp -u XXXXXX; then
2525     # simple replacement for missing mktemp
2526     # NOT SAFE FOR GENERAL USE
2527     mktemp(){
2528         echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
2529     }
2530 fi
2531
2532 tmpfile(){
2533     tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
2534         (set -C; exec > $tmp) 2>/dev/null ||
2535         die "Unable to create temporary file in $TMPDIR."
2536     append TMPFILES $tmp
2537     eval $1=$tmp
2538 }
2539
2540 trap 'rm -f -- $TMPFILES' EXIT
2541
2542 tmpfile TMPASM .asm
2543 tmpfile TMPC   .c
2544 tmpfile TMPE   $EXESUF
2545 tmpfile TMPH   .h
2546 tmpfile TMPO   .o
2547 tmpfile TMPS   .S
2548 tmpfile TMPSH  .sh
2549 tmpfile TMPV   .ver
2550
2551 unset -f mktemp
2552
2553 chmod +x $TMPE
2554
2555 # make sure we can execute files in $TMPDIR
2556 cat > $TMPSH 2>> $logfile <<EOF
2557 #! /bin/sh
2558 EOF
2559 chmod +x $TMPSH >> $logfile 2>&1
2560 if ! $TMPSH >> $logfile 2>&1; then
2561     cat <<EOF
2562 Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
2563 variable to another directory and make sure that it is not mounted noexec.
2564 EOF
2565     die "Sanity test failed."
2566 fi
2567
2568 ccc_flags(){
2569     for flag; do
2570         case $flag in
2571             -std=c99)           echo -c99                       ;;
2572             -mcpu=*)            echo -arch ${flag#*=}           ;;
2573             -mieee)             echo -ieee                      ;;
2574             -O*|-fast)          echo $flag                      ;;
2575             -fno-math-errno)    echo -assume nomath_errno       ;;
2576             -g)                 echo -g3                        ;;
2577             -Wall)              echo -msg_enable level2         ;;
2578             -Wno-pointer-sign)  echo -msg_disable ptrmismatch1  ;;
2579             -Wl,*)              echo $flag                      ;;
2580             -f*|-W*)                                            ;;
2581             *)                  echo $flag                      ;;
2582         esac
2583    done
2584 }
2585
2586 cparser_flags(){
2587     for flag; do
2588         case $flag in
2589             -Wno-switch)             echo -Wno-switch-enum ;;
2590             -Wno-format-zero-length) ;;
2591             -Wdisabled-optimization) ;;
2592             -Wno-pointer-sign)       echo -Wno-other ;;
2593             *)                       echo $flag ;;
2594         esac
2595     done
2596 }
2597
2598 msvc_common_flags(){
2599     for flag; do
2600         case $flag in
2601             # In addition to specifying certain flags under the compiler
2602             # specific filters, they must be specified here as well or else the
2603             # generic catch all at the bottom will print the original flag.
2604             -Wall)                ;;
2605             -std=c99)             ;;
2606             # Common flags
2607             -fomit-frame-pointer) ;;
2608             -g)                   echo -Z7 ;;
2609             -fno-math-errno)      ;;
2610             -fno-common)          ;;
2611             -fno-signed-zeros)    ;;
2612             -fPIC)                ;;
2613             -mthumb)              ;;
2614             -march=*)             ;;
2615             -lz)                  echo zlib.lib ;;
2616             -lavifil32)           echo vfw32.lib ;;
2617             -lavicap32)           echo vfw32.lib user32.lib ;;
2618             -l*)                  echo ${flag#-l}.lib ;;
2619             *)                    echo $flag ;;
2620         esac
2621     done
2622 }
2623
2624 msvc_flags(){
2625     msvc_common_flags "$@"
2626     for flag; do
2627         case $flag in
2628             -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
2629                                        -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
2630                                        -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
2631                                        -wd4273 ;;
2632         esac
2633     done
2634 }
2635
2636 icl_flags(){
2637     msvc_common_flags "$@"
2638     for flag; do
2639         case $flag in
2640             # Despite what Intel's documentation says -Wall, which is supported
2641             # on Windows, does enable remarks so disable them here.
2642             -Wall)                echo $flag -Qdiag-disable:remark ;;
2643             -std=c99)             echo -Qstd=c99 ;;
2644         esac
2645     done
2646 }
2647
2648 pgi_flags(){
2649     for flag; do
2650         case $flag in
2651             -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
2652             -fomit-frame-pointer) echo -Mnoframe ;;
2653             -g)                   echo -gopt ;;
2654             *)                    echo $flag ;;
2655         esac
2656     done
2657 }
2658
2659 suncc_flags(){
2660     for flag; do
2661         case $flag in
2662             -march=*|-mcpu=*)
2663                 case "${flag#*=}" in
2664                     native)                   echo -xtarget=native       ;;
2665                     v9|niagara)               echo -xarch=sparc          ;;
2666                     ultrasparc)               echo -xarch=sparcvis       ;;
2667                     ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
2668                     i586|pentium)             echo -xchip=pentium        ;;
2669                     i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
2670                     pentium3*|c3-2)           echo -xtarget=pentium3     ;;
2671                     pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
2672                     pentium4*)          echo -xtarget=pentium4           ;;
2673                     prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
2674                     *-sse3)             echo -xarch=sse3                 ;;
2675                     core2)              echo -xarch=ssse3 -xchip=core2   ;;
2676                     corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
2677                     corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
2678                     amdfam10|barcelona|bdver*) echo -xarch=sse4_1        ;;
2679                     athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
2680                     k8|opteron|athlon64|athlon-fx)
2681                                                echo -xarch=sse2a         ;;
2682                     athlon*)                   echo -xarch=pentium_proa  ;;
2683                 esac
2684                 ;;
2685             -std=c99)             echo -xc99              ;;
2686             -fomit-frame-pointer) echo -xregs=frameptr    ;;
2687             -fPIC)                echo -KPIC -xcode=pic32 ;;
2688             -W*,*)                echo $flag              ;;
2689             -f*-*|-W*|-mimpure-text)                      ;;
2690             -shared)              echo -G                 ;;
2691             *)                    echo $flag              ;;
2692         esac
2693     done
2694 }
2695
2696 tms470_flags(){
2697     for flag; do
2698         case $flag in
2699             -march=*|-mcpu=*)
2700                 case "${flag#*=}" in
2701                     armv7-a|cortex-a*)      echo -mv=7a8 ;;
2702                     armv7-r|cortex-r*)      echo -mv=7r4 ;;
2703                     armv7-m|cortex-m*)      echo -mv=7m3 ;;
2704                     armv6*|arm11*)          echo -mv=6   ;;
2705                     armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26])
2706                                             echo -mv=5e  ;;
2707                     armv4*|arm7*|arm9[24]*) echo -mv=4   ;;
2708                 esac
2709                 ;;
2710             -mfpu=neon)     echo --float_support=vfpv3 --neon ;;
2711             -mfpu=vfp)      echo --float_support=vfpv2        ;;
2712             -mfpu=vfpv3)    echo --float_support=vfpv3        ;;
2713             -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
2714             -msoft-float)   echo --float_support=vfplib       ;;
2715             -O[0-3]|-mf=*)  echo $flag                        ;;
2716             -g)             echo -g -mn                       ;;
2717             -pds=*)         echo $flag                        ;;
2718             -D*|-I*)        echo $flag                        ;;
2719             --gcc|--abi=*)  echo $flag                        ;;
2720             -me)            echo $flag                        ;;
2721         esac
2722     done
2723 }
2724
2725 probe_cc(){
2726     pfx=$1
2727     _cc=$2
2728
2729     unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
2730     unset _ld_o _ldflags _ld_lib _ld_path
2731     unset _depflags _DEPCMD _DEPFLAGS
2732     _flags_filter=echo
2733
2734     if $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
2735         _type=llvm_gcc
2736         gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)')
2737         _ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver"
2738         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2739         _cflags_speed='-O3'
2740         _cflags_size='-Os'
2741     elif $_cc -v 2>&1 | grep -qi ^gcc; then
2742         _type=gcc
2743         gcc_version=$($_cc --version | head -n1)
2744         gcc_basever=$($_cc -dumpversion)
2745         gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
2746         gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
2747         _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
2748         if ! $_cc -dumpversion | grep -q '^2\.'; then
2749             _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2750         fi
2751         _cflags_speed='-O3'
2752         _cflags_size='-Os'
2753     elif $_cc --version 2>/dev/null | grep -q ^icc; then
2754         _type=icc
2755         _ident=$($_cc --version | head -n1)
2756         _depflags='-MMD'
2757         _cflags_speed='-O3'
2758         _cflags_size='-Os'
2759         _cflags_noopt='-O1'
2760     elif $_cc -v 2>&1 | grep -q xlc; then
2761         _type=xlc
2762         _ident=$($_cc -qversion 2>/dev/null | head -n1)
2763         _cflags_speed='-O5'
2764         _cflags_size='-O5 -qcompact'
2765     elif $_cc -V 2>/dev/null | grep -q Compaq; then
2766         _type=ccc
2767         _ident=$($_cc -V | head -n1 | cut -d' ' -f1-3)
2768         _DEPFLAGS='-M'
2769         _cflags_speed='-fast'
2770         _cflags_size='-O1'
2771         _flags_filter=ccc_flags
2772     elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
2773         test -d "$sysroot" || die "No valid sysroot specified."
2774         _type=armcc
2775         _ident=$($_cc --vsn | head -n1 | sed 's/.*: //')
2776         armcc_conf="$PWD/armcc.conf"
2777         $_cc --arm_linux_configure                 \
2778              --arm_linux_config_file="$armcc_conf" \
2779              --configure_sysroot="$sysroot"        \
2780              --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
2781              die "Error creating armcc configuration file."
2782         $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
2783         _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
2784         as_default="${cross_prefix}gcc"
2785         _depflags='-MMD'
2786         _cflags_speed='-O3'
2787         _cflags_size='-Os'
2788     elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
2789         _type=tms470
2790         _ident=$($_cc -version | head -n1 | tr -s ' ')
2791         _flags='--gcc --abi=eabi -me'
2792         _cc_e='-ppl -fe=$@'
2793         _cc_o='-fe=$@'
2794         _depflags='-ppa -ppd=$(@:.o=.d)'
2795         _cflags_speed='-O3 -mf=5'
2796         _cflags_size='-O3 -mf=2'
2797         _flags_filter=tms470_flags
2798     elif $_cc -v 2>&1 | grep -q clang; then
2799         _type=clang
2800         _ident=$($_cc --version | head -n1)
2801         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2802         _cflags_speed='-O3'
2803         _cflags_size='-Os'
2804     elif $_cc -V 2>&1 | grep -q Sun; then
2805         _type=suncc
2806         _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
2807         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
2808         _DEPFLAGS='-xM1 -xc99'
2809         _ldflags='-std=c99'
2810         _cflags_speed='-O5'
2811         _cflags_size='-O5 -xspace'
2812         _flags_filter=suncc_flags
2813     elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
2814         _type=pathscale
2815         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
2816         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2817         _cflags_speed='-O2'
2818         _cflags_size='-Os'
2819         _flags_filter='filter_out -Wdisabled-optimization'
2820     elif $_cc -v 2>&1 | grep -q Open64; then
2821         _type=open64
2822         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
2823         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2824         _cflags_speed='-O2'
2825         _cflags_size='-Os'
2826         _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
2827     elif $_cc -V 2>&1 | grep -q Portland; then
2828         _type=pgi
2829         _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')"
2830         opt_common='-alias=ansi -Mdse -Mlre -Mpre'
2831         _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
2832         _cflags_size="-O2 -Munroll=c:1 $opt_common"
2833         _cflags_noopt="-O1"
2834         _flags_filter=pgi_flags
2835     elif $_cc 2>&1 | grep -q Microsoft; then
2836         _type=msvc
2837         _ident=$($cc 2>&1 | head -n1)
2838         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
2839         _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
2840         _cflags_speed="-O2"
2841         _cflags_size="-O1"
2842         if $_cc 2>&1 | grep -q Linker; then
2843             _ld_o='-out:$@'
2844         else
2845             _ld_o='-Fe$@'
2846         fi
2847         _cc_o='-Fo$@'
2848         _cc_e='-P -Fi$@'
2849         _flags_filter=msvc_flags
2850         _ld_lib='lib%.a'
2851         _ld_path='-libpath:'
2852         _flags='-nologo'
2853         _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
2854         if [ $pfx = hostcc ]; then
2855             append _cflags -Dsnprintf=_snprintf
2856         fi
2857     elif $_cc 2>&1 | grep -q Intel; then
2858         _type=icl
2859         _ident=$($cc 2>&1 | head -n1)
2860         _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
2861         # Not only is O3 broken on 13.x+ but it is slower on all previous
2862         # versions (tested) as well.
2863         _cflags_speed="-O2"
2864         _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
2865         if $_cc 2>&1 | grep -q Linker; then
2866             _ld_o='-out:$@'
2867         else
2868             _ld_o='-Fe$@'
2869         fi
2870         _cc_o='-Fo$@'
2871         _cc_e='-P'
2872         _flags_filter=icl_flags
2873         _ld_lib='lib%.a'
2874         _ld_path='-libpath:'
2875         # -Qdiag-error to make icl error when seeing certain unknown arguments
2876         _flags='-nologo -Qdiag-error:4044,10157'
2877         # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency
2878         # with MSVC which enables it by default.
2879         _cflags='-D_USE_MATH_DEFINES -FIstdlib.h -Dstrtoll=_strtoi64 -Qms0 -Qvec- -Qsimd- -GS'
2880         if [ $pfx = hostcc ]; then
2881             append _cflags -Dsnprintf=_snprintf
2882         fi
2883     elif $_cc --version 2>/dev/null | grep -q ^cparser; then
2884         _type=cparser
2885         _ident=$($_cc --version | head -n1)
2886         _depflags='-MMD'
2887         _cflags_speed='-O4'
2888         _cflags_size='-O2'
2889         _flags_filter=cparser_flags
2890     fi
2891
2892     eval ${pfx}_type=\$_type
2893     eval ${pfx}_ident=\$_ident
2894 }
2895
2896 set_ccvars(){
2897     eval ${1}_C=\${_cc_c-\${${1}_C}}
2898     eval ${1}_E=\${_cc_e-\${${1}_E}}
2899     eval ${1}_O=\${_cc_o-\${${1}_O}}
2900
2901     if [ -n "$_depflags" ]; then
2902         eval ${1}_DEPFLAGS=\$_depflags
2903     else
2904         eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
2905         eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
2906         eval DEP${1}FLAGS=\$_flags
2907     fi
2908 }
2909
2910 probe_cc cc "$cc"
2911 cflags_filter=$_flags_filter
2912 cflags_speed=$_cflags_speed
2913 cflags_size=$_cflags_size
2914 cflags_noopt=$_cflags_noopt
2915 add_cflags $_flags $_cflags
2916 cc_ldflags=$_ldflags
2917 set_ccvars CC
2918
2919 probe_cc hostcc "$host_cc"
2920 host_cflags_filter=$_flags_filter
2921 add_host_cflags  $_flags $_cflags
2922 set_ccvars HOSTCC
2923
2924 test -n "$cc_type" && enable $cc_type ||
2925     warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
2926
2927 : ${as_default:=$cc}
2928 : ${dep_cc_default:=$cc}
2929 : ${ld_default:=$cc}
2930 : ${host_ld_default:=$host_cc}
2931 set_default ar as dep_cc ld host_ld
2932
2933 probe_cc as "$as"
2934 asflags_filter=$_flags_filter
2935 add_asflags $_flags $_cflags
2936 set_ccvars AS
2937
2938 probe_cc ld "$ld"
2939 ldflags_filter=$_flags_filter
2940 add_ldflags $_flags $_ldflags
2941 test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
2942 LD_O=${_ld_o-$LD_O}
2943 LD_LIB=${_ld_lib-$LD_LIB}
2944 LD_PATH=${_ld_path-$LD_PATH}
2945
2946 probe_cc hostld "$host_ld"
2947 host_ldflags_filter=$_flags_filter
2948 add_host_ldflags $_flags $_ldflags
2949 HOSTLD_O=${_ld_o-$HOSTLD_O}
2950
2951 if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
2952     probe_cc depcc "$dep_cc"
2953     CCDEP=${_DEPCMD:-$DEPCMD}
2954     CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
2955     DEPCCFLAGS=$_flags
2956 fi
2957
2958 if $ar 2>&1 | grep -q Microsoft; then
2959     arflags="-nologo"
2960     ar_o='-out:$@'
2961 elif $ar 2>&1 | grep -q 'Texas Instruments'; then
2962     arflags="rq"
2963     ar_o='$@'
2964 elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then
2965     arflags='-Xany -r -c'
2966     ar_o='$@'
2967 else
2968     arflags="rc"
2969     ar_o='$@'
2970 fi
2971
2972 add_cflags $extra_cflags
2973 add_asflags $extra_cflags
2974
2975 if test -n "$sysroot"; then
2976     case "$cc_type" in
2977         gcc|llvm_gcc|clang)
2978             add_cppflags --sysroot="$sysroot"
2979             add_ldflags --sysroot="$sysroot"
2980         ;;
2981         tms470)
2982             add_cppflags -I"$sysinclude"
2983             add_ldflags  --sysroot="$sysroot"
2984         ;;
2985     esac
2986 fi
2987
2988 if test "$cpu" = host; then
2989     enabled cross_compile &&
2990         die "--cpu=host makes no sense when cross-compiling."
2991
2992     case "$cc_type" in
2993         gcc|llvm_gcc)
2994             check_native(){
2995                 $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
2996                 sed -n "/cc1.*$1=/{
2997                             s/.*$1=\\([^ ]*\\).*/\\1/
2998                             p
2999                             q
3000                         }" $TMPE
3001             }
3002             cpu=$(check_native -march || check_native -mcpu)
3003         ;;
3004     esac
3005
3006     test "${cpu:-host}" = host &&
3007         die "--cpu=host not supported with compiler $cc"
3008 fi
3009
3010 # Deal with common $arch aliases
3011 case "$arch" in
3012     aarch64|arm64)
3013         arch="aarch64"
3014     ;;
3015     arm*)
3016         arch="arm"
3017     ;;
3018     mips*|IP*)
3019         arch="mips"
3020     ;;
3021     parisc*|hppa*)
3022         arch="parisc"
3023     ;;
3024     "Power Macintosh"|ppc*|powerpc*)
3025         arch="ppc"
3026     ;;
3027     s390|s390x)
3028         arch="s390"
3029     ;;
3030     sh4|sh)
3031         arch="sh4"
3032     ;;
3033     sun4u|sparc*)
3034         arch="sparc"
3035     ;;
3036     tilegx|tile-gx)
3037         arch="tilegx"
3038     ;;
3039     i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
3040         arch="x86"
3041     ;;
3042 esac
3043
3044 is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
3045 enable $arch
3046
3047 # Add processor-specific flags
3048 if enabled aarch64; then
3049
3050     case $cpu in
3051         armv*)
3052             cpuflags="-march=$cpu"
3053         ;;
3054         *)
3055             cpuflags="-mcpu=$cpu"
3056         ;;
3057     esac
3058
3059 elif enabled alpha; then
3060
3061     cpuflags="-mcpu=$cpu"
3062
3063 elif enabled arm; then
3064
3065     check_arm_arch() {
3066         check_cpp_condition stddef.h \
3067             "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
3068             $cpuflags
3069     }
3070
3071     probe_arm_arch() {
3072         if   check_arm_arch 4;        then echo armv4;
3073         elif check_arm_arch 4T;       then echo armv4t;
3074         elif check_arm_arch 5;        then echo armv5;
3075         elif check_arm_arch 5E;       then echo armv5e;
3076         elif check_arm_arch 5T;       then echo armv5t;
3077         elif check_arm_arch 5TE;      then echo armv5te;
3078         elif check_arm_arch 5TEJ;     then echo armv5te;
3079         elif check_arm_arch 6;        then echo armv6;
3080         elif check_arm_arch 6J;       then echo armv6j;
3081         elif check_arm_arch 6K;       then echo armv6k;
3082         elif check_arm_arch 6Z;       then echo armv6z;
3083         elif check_arm_arch 6ZK;      then echo armv6zk;
3084         elif check_arm_arch 6T2;      then echo armv6t2;
3085         elif check_arm_arch 7;        then echo armv7;
3086         elif check_arm_arch 7A  7_A;  then echo armv7-a;
3087         elif check_arm_arch 7R  7_R;  then echo armv7-r;
3088         elif check_arm_arch 7M  7_M;  then echo armv7-m;
3089         elif check_arm_arch 7EM 7E_M; then echo armv7-m;
3090         elif check_arm_arch 8A  8_A;  then echo armv8-a;
3091         fi
3092     }
3093
3094     [ "$cpu" = generic ] && cpu=$(probe_arm_arch)
3095
3096     case $cpu in
3097         armv*)
3098             cpuflags="-march=$cpu"
3099             subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
3100         ;;
3101         *)
3102             cpuflags="-mcpu=$cpu"
3103             case $cpu in
3104                 cortex-a*)                               subarch=armv7a  ;;
3105                 cortex-r*)                               subarch=armv7r  ;;
3106                 cortex-m*)                 enable thumb; subarch=armv7m  ;;
3107                 arm11*)                                  subarch=armv6   ;;
3108                 arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
3109                 armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
3110                 *)                             subarch=$(probe_arm_arch) ;;
3111             esac
3112         ;;
3113     esac
3114
3115     case "$subarch" in
3116         armv5t*)    enable fast_clz                ;;
3117         armv[6-8]*) enable fast_clz fast_unaligned ;;
3118     esac
3119
3120 elif enabled avr32; then
3121
3122     case $cpu in
3123         ap7[02]0[0-2])
3124             subarch="avr32_ap"
3125             cpuflags="-mpart=$cpu"
3126         ;;
3127         ap)
3128             subarch="avr32_ap"
3129             cpuflags="-march=$cpu"
3130         ;;
3131         uc3[ab]*)
3132             subarch="avr32_uc"
3133             cpuflags="-mcpu=$cpu"
3134         ;;
3135         uc)
3136             subarch="avr32_uc"
3137             cpuflags="-march=$cpu"
3138         ;;
3139     esac
3140
3141 elif enabled bfin; then
3142
3143     cpuflags="-mcpu=$cpu"
3144
3145 elif enabled mips; then
3146
3147     cpuflags="-march=$cpu"
3148
3149 elif enabled ppc; then
3150
3151     disable ldbrx
3152
3153     case $(tolower $cpu) in
3154         601|ppc601|powerpc601)
3155             cpuflags="-mcpu=601"
3156             disable altivec
3157         ;;
3158         603*|ppc603*|powerpc603*)
3159             cpuflags="-mcpu=603"
3160             disable altivec
3161         ;;
3162         604*|ppc604*|powerpc604*)
3163             cpuflags="-mcpu=604"
3164             disable altivec
3165         ;;
3166         g3|75*|ppc75*|powerpc75*)
3167             cpuflags="-mcpu=750"
3168             disable altivec
3169         ;;
3170         g4|745*|ppc745*|powerpc745*)
3171             cpuflags="-mcpu=7450"
3172         ;;
3173         74*|ppc74*|powerpc74*)
3174             cpuflags="-mcpu=7400"
3175         ;;
3176         g5|970|ppc970|powerpc970)
3177             cpuflags="-mcpu=970"
3178         ;;
3179         power[3-7]*)
3180             cpuflags="-mcpu=$cpu"
3181         ;;
3182         cell)
3183             cpuflags="-mcpu=cell"
3184             enable ldbrx
3185         ;;
3186         e500mc)
3187             cpuflags="-mcpu=e500mc"
3188             disable altivec
3189         ;;
3190         e500v2)
3191             cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
3192             disable altivec
3193             disable dcbzl
3194         ;;
3195         e500)
3196             cpuflags="-mcpu=8540 -mhard-float"
3197             disable altivec
3198             disable dcbzl
3199         ;;
3200     esac
3201
3202 elif enabled sparc; then
3203
3204     case $cpu in
3205         cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
3206             cpuflags="-mcpu=$cpu"
3207         ;;
3208         ultrasparc*|niagara[234])
3209             cpuflags="-mcpu=$cpu"
3210         ;;
3211     esac
3212
3213 elif enabled x86; then
3214
3215     case $cpu in
3216         i[345]86|pentium)
3217             cpuflags="-march=$cpu"
3218             disable mmx
3219         ;;
3220         # targets that do NOT support nopl and conditional mov (cmov)
3221         pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
3222             cpuflags="-march=$cpu"
3223             disable i686
3224         ;;
3225         # targets that do support nopl and conditional mov (cmov)
3226         i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx|core2|corei7*|amdfam10|barcelona|atom|bdver*)
3227             cpuflags="-march=$cpu"
3228             enable i686
3229             enable fast_cmov
3230         ;;
3231         # targets that do support conditional mov but on which it's slow
3232         pentium4|pentium4m|prescott|nocona)
3233             cpuflags="-march=$cpu"
3234             enable i686
3235             disable fast_cmov
3236         ;;
3237     esac
3238
3239 fi
3240
3241 if [ "$cpu" != generic ]; then
3242     add_cflags  $cpuflags
3243     add_asflags $cpuflags
3244 fi
3245
3246 # compiler sanity check
3247 check_exec <<EOF
3248 int main(void){ return 0; }
3249 EOF
3250 if test "$?" != 0; then
3251     echo "$cc is unable to create an executable file."
3252     if test -z "$cross_prefix" && ! enabled cross_compile ; then
3253         echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
3254         echo "Only do this if you know what cross compiling means."
3255     fi
3256     die "C compiler test failed."
3257 fi
3258
3259 add_cppflags -D_ISOC99_SOURCE
3260 check_cflags -std=c99
3261 check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
3262 #include <stdlib.h>
3263 EOF
3264 check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
3265 #include <stdlib.h>
3266 EOF
3267
3268 add_host_cppflags -D_ISOC99_SOURCE
3269 check_host_cflags -std=c99
3270 check_host_cflags -Wall
3271 check_host_cflags -O3
3272
3273 check_64bit(){
3274     arch32=$1
3275     arch64=$2
3276     expr=$3
3277     check_code cc "" "int test[2*($expr) - 1]" &&
3278         subarch=$arch64 || subarch=$arch32
3279 }
3280
3281 case "$arch" in
3282     aarch64|alpha|ia64)
3283         spic=$shared
3284     ;;
3285     mips)
3286         check_64bit mips mips64 '_MIPS_SIM > 1'
3287         spic=$shared
3288     ;;
3289     parisc)
3290         check_64bit parisc parisc64 'sizeof(void *) > 4'
3291         spic=$shared
3292     ;;
3293     ppc)
3294         check_64bit ppc ppc64 'sizeof(void *) > 4'
3295         spic=$shared
3296     ;;
3297     s390)
3298         check_64bit s390 s390x 'sizeof(void *) > 4'
3299         spic=$shared
3300     ;;
3301     sparc)
3302         check_64bit sparc sparc64 'sizeof(void *) > 4'
3303         spic=$shared
3304     ;;
3305     x86)
3306         check_64bit x86_32 x86_64 'sizeof(void *) > 4'
3307         if test "$subarch" = "x86_64"; then
3308             spic=$shared
3309         fi
3310     ;;
3311 esac
3312
3313 enable $subarch
3314 enabled spic && enable_weak pic
3315
3316 # OS specific
3317 case $target_os in
3318     aix)
3319         SHFLAGS=-shared
3320         add_cppflags '-I\$(SRC_PATH)/compat/aix'
3321         enabled shared && add_ldflags -Wl,-brtl
3322         ;;
3323     haiku)
3324         prefix_default="/boot/common"
3325         network_extralibs="-lnetwork"
3326         host_libs=
3327         ;;
3328     sunos)
3329         SHFLAGS='-shared -Wl,-h,$$(@F)'
3330         enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
3331         network_extralibs="-lsocket -lnsl"
3332         # When using suncc to build, the Solaris linker will mark
3333         # an executable with each instruction set encountered by
3334         # the Solaris assembler.  As our libraries contain their own
3335         # guards for processor-specific code, instead suppress
3336         # generation of the HWCAPS ELF section on Solaris x86 only.
3337         enabled_all suncc x86 &&
3338             echo "hwcap_1 = OVERRIDE;" > mapfile &&
3339             add_ldflags -Wl,-M,mapfile
3340         nm_default='nm -P -g'
3341         ;;
3342     netbsd)
3343         disable symver
3344         oss_indev_extralibs="-lossaudio"
3345         oss_outdev_extralibs="-lossaudio"
3346         ;;
3347     openbsd|bitrig)
3348         disable symver
3349         SHFLAGS='-shared'
3350         SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
3351         SLIB_INSTALL_LINKS=
3352         oss_indev_extralibs="-lossaudio"
3353         oss_outdev_extralibs="-lossaudio"
3354         ;;
3355     dragonfly)
3356         disable symver
3357         ;;
3358     freebsd)
3359         ;;
3360     bsd/os)
3361         add_extralibs -lpoll -lgnugetopt
3362         ;;
3363     darwin)
3364         gas="gas-preprocessor.pl $cc"
3365         enabled ppc && add_asflags -force_cpusubtype_ALL
3366         SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
3367         enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
3368         add_ldflags -Wl,-dynamic,-search_paths_first
3369         SLIBSUF=".dylib"
3370         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
3371         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
3372         objformat="macho"
3373         enabled x86_64 && objformat="macho64"
3374         enabled_any pic shared ||
3375             { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
3376         ;;
3377     mingw32*)
3378         if test $target_os = "mingw32ce"; then
3379             disable network
3380         else
3381             target_os=mingw32
3382         fi
3383         LIBTARGET=i386
3384         if enabled x86_64; then
3385             LIBTARGET="i386:x86-64"
3386         elif enabled arm; then
3387             LIBTARGET=arm-wince
3388         fi
3389         check_ldflags -Wl,--nxcompat
3390         check_ldflags -Wl,--dynamicbase
3391         shlibdir_default="$bindir_default"
3392         SLIBPREF=""
3393         SLIBSUF=".dll"
3394         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3395         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3396         SLIB_EXTRA_CMD=-'sed -e "s/ @[^ ]*//" $$(@:$(SLIBSUF)=.orig.def) > $$(@:$(SLIBSUF)=.def); $(DLLTOOL) -m $(LIBTARGET) -d $$(@:$(SLIBSUF)=.def) -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D $(SLIBNAME_WITH_MAJOR)'
3397         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3398         SLIB_INSTALL_LINKS=
3399         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3400         SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3401         SHFLAGS='-shared -Wl,--output-def,$$(@:$(SLIBSUF)=.orig.def) -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-image-base'
3402         objformat="win32"
3403         dlltool="${cross_prefix}dlltool"
3404         ranlib=:
3405         enable dos_paths
3406         ;;
3407     win32|win64)
3408         disable symver
3409         if enabled shared; then
3410             # Link to the import library instead of the normal static library
3411             # for shared libs.
3412             LD_LIB='%.lib'
3413             # Cannot build both shared and static libs with MSVC or icl.
3414             disable static
3415         fi
3416         shlibdir_default="$bindir_default"
3417         SLIBPREF=""
3418         SLIBSUF=".dll"
3419         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3420         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3421         SLIB_CREATE_DEF_CMD='$(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
3422         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3423         SLIB_INSTALL_LINKS=
3424         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3425         SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3426         SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
3427         objformat="win32"
3428         ranlib=:
3429         enable dos_paths
3430         ;;
3431     cygwin*)
3432         target_os=cygwin
3433         shlibdir_default="$bindir_default"
3434         SLIBPREF="cyg"
3435         SLIBSUF=".dll"
3436         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3437         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3438         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3439         SLIB_INSTALL_LINKS=
3440         SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a'
3441         SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a'
3442         objformat="win32"
3443         enable dos_paths
3444         ;;
3445     *-dos|freedos|opendos)
3446         network_extralibs="-lsocket"
3447         objformat="coff"
3448         enable dos_paths
3449         add_cppflags -U__STRICT_ANSI__
3450         ;;
3451     linux)
3452         enable dv1394
3453         ;;
3454     irix*)
3455         target_os=irix
3456         ranlib="echo ignoring ranlib"
3457         ;;
3458     os/2*)
3459         ln_s="cp -f"
3460         objformat="aout"
3461         add_cppflags -D_GNU_SOURCE
3462         add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
3463         SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
3464         LIBSUF="_s.a"
3465         SLIBPREF=""
3466         SLIBSUF=".dll"
3467         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
3468         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
3469         SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
3470             echo PROTMODE >> $(SUBDIR)$(NAME).def; \
3471             echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
3472             echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
3473             echo EXPORTS >> $(SUBDIR)$(NAME).def; \
3474             emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def'
3475         SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
3476             emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
3477         SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
3478         enable dos_paths
3479         ;;
3480     gnu/kfreebsd)
3481         add_cppflags -D_BSD_SOURCE
3482         ;;
3483     gnu)
3484         ;;
3485     qnx)
3486         add_cppflags -D_QNX_SOURCE
3487         network_extralibs="-lsocket"
3488         ;;
3489     symbian)
3490         SLIBSUF=".dll"
3491         enable dos_paths
3492         add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default
3493         add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS
3494         add_ldflags -Wl,--target1-abs,--no-undefined \
3495                     -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \
3496                     -Wl,--entry=_E32Startup -Wl,-u,_E32Startup
3497         add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \
3498                       -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
3499                       -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
3500         ;;
3501     osf1)
3502         add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
3503         ;;
3504     minix)
3505         ;;
3506     plan9)
3507         add_cppflags -D_C99_SNPRINTF_EXTENSION  \
3508                      -D_REENTRANT_SOURCE        \
3509                      -D_RESEARCH_SOURCE         \
3510                      -DFD_SETSIZE=96            \
3511                      -DHAVE_SOCK_OPTS
3512         add_compat strtod.o strtod=avpriv_strtod
3513         network_extralibs='-lbsd'
3514         exeobjs=compat/plan9/main.o
3515         disable avserver
3516         cp_f='cp'
3517         ;;
3518     none)
3519         ;;
3520     *)
3521         die "Unknown OS '$target_os'."
3522         ;;
3523 esac
3524
3525 # determine libc flavour
3526
3527 probe_libc(){
3528     pfx=$1
3529     pfx_no_=${pfx%_}
3530     # uclibc defines __GLIBC__, so it needs to be checked before glibc.
3531     if check_${pfx}cpp_condition features.h "defined __UCLIBC__"; then
3532         eval ${pfx}libc_type=uclibc
3533         add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3534     elif check_${pfx}cpp_condition features.h "defined __GLIBC__"; then
3535         eval ${pfx}libc_type=glibc
3536         add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3537     # MinGW headers can be installed on Cygwin, so check for newlib first.
3538     elif check_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
3539         eval ${pfx}libc_type=newlib
3540         add_${pfx}cppflags -U__STRICT_ANSI__
3541     # MinGW64 is backwards compatible with MinGW32, so check for it first.
3542     elif check_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then
3543         eval ${pfx}libc_type=mingw64
3544         add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3545         eval test \$${pfx_no_}cc_type = "gcc" &&
3546             add_${pfx}cppflags -D__printf__=__gnu_printf__
3547     elif check_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
3548          check_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
3549         eval ${pfx}libc_type=mingw32
3550         check_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \
3551             (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
3552             die "ERROR: MinGW32 runtime version must be >= 3.15."
3553         add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3554         eval test \$${pfx_no_}cc_type = "gcc" &&
3555             add_${pfx}cppflags -D__printf__=__gnu_printf__
3556     elif check_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
3557         eval ${pfx}libc_type=msvcrt
3558         # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to
3559         # 0x601 by default unless something else is set by the user.
3560         # This can easily lead to us detecting functions only present
3561         # in such new versions and producing binaries requiring windows 7.0.
3562         # Therefore explicitly set the default to XP unless the user has
3563         # set something else on the command line.
3564         check_${pfx}cpp_condition stdlib.h "defined(_WIN32_WINNT)" ||
3565             add_${pfx}cppflags -D_WIN32_WINNT=0x0502
3566     elif check_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then
3567         eval ${pfx}libc_type=klibc
3568     elif check_${pfx}cpp_condition sys/cdefs.h "defined __BIONIC__"; then
3569         eval ${pfx}libc_type=bionic
3570     elif check_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
3571         eval ${pfx}libc_type=solaris
3572         add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
3573     fi
3574 }
3575
3576 probe_libc
3577 test -n "$libc_type" && enable libc_$libc_type
3578 probe_libc host_
3579 test -n "$host_libc_type" && enable host_libc_$host_libc_type
3580
3581 case $libc_type in
3582     bionic)
3583         add_compat strtod.o strtod=avpriv_strtod
3584         ;;
3585     msvcrt)
3586         add_compat strtod.o strtod=avpriv_strtod
3587         add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
3588                                      _snprintf=avpriv_snprintf  \
3589                                      vsnprintf=avpriv_vsnprintf
3590         ;;
3591 esac
3592
3593 # hacks for compiler/libc/os combinations
3594
3595 if enabled_all tms470 libc_glibc; then
3596     CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
3597     add_cppflags -D__USER_LABEL_PREFIX__=
3598     add_cppflags -D__builtin_memset=memset
3599     add_cppflags -D__gnuc_va_list=va_list -D_VA_LIST_DEFINED
3600     add_cflags   -pds=48    # incompatible redefinition of macro
3601 fi
3602
3603 if enabled_all ccc libc_glibc; then
3604     add_ldflags -Wl,-z,now  # calls to libots crash without this
3605 fi
3606
3607 check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
3608     add_cppflags '-I\$(SRC_PATH)/compat/float'
3609
3610 esc(){
3611     echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
3612 }
3613
3614 echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $LIBAV_CONFIGURATION)" >config.fate
3615
3616 check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
3617
3618 set_default $PATHS_LIST
3619 set_default nm
3620
3621 # we need to build at least one lib type
3622 if ! enabled_any static shared; then
3623     cat <<EOF
3624 At least one library type must be built.
3625 Specify --enable-static to build the static libraries or --enable-shared to
3626 build the shared libraries as well. To only build the shared libraries specify
3627 --disable-static in addition to --enable-shared.
3628 EOF
3629     exit 1;
3630 fi
3631
3632 die_license_disabled() {
3633     enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
3634 }
3635
3636 die_license_disabled gpl libcdio
3637 die_license_disabled gpl libx264
3638 die_license_disabled gpl libx265
3639 die_license_disabled gpl libxavs
3640 die_license_disabled gpl libxvid
3641 die_license_disabled gpl x11grab
3642
3643 die_license_disabled nonfree libfaac
3644 die_license_disabled nonfree libfdk_aac
3645 die_license_disabled nonfree openssl
3646
3647 die_license_disabled version3 libopencore_amrnb
3648 die_license_disabled version3 libopencore_amrwb
3649 die_license_disabled version3 libvo_aacenc
3650 die_license_disabled version3 libvo_amrwbenc
3651
3652 enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
3653
3654 disabled optimizations || check_cflags -fomit-frame-pointer
3655
3656 enable_weak_pic() {
3657     disabled pic && return
3658     enable pic
3659     add_cppflags -DPIC
3660     case "$target_os" in
3661     mingw*|cygwin*)
3662         ;;
3663     *)
3664         add_cflags -fPIC
3665         ;;
3666     esac
3667     add_asflags  -fPIC
3668 }
3669
3670 enabled pic && enable_weak_pic
3671
3672 check_cc <<EOF || die "Symbol mangling check failed."
3673 int ff_extern;
3674 EOF
3675 sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
3676 extern_prefix=${sym%%ff_extern*}
3677
3678 check_cc <<EOF && enable_weak inline_asm
3679 void foo(void) { __asm__ volatile ("" ::); }
3680 EOF
3681
3682 _restrict=
3683 for restrict_keyword in restrict __restrict__ __restrict; do
3684     check_cc <<EOF && _restrict=$restrict_keyword && break
3685 void foo(char * $restrict_keyword p);
3686 EOF
3687 done
3688
3689 check_cc <<EOF && enable pragma_deprecated
3690 void foo(void) { _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") }
3691 EOF
3692
3693 check_cc <<EOF && enable attribute_packed
3694 struct { int x; } __attribute__((packed)) x;
3695 EOF
3696
3697 check_cc <<EOF && enable attribute_may_alias
3698 union { int x; } __attribute__((may_alias)) x;
3699 EOF
3700
3701 check_cc <<EOF || die "endian test failed"
3702 unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
3703 EOF
3704 od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
3705
3706 check_inline_asm inline_asm_labels '"1:\n"'
3707
3708 if enabled aarch64; then
3709     enabled armv8 && check_insn armv8 'prfm   pldl1strm, [x0]'
3710     # internal assembler in clang 3.3 does not support this instruction
3711     enabled neon && check_insn neon 'ext   v0.8B, v0.8B, v1.8B, #1'
3712     enabled vfp  && check_insn vfp  'fmadd d0,    d0,    d1,    d2'
3713
3714     map 'enabled_any ${v}_external ${v}_inline || disable $v' $ARCH_EXT_LIST_ARM
3715
3716 elif enabled alpha; then
3717
3718     check_cflags -mieee
3719
3720 elif enabled arm; then
3721
3722     check_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb
3723     enabled thumb && check_cflags -mthumb || check_cflags -marm
3724     nogas=die
3725
3726     if     check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then
3727         enable vfp_args
3728     elif ! check_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__"; then
3729         case "${cross_prefix:-$cc}" in
3730             *hardfloat*)         enable vfp_args;   fpabi=vfp ;;
3731             *) check_ld <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
3732 __asm__ (".eabi_attribute 28, 1");
3733 int main(void) { return 0; }
3734 EOF
3735         esac
3736         warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
3737     fi
3738
3739     enabled armv5te && check_insn armv5te 'qadd r0, r0, r0'
3740     enabled armv6   && check_insn armv6   'sadd16 r0, r0, r0'
3741     enabled armv6t2 && check_insn armv6t2 'movt r0, #0'
3742     enabled neon    && check_insn neon    'vadd.i16 q0, q0, q0'
3743     enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
3744     enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'
3745
3746     [ $target_os = linux ] ||
3747         map 'enabled_any ${v}_external ${v}_inline || disable $v' \
3748             $ARCH_EXT_LIST_ARM
3749
3750     check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
3751
3752     [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
3753
3754 elif enabled mips; then
3755
3756     check_inline_asm loongson '"dmult.g $1, $2, $3"'
3757
3758 elif enabled parisc; then
3759
3760     if enabled gcc; then
3761         case $($cc -dumpversion) in
3762             4.[3-8].*) check_cflags -fno-optimize-sibling-calls ;;
3763         esac
3764     fi
3765
3766 elif enabled ppc; then
3767
3768     enable local_aligned_8 local_aligned_16
3769
3770     check_inline_asm dcbzl     '"dcbzl 0, %0" :: "r"(0)'
3771     check_inline_asm ibm_asm   '"add 0, 0, 0"'
3772     check_inline_asm ppc4xx    '"maclhw r10, r11, r12"'
3773     check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'
3774
3775     # AltiVec flags: The FSF version of GCC differs from the Apple version
3776     if enabled altivec; then
3777         nogas=warn
3778         check_cflags -maltivec -mabi=altivec &&
3779         { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } ||
3780         check_cflags -faltivec
3781
3782         # check if our compiler supports Motorola AltiVec C API
3783         check_cc <<EOF || disable altivec
3784 $inc_altivec_h
3785 int main(void) {
3786     vector signed int v1 = (vector signed int) { 0 };
3787     vector signed int v2 = (vector signed int) { 1 };
3788     v1 = vec_add(v1, v2);
3789     return 0;
3790 }
3791 EOF
3792
3793         enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
3794     fi
3795
3796 elif enabled x86; then
3797
3798     check_builtin rdtsc    intrin.h   "__rdtsc()"
3799     check_builtin mm_empty mmintrin.h "_mm_empty()"
3800
3801     enable local_aligned_8 local_aligned_16
3802
3803     # check whether EBP is available on x86
3804     # As 'i' is stored on the stack, this program will crash
3805     # if the base pointer is used to access it because the
3806     # base pointer is cleared in the inline assembly code.
3807     check_exec_crash <<EOF && enable ebp_available
3808 volatile int i=0;
3809 __asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
3810 return i;
3811 EOF
3812
3813     # check whether EBX is available on x86
3814     check_inline_asm ebx_available '""::"b"(0)' &&
3815         check_inline_asm ebx_available '"":::"%ebx"'
3816
3817     # check whether xmm clobbers are supported
3818     check_inline_asm xmm_clobbers '"":::"%xmm0"'
3819
3820     # check whether binutils is new enough to compile SSSE3/MMXEXT
3821     enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
3822     enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
3823
3824     if ! disabled_any asm mmx yasm; then
3825         if check_cmd $yasmexe --version; then
3826             enabled x86_64 && yasm_extra="-m amd64"
3827             yasm_debug="-g dwarf2"
3828         elif check_cmd nasm -v; then
3829             yasmexe=nasm
3830             yasm_debug="-g -F dwarf"
3831             enabled x86_64 && test "$objformat" = elf && objformat=elf64
3832         fi
3833
3834         YASMFLAGS="-f $objformat $yasm_extra"
3835         enabled pic               && append YASMFLAGS "-DPIC"
3836         test -n "$extern_prefix"  && append YASMFLAGS "-DPREFIX"
3837         case "$objformat" in
3838             elf*) enabled debug && append YASMFLAGS $yasm_debug ;;
3839         esac
3840
3841         check_yasm "movbe ecx, [5]" && enable yasm ||
3842             die "yasm/nasm not found or too old. Use --disable-yasm for a crippled build."
3843         check_yasm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
3844         check_yasm "vfmadd132ps ymm0, ymm1, ymm2"    || disable fma3_external
3845         check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
3846         check_yasm "CPU amdnop" || disable cpunop
3847     fi
3848
3849     case "$cpu" in
3850         athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
3851             disable fast_clz
3852         ;;
3853     esac
3854
3855 fi
3856
3857 if enabled asm; then
3858     as=${gas:=$as}
3859     check_as <<EOF && enable gnu_as || \
3860         $nogas "GNU assembler not found, install gas-preprocessor"
3861 .macro m n
3862 \n: .int 0
3863 .endm
3864 m x
3865 EOF
3866 fi
3867
3868 check_ldflags -Wl,--as-needed
3869
3870 if check_func dlopen; then
3871     ldl=
3872 elif check_func dlopen -ldl; then
3873     ldl=-ldl
3874 fi
3875
3876 if ! disabled network; then
3877     check_func getaddrinfo $network_extralibs
3878     check_func getservbyport $network_extralibs
3879     check_func inet_aton $network_extralibs
3880
3881     check_type netdb.h "struct addrinfo"
3882     check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
3883     check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
3884     check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
3885     check_type poll.h "struct pollfd"
3886     check_type netinet/sctp.h "struct sctp_event_subscribe"
3887     check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
3888     check_type netinet/in.h "struct sockaddr_in6"
3889     check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
3890     check_type "sys/types.h sys/socket.h" socklen_t
3891
3892     # Prefer arpa/inet.h over winsock2
3893     if check_header arpa/inet.h ; then
3894         check_func closesocket
3895     elif check_header winsock2.h ; then
3896         check_func_headers winsock2.h closesocket -lws2 &&
3897             network_extralibs="-lws2" ||
3898         { check_func_headers winsock2.h closesocket -lws2_32 &&
3899             network_extralibs="-lws2_32"; } || disable winsock2_h network
3900         check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
3901
3902         check_type ws2tcpip.h socklen_t
3903         check_type ws2tcpip.h "struct addrinfo"
3904         check_type ws2tcpip.h "struct group_source_req"
3905         check_type ws2tcpip.h "struct ip_mreq_source"
3906         check_type ws2tcpip.h "struct ipv6_mreq"
3907         check_type winsock2.h "struct pollfd"
3908         check_struct winsock2.h "struct sockaddr" sa_len
3909         check_type ws2tcpip.h "struct sockaddr_in6"
3910         check_type ws2tcpip.h "struct sockaddr_storage"
3911     else
3912         disable network
3913     fi
3914 fi
3915
3916 check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
3917 check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
3918 check_builtin MemoryBarrier windows.h "MemoryBarrier()"
3919 check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
3920
3921 check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
3922 check_func  ${malloc_prefix}memalign            && enable memalign
3923 check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
3924
3925 check_func  fcntl
3926 check_func  fork
3927 check_func  gethrtime
3928 check_func  getopt
3929 check_func  getrusage
3930 check_func  gettimeofday
3931 check_func  isatty
3932 check_func  localtime_r
3933 check_func  mach_absolute_time
3934 check_func  mkstemp
3935 check_func  mmap
3936 check_func  mprotect
3937 # Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
3938 check_func  nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }
3939 check_func  sched_getaffinity
3940 check_func  setrlimit
3941 check_func  strerror_r
3942 check_func  strptime
3943 check_func  sysconf
3944 check_func  sysctl
3945 check_func  usleep
3946
3947 check_func_headers io.h setmode
3948 check_func_headers stdlib.h getenv
3949
3950 check_func_headers windows.h CoTaskMemFree -lole32
3951 check_func_headers windows.h GetProcessAffinityMask
3952 check_func_headers windows.h GetProcessTimes
3953 check_func_headers windows.h GetSystemTimeAsFileTime
3954 check_func_headers windows.h MapViewOfFile
3955 check_func_headers windows.h SetConsoleTextAttribute
3956 check_func_headers windows.h Sleep
3957 check_func_headers windows.h VirtualAlloc
3958
3959 check_header direct.h
3960 check_header dlfcn.h
3961 check_header dxva.h
3962 check_header dxva2api.h
3963 check_header io.h
3964 check_header mach/mach_time.h
3965 check_header malloc.h
3966 check_header poll.h
3967 check_header sys/mman.h
3968 check_header sys/param.h
3969 check_header sys/resource.h
3970 check_header sys/select.h
3971 check_header sys/time.h
3972 check_header sys/un.h
3973 check_header unistd.h
3974 check_header vdpau/vdpau.h
3975 check_header vdpau/vdpau_x11.h
3976 check_header VideoDecodeAcceleration/VDADecoder.h
3977 check_header windows.h
3978 check_header X11/extensions/XvMClib.h
3979
3980 check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
3981 check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
3982 check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
3983
3984 check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
3985
3986 if ! disabled w32threads && ! enabled pthreads; then
3987     check_func_headers "windows.h process.h" _beginthreadex &&
3988         enable w32threads || disable w32threads
3989 fi
3990
3991 # check for some common methods of building with pthread support
3992 # do this before the optional library checks as some of them require pthreads
3993 if ! disabled pthreads && ! enabled w32threads; then
3994     enable pthreads
3995     if check_func pthread_join -pthread; then
3996         add_cflags -pthread
3997         add_extralibs -pthread
3998     elif check_func pthread_join -pthreads; then
3999         add_cflags -pthreads
4000         add_extralibs -pthreads
4001     elif check_func pthread_join -lpthreadGC2; then
4002         add_extralibs -lpthreadGC2
4003     elif check_lib pthread.h pthread_join -lpthread; then
4004         :
4005     elif ! check_func pthread_join; then
4006         disable pthreads
4007     fi
4008 fi
4009
4010 disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
4011 disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
4012
4013 check_lib math.h sin -lm && LIBM="-lm"
4014 enabled vaapi && require vaapi va/va.h vaInitialize -lva
4015
4016 atan2f_args=2
4017 ldexpf_args=2
4018 powf_args=2
4019
4020 for func in $MATH_FUNCS; do
4021     eval check_mathfunc $func \${${func}_args:-1}
4022 done
4023
4024 # these are off by default, so fail if requested and not available
4025 enabled avisynth          && { { check_header "avisynth/avisynth_c.h" && check_lib2 "windows.h" LoadLibrary; } ||
4026                                { check_header "avxsynth/avxsynth_c.h" && check_lib2 "dlfcn.h" dlopen -ldl; } ||
4027                                die "ERROR: LoadLibrary/dlopen not found, or avisynth header not found"; }
4028 enabled frei0r            && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; }
4029 enabled gnutls            && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
4030 enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
4031 enabled libfdk_aac        && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
4032 enabled libfontconfig     && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
4033 enabled libfreetype       && require_pkg_config freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
4034 enabled libgsm            && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
4035                                    check_lib "${gsm_hdr}" gsm_create -lgsm && break;
4036                                done || die "ERROR: libgsm not found"; }
4037 enabled libilbc           && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
4038 enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
4039 enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
4040 enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
4041 enabled libopencv         && require_pkg_config opencv opencv/cv.h cvCreateImageHeader
4042 enabled libopenjpeg       && { { check_header openjpeg.h && check_lib2 openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC; } ||
4043                                { require_pkg_config libopenjpeg1 openjpeg.h opj_version -DOPJ_STATIC; } }
4044 enabled libopus           && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
4045 enabled libpulse          && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new