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