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