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