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