lavc: Add new VDA hwaccel
[libav.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_vda_old_hwaccel_deps="vda"
1900 h264_vda_old_hwaccel_select="h264_decoder"
1901 h264_vdpau_hwaccel_deps="vdpau"
1902 h264_vdpau_hwaccel_select="h264_decoder"
1903 mpeg1_vdpau_hwaccel_deps="vdpau"
1904 mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
1905 mpeg2_dxva2_hwaccel_deps="dxva2"
1906 mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
1907 mpeg2_vaapi_hwaccel_deps="vaapi"
1908 mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
1909 mpeg2_vdpau_hwaccel_deps="vdpau"
1910 mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
1911 mpeg4_vaapi_hwaccel_deps="vaapi"
1912 mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
1913 mpeg4_vdpau_hwaccel_deps="vdpau"
1914 mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
1915 vc1_dxva2_hwaccel_deps="dxva2"
1916 vc1_dxva2_hwaccel_select="vc1_decoder"
1917 vc1_vaapi_hwaccel_deps="vaapi"
1918 vc1_vaapi_hwaccel_select="vc1_decoder"
1919 vc1_vdpau_hwaccel_deps="vdpau"
1920 vc1_vdpau_hwaccel_select="vc1_decoder"
1921 wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
1922 wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
1923 wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
1924
1925 # parsers
1926 h264_parser_select="h264_decoder"
1927 mpeg4video_parser_select="error_resilience h263dsp mpegvideo"
1928 mpegvideo_parser_select="error_resilience mpegvideo"
1929 vc1_parser_select="mpegvideo"
1930
1931 # external libraries
1932 libfaac_encoder_deps="libfaac"
1933 libfaac_encoder_select="audio_frame_queue"
1934 libfdk_aac_decoder_deps="libfdk_aac"
1935 libfdk_aac_encoder_deps="libfdk_aac"
1936 libfdk_aac_encoder_select="audio_frame_queue"
1937 libgsm_decoder_deps="libgsm"
1938 libgsm_encoder_deps="libgsm"
1939 libgsm_ms_decoder_deps="libgsm"
1940 libgsm_ms_encoder_deps="libgsm"
1941 libilbc_decoder_deps="libilbc"
1942 libilbc_encoder_deps="libilbc"
1943 libmp3lame_encoder_deps="libmp3lame"
1944 libmp3lame_encoder_select="audio_frame_queue"
1945 libopencore_amrnb_decoder_deps="libopencore_amrnb"
1946 libopencore_amrnb_encoder_deps="libopencore_amrnb"
1947 libopencore_amrnb_encoder_select="audio_frame_queue"
1948 libopencore_amrwb_decoder_deps="libopencore_amrwb"
1949 libopenjpeg_decoder_deps="libopenjpeg"
1950 libopenjpeg_encoder_deps="libopenjpeg"
1951 libopus_decoder_deps="libopus"
1952 libopus_encoder_deps="libopus"
1953 libopus_encoder_select="audio_frame_queue"
1954 libschroedinger_decoder_deps="libschroedinger"
1955 libschroedinger_encoder_deps="libschroedinger"
1956 libspeex_decoder_deps="libspeex"
1957 libspeex_encoder_deps="libspeex"
1958 libspeex_encoder_select="audio_frame_queue"
1959 libtheora_encoder_deps="libtheora"
1960 libtwolame_encoder_deps="libtwolame"
1961 libvo_aacenc_encoder_deps="libvo_aacenc"
1962 libvo_aacenc_encoder_select="audio_frame_queue"
1963 libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
1964 libvorbis_encoder_deps="libvorbis"
1965 libvorbis_encoder_select="audio_frame_queue"
1966 libvpx_vp8_decoder_deps="libvpx"
1967 libvpx_vp8_encoder_deps="libvpx"
1968 libvpx_vp9_decoder_deps="libvpx"
1969 libvpx_vp9_encoder_deps="libvpx"
1970 libwavpack_encoder_deps="libwavpack"
1971 libwebp_encoder_deps="libwebp"
1972 libx264_encoder_deps="libx264"
1973 libx265_encoder_deps="libx265"
1974 libxavs_encoder_deps="libxavs"
1975 libxvid_encoder_deps="libxvid"
1976
1977 # demuxers / muxers
1978 ac3_demuxer_select="ac3_parser"
1979 asf_demuxer_select="riffdec"
1980 asf_muxer_select="riffenc"
1981 asf_stream_muxer_select="asf_muxer"
1982 avi_demuxer_select="riffdec"
1983 avi_muxer_select="riffenc"
1984 avisynth_demuxer_deps="avisynth"
1985 avisynth_demuxer_select="riffdec"
1986 caf_demuxer_select="riffdec"
1987 dirac_demuxer_select="dirac_parser"
1988 dxa_demuxer_select="riffdec"
1989 eac3_demuxer_select="ac3_parser"
1990 f4v_muxer_select="mov_muxer"
1991 flac_demuxer_select="flac_parser"
1992 hds_muxer_select="flv_muxer"
1993 hls_muxer_select="mpegts_muxer"
1994 ipod_muxer_select="mov_muxer"
1995 ismv_muxer_select="mov_muxer"
1996 matroska_audio_muxer_select="matroska_muxer"
1997 matroska_demuxer_select="riffdec"
1998 matroska_demuxer_suggest="bzlib lzo zlib"
1999 matroska_muxer_select="riffenc"
2000 mmf_muxer_select="riffenc"
2001 mov_demuxer_select="riffdec"
2002 mov_demuxer_suggest="zlib"
2003 mov_muxer_select="riffenc rtpenc_chain"
2004 mp3_demuxer_select="mpegaudio_parser"
2005 mp4_muxer_select="mov_muxer"
2006 mpegts_muxer_select="adts_muxer latm_muxer"
2007 mpegtsraw_demuxer_select="mpegts_demuxer"
2008 mxf_d10_muxer_select="mxf_muxer"
2009 nut_muxer_select="riffenc"
2010 nuv_demuxer_select="riffdec"
2011 ogg_demuxer_select="golomb"
2012 psp_muxer_select="mov_muxer"
2013 rtp_demuxer_select="sdp_demuxer"
2014 rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
2015 rtsp_demuxer_select="http_protocol rtpdec"
2016 rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
2017 sap_demuxer_select="sdp_demuxer"
2018 sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
2019 sdp_demuxer_select="rtpdec"
2020 smoothstreaming_muxer_select="ismv_muxer"
2021 spdif_muxer_select="aac_parser"
2022 tak_demuxer_select="tak_parser"
2023 tg2_muxer_select="mov_muxer"
2024 tgp_muxer_select="mov_muxer"
2025 w64_demuxer_select="wav_demuxer"
2026 wav_demuxer_select="riffdec"
2027 wav_muxer_select="riffenc"
2028 webm_muxer_select="riffenc"
2029 wtv_demuxer_select="riffdec"
2030 xmv_demuxer_select="riffdec"
2031 xwma_demuxer_select="riffdec"
2032
2033 # indevs / outdevs
2034 alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
2035 alsa_outdev_deps="alsa_asoundlib_h"
2036 bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
2037 dv1394_indev_deps="dv1394"
2038 dv1394_indev_select="dv_demuxer"
2039 fbdev_indev_deps="linux_fb_h"
2040 jack_indev_deps="jack_jack_h pthreads"
2041 libcdio_indev_deps="libcdio"
2042 libdc1394_indev_deps="libdc1394"
2043 oss_indev_deps_any="soundcard_h sys_soundcard_h"
2044 oss_outdev_deps_any="soundcard_h sys_soundcard_h"
2045 pulse_indev_deps="libpulse"
2046 sndio_indev_deps="sndio_h"
2047 sndio_outdev_deps="sndio_h"
2048 v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
2049 vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
2050 vfwcap_indev_extralibs="-lavicap32"
2051 x11grab_indev_deps="x11grab XShmCreateImage"
2052
2053 # protocols
2054 ffrtmpcrypt_protocol_deps="!librtmp_protocol"
2055 ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
2056 ffrtmpcrypt_protocol_select="tcp_protocol"
2057 ffrtmphttp_protocol_deps="!librtmp_protocol"
2058 ffrtmphttp_protocol_select="http_protocol"
2059 gopher_protocol_select="network"
2060 http_protocol_select="tcp_protocol"
2061 httpproxy_protocol_select="tcp_protocol"
2062 https_protocol_select="tls_protocol"
2063 librtmp_protocol_deps="librtmp"
2064 librtmpe_protocol_deps="librtmp"
2065 librtmps_protocol_deps="librtmp"
2066 librtmpt_protocol_deps="librtmp"
2067 librtmpte_protocol_deps="librtmp"
2068 mmsh_protocol_select="http_protocol"
2069 mmst_protocol_select="network"
2070 rtmp_protocol_deps="!librtmp_protocol"
2071 rtmp_protocol_select="tcp_protocol"
2072 rtmpe_protocol_select="ffrtmpcrypt_protocol"
2073 rtmps_protocol_deps="!librtmp_protocol"
2074 rtmps_protocol_select="tls_protocol"
2075 rtmpt_protocol_select="ffrtmphttp_protocol"
2076 rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2077 rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2078 rtp_protocol_select="udp_protocol"
2079 sctp_protocol_deps="struct_sctp_event_subscribe"
2080 sctp_protocol_select="network"
2081 srtp_protocol_select="rtp_protocol"
2082 tcp_protocol_select="network"
2083 tls_protocol_deps_any="openssl gnutls"
2084 tls_protocol_select="tcp_protocol"
2085 udp_protocol_select="network"
2086 unix_protocol_deps="sys_un_h"
2087 unix_protocol_select="network"
2088
2089 # filters
2090 blackframe_filter_deps="gpl"
2091 boxblur_filter_deps="gpl"
2092 bs2b_filter_deps="libbs2b"
2093 cropdetect_filter_deps="gpl"
2094 delogo_filter_deps="gpl"
2095 drawtext_filter_deps="libfreetype"
2096 frei0r_filter_deps="frei0r dlopen"
2097 frei0r_filter_extralibs='$ldl'
2098 frei0r_src_filter_deps="frei0r dlopen"
2099 frei0r_src_filter_extralibs='$ldl'
2100 hqdn3d_filter_deps="gpl"
2101 interlace_filter_deps="gpl"
2102 ocv_filter_deps="libopencv"
2103 resample_filter_deps="avresample"
2104 scale_filter_deps="swscale"
2105
2106 # examples
2107 avcodec_example_deps="avcodec avutil"
2108 filter_audio_example_deps="avfilter avutil"
2109 metadata_example_deps="avformat avutil"
2110 output_example_deps="avcodec avformat avutil swscale"
2111 transcode_aac_example_deps="avcodec avformat avresample"
2112
2113 # libraries
2114 avcodec_deps="avutil"
2115 avdevice_deps="avutil avcodec avformat"
2116 avfilter_deps="avutil"
2117 avformat_deps="avutil avcodec"
2118 avresample_deps="avutil"
2119 swscale_deps="avutil"
2120
2121 # programs
2122 avconv_deps="avcodec avfilter avformat avresample swscale"
2123 avconv_select="aformat_filter anull_filter asyncts_filter atrim_filter format_filter
2124                fps_filter null_filter resample_filter scale_filter
2125                setpts_filter trim_filter"
2126 avplay_deps="avcodec avformat avresample swscale sdl"
2127 avplay_libs='$sdl_libs'
2128 avplay_select="rdft"
2129 avprobe_deps="avcodec avformat"
2130 avserver_deps="avformat fork !shared"
2131 avserver_select="ffm_muxer rtp_protocol rtsp_demuxer"
2132
2133 # documentation
2134 pod2man_deps="doc"
2135 texi2html_deps="doc"
2136
2137 # default parameters
2138
2139 logfile="config.log"
2140
2141 # installation paths
2142 prefix_default="/usr/local"
2143 bindir_default='${prefix}/bin'
2144 datadir_default='${prefix}/share/avconv'
2145 docdir_default='${prefix}/share/doc/libav'
2146 incdir_default='${prefix}/include'
2147 libdir_default='${prefix}/lib'
2148 mandir_default='${prefix}/share/man'
2149 shlibdir_default="$libdir_default"
2150
2151 # toolchain
2152 ar_default="ar"
2153 cc_default="gcc"
2154 host_cc_default="gcc"
2155 cp_f="cp -f"
2156 ln_s="ln -s -f"
2157 nm_default="nm -g"
2158 objformat="elf"
2159 pkg_config_default=pkg-config
2160 ranlib="ranlib"
2161 strip="strip"
2162 yasmexe="yasm"
2163
2164 nogas=":"
2165
2166 # machine
2167 arch_default=$(uname -m)
2168 cpu="generic"
2169
2170 # OS
2171 target_os_default=$(tolower $(uname -s))
2172 host_os=$target_os_default
2173
2174 # configurable options
2175 enable $EXAMPLE_LIST $LIBRARY_LIST $PROGRAM_LIST
2176
2177 enable asm
2178 enable debug
2179 enable doc
2180 enable optimizations
2181 enable safe_bitstream_reader
2182 enable static
2183 enable swscale_alpha
2184
2185 # By default, enable only those hwaccels that have no external dependencies.
2186 enable dxva2 vdpau
2187
2188 # build settings
2189 SHFLAGS='-shared -Wl,-soname,$$(@F)'
2190 LIBPREF="lib"
2191 LIBSUF=".a"
2192 FULLNAME='$(NAME)$(BUILDSUF)'
2193 LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
2194 SLIBPREF="lib"
2195 SLIBSUF=".so"
2196 SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
2197 SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
2198 SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
2199 LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2200 SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
2201 SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2202
2203 asflags_filter=echo
2204 cflags_filter=echo
2205 ldflags_filter=echo
2206
2207 AS_C='-c'
2208 AS_O='-o $@'
2209 CC_C='-c'
2210 CC_E='-E -o $@'
2211 CC_O='-o $@'
2212 LD_O='-o $@'
2213 LD_LIB='-l%'
2214 LD_PATH='-L'
2215 HOSTCC_C='-c'
2216 HOSTCC_E='-E -o $@'
2217 HOSTCC_O='-o $@'
2218 HOSTLD_O='-o $@'
2219
2220 host_libs='-lm'
2221 host_cflags_filter=echo
2222 host_ldflags_filter=echo
2223
2224 target_path='$(CURDIR)'
2225
2226 # since the object filename is not given with the -MM flag, the compiler
2227 # is only able to print the basename, and we must add the path ourselves
2228 DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
2229 DEPFLAGS='-MM'
2230
2231 # find source path
2232 if test -f configure; then
2233     source_path=.
2234 else
2235     source_path=$(cd $(dirname "$0"); pwd)
2236     echo "$source_path" | grep -q '[[:blank:]]' &&
2237         die "Out of tree builds are impossible with whitespace in source path."
2238     test -e "$source_path/config.h" &&
2239         die "Out of tree builds are impossible with config.h in source dir."
2240 fi
2241
2242 for v in "$@"; do
2243     r=${v#*=}
2244     l=${v%"$r"}
2245     r=$(sh_quote "$r")
2246     LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
2247 done
2248
2249 find_things(){
2250     thing=$1
2251     pattern=$2
2252     file=$source_path/$3
2253     sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2254 }
2255
2256 ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
2257 DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2258 HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
2259 PARSER_LIST=$(find_things   parser   PARSER   libavcodec/allcodecs.c)
2260 BSF_LIST=$(find_things      bsf      BSF      libavcodec/allcodecs.c)
2261 MUXER_LIST=$(find_things    muxer    _MUX     libavformat/allformats.c)
2262 DEMUXER_LIST=$(find_things  demuxer  DEMUX    libavformat/allformats.c)
2263 OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
2264 INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2265 PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
2266 FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2267
2268 ALL_COMPONENTS="
2269     $BSF_LIST
2270     $DECODER_LIST
2271     $DEMUXER_LIST
2272     $ENCODER_LIST
2273     $FILTER_LIST
2274     $HWACCEL_LIST
2275     $INDEV_LIST
2276     $MUXER_LIST
2277     $OUTDEV_LIST
2278     $PARSER_LIST
2279     $PROTOCOL_LIST
2280 "
2281
2282 for n in $COMPONENT_LIST; do
2283     v=$(toupper ${n%s})_LIST
2284     eval enable \$$v
2285     eval ${n}_if_any="\$$v"
2286 done
2287
2288 enable $ARCH_EXT_LIST
2289
2290 die_unknown(){
2291     echo "Unknown option \"$1\"."
2292     echo "See $0 --help for available options."
2293     exit 1
2294 }
2295
2296 print_3_columns() {
2297     cat | tr ' ' '\n' | sort | pr -r -3 -t
2298 }
2299
2300 show_list() {
2301     suffix=_$1
2302     shift
2303     echo $* | sed s/$suffix//g | print_3_columns
2304     exit 0
2305 }
2306
2307 rand_list(){
2308     IFS=', '
2309     set -- $*
2310     unset IFS
2311     for thing; do
2312         comp=${thing%:*}
2313         prob=${thing#$comp}
2314         prob=${prob#:}
2315         is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
2316         echo "prob ${prob:-0.5}"
2317         printf '%s\n' $comp
2318     done
2319 }
2320
2321 do_random(){
2322     action=$1
2323     shift
2324     random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
2325     $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
2326 }
2327
2328 for opt do
2329     optval="${opt#*=}"
2330     case "$opt" in
2331         --extra-ldflags=*)
2332             add_ldflags $optval
2333         ;;
2334         --extra-libs=*)
2335             add_extralibs $optval
2336         ;;
2337         --disable-devices)
2338             disable $INDEV_LIST $OUTDEV_LIST
2339         ;;
2340         --enable-debug=*)
2341             debuglevel="$optval"
2342         ;;
2343         --disable-programs)
2344             disable $PROGRAM_LIST
2345         ;;
2346         --disable-everything)
2347             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2348         ;;
2349         --disable-all)
2350             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2351             disable $LIBRARY_LIST $PROGRAM_LIST doc
2352         ;;
2353         --enable-random|--disable-random)
2354             action=${opt%%-random}
2355             do_random ${action#--} $COMPONENT_LIST
2356         ;;
2357         --enable-random=*|--disable-random=*)
2358             action=${opt%%-random=*}
2359             do_random ${action#--} $optval
2360         ;;
2361         --enable-*=*|--disable-*=*)
2362             eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
2363             is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
2364             eval list=\$$(toupper $thing)_LIST
2365             name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
2366             $action $(filter "$name" $list)
2367         ;;
2368         --enable-?*|--disable-?*)
2369             eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
2370             if is_in $option $COMPONENT_LIST; then
2371                 test $action = disable && action=unset
2372                 eval $action \$$(toupper ${option%s})_LIST
2373             elif is_in $option $CMDLINE_SELECT; then
2374                 $action $option
2375             else
2376                 die_unknown $opt
2377             fi
2378         ;;
2379         --list-*)
2380             NAME="${opt#--list-}"
2381             is_in $NAME $COMPONENT_LIST || die_unknown $opt
2382             NAME=${NAME%s}
2383             eval show_list $NAME \$$(toupper $NAME)_LIST
2384         ;;
2385         --help|-h) show_help
2386         ;;
2387         *)
2388             optname="${opt%%=*}"
2389             optname="${optname#--}"
2390             optname=$(echo "$optname" | sed 's/-/_/g')
2391             if is_in $optname $CMDLINE_SET; then
2392                 eval $optname='$optval'
2393             elif is_in $optname $CMDLINE_APPEND; then
2394                 append $optname "$optval"
2395             else
2396                 die_unknown $opt
2397             fi
2398         ;;
2399     esac
2400 done
2401
2402 disabled logging && logfile=/dev/null
2403
2404 echo "# $0 $LIBAV_CONFIGURATION" > $logfile
2405 set >> $logfile
2406
2407 test -n "$cross_prefix" && enable cross_compile
2408
2409 if enabled cross_compile; then
2410     test -n "$arch" && test -n "$target_os" ||
2411         die "Must specify target arch and OS when cross-compiling"
2412 fi
2413
2414 ar_default="${cross_prefix}${ar_default}"
2415 cc_default="${cross_prefix}${cc_default}"
2416 nm_default="${cross_prefix}${nm_default}"
2417 pkg_config_default="${cross_prefix}${pkg_config_default}"
2418 ranlib="${cross_prefix}${ranlib}"
2419 strip="${cross_prefix}${strip}"
2420
2421 sysinclude_default="${sysroot}/usr/include"
2422
2423 case "$toolchain" in
2424     clang-asan)
2425         cc_default="clang"
2426         add_cflags  -fsanitize=address
2427         add_ldflags -fsanitize=address
2428     ;;
2429     clang-tsan)
2430         cc_default="clang"
2431         add_cflags  -fsanitize=thread -pie
2432         add_ldflags -fsanitize=thread -pie
2433     ;;
2434     clang-usan)
2435         cc_default="clang"
2436         add_cflags  -fsanitize=undefined
2437         add_ldflags -fsanitize=undefined
2438     ;;
2439     gcc-asan)
2440         cc_default="gcc"
2441         add_cflags  -fsanitize=address
2442         add_ldflags -fsanitize=address
2443     ;;
2444     gcc-tsan)
2445         cc_default="gcc"
2446         add_cflags  -fsanitize=thread -pie -fPIC
2447         add_ldflags -fsanitize=thread -pie -fPIC
2448     ;;
2449     gcc-usan)
2450         cc_default="gcc"
2451         add_cflags  -fsanitize=undefined
2452         add_ldflags -fsanitize=undefined
2453     ;;
2454     valgrind-massif)
2455         target_exec_default="valgrind"
2456         target_exec_args="--alloc-fn=av_malloc --alloc-fn=av_mallocz"
2457     ;;
2458     valgrind-memcheck)
2459         target_exec_default="valgrind"
2460         target_exec_args="--track-origins=yes --leak-check=full"
2461     ;;
2462     msvc)
2463         # Check whether the current MSVC version needs the C99 converter.
2464         # From MSVC 2013 (compiler major version 18) onwards, it does actually
2465         # support enough of C99 to build libav. Default to the new
2466         # behaviour if the regexp was unable to match anything, since this
2467         # successfully parses the version number of existing supported
2468         # versions that require the converter (MSVC 2010 and 2012).
2469         cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
2470         if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
2471             cc_default="cl"
2472         else
2473             cc_default="c99wrap cl"
2474         fi
2475         ld_default="link"
2476         nm_default="dumpbin -symbols"
2477         ar_default="lib"
2478         target_os_default="win32"
2479         # Use a relative path for TMPDIR. This makes sure all the
2480         # ffconf temp files are written with a relative path, avoiding
2481         # issues with msys/win32 path conversion for MSVC parameters
2482         # such as -Fo<file> or -out:<file>.
2483         TMPDIR=.
2484     ;;
2485     icl)
2486         cc_default="icl"
2487         ld_default="xilink"
2488         nm_default="dumpbin -symbols"
2489         ar_default="xilib"
2490         target_os_default="win32"
2491         TMPDIR=.
2492     ;;
2493     gcov)
2494         add_cflags  -fprofile-arcs -ftest-coverage
2495         add_ldflags -fprofile-arcs -ftest-coverage
2496     ;;
2497     hardened)
2498         add_cflags  -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all
2499         add_ldflags -Wl,-z,relro -Wl,-z,now
2500     ;;
2501     ?*)
2502         die "Unknown toolchain $toolchain"
2503     ;;
2504 esac
2505
2506 set_default arch cc pkg_config sysinclude target_exec target_os
2507 enabled cross_compile || host_cc_default=$cc
2508 set_default host_cc
2509
2510 if ! $pkg_config --version >/dev/null 2>&1; then
2511     warn "$pkg_config not found, library detection may fail."
2512     pkg_config=false
2513 fi
2514
2515 exesuf() {
2516     case $1 in
2517         mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
2518     esac
2519 }
2520
2521 EXESUF=$(exesuf $target_os)
2522 HOSTEXESUF=$(exesuf $host_os)
2523
2524 # set temporary file name
2525 : ${TMPDIR:=$TEMPDIR}
2526 : ${TMPDIR:=$TMP}
2527 : ${TMPDIR:=/tmp}
2528
2529 if ! check_cmd mktemp -u XXXXXX; then
2530     # simple replacement for missing mktemp
2531     # NOT SAFE FOR GENERAL USE
2532     mktemp(){
2533         echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
2534     }
2535 fi
2536
2537 tmpfile(){
2538     tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
2539         (set -C; exec > $tmp) 2>/dev/null ||
2540         die "Unable to create temporary file in $TMPDIR."
2541     append TMPFILES $tmp
2542     eval $1=$tmp
2543 }
2544
2545 trap 'rm -f -- $TMPFILES' EXIT
2546
2547 tmpfile TMPASM .asm
2548 tmpfile TMPC   .c
2549 tmpfile TMPE   $EXESUF
2550 tmpfile TMPH   .h
2551 tmpfile TMPO   .o
2552 tmpfile TMPS   .S
2553 tmpfile TMPSH  .sh
2554 tmpfile TMPV   .ver
2555
2556 unset -f mktemp
2557
2558 chmod +x $TMPE
2559
2560 # make sure we can execute files in $TMPDIR
2561 cat > $TMPSH 2>> $logfile <<EOF
2562 #! /bin/sh
2563 EOF
2564 chmod +x $TMPSH >> $logfile 2>&1
2565 if ! $TMPSH >> $logfile 2>&1; then
2566     cat <<EOF
2567 Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
2568 variable to another directory and make sure that it is not mounted noexec.
2569 EOF
2570     die "Sanity test failed."
2571 fi
2572
2573 ccc_flags(){
2574     for flag; do
2575         case $flag in
2576             -std=c99)           echo -c99                       ;;
2577             -mcpu=*)            echo -arch ${flag#*=}           ;;
2578             -mieee)             echo -ieee                      ;;
2579             -O*|-fast)          echo $flag                      ;;
2580             -fno-math-errno)    echo -assume nomath_errno       ;;
2581             -g)                 echo -g3                        ;;
2582             -Wall)              echo -msg_enable level2         ;;
2583             -Wno-pointer-sign)  echo -msg_disable ptrmismatch1  ;;
2584             -Wl,*)              echo $flag                      ;;
2585             -f*|-W*)                                            ;;
2586             *)                  echo $flag                      ;;
2587         esac
2588    done
2589 }
2590
2591 cparser_flags(){
2592     for flag; do
2593         case $flag in
2594             -Wno-switch)             echo -Wno-switch-enum ;;
2595             -Wno-format-zero-length) ;;
2596             -Wdisabled-optimization) ;;
2597             -Wno-pointer-sign)       echo -Wno-other ;;
2598             *)                       echo $flag ;;
2599         esac
2600     done
2601 }
2602
2603 msvc_common_flags(){
2604     for flag; do
2605         case $flag in
2606             # In addition to specifying certain flags under the compiler
2607             # specific filters, they must be specified here as well or else the
2608             # generic catch all at the bottom will print the original flag.
2609             -Wall)                ;;
2610             -std=c99)             ;;
2611             # Common flags
2612             -fomit-frame-pointer) ;;
2613             -g)                   echo -Z7 ;;
2614             -fno-math-errno)      ;;
2615             -fno-common)          ;;
2616             -fno-signed-zeros)    ;;
2617             -fPIC)                ;;
2618             -mthumb)              ;;
2619             -march=*)             ;;
2620             -lz)                  echo zlib.lib ;;
2621             -lavifil32)           echo vfw32.lib ;;
2622             -lavicap32)           echo vfw32.lib user32.lib ;;
2623             -l*)                  echo ${flag#-l}.lib ;;
2624             *)                    echo $flag ;;
2625         esac
2626     done
2627 }
2628
2629 msvc_flags(){
2630     msvc_common_flags "$@"
2631     for flag; do
2632         case $flag in
2633             -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
2634                                        -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
2635                                        -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
2636                                        -wd4273 ;;
2637         esac
2638     done
2639 }
2640
2641 icl_flags(){
2642     msvc_common_flags "$@"
2643     for flag; do
2644         case $flag in
2645             # Despite what Intel's documentation says -Wall, which is supported
2646             # on Windows, does enable remarks so disable them here.
2647             -Wall)                echo $flag -Qdiag-disable:remark ;;
2648             -std=c99)             echo -Qstd=c99 ;;
2649         esac
2650     done
2651 }
2652
2653 pgi_flags(){
2654     for flag; do
2655         case $flag in
2656             -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
2657             -fomit-frame-pointer) echo -Mnoframe ;;
2658             -g)                   echo -gopt ;;
2659             *)                    echo $flag ;;
2660         esac
2661     done
2662 }
2663
2664 suncc_flags(){
2665     for flag; do
2666         case $flag in
2667             -march=*|-mcpu=*)
2668                 case "${flag#*=}" in
2669                     native)                   echo -xtarget=native       ;;
2670                     v9|niagara)               echo -xarch=sparc          ;;
2671                     ultrasparc)               echo -xarch=sparcvis       ;;
2672                     ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
2673                     i586|pentium)             echo -xchip=pentium        ;;
2674                     i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
2675                     pentium3*|c3-2)           echo -xtarget=pentium3     ;;
2676                     pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
2677                     pentium4*)          echo -xtarget=pentium4           ;;
2678                     prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
2679                     *-sse3)             echo -xarch=sse3                 ;;
2680                     core2)              echo -xarch=ssse3 -xchip=core2   ;;
2681                     corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
2682                     corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
2683                     amdfam10|barcelona|bdver*) echo -xarch=sse4_1        ;;
2684                     athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
2685                     k8|opteron|athlon64|athlon-fx)
2686                                                echo -xarch=sse2a         ;;
2687                     athlon*)                   echo -xarch=pentium_proa  ;;
2688                 esac
2689                 ;;
2690             -std=c99)             echo -xc99              ;;
2691             -fomit-frame-pointer) echo -xregs=frameptr    ;;
2692             -fPIC)                echo -KPIC -xcode=pic32 ;;
2693             -W*,*)                echo $flag              ;;
2694             -f*-*|-W*|-mimpure-text)                      ;;
2695             -shared)              echo -G                 ;;
2696             *)                    echo $flag              ;;
2697         esac
2698     done
2699 }
2700
2701 tms470_flags(){
2702     for flag; do
2703         case $flag in
2704             -march=*|-mcpu=*)
2705                 case "${flag#*=}" in
2706                     armv7-a|cortex-a*)      echo -mv=7a8 ;;
2707                     armv7-r|cortex-r*)      echo -mv=7r4 ;;
2708                     armv7-m|cortex-m*)      echo -mv=7m3 ;;
2709                     armv6*|arm11*)          echo -mv=6   ;;
2710                     armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26])
2711                                             echo -mv=5e  ;;
2712                     armv4*|arm7*|arm9[24]*) echo -mv=4   ;;
2713                 esac
2714                 ;;
2715             -mfpu=neon)     echo --float_support=vfpv3 --neon ;;
2716             -mfpu=vfp)      echo --float_support=vfpv2        ;;
2717             -mfpu=vfpv3)    echo --float_support=vfpv3        ;;
2718             -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
2719             -msoft-float)   echo --float_support=vfplib       ;;
2720             -O[0-3]|-mf=*)  echo $flag                        ;;
2721             -g)             echo -g -mn                       ;;
2722             -pds=*)         echo $flag                        ;;
2723             -D*|-I*)        echo $flag                        ;;
2724             --gcc|--abi=*)  echo $flag                        ;;
2725             -me)            echo $flag                        ;;
2726         esac
2727     done
2728 }
2729
2730 probe_cc(){
2731     pfx=$1
2732     _cc=$2
2733
2734     unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
2735     unset _ld_o _ldflags _ld_lib _ld_path
2736     unset _depflags _DEPCMD _DEPFLAGS
2737     _flags_filter=echo
2738
2739     if $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
2740         _type=llvm_gcc
2741         gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)')
2742         _ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver"
2743         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2744         _cflags_speed='-O3'
2745         _cflags_size='-Os'
2746     elif $_cc -v 2>&1 | grep -qi ^gcc; then
2747         _type=gcc
2748         gcc_version=$($_cc --version | head -n1)
2749         gcc_basever=$($_cc -dumpversion)
2750         gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
2751         gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
2752         _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
2753         if ! $_cc -dumpversion | grep -q '^2\.'; then
2754             _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2755         fi
2756         _cflags_speed='-O3'
2757         _cflags_size='-Os'
2758     elif $_cc --version 2>/dev/null | grep -q ^icc; then
2759         _type=icc
2760         _ident=$($_cc --version | head -n1)
2761         _depflags='-MMD'
2762         _cflags_speed='-O3'
2763         _cflags_size='-Os'
2764         _cflags_noopt='-O1'
2765     elif $_cc -v 2>&1 | grep -q xlc; then
2766         _type=xlc
2767         _ident=$($_cc -qversion 2>/dev/null | head -n1)
2768         _cflags_speed='-O5'
2769         _cflags_size='-O5 -qcompact'
2770     elif $_cc -V 2>/dev/null | grep -q Compaq; then
2771         _type=ccc
2772         _ident=$($_cc -V | head -n1 | cut -d' ' -f1-3)
2773         _DEPFLAGS='-M'
2774         _cflags_speed='-fast'
2775         _cflags_size='-O1'
2776         _flags_filter=ccc_flags
2777     elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
2778         test -d "$sysroot" || die "No valid sysroot specified."
2779         _type=armcc
2780         _ident=$($_cc --vsn | head -n1 | sed 's/.*: //')
2781         armcc_conf="$PWD/armcc.conf"
2782         $_cc --arm_linux_configure                 \
2783              --arm_linux_config_file="$armcc_conf" \
2784              --configure_sysroot="$sysroot"        \
2785              --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
2786              die "Error creating armcc configuration file."
2787         $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
2788         _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
2789         as_default="${cross_prefix}gcc"
2790         _depflags='-MMD'
2791         _cflags_speed='-O3'
2792         _cflags_size='-Os'
2793     elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
2794         _type=tms470
2795         _ident=$($_cc -version | head -n1 | tr -s ' ')
2796         _flags='--gcc --abi=eabi -me'
2797         _cc_e='-ppl -fe=$@'
2798         _cc_o='-fe=$@'
2799         _depflags='-ppa -ppd=$(@:.o=.d)'
2800         _cflags_speed='-O3 -mf=5'
2801         _cflags_size='-O3 -mf=2'
2802         _flags_filter=tms470_flags
2803     elif $_cc -v 2>&1 | grep -q clang; then
2804         _type=clang
2805         _ident=$($_cc --version | head -n1)
2806         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2807         _cflags_speed='-O3'
2808         _cflags_size='-Os'
2809     elif $_cc -V 2>&1 | grep -q Sun; then
2810         _type=suncc
2811         _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
2812         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
2813         _DEPFLAGS='-xM1 -xc99'
2814         _ldflags='-std=c99'
2815         _cflags_speed='-O5'
2816         _cflags_size='-O5 -xspace'
2817         _flags_filter=suncc_flags
2818     elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
2819         _type=pathscale
2820         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
2821         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2822         _cflags_speed='-O2'
2823         _cflags_size='-Os'
2824         _flags_filter='filter_out -Wdisabled-optimization'
2825     elif $_cc -v 2>&1 | grep -q Open64; then
2826         _type=open64
2827         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
2828         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2829         _cflags_speed='-O2'
2830         _cflags_size='-Os'
2831         _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
2832     elif $_cc -V 2>&1 | grep -q Portland; then
2833         _type=pgi
2834         _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')"
2835         opt_common='-alias=ansi -Mdse -Mlre -Mpre'
2836         _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
2837         _cflags_size="-O2 -Munroll=c:1 $opt_common"
2838         _cflags_noopt="-O1"
2839         _flags_filter=pgi_flags
2840     elif $_cc 2>&1 | grep -q Microsoft; then
2841         _type=msvc
2842         _ident=$($cc 2>&1 | head -n1)
2843         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
2844         _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
2845         _cflags_speed="-O2"
2846         _cflags_size="-O1"
2847         if $_cc 2>&1 | grep -q Linker; then
2848             _ld_o='-out:$@'
2849         else
2850             _ld_o='-Fe$@'
2851         fi
2852         _cc_o='-Fo$@'
2853         _cc_e='-P -Fi$@'
2854         _flags_filter=msvc_flags
2855         _ld_lib='lib%.a'
2856         _ld_path='-libpath:'
2857         _flags='-nologo'
2858         _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
2859         if [ $pfx = hostcc ]; then
2860             append _cflags -Dsnprintf=_snprintf
2861         fi
2862     elif $_cc 2>&1 | grep -q Intel; then
2863         _type=icl
2864         _ident=$($cc 2>&1 | head -n1)
2865         _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
2866         # Not only is O3 broken on 13.x+ but it is slower on all previous
2867         # versions (tested) as well.
2868         _cflags_speed="-O2"
2869         _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
2870         if $_cc 2>&1 | grep -q Linker; then
2871             _ld_o='-out:$@'
2872         else
2873             _ld_o='-Fe$@'
2874         fi
2875         _cc_o='-Fo$@'
2876         _cc_e='-P'
2877         _flags_filter=icl_flags
2878         _ld_lib='lib%.a'
2879         _ld_path='-libpath:'
2880         # -Qdiag-error to make icl error when seeing certain unknown arguments
2881         _flags='-nologo -Qdiag-error:4044,10157'
2882         # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency
2883         # with MSVC which enables it by default.
2884         _cflags='-D_USE_MATH_DEFINES -FIstdlib.h -Dstrtoll=_strtoi64 -Qms0 -Qvec- -Qsimd- -GS'
2885         if [ $pfx = hostcc ]; then
2886             append _cflags -Dsnprintf=_snprintf
2887         fi
2888     elif $_cc --version 2>/dev/null | grep -q ^cparser; then
2889         _type=cparser
2890         _ident=$($_cc --version | head -n1)
2891         _depflags='-MMD'
2892         _cflags_speed='-O4'
2893         _cflags_size='-O2'
2894         _flags_filter=cparser_flags
2895     fi
2896
2897     eval ${pfx}_type=\$_type
2898     eval ${pfx}_ident=\$_ident
2899 }
2900
2901 set_ccvars(){
2902     eval ${1}_C=\${_cc_c-\${${1}_C}}
2903     eval ${1}_E=\${_cc_e-\${${1}_E}}
2904     eval ${1}_O=\${_cc_o-\${${1}_O}}
2905
2906     if [ -n "$_depflags" ]; then
2907         eval ${1}_DEPFLAGS=\$_depflags
2908     else
2909         eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
2910         eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
2911         eval DEP${1}FLAGS=\$_flags
2912     fi
2913 }
2914
2915 probe_cc cc "$cc"
2916 cflags_filter=$_flags_filter
2917 cflags_speed=$_cflags_speed
2918 cflags_size=$_cflags_size
2919 cflags_noopt=$_cflags_noopt
2920 add_cflags $_flags $_cflags
2921 cc_ldflags=$_ldflags
2922 set_ccvars CC
2923
2924 probe_cc hostcc "$host_cc"
2925 host_cflags_filter=$_flags_filter
2926 add_host_cflags  $_flags $_cflags
2927 set_ccvars HOSTCC
2928
2929 test -n "$cc_type" && enable $cc_type ||
2930     warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
2931
2932 : ${as_default:=$cc}
2933 : ${dep_cc_default:=$cc}
2934 : ${ld_default:=$cc}
2935 : ${host_ld_default:=$host_cc}
2936 set_default ar as dep_cc ld host_ld
2937
2938 probe_cc as "$as"
2939 asflags_filter=$_flags_filter
2940 add_asflags $_flags $_cflags
2941 set_ccvars AS
2942
2943 probe_cc ld "$ld"
2944 ldflags_filter=$_flags_filter
2945 add_ldflags $_flags $_ldflags
2946 test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
2947 LD_O=${_ld_o-$LD_O}
2948 LD_LIB=${_ld_lib-$LD_LIB}
2949 LD_PATH=${_ld_path-$LD_PATH}
2950
2951 probe_cc hostld "$host_ld"
2952 host_ldflags_filter=$_flags_filter
2953 add_host_ldflags $_flags $_ldflags
2954 HOSTLD_O=${_ld_o-$HOSTLD_O}
2955
2956 if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
2957     probe_cc depcc "$dep_cc"
2958     CCDEP=${_DEPCMD:-$DEPCMD}
2959     CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
2960     DEPCCFLAGS=$_flags
2961 fi
2962
2963 if $ar 2>&1 | grep -q Microsoft; then
2964     arflags="-nologo"
2965     ar_o='-out:$@'
2966 elif $ar 2>&1 | grep -q 'Texas Instruments'; then
2967     arflags="rq"
2968     ar_o='$@'
2969 elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then
2970     arflags='-Xany -r -c'
2971     ar_o='$@'
2972 else
2973     arflags="rc"
2974     ar_o='$@'
2975 fi
2976
2977 add_cflags $extra_cflags
2978 add_asflags $extra_cflags
2979
2980 if test -n "$sysroot"; then
2981     case "$cc_type" in
2982         gcc|llvm_gcc|clang)
2983             add_cppflags --sysroot="$sysroot"
2984             add_ldflags --sysroot="$sysroot"
2985         ;;
2986         tms470)
2987             add_cppflags -I"$sysinclude"
2988             add_ldflags  --sysroot="$sysroot"
2989         ;;
2990     esac
2991 fi
2992
2993 if test "$cpu" = host; then
2994     enabled cross_compile &&
2995         die "--cpu=host makes no sense when cross-compiling."
2996
2997     case "$cc_type" in
2998         gcc|llvm_gcc)
2999             check_native(){
3000                 $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
3001                 sed -n "/cc1.*$1=/{
3002                             s/.*$1=\\([^ ]*\\).*/\\1/
3003                             p
3004                             q
3005                         }" $TMPE
3006             }
3007             cpu=$(check_native -march || check_native -mcpu)
3008         ;;
3009     esac
3010
3011     test "${cpu:-host}" = host &&
3012         die "--cpu=host not supported with compiler $cc"
3013 fi
3014
3015 # Deal with common $arch aliases
3016 case "$arch" in
3017     aarch64|arm64)
3018         arch="aarch64"
3019     ;;
3020     arm*)
3021         arch="arm"
3022     ;;
3023     mips*|IP*)
3024         arch="mips"
3025     ;;
3026     parisc*|hppa*)
3027         arch="parisc"
3028     ;;
3029     "Power Macintosh"|ppc*|powerpc*)
3030         arch="ppc"
3031     ;;
3032     s390|s390x)
3033         arch="s390"
3034     ;;
3035     sh4|sh)
3036         arch="sh4"
3037     ;;
3038     sun4u|sparc*)
3039         arch="sparc"
3040     ;;
3041     tilegx|tile-gx)
3042         arch="tilegx"
3043     ;;
3044     i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
3045         arch="x86"
3046     ;;
3047 esac
3048
3049 is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
3050 enable $arch
3051
3052 # Add processor-specific flags
3053 if enabled aarch64; then
3054
3055     case $cpu in
3056         armv*)
3057             cpuflags="-march=$cpu"
3058         ;;
3059         *)
3060             cpuflags="-mcpu=$cpu"
3061         ;;
3062     esac
3063
3064 elif enabled alpha; then
3065
3066     cpuflags="-mcpu=$cpu"
3067
3068 elif enabled arm; then
3069
3070     check_arm_arch() {
3071         check_cpp_condition stddef.h \
3072             "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
3073             $cpuflags
3074     }
3075
3076     probe_arm_arch() {
3077         if   check_arm_arch 4;        then echo armv4;
3078         elif check_arm_arch 4T;       then echo armv4t;
3079         elif check_arm_arch 5;        then echo armv5;
3080         elif check_arm_arch 5E;       then echo armv5e;
3081         elif check_arm_arch 5T;       then echo armv5t;
3082         elif check_arm_arch 5TE;      then echo armv5te;
3083         elif check_arm_arch 5TEJ;     then echo armv5te;
3084         elif check_arm_arch 6;        then echo armv6;
3085         elif check_arm_arch 6J;       then echo armv6j;
3086         elif check_arm_arch 6K;       then echo armv6k;
3087         elif check_arm_arch 6Z;       then echo armv6z;
3088         elif check_arm_arch 6ZK;      then echo armv6zk;
3089         elif check_arm_arch 6T2;      then echo armv6t2;
3090         elif check_arm_arch 7;        then echo armv7;
3091         elif check_arm_arch 7A  7_A;  then echo armv7-a;
3092         elif check_arm_arch 7R  7_R;  then echo armv7-r;
3093         elif check_arm_arch 7M  7_M;  then echo armv7-m;
3094         elif check_arm_arch 7EM 7E_M; then echo armv7-m;
3095         elif check_arm_arch 8A  8_A;  then echo armv8-a;
3096         fi
3097     }
3098
3099     [ "$cpu" = generic ] && cpu=$(probe_arm_arch)
3100
3101     case $cpu in
3102         armv*)
3103             cpuflags="-march=$cpu"
3104             subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
3105         ;;
3106         *)
3107             cpuflags="-mcpu=$cpu"
3108             case $cpu in
3109                 cortex-a*)                               subarch=armv7a  ;;
3110                 cortex-r*)                               subarch=armv7r  ;;
3111                 cortex-m*)                 enable thumb; subarch=armv7m  ;;
3112                 arm11*)                                  subarch=armv6   ;;
3113                 arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
3114                 armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
3115                 *)                             subarch=$(probe_arm_arch) ;;
3116             esac
3117         ;;
3118     esac
3119
3120     case "$subarch" in
3121         armv5t*)    enable fast_clz                ;;
3122         armv[6-8]*) enable fast_clz fast_unaligned ;;
3123     esac
3124
3125 elif enabled avr32; then
3126
3127     case $cpu in
3128         ap7[02]0[0-2])
3129             subarch="avr32_ap"
3130             cpuflags="-mpart=$cpu"
3131         ;;
3132         ap)
3133             subarch="avr32_ap"
3134             cpuflags="-march=$cpu"
3135         ;;
3136         uc3[ab]*)
3137             subarch="avr32_uc"
3138             cpuflags="-mcpu=$cpu"
3139         ;;
3140         uc)
3141             subarch="avr32_uc"
3142             cpuflags="-march=$cpu"
3143         ;;
3144     esac
3145
3146 elif enabled bfin; then
3147
3148     cpuflags="-mcpu=$cpu"
3149
3150 elif enabled mips; then
3151
3152     cpuflags="-march=$cpu"
3153
3154 elif enabled ppc; then
3155
3156     disable ldbrx
3157
3158     case $(tolower $cpu) in
3159         601|ppc601|powerpc601)
3160             cpuflags="-mcpu=601"
3161             disable altivec
3162         ;;
3163         603*|ppc603*|powerpc603*)
3164             cpuflags="-mcpu=603"
3165             disable altivec
3166         ;;
3167         604*|ppc604*|powerpc604*)
3168             cpuflags="-mcpu=604"
3169             disable altivec
3170         ;;
3171         g3|75*|ppc75*|powerpc75*)
3172             cpuflags="-mcpu=750"
3173             disable altivec
3174         ;;
3175         g4|745*|ppc745*|powerpc745*)
3176             cpuflags="-mcpu=7450"
3177         ;;
3178         74*|ppc74*|powerpc74*)
3179             cpuflags="-mcpu=7400"
3180         ;;
3181         g5|970|ppc970|powerpc970)
3182             cpuflags="-mcpu=970"
3183         ;;
3184         power[3-7]*)
3185             cpuflags="-mcpu=$cpu"
3186         ;;
3187         cell)
3188             cpuflags="-mcpu=cell"
3189             enable ldbrx
3190         ;;
3191         e500mc)
3192             cpuflags="-mcpu=e500mc"
3193             disable altivec
3194         ;;
3195         e500v2)
3196             cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
3197             disable altivec
3198             disable dcbzl
3199         ;;
3200         e500)
3201             cpuflags="-mcpu=8540 -mhard-float"
3202             disable altivec
3203             disable dcbzl
3204         ;;
3205     esac
3206
3207 elif enabled sparc; then
3208
3209     case $cpu in
3210         cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
3211             cpuflags="-mcpu=$cpu"
3212         ;;
3213         ultrasparc*|niagara[234])
3214             cpuflags="-mcpu=$cpu"
3215         ;;
3216     esac
3217
3218 elif enabled x86; then
3219
3220     case $cpu in
3221         i[345]86|pentium)
3222             cpuflags="-march=$cpu"
3223             disable mmx
3224         ;;
3225         # targets that do NOT support nopl and conditional mov (cmov)
3226         pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
3227             cpuflags="-march=$cpu"
3228             disable i686
3229         ;;
3230         # targets that do support nopl and conditional mov (cmov)
3231         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*)
3232             cpuflags="-march=$cpu"
3233             enable i686
3234             enable fast_cmov
3235         ;;
3236         # targets that do support conditional mov but on which it's slow
3237         pentium4|pentium4m|prescott|nocona)
3238             cpuflags="-march=$cpu"
3239             enable i686
3240             disable fast_cmov
3241         ;;
3242     esac
3243
3244 fi
3245
3246 if [ "$cpu" != generic ]; then
3247     add_cflags  $cpuflags
3248     add_asflags $cpuflags
3249 fi
3250
3251 # compiler sanity check
3252 check_exec <<EOF
3253 int main(void){ return 0; }
3254 EOF
3255 if test "$?" != 0; then
3256     echo "$cc is unable to create an executable file."
3257     if test -z "$cross_prefix" && ! enabled cross_compile ; then
3258         echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
3259         echo "Only do this if you know what cross compiling means."
3260     fi
3261     die "C compiler test failed."
3262 fi
3263
3264 add_cppflags -D_ISOC99_SOURCE
3265 check_cflags -std=c99
3266 check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
3267 #include <stdlib.h>
3268 EOF
3269 check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
3270 #include <stdlib.h>
3271 EOF
3272
3273 add_host_cppflags -D_ISOC99_SOURCE
3274 check_host_cflags -std=c99
3275 check_host_cflags -Wall
3276 check_host_cflags -O3
3277
3278 check_64bit(){
3279     arch32=$1
3280     arch64=$2
3281     expr=$3
3282     check_code cc "" "int test[2*($expr) - 1]" &&
3283         subarch=$arch64 || subarch=$arch32
3284 }
3285
3286 case "$arch" in
3287     aarch64|alpha|ia64)
3288         spic=$shared
3289     ;;
3290     mips)
3291         check_64bit mips mips64 '_MIPS_SIM > 1'
3292         spic=$shared
3293     ;;
3294     parisc)
3295         check_64bit parisc parisc64 'sizeof(void *) > 4'
3296         spic=$shared
3297     ;;
3298     ppc)
3299         check_64bit ppc ppc64 'sizeof(void *) > 4'
3300         spic=$shared
3301     ;;
3302     s390)
3303         check_64bit s390 s390x 'sizeof(void *) > 4'
3304         spic=$shared
3305     ;;
3306     sparc)
3307         check_64bit sparc sparc64 'sizeof(void *) > 4'
3308         spic=$shared
3309     ;;
3310     x86)
3311         check_64bit x86_32 x86_64 'sizeof(void *) > 4'
3312         if test "$subarch" = "x86_64"; then
3313             spic=$shared
3314         fi
3315     ;;
3316 esac
3317
3318 enable $subarch
3319 enabled spic && enable_weak pic
3320
3321 # OS specific
3322 case $target_os in
3323     aix)
3324         SHFLAGS=-shared
3325         add_cppflags '-I\$(SRC_PATH)/compat/aix'
3326         enabled shared && add_ldflags -Wl,-brtl
3327         ;;
3328     haiku)
3329         prefix_default="/boot/common"
3330         network_extralibs="-lnetwork"
3331         host_libs=
3332         ;;
3333     sunos)
3334         SHFLAGS='-shared -Wl,-h,$$(@F)'
3335         enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
3336         network_extralibs="-lsocket -lnsl"
3337         # When using suncc to build, the Solaris linker will mark
3338         # an executable with each instruction set encountered by
3339         # the Solaris assembler.  As our libraries contain their own
3340         # guards for processor-specific code, instead suppress
3341         # generation of the HWCAPS ELF section on Solaris x86 only.
3342         enabled_all suncc x86 &&
3343             echo "hwcap_1 = OVERRIDE;" > mapfile &&
3344             add_ldflags -Wl,-M,mapfile
3345         nm_default='nm -P -g'
3346         ;;
3347     netbsd)
3348         disable symver
3349         oss_indev_extralibs="-lossaudio"
3350         oss_outdev_extralibs="-lossaudio"
3351         ;;
3352     openbsd|bitrig)
3353         disable symver
3354         SHFLAGS='-shared'
3355         SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
3356         SLIB_INSTALL_LINKS=
3357         oss_indev_extralibs="-lossaudio"
3358         oss_outdev_extralibs="-lossaudio"
3359         ;;
3360     dragonfly)
3361         disable symver
3362         ;;
3363     freebsd)
3364         ;;
3365     bsd/os)
3366         add_extralibs -lpoll -lgnugetopt
3367         ;;
3368     darwin)
3369         gas="gas-preprocessor.pl $cc"
3370         enabled ppc && add_asflags -force_cpusubtype_ALL
3371         SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
3372         enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
3373         add_ldflags -Wl,-dynamic,-search_paths_first
3374         SLIBSUF=".dylib"
3375         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
3376         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
3377         objformat="macho"
3378         enabled x86_64 && objformat="macho64"
3379         enabled_any pic shared ||
3380             { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
3381         ;;
3382     mingw32*)
3383         if test $target_os = "mingw32ce"; then
3384             disable network
3385         else
3386             target_os=mingw32
3387         fi
3388         LIBTARGET=i386
3389         if enabled x86_64; then
3390             LIBTARGET="i386:x86-64"
3391         elif enabled arm; then
3392             LIBTARGET=arm-wince
3393         fi
3394         check_ldflags -Wl,--nxcompat
3395         check_ldflags -Wl,--dynamicbase
3396         shlibdir_default="$bindir_default"
3397         SLIBPREF=""
3398         SLIBSUF=".dll"
3399         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3400         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3401         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)'
3402         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3403         SLIB_INSTALL_LINKS=
3404         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3405         SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3406         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'
3407         objformat="win32"
3408         dlltool="${cross_prefix}dlltool"
3409         ranlib=:
3410         enable dos_paths
3411         ;;
3412     win32|win64)
3413         disable symver
3414         if enabled shared; then
3415             # Link to the import library instead of the normal static library
3416             # for shared libs.
3417             LD_LIB='%.lib'
3418             # Cannot build both shared and static libs with MSVC or icl.
3419             disable static
3420         fi
3421         shlibdir_default="$bindir_default"
3422         SLIBPREF=""
3423         SLIBSUF=".dll"
3424         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3425         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3426         SLIB_CREATE_DEF_CMD='$(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
3427         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3428         SLIB_INSTALL_LINKS=
3429         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3430         SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3431         SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
3432         objformat="win32"
3433         ranlib=:
3434         enable dos_paths
3435         ;;
3436     cygwin*)
3437         target_os=cygwin
3438         shlibdir_default="$bindir_default"
3439         SLIBPREF="cyg"
3440         SLIBSUF=".dll"
3441         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3442         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3443         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3444         SLIB_INSTALL_LINKS=
3445         SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a'
3446         SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a'
3447         objformat="win32"
3448         enable dos_paths
3449         ;;
3450     *-dos|freedos|opendos)
3451         network_extralibs="-lsocket"
3452         objformat="coff"
3453         enable dos_paths
3454         add_cppflags -U__STRICT_ANSI__
3455         ;;
3456     linux)
3457         enable dv1394
3458         ;;
3459     irix*)
3460         target_os=irix
3461         ranlib="echo ignoring ranlib"
3462         ;;
3463     os/2*)
3464         ln_s="cp -f"
3465         objformat="aout"
3466         add_cppflags -D_GNU_SOURCE
3467         add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
3468         SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
3469         LIBSUF="_s.a"
3470         SLIBPREF=""
3471         SLIBSUF=".dll"
3472         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
3473         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
3474         SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
3475             echo PROTMODE >> $(SUBDIR)$(NAME).def; \
3476             echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
3477             echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
3478             echo EXPORTS >> $(SUBDIR)$(NAME).def; \
3479             emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def'
3480         SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
3481             emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
3482         SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
3483         enable dos_paths
3484         ;;
3485     gnu/kfreebsd)
3486         add_cppflags -D_BSD_SOURCE
3487         ;;
3488     gnu)
3489         ;;
3490     qnx)
3491         add_cppflags -D_QNX_SOURCE
3492         network_extralibs="-lsocket"
3493         ;;
3494     symbian)
3495         SLIBSUF=".dll"
3496         enable dos_paths
3497         add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default
3498         add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS
3499         add_ldflags -Wl,--target1-abs,--no-undefined \
3500                     -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \
3501                     -Wl,--entry=_E32Startup -Wl,-u,_E32Startup
3502         add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \
3503                       -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
3504                       -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
3505         ;;
3506     osf1)
3507         add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
3508         ;;
3509     minix)
3510         ;;
3511     plan9)
3512         add_cppflags -D_C99_SNPRINTF_EXTENSION  \
3513                      -D_REENTRANT_SOURCE        \
3514                      -D_RESEARCH_SOURCE         \
3515                      -DFD_SETSIZE=96            \
3516                      -DHAVE_SOCK_OPTS
3517         add_compat strtod.o strtod=avpriv_strtod
3518         network_extralibs='-lbsd'
3519         exeobjs=compat/plan9/main.o
3520         disable avserver
3521         cp_f='cp'
3522         ;;
3523     none)
3524         ;;
3525     *)
3526         die "Unknown OS '$target_os'."
3527         ;;
3528 esac
3529
3530 # determine libc flavour
3531
3532 probe_libc(){
3533     pfx=$1
3534     pfx_no_=${pfx%_}
3535     # uclibc defines __GLIBC__, so it needs to be checked before glibc.
3536     if check_${pfx}cpp_condition features.h "defined __UCLIBC__"; then
3537         eval ${pfx}libc_type=uclibc
3538         add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3539     elif check_${pfx}cpp_condition features.h "defined __GLIBC__"; then
3540         eval ${pfx}libc_type=glibc
3541         add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3542     # MinGW headers can be installed on Cygwin, so check for newlib first.
3543     elif check_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
3544         eval ${pfx}libc_type=newlib
3545         add_${pfx}cppflags -U__STRICT_ANSI__
3546     # MinGW64 is backwards compatible with MinGW32, so check for it first.
3547     elif check_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then
3548         eval ${pfx}libc_type=mingw64
3549         add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3550         eval test \$${pfx_no_}cc_type = "gcc" &&
3551             add_${pfx}cppflags -D__printf__=__gnu_printf__
3552     elif check_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
3553          check_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
3554         eval ${pfx}libc_type=mingw32
3555         check_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \
3556             (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
3557             die "ERROR: MinGW32 runtime version must be >= 3.15."
3558         add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3559         eval test \$${pfx_no_}cc_type = "gcc" &&
3560             add_${pfx}cppflags -D__printf__=__gnu_printf__
3561     elif check_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
3562         eval ${pfx}libc_type=msvcrt
3563         # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to
3564         # 0x601 by default unless something else is set by the user.
3565         # This can easily lead to us detecting functions only present
3566         # in such new versions and producing binaries requiring windows 7.0.
3567         # Therefore explicitly set the default to XP unless the user has
3568         # set something else on the command line.
3569         check_${pfx}cpp_condition stdlib.h "defined(_WIN32_WINNT)" ||
3570             add_${pfx}cppflags -D_WIN32_WINNT=0x0502
3571     elif check_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then
3572         eval ${pfx}libc_type=klibc
3573     elif check_${pfx}cpp_condition sys/cdefs.h "defined __BIONIC__"; then
3574         eval ${pfx}libc_type=bionic
3575     elif check_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
3576         eval ${pfx}libc_type=solaris
3577         add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
3578     fi
3579 }
3580
3581 probe_libc
3582 test -n "$libc_type" && enable libc_$libc_type
3583 probe_libc host_
3584 test -n "$host_libc_type" && enable host_libc_$host_libc_type
3585
3586 case $libc_type in
3587     bionic)
3588         add_compat strtod.o strtod=avpriv_strtod
3589         ;;
3590     msvcrt)
3591         add_compat strtod.o strtod=avpriv_strtod
3592         add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
3593                                      _snprintf=avpriv_snprintf  \
3594                                      vsnprintf=avpriv_vsnprintf
3595         ;;
3596 esac
3597
3598 # hacks for compiler/libc/os combinations
3599
3600 if enabled_all tms470 libc_glibc; then
3601     CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
3602     add_cppflags -D__USER_LABEL_PREFIX__=
3603     add_cppflags -D__builtin_memset=memset
3604     add_cppflags -D__gnuc_va_list=va_list -D_VA_LIST_DEFINED
3605     add_cflags   -pds=48    # incompatible redefinition of macro
3606 fi
3607
3608 if enabled_all ccc libc_glibc; then
3609     add_ldflags -Wl,-z,now  # calls to libots crash without this
3610 fi
3611
3612 check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
3613     add_cppflags '-I\$(SRC_PATH)/compat/float'
3614
3615 esc(){
3616     echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
3617 }
3618
3619 echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $LIBAV_CONFIGURATION)" >config.fate
3620
3621 check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
3622
3623 set_default $PATHS_LIST
3624 set_default nm
3625
3626 # we need to build at least one lib type
3627 if ! enabled_any static shared; then
3628     cat <<EOF
3629 At least one library type must be built.
3630 Specify --enable-static to build the static libraries or --enable-shared to
3631 build the shared libraries as well. To only build the shared libraries specify
3632 --disable-static in addition to --enable-shared.
3633 EOF
3634     exit 1;
3635 fi
3636
3637 die_license_disabled() {
3638     enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
3639 }
3640
3641 die_license_disabled gpl libcdio
3642 die_license_disabled gpl libx264
3643 die_license_disabled gpl libx265
3644 die_license_disabled gpl libxavs
3645 die_license_disabled gpl libxvid
3646 die_license_disabled gpl x11grab
3647
3648 die_license_disabled nonfree libfaac
3649 die_license_disabled nonfree libfdk_aac
3650 die_license_disabled nonfree openssl
3651
3652 die_license_disabled version3 libopencore_amrnb
3653 die_license_disabled version3 libopencore_amrwb
3654 die_license_disabled version3 libvo_aacenc
3655 die_license_disabled version3 libvo_amrwbenc
3656
3657 enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
3658
3659 disabled optimizations || check_cflags -fomit-frame-pointer
3660
3661 enable_weak_pic() {
3662     disabled pic && return
3663     enable pic
3664     add_cppflags -DPIC
3665     case "$target_os" in
3666     mingw*|cygwin*)
3667         ;;
3668     *)
3669         add_cflags -fPIC
3670         ;;
3671     esac
3672     add_asflags  -fPIC
3673 }
3674
3675 enabled pic && enable_weak_pic
3676
3677 check_cc <<EOF || die "Symbol mangling check failed."
3678 int ff_extern;
3679 EOF
3680 sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
3681 extern_prefix=${sym%%ff_extern*}
3682
3683 check_cc <<EOF && enable_weak inline_asm
3684 void foo(void) { __asm__ volatile ("" ::); }
3685 EOF
3686
3687 _restrict=
3688 for restrict_keyword in restrict __restrict__ __restrict; do
3689     check_cc <<EOF && _restrict=$restrict_keyword && break
3690 void foo(char * $restrict_keyword p);
3691 EOF
3692 done
3693
3694 check_cc <<EOF && enable pragma_deprecated
3695 void foo(void) { _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") }
3696 EOF
3697
3698 check_cc <<EOF && enable attribute_packed
3699 struct { int x; } __attribute__((packed)) x;
3700 EOF
3701
3702 check_cc <<EOF && enable attribute_may_alias
3703 union { int x; } __attribute__((may_alias)) x;
3704 EOF
3705
3706 check_cc <<EOF || die "endian test failed"
3707 unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
3708 EOF
3709 od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
3710
3711 check_inline_asm inline_asm_labels '"1:\n"'
3712
3713 if enabled aarch64; then
3714     enabled armv8 && check_insn armv8 'prfm   pldl1strm, [x0]'
3715     # internal assembler in clang 3.3 does not support this instruction
3716     enabled neon && check_insn neon 'ext   v0.8B, v0.8B, v1.8B, #1'
3717     enabled vfp  && check_insn vfp  'fmadd d0,    d0,    d1,    d2'
3718
3719     map 'enabled_any ${v}_external ${v}_inline || disable $v' $ARCH_EXT_LIST_ARM
3720
3721 elif enabled alpha; then
3722
3723     check_cflags -mieee
3724
3725 elif enabled arm; then
3726
3727     check_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb
3728     enabled thumb && check_cflags -mthumb || check_cflags -marm
3729     nogas=die
3730
3731     if     check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then
3732         enable vfp_args
3733     elif ! check_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__"; then
3734         case "${cross_prefix:-$cc}" in
3735             *hardfloat*)         enable vfp_args;   fpabi=vfp ;;
3736             *) check_ld <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
3737 __asm__ (".eabi_attribute 28, 1");
3738 int main(void) { return 0; }
3739 EOF
3740         esac
3741         warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
3742     fi
3743
3744     enabled armv5te && check_insn armv5te 'qadd r0, r0, r0'
3745     enabled armv6   && check_insn armv6   'sadd16 r0, r0, r0'
3746     enabled armv6t2 && check_insn armv6t2 'movt r0, #0'
3747     enabled neon    && check_insn neon    'vadd.i16 q0, q0, q0'
3748     enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
3749     enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'
3750
3751     [ $target_os = linux ] ||
3752         map 'enabled_any ${v}_external ${v}_inline || disable $v' \
3753             $ARCH_EXT_LIST_ARM
3754
3755     check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
3756
3757     [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
3758
3759 elif enabled mips; then
3760
3761     check_inline_asm loongson '"dmult.g $1, $2, $3"'
3762
3763 elif enabled parisc; then
3764
3765     if enabled gcc; then
3766         case $($cc -dumpversion) in
3767             4.[3-8].*) check_cflags -fno-optimize-sibling-calls ;;
3768         esac
3769     fi
3770
3771 elif enabled ppc; then
3772
3773     enable local_aligned_8 local_aligned_16
3774
3775     check_inline_asm dcbzl     '"dcbzl 0, %0" :: "r"(0)'
3776     check_inline_asm ibm_asm   '"add 0, 0, 0"'
3777     check_inline_asm ppc4xx    '"maclhw r10, r11, r12"'
3778     check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'
3779
3780     # AltiVec flags: The FSF version of GCC differs from the Apple version
3781     if enabled altivec; then
3782         nogas=warn
3783         check_cflags -maltivec -mabi=altivec &&
3784         { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } ||
3785         check_cflags -faltivec
3786
3787         # check if our compiler supports Motorola AltiVec C API
3788         check_cc <<EOF || disable altivec
3789 $inc_altivec_h
3790 int main(void) {
3791     vector signed int v1 = (vector signed int) { 0 };
3792     vector signed int v2 = (vector signed int) { 1 };
3793     v1 = vec_add(v1, v2);
3794     return 0;
3795 }
3796 EOF
3797
3798         enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
3799     fi
3800
3801 elif enabled x86; then
3802
3803     check_builtin rdtsc    intrin.h   "__rdtsc()"
3804     check_builtin mm_empty mmintrin.h "_mm_empty()"
3805
3806     enable local_aligned_8 local_aligned_16
3807
3808     # check whether EBP is available on x86
3809     # As 'i' is stored on the stack, this program will crash
3810     # if the base pointer is used to access it because the
3811     # base pointer is cleared in the inline assembly code.
3812     check_exec_crash <<EOF && enable ebp_available
3813 volatile int i=0;
3814 __asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
3815 return i;
3816 EOF
3817
3818     # check whether EBX is available on x86
3819     check_inline_asm ebx_available '""::"b"(0)' &&
3820         check_inline_asm ebx_available '"":::"%ebx"'
3821
3822     # check whether xmm clobbers are supported
3823     check_inline_asm xmm_clobbers '"":::"%xmm0"'
3824
3825     # check whether binutils is new enough to compile SSSE3/MMXEXT
3826     enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
3827     enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
3828
3829     if ! disabled_any asm mmx yasm; then
3830         if check_cmd $yasmexe --version; then
3831             enabled x86_64 && yasm_extra="-m amd64"
3832             yasm_debug="-g dwarf2"
3833         elif check_cmd nasm -v; then
3834             yasmexe=nasm
3835             yasm_debug="-g -F dwarf"
3836             enabled x86_64 && test "$objformat" = elf && objformat=elf64
3837         fi
3838
3839         YASMFLAGS="-f $objformat $yasm_extra"
3840         enabled pic               && append YASMFLAGS "-DPIC"
3841         test -n "$extern_prefix"  && append YASMFLAGS "-DPREFIX"
3842         case "$objformat" in
3843             elf*) enabled debug && append YASMFLAGS $yasm_debug ;;
3844         esac
3845
3846         check_yasm "movbe ecx, [5]" && enable yasm ||
3847             die "yasm/nasm not found or too old. Use --disable-yasm for a crippled build."
3848         check_yasm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
3849         check_yasm "vfmadd132ps ymm0, ymm1, ymm2"    || disable fma3_external
3850         check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
3851         check_yasm "CPU amdnop" || disable cpunop
3852     fi
3853
3854     case "$cpu" in
3855         athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
3856             disable fast_clz
3857         ;;
3858     esac
3859
3860 fi
3861
3862 if enabled asm; then
3863     as=${gas:=$as}
3864     check_as <<EOF && enable gnu_as || \
3865         $nogas "GNU assembler not found, install gas-preprocessor"
3866 .macro m n
3867 \n: .int 0
3868 .endm
3869 m x
3870 EOF
3871 fi
3872
3873 check_ldflags -Wl,--as-needed
3874
3875 if check_func dlopen; then
3876     ldl=
3877 elif check_func dlopen -ldl; then
3878     ldl=-ldl
3879 fi
3880
3881 if ! disabled network; then
3882     check_func getaddrinfo $network_extralibs
3883     check_func getservbyport $network_extralibs
3884     check_func inet_aton $network_extralibs
3885
3886     check_type netdb.h "struct addrinfo"
3887     check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
3888     check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
3889     check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
3890     check_type poll.h "struct pollfd"
3891     check_type netinet/sctp.h "struct sctp_event_subscribe"
3892     check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
3893     check_type netinet/in.h "struct sockaddr_in6"
3894     check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
3895     check_type "sys/types.h sys/socket.h" socklen_t
3896
3897     # Prefer arpa/inet.h over winsock2
3898     if check_header arpa/inet.h ; then
3899         check_func closesocket
3900     elif check_header winsock2.h ; then
3901         check_func_headers winsock2.h closesocket -lws2 &&
3902             network_extralibs="-lws2" ||
3903         { check_func_headers winsock2.h closesocket -lws2_32 &&
3904             network_extralibs="-lws2_32"; } || disable winsock2_h network
3905         check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
3906
3907         check_type ws2tcpip.h socklen_t
3908         check_type ws2tcpip.h "struct addrinfo"
3909         check_type ws2tcpip.h "struct group_source_req"
3910         check_type ws2tcpip.h "struct ip_mreq_source"
3911         check_type ws2tcpip.h "struct ipv6_mreq"
3912         check_type winsock2.h "struct pollfd"
3913         check_struct winsock2.h "struct sockaddr" sa_len
3914         check_type ws2tcpip.h "struct sockaddr_in6"
3915         check_type ws2tcpip.h "struct sockaddr_storage"
3916     else
3917         disable network
3918     fi
3919 fi
3920
3921 check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
3922 check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
3923 check_builtin MemoryBarrier windows.h "MemoryBarrier()"
3924 check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
3925
3926 check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
3927 check_func  ${malloc_prefix}memalign            && enable memalign
3928 check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
3929
3930 check_func  fcntl
3931 check_func  fork
3932 check_func  gethrtime
3933 check_func  getopt
3934 check_func  getrusage
3935 check_func  gettimeofday
3936 check_func  isatty
3937 check_func  localtime_r
3938 check_func  mach_absolute_time
3939 check_func  mkstemp
3940 check_func  mmap
3941 check_func  mprotect
3942 # Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
3943 check_func  nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }
3944 check_func  sched_getaffinity
3945 check_func  setrlimit
3946 check_func  strerror_r
3947 check_func  strptime
3948 check_func  sysconf
3949 check_func  sysctl
3950 check_func  usleep
3951
3952 check_func_headers io.h setmode
3953 check_func_headers stdlib.h getenv
3954
3955 check_func_headers windows.h CoTaskMemFree -lole32
3956 check_func_headers windows.h GetProcessAffinityMask
3957 check_func_headers windows.h GetProcessTimes
3958 check_func_headers windows.h GetSystemTimeAsFileTime
3959 check_func_headers windows.h MapViewOfFile
3960 check_func_headers windows.h SetConsoleTextAttribute
3961 check_func_headers windows.h Sleep
3962 check_func_headers windows.h VirtualAlloc
3963
3964 check_header direct.h
3965 check_header dlfcn.h
3966 check_header dxva.h
3967 check_header dxva2api.h
3968 check_header io.h
3969 check_header mach/mach_time.h
3970 check_header malloc.h
3971 check_header poll.h
3972 check_header sys/mman.h
3973 check_header sys/param.h
3974 check_header sys/resource.h
3975 check_header sys/select.h
3976 check_header sys/time.h
3977 check_header sys/un.h
3978 check_header unistd.h
3979 check_header vdpau/vdpau.h
3980 check_header vdpau/vdpau_x11.h
3981 check_header VideoDecodeAcceleration/VDADecoder.h
3982 check_header windows.h
3983 check_header X11/extensions/XvMClib.h
3984
3985 check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
3986 check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
3987 check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
3988
3989 check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
3990
3991 if ! disabled w32threads && ! enabled pthreads; then
3992     check_func_headers "windows.h process.h" _beginthreadex &&
3993         enable w32threads || disable w32threads
3994 fi
3995
3996 # check for some common methods of building with pthread support
3997 # do this before the optional library checks as some of them require pthreads
3998 if ! disabled pthreads && ! enabled w32threads; then
3999     enable pthreads
4000     if check_func pthread_join -pthread; then
4001         add_cflags -pthread
4002         add_extralibs -pthread
4003     elif check_func pthread_join -pthreads; then
4004         add_cflags -pthreads
4005         add_extralibs -pthreads
4006     elif check_func pthread_join -lpthreadGC2; then
4007         add_extralibs -lpthreadGC2
4008     elif check_lib pthread.h pthread_join -lpthread; then
4009         :
4010     elif ! check_func pthread_join; then
4011         disable pthreads
4012     fi
4013 fi
4014
4015 disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
4016 disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
4017
4018 check_lib math.h sin -lm && LIBM="-lm"
4019 enabled vaapi && require vaapi va/va.h vaInitialize -lva
4020
4021 atan2f_args=2
4022 ldexpf_args=2
4023 powf_args=2
4024
4025 for func in $MATH_FUNCS; do
4026     eval check_mathfunc $func \${${func}_args:-1}
4027 done
4028
4029 # these are off by default, so fail if requested and not available
4030 enabled avisynth          && { { check_header "avisynth/avisynth_c.h" && check_lib2 "windows.h" LoadLibrary; } ||
4031                                { check_header "avxsynth/avxsynth_c.h" && check_lib2 "dlfcn.h" dlopen -ldl; } ||
4032                                die "ERROR: LoadLibrary/dlopen not found, or avisynth header not found"; }
4033 enabled frei0r            && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; }
4034 enabled gnutls            && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
4035 enabled libbs2b           && require_pkg_config libbs2b bs2b.h bs2b_open
4036 enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
4037 enabled libfdk_aac        && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
4038 enabled libfontconfig     && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
4039 enabled libfreetype       && require_pkg_config freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
4040 enabled libgsm            && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
4041                                    check_lib "${gsm_hdr}" gsm_create -lgsm && break;
4042                                done || die "ERROR: libgsm not found"; }
4043 enabled libilbc           && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
4044 enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
4045 enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
4046 enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
4047 enabled libopencv         && require_pkg_config opencv opencv/cv.h cvCreateImageHeader
4048 enabled libopenjpeg       && { { check_header openjpeg.h && check_lib2 openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC; } ||
4049                                { require_pkg_config libopenjpeg1 openjpeg.h opj_version -DOPJ_STATIC; } }
4050 enabled libopus           && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
4051 enabled libpulse          && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
4052 enabled librtmp           && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
4053 enabled libschroedinger   && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
4054 enabled libspeex          && require libspeex speex/speex.h speex_decoder_init -lspeex
4055 enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
4056 enabled libtwolame        && require libtwolame twolame.h twolame_init -ltwolame
4057 enabled libvo_aacenc      && require libvo_aacenc vo-aacenc/voAAC.h voGetAACEncAPI -lvo-aacenc
4058 enabled libvo_amrwbenc    && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
4059 enabled libvorbis         && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg
4060 enabled libvpx            && {
4061     enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
4062                                     die "ERROR: libvpx decoder version must be >=0.9.1"; }