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