configure: simplify check_lib function
[ffmpeg.git] / configure
1 #!/bin/sh
2 #
3 # FFmpeg 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 FFMPEG, 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 FFmpeg."
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 show_help(){
58 cat <<EOF
59 Usage: configure [options]
60 Options: [defaults in brackets after descriptions]
61
62 Standard options:
63   --help                   print this message
64   --logfile=FILE           log tests and output to FILE [config.log]
65   --disable-logging        do not log configure debug information
66   --prefix=PREFIX          install in PREFIX [$prefix]
67   --bindir=DIR             install binaries in DIR [PREFIX/bin]
68   --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]
69   --libdir=DIR             install libs in DIR [PREFIX/lib]
70   --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
71   --incdir=DIR             install includes in DIR [PREFIX/include]
72   --mandir=DIR             install man page in DIR [PREFIX/share/man]
73
74 Configuration options:
75   --disable-static         do not build static libraries [no]
76   --enable-shared          build shared libraries [no]
77   --enable-gpl             allow use of GPL code, the resulting libs
78                            and binaries will be under GPL [no]
79   --enable-version3        upgrade (L)GPL to version 3 [no]
80   --enable-nonfree         allow use of nonfree code, the resulting libs
81                            and binaries will be unredistributable [no]
82   --disable-doc            do not build documentation
83   --disable-ffmpeg         disable ffmpeg build
84   --disable-ffplay         disable ffplay build
85   --disable-ffprobe        disable ffprobe build
86   --disable-ffserver       disable ffserver build
87   --disable-avdevice       disable libavdevice build
88   --disable-avcodec        disable libavcodec build
89   --disable-avformat       disable libavformat build
90   --disable-swscale        disable libswscale build
91   --enable-postproc        enable GPLed postprocessing support [no]
92   --disable-avfilter       disable video filter support [no]
93   --enable-avfilter-lavf   video filters dependent on avformat [no]
94   --disable-pthreads       disable pthreads [auto]
95   --enable-w32threads      use Win32 threads [no]
96   --enable-x11grab         enable X11 grabbing [no]
97   --disable-network        disable network support [no]
98   --disable-mpegaudio-hp   faster (but less accurate) MPEG audio decoding [no]
99   --enable-gray            enable full grayscale support (slower color)
100   --disable-swscale-alpha  disable alpha channel support in swscale
101   --disable-fastdiv        disable table-based division
102   --enable-small           optimize for size instead of speed
103   --disable-aandct         disable AAN DCT code
104   --disable-dct            disable DCT code
105   --disable-fft            disable FFT code
106   --disable-golomb         disable Golomb code
107   --disable-lpc            disable LPC code
108   --disable-mdct           disable MDCT code
109   --disable-rdft           disable RDFT code
110   --disable-vaapi          disable VAAPI code
111   --disable-vdpau          disable VDPAU code
112   --disable-dxva2          disable DXVA2 code
113   --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary)
114   --enable-hardcoded-tables use hardcoded tables instead of runtime generation
115   --enable-memalign-hack   emulate memalign, interferes with memory debuggers
116   --disable-everything     disable all components listed below
117   --disable-encoder=NAME   disable encoder NAME
118   --enable-encoder=NAME    enable encoder NAME
119   --disable-encoders       disable all encoders
120   --disable-decoder=NAME   disable decoder NAME
121   --enable-decoder=NAME    enable decoder NAME
122   --disable-decoders       disable all decoders
123   --disable-hwaccel=NAME   disable hwaccel NAME
124   --enable-hwaccel=NAME    enable hwaccel NAME
125   --disable-hwaccels       disable all hwaccels
126   --disable-muxer=NAME     disable muxer NAME
127   --enable-muxer=NAME      enable muxer NAME
128   --disable-muxers         disable all muxers
129   --disable-demuxer=NAME   disable demuxer NAME
130   --enable-demuxer=NAME    enable demuxer NAME
131   --disable-demuxers       disable all demuxers
132   --enable-parser=NAME     enable parser NAME
133   --disable-parser=NAME    disable parser NAME
134   --disable-parsers        disable all parsers
135   --enable-bsf=NAME        enable bitstream filter NAME
136   --disable-bsf=NAME       disable bitstream filter NAME
137   --disable-bsfs           disable all bitstream filters
138   --enable-protocol=NAME   enable protocol NAME
139   --disable-protocol=NAME  disable protocol NAME
140   --disable-protocols      disable all protocols
141   --disable-indev=NAME     disable input device NAME
142   --disable-outdev=NAME    disable output device NAME
143   --disable-indevs         disable input devices
144   --disable-outdevs        disable output devices
145   --disable-devices        disable all devices
146   --enable-filter=NAME     enable filter NAME
147   --disable-filter=NAME    disable filter NAME
148   --disable-filters        disable all filters
149   --list-decoders          show all available decoders
150   --list-encoders          show all available encoders
151   --list-hwaccels          show all available hardware accelerators
152   --list-muxers            show all available muxers
153   --list-demuxers          show all available demuxers
154   --list-parsers           show all available parsers
155   --list-protocols         show all available protocols
156   --list-bsfs              show all available bitstream filters
157   --list-indevs            show all available input devices
158   --list-outdevs           show all available output devices
159   --list-filters           show all available filters
160
161 External library support:
162   --enable-avisynth        enable reading of AVISynth script files [no]
163   --enable-bzlib           enable bzlib [autodetect]
164   --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
165   --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
166   --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
167                            and libraw1394 [no]
168   --enable-libdirac        enable Dirac support via libdirac [no]
169   --enable-libfaac         enable FAAC support via libfaac [no]
170   --enable-libgsm          enable GSM support via libgsm [no]
171   --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
172   --enable-libnut          enable NUT (de)muxing via libnut,
173                            native (de)muxer exists [no]
174   --enable-libopenjpeg     enable JPEG 2000 decoding via OpenJPEG [no]
175   --enable-librtmp         enable RTMP[E] support via librtmp [no]
176   --enable-libschroedinger enable Dirac support via libschroedinger [no]
177   --enable-libspeex        enable Speex decoding via libspeex [no]
178   --enable-libtheora       enable Theora encoding via libtheora [no]
179   --enable-libvorbis       enable Vorbis encoding via libvorbis,
180                            native implementation exists [no]
181   --enable-libvpx          enable VP8 support via libvpx [no]
182   --enable-libx264         enable H.264 encoding via x264 [no]
183   --enable-libxvid         enable Xvid encoding via xvidcore,
184                            native MPEG-4/Xvid encoder exists [no]
185   --enable-mlib            enable Sun medialib [no]
186   --enable-zlib            enable zlib [autodetect]
187
188 Advanced options (experts only):
189   --source-path=PATH       path to source code [$source_path]
190   --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
191   --enable-cross-compile   assume a cross-compiler is used
192   --sysroot=PATH           root of cross-build tree
193   --sysinclude=PATH        location of cross-build system headers
194   --target-os=OS           compiler targets OS [$target_os]
195   --target-exec=CMD        command to run executables on target
196   --target-path=DIR        path to view of build directory on target
197   --nm=NM                  use nm tool
198   --ar=AR                  use archive tool AR [$ar_default]
199   --as=AS                  use assembler AS [$as_default]
200   --cc=CC                  use C compiler CC [$cc_default]
201   --ld=LD                  use linker LD
202   --host-cc=HOSTCC         use host C compiler HOSTCC
203   --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
204   --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
205   --host-libs=HLIBS        use libs HLIBS when linking for host
206   --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
207   --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
208   --extra-libs=ELIBS       add ELIBS [$ELIBS]
209   --extra-version=STRING   version string suffix []
210   --build-suffix=SUFFIX    library name suffix []
211   --arch=ARCH              select architecture [$arch]
212   --cpu=CPU                select the minimum required CPU (affects
213                            instruction selection, may crash on older CPUs)
214   --enable-powerpc-perf    enable performance report on PPC
215                            (requires enabling PMC)
216   --disable-asm            disable all assembler optimizations
217   --disable-altivec        disable AltiVec optimizations
218   --disable-amd3dnow       disable 3DNow! optimizations
219   --disable-amd3dnowext    disable 3DNow! extended optimizations
220   --disable-mmx            disable MMX optimizations
221   --disable-mmx2           disable MMX2 optimizations
222   --disable-sse            disable SSE optimizations
223   --disable-ssse3          disable SSSE3 optimizations
224   --disable-armv5te        disable armv5te optimizations
225   --disable-armv6          disable armv6 optimizations
226   --disable-armv6t2        disable armv6t2 optimizations
227   --disable-armvfp         disable ARM VFP optimizations
228   --disable-iwmmxt         disable iwmmxt optimizations
229   --disable-mmi            disable MMI optimizations
230   --disable-neon           disable neon optimizations
231   --disable-vis            disable VIS optimizations
232   --disable-yasm           disable use of yasm assembler
233   --enable-pic             build position-independent code
234   --malloc-prefix=PFX      prefix malloc and related names with PFX
235   --enable-sram            allow use of on-chip SRAM
236
237 Developer options (useful when working on FFmpeg itself):
238   --disable-debug          disable debugging symbols
239   --enable-debug=LEVEL     set the debug level [$debuglevel]
240   --enable-gprof           enable profiling with gprof [$gprof]
241   --disable-optimizations  disable compiler optimizations
242   --enable-extra-warnings  enable more compiler warnings
243   --disable-stripping      disable stripping of executables and shared libraries
244   --samples=PATH           location of test samples for FATE
245
246 NOTE: Object files are built at the place where configure is launched.
247 EOF
248   exit 0
249 }
250
251 quotes='""'
252
253 log(){
254     echo "$@" >> $logfile
255 }
256
257 log_file(){
258     log BEGIN $1
259     pr -n -t $1 >> $logfile
260     log END $1
261 }
262
263 echolog(){
264     log "$@"
265     echo "$@"
266 }
267
268 warn(){
269     log "WARNING: $*"
270     WARNINGS="${WARNINGS}WARNING: $*\n"
271 }
272
273 die(){
274     echolog "$@"
275     cat <<EOF
276
277 If you think configure made a mistake, make sure you are using the latest
278 version from SVN.  If the latest version fails, report the problem to the
279 ffmpeg-user@mplayerhq.hu mailing list or IRC #ffmpeg on irc.freenode.net.
280 EOF
281     if disabled logging; then
282         cat <<EOF
283 Rerun configure with logging enabled (do not use --disable-logging), and
284 include the log this produces with your report.
285 EOF
286     else
287 cat <<EOF
288 Include the log file "$logfile" produced by configure as this will help
289 solving the problem.
290 EOF
291     fi
292     exit 1
293 }
294
295 # Avoid locale weirdness, besides we really just want to translate ASCII.
296 toupper(){
297     echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
298 }
299
300 tolower(){
301     echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
302 }
303
304 c_escape(){
305     echo "$*" | sed 's/["\\]/\\\0/g'
306 }
307
308 sh_quote(){
309     v=$(echo "$1" | sed "s/'/'\\\\''/g")
310     test "$v" = "${v#*[ |&;<>()$\`\\\"\'*?\[\]#~=%]}" || v="'$v'"
311     echo "$v"
312 }
313
314 filter(){
315     pat=$1
316     shift
317     for v; do
318         eval "case $v in $pat) echo $v ;; esac"
319     done
320 }
321
322 map(){
323     m=$1
324     shift
325     for v; do eval $m; done
326 }
327
328 set_all(){
329     value=$1
330     shift
331     for var in $*; do
332         eval $var=$value
333     done
334 }
335
336 set_weak(){
337     value=$1
338     shift
339     for var; do
340         eval : \${$var:=$value}
341     done
342 }
343
344 pushvar(){
345     for var in $*; do
346         eval level=\${${var}_level:=0}
347         eval ${var}_${level}="\$$var"
348         eval ${var}_level=$(($level+1))
349     done
350 }
351
352 popvar(){
353     for var in $*; do
354         eval level=\${${var}_level:-0}
355         test $level = 0 && continue
356         eval level=$(($level-1))
357         eval $var="\${${var}_${level}}"
358         eval ${var}_level=$level
359         eval unset ${var}_${level}
360     done
361 }
362
363 enable(){
364     set_all yes $*
365 }
366
367 disable(){
368     set_all no $*
369 }
370
371 enable_weak(){
372     set_weak yes $*
373 }
374
375 disable_weak(){
376     set_weak no $*
377 }
378
379 enable_safe(){
380     for var; do
381         enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
382     done
383 }
384
385 disable_safe(){
386     for var; do
387         disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
388     done
389 }
390
391 do_enable_deep(){
392     for var; do
393         enabled $var && continue
394         eval sel="\$${var}_select"
395         eval sgs="\$${var}_suggest"
396         pushvar var sgs
397         enable_deep $sel
398         popvar sgs
399         enable_deep_weak $sgs
400         popvar var
401     done
402 }
403
404 enable_deep(){
405     do_enable_deep $*
406     enable $*
407 }
408
409 enable_deep_weak(){
410     do_enable_deep $*
411     enable_weak $*
412 }
413
414 enabled(){
415     test "${1#!}" = "$1" && op== || op=!=
416     eval test "x\$${1#!}" $op "xyes"
417 }
418
419 disabled(){
420     test "${1#!}" = "$1" && op== || op=!=
421     eval test "x\$${1#!}" $op "xno"
422 }
423
424 enabled_all(){
425     for opt; do
426         enabled $opt || return 1
427     done
428 }
429
430 disabled_all(){
431     for opt; do
432         disabled $opt || return 1
433     done
434 }
435
436 enabled_any(){
437     for opt; do
438         enabled $opt && return 0
439     done
440 }
441
442 disabled_any(){
443     for opt; do
444         disabled $opt && return 0
445     done
446     return 1
447 }
448
449 set_default(){
450     for opt; do
451         eval : \${$opt:=\$${opt}_default}
452     done
453 }
454
455 is_in(){
456     value=$1
457     shift
458     for var in $*; do
459         [ $var = $value ] && return 0
460     done
461     return 1
462 }
463
464 check_deps(){
465     for cfg; do
466         cfg="${cfg#!}"
467         enabled ${cfg}_checking && die "Circular dependency for $cfg."
468         disabled ${cfg}_checking && continue
469         enable ${cfg}_checking
470
471         eval dep_all="\$${cfg}_deps"
472         eval dep_any="\$${cfg}_deps_any"
473         eval dep_sel="\$${cfg}_select"
474         eval dep_sgs="\$${cfg}_suggest"
475         eval dep_ifa="\$${cfg}_if"
476         eval dep_ifn="\$${cfg}_if_any"
477
478         pushvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
479         check_deps $dep_all $dep_any $dep_sel $dep_sgs $dep_ifa $dep_ifn
480         popvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
481
482         [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
483         [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
484         enabled_all  $dep_all || disable $cfg
485         enabled_any  $dep_any || disable $cfg
486         disabled_any $dep_sel && disable $cfg
487
488         if enabled $cfg; then
489             eval dep_extralibs="\$${cfg}_extralibs"
490             test -n "$dep_extralibs" && add_extralibs $dep_extralibs
491             enable_deep $dep_sel
492             enable_deep_weak $dep_sgs
493         fi
494
495         disable ${cfg}_checking
496     done
497 }
498
499 print_config(){
500     pfx=$1
501     header=$2
502     makefile=$3
503     shift 3
504     for cfg; do
505         ucname="$(toupper $cfg)"
506         if enabled $cfg; then
507             echo "#define ${pfx}${ucname} 1" >> $header
508             echo "${pfx}${ucname}=yes" >> $makefile
509         else
510             echo "#define ${pfx}${ucname} 0" >> $header
511             echo "!${pfx}${ucname}=yes" >> $makefile
512         fi
513     done
514 }
515
516 flags_saved(){
517     (: ${SAVE_CFLAGS?}) 2> /dev/null
518 }
519
520 save_flags(){
521     flags_saved && return
522     SAVE_CFLAGS="$CFLAGS"
523     SAVE_LDFLAGS="$LDFLAGS"
524     SAVE_extralibs="$extralibs"
525 }
526
527 restore_flags(){
528     flags_saved || return
529     CFLAGS="$SAVE_CFLAGS"
530     LDFLAGS="$SAVE_LDFLAGS"
531     extralibs="$SAVE_extralibs"
532     unset SAVE_CFLAGS
533     unset SAVE_LDFLAGS
534     unset SAVE_extralibs
535 }
536
537 temp_cflags(){
538     save_flags
539     CFLAGS="$CFLAGS $*"
540 }
541
542 temp_ldflags(){
543     save_flags
544     LDFLAGS="$LDFLAGS $*"
545 }
546
547 temp_extralibs(){
548     save_flags
549     extralibs="$extralibs $*"
550 }
551
552 append(){
553     var=$1
554     shift
555     flags_saved && eval "SAVE_$var=\"\$SAVE_$var $*\""
556     eval "$var=\"\$$var $*\""
557 }
558
559 add_cppflags(){
560     append CPPFLAGS $($filter_cppflags "$@")
561 }
562
563 add_cflags(){
564     append CFLAGS $($filter_cflags "$@")
565 }
566
567 add_asflags(){
568     append ASFLAGS $($filter_asflags "$@")
569 }
570
571 add_ldflags(){
572     append LDFLAGS "$@"
573 }
574
575 add_extralibs(){
576     append extralibs "$@"
577 }
578
579 check_cmd(){
580     log "$@"
581     "$@" >> $logfile 2>&1
582 }
583
584 check_cc(){
585     log check_cc "$@"
586     cat > $TMPC
587     log_file $TMPC
588     check_cmd $cc $CPPFLAGS $CFLAGS "$@" -c -o $TMPO $TMPC
589 }
590
591 check_cpp(){
592     log check_cpp "$@"
593     cat > $TMPC
594     log_file $TMPC
595     check_cmd $cc $CPPFLAGS $CFLAGS "$@" -E -o $TMPO $TMPC
596 }
597
598 check_as(){
599     log check_as "$@"
600     cat > $TMPC
601     log_file $TMPC
602     check_cmd $as $CPPFLAGS $ASFLAGS "$@" -c -o $TMPO $TMPC
603 }
604
605 check_asm(){
606     log check_asm "$@"
607     name="$1"
608     code="$2"
609     shift 2
610     disable $name
611     check_as "$@" <<EOF && enable $name
612 void foo(void){ __asm__ volatile($code); }
613 EOF
614 }
615
616 check_yasm(){
617     log check_yasm "$@"
618     echo "$1" > $TMPS
619     log_file $TMPS
620     shift 1
621     check_cmd $yasmexe $YASMFLAGS "$@" -o $TMPO $TMPS
622 }
623
624 check_ld(){
625     log check_ld "$@"
626     flags=''
627     libs=''
628     for f; do
629         test "${f}" = "${f#-l}" && flags="$flags $f" || libs="$libs $f"
630     done
631     check_cc $($filter_cflags $flags) || return
632     check_cmd $ld $LDFLAGS $flags -o $TMPE $TMPO $extralibs $libs
633 }
634
635 check_cppflags(){
636     log check_cppflags "$@"
637     set -- $($filter_cppflags "$@")
638     check_cc "$@" <<EOF && append CPPFLAGS "$@"
639 int x;
640 EOF
641 }
642
643 check_cflags(){
644     log check_cflags "$@"
645     set -- $($filter_cflags "$@")
646     check_cc "$@" <<EOF && append CFLAGS "$@"
647 int x;
648 EOF
649 }
650
651 test_ldflags(){
652     log test_ldflags "$@"
653     check_ld "$@" <<EOF
654 int main(void){ return 0; }
655 EOF
656 }
657
658 check_ldflags(){
659     log check_ldflags "$@"
660     test_ldflags "$@" && add_ldflags "$@"
661 }
662
663 check_header(){
664     log check_header "$@"
665     header=$1
666     shift
667     disable_safe $header
668     check_cpp "$@" <<EOF && enable_safe $header
669 #include <$header>
670 int x;
671 EOF
672 }
673
674 check_func(){
675     log check_func "$@"
676     func=$1
677     shift
678     disable $func
679     check_ld "$@" <<EOF && enable $func
680 extern int $func();
681 int main(void){ $func(); }
682 EOF
683 }
684
685 check_mathfunc(){
686     log check_mathfunc "$@"
687     func=$1
688     shift
689     disable $func
690     check_ld "$@" <<EOF && enable $func
691 #include <math.h>
692 float foo(float f) { return $func(f); }
693 int main(void){ return 0; }
694 EOF
695 }
696
697 check_func_headers(){
698     log check_func_headers "$@"
699     headers=$1
700     func=$2
701     shift 2
702     disable $func
703     incs=""
704     for hdr in $headers; do
705         incs="$incs
706 #include <$hdr>"
707     done
708     check_ld "$@" <<EOF && enable $func && enable_safe $headers
709 $incs
710 int main(int argc, char **argv){
711     return (long) $func;
712 }
713 EOF
714 }
715
716 check_cpp_condition(){
717     log check_cpp_condition "$@"
718     header=$1
719     condition=$2
720     shift 2
721     check_cpp $($filter_cppflags "$@") <<EOF
722 #include <$header>
723 #if !($condition)
724 #error "unsatisfied condition: $condition"
725 #endif
726 EOF
727 }
728
729 check_lib(){
730     log check_lib "$@"
731     header="$1"
732     func="$2"
733     shift 2
734     check_header $header && check_func $func "$@" && add_extralibs "$@"
735 }
736
737 check_lib2(){
738     log check_lib2 "$@"
739     headers="$1"
740     func="$2"
741     shift 2
742     check_func_headers "$headers" $func "$@" && add_extralibs "$@"
743 }
744
745 check_exec(){
746     check_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
747 }
748
749 check_exec_crash(){
750     code=$(cat)
751
752     # exit() is not async signal safe.  _Exit (C99) and _exit (POSIX)
753     # are safe but may not be available everywhere.  Thus we use
754     # raise(SIGTERM) instead.  The check is run in a subshell so we
755     # can redirect the "Terminated" message from the shell.  SIGBUS
756     # is not defined by standard C so it is used conditionally.
757
758     (check_exec "$@") >> $logfile 2>&1 <<EOF
759 #include <signal.h>
760 static void sighandler(int sig){
761     raise(SIGTERM);
762 }
763 int main(void){
764     signal(SIGILL, sighandler);
765     signal(SIGFPE, sighandler);
766     signal(SIGSEGV, sighandler);
767 #ifdef SIGBUS
768     signal(SIGBUS, sighandler);
769 #endif
770     { $code }
771 }
772 EOF
773 }
774
775 check_type(){
776     log check_type "$@"
777     headers=$1
778     type=$2
779     shift 2
780     disable_safe "$type"
781     incs=""
782     for hdr in $headers; do
783         incs="$incs
784 #include <$hdr>"
785     done
786     check_cc "$@" <<EOF && enable_safe "$type"
787 $incs
788 $type v;
789 EOF
790 }
791
792 check_struct(){
793     log check_type "$@"
794     headers=$1
795     struct=$2
796     member=$3
797     shift 3
798     disable_safe "${struct}_${member}"
799     incs=""
800     for hdr in $headers; do
801         incs="$incs
802 #include <$hdr>"
803     done
804     check_cc "$@" <<EOF && enable_safe "${struct}_${member}"
805 $incs
806 const void *p = &(($struct *)0)->$member;
807 EOF
808 }
809
810 require(){
811     name="$1"
812     header="$2"
813     func="$3"
814     shift 3
815     check_lib $header $func "$@" || die "ERROR: $name not found"
816 }
817
818 require2(){
819     name="$1"
820     headers="$2"
821     func="$3"
822     shift 3
823     check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
824 }
825
826 check_host_cc(){
827     log check_host_cc "$@"
828     cat > $TMPC
829     log_file $TMPC
830     check_cmd $host_cc $host_cflags "$@" -c -o $TMPO $TMPC
831 }
832
833 check_host_cflags(){
834     log check_host_cflags "$@"
835     check_host_cc "$@" <<EOF && append host_cflags "$@"
836 int x;
837 EOF
838 }
839
840 apply(){
841     file=$1
842     shift
843     "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
844 }
845
846 cp_if_changed(){
847     cmp -s "$1" "$2" &&
848         echo "$2 is unchanged" ||
849         cp -f "$1" "$2"
850 }
851
852 # CONFIG_LIST contains configurable options, while HAVE_LIST is for
853 # system-dependent things.
854
855 COMPONENT_LIST="
856     bsfs
857     decoders
858     demuxers
859     encoders
860     filters
861     hwaccels
862     indevs
863     muxers
864     outdevs
865     parsers
866     protocols
867 "
868
869 CONFIG_LIST="
870     $COMPONENT_LIST
871     aandct
872     avcodec
873     avdevice
874     avfilter
875     avfilter_lavf
876     avformat
877     avisynth
878     bzlib
879     dct
880     doc
881     dwt
882     dxva2
883     fastdiv
884     ffmpeg
885     ffplay
886     ffprobe
887     ffserver
888     fft
889     golomb
890     gpl
891     gprof
892     gray
893     h264dsp
894     hardcoded_tables
895     libdc1394
896     libdirac
897     libfaac
898     libgsm
899     libmp3lame
900     libnut
901     libopencore_amrnb
902     libopencore_amrwb
903     libopenjpeg
904     librtmp
905     libschroedinger
906     libspeex
907     libtheora
908     libvorbis
909     libvpx
910     libx264
911     libxvid
912     lpc
913     lsp
914     mdct
915     memalign_hack
916     mlib
917     mpegaudio_hp
918     network
919     nonfree
920     pic
921     postproc
922     powerpc_perf
923     rdft
924     runtime_cpudetect
925     shared
926     small
927     sram
928     static
929     swscale
930     swscale_alpha
931     vaapi
932     vdpau
933     version3
934     x11grab
935     zlib
936 "
937
938 THREADS_LIST='
939     pthreads
940     w32threads
941 '
942
943 ARCH_LIST='
944     alpha
945     arm
946     avr32
947     avr32_ap
948     avr32_uc
949     bfin
950     ia64
951     m68k
952     mips
953     mips64
954     parisc
955     ppc
956     ppc64
957     s390
958     sh4
959     sparc
960     sparc64
961     tomi
962     x86
963     x86_32
964     x86_64
965 '
966
967 ARCH_EXT_LIST='
968     altivec
969     amd3dnow
970     amd3dnowext
971     armv5te
972     armv6
973     armv6t2
974     armvfp
975     iwmmxt
976     mmi
977     mmx
978     mmx2
979     neon
980     ppc4xx
981     sse
982     ssse3
983     vis
984 '
985
986 HAVE_LIST_PUB='
987     bigendian
988 '
989
990 HAVE_LIST="
991     $ARCH_EXT_LIST
992     $HAVE_LIST_PUB
993     $THREADS_LIST
994     alsa_asoundlib_h
995     altivec_h
996     arpa_inet_h
997     attribute_may_alias
998     attribute_packed
999     bswap
1000     closesocket
1001     cmov
1002     conio_h
1003     dcbzl
1004     dev_bktr_ioctl_bt848_h
1005     dev_bktr_ioctl_meteor_h
1006     dev_ic_bt8xx_h
1007     dev_video_meteor_ioctl_meteor_h
1008     dev_video_bktr_ioctl_bt848_h
1009     dlfcn_h
1010     dlopen
1011     dos_paths
1012     ebp_available
1013     ebx_available
1014     exp2
1015     exp2f
1016     fast_64bit
1017     fast_clz
1018     fast_cmov
1019     fast_unaligned
1020     fork
1021     getaddrinfo
1022     gethrtime
1023     GetProcessMemoryInfo
1024     GetProcessTimes
1025     getrusage
1026     struct_rusage_ru_maxrss
1027     inet_aton
1028     inline_asm
1029     isatty
1030     ldbrx
1031     libdc1394_1
1032     libdc1394_2
1033     llrint
1034     llrintf
1035     local_aligned_16
1036     local_aligned_8
1037     log2
1038     log2f
1039     loongson
1040     lrint
1041     lrintf
1042     lzo1x_999_compress
1043     machine_ioctl_bt848_h
1044     machine_ioctl_meteor_h
1045     malloc_h
1046     memalign
1047     mkstemp
1048     pld
1049     posix_memalign
1050     round
1051     roundf
1052     sdl
1053     sdl_video_size
1054     setmode
1055     socklen_t
1056     soundcard_h
1057     poll_h
1058     setrlimit
1059     strerror_r
1060     struct_addrinfo
1061     struct_ipv6_mreq
1062     struct_sockaddr_in6
1063     struct_sockaddr_sa_len
1064     struct_sockaddr_storage
1065     symver
1066     symver_gnu_asm
1067     symver_asm_label
1068     sys_mman_h
1069     sys_resource_h
1070     sys_select_h
1071     sys_soundcard_h
1072     sys_videoio_h
1073     ten_operands
1074     termios_h
1075     threads
1076     truncf
1077     vfp_args
1078     VirtualAlloc
1079     winsock2_h
1080     xform_asm
1081     yasm
1082 "
1083
1084 # options emitted with CONFIG_ prefix but not available on command line
1085 CONFIG_EXTRA="
1086     avutil
1087     gplv3
1088     lgplv3
1089 "
1090
1091 CMDLINE_SELECT="
1092     $ARCH_EXT_LIST
1093     $CONFIG_LIST
1094     $THREADS_LIST
1095     asm
1096     cross_compile
1097     debug
1098     extra_warnings
1099     logging
1100     optimizations
1101     stripping
1102     yasm
1103 "
1104
1105 PATHS_LIST='
1106     bindir
1107     datadir
1108     incdir
1109     libdir
1110     mandir
1111     prefix
1112     shlibdir
1113 '
1114
1115 CMDLINE_SET="
1116     $PATHS_LIST
1117     ar
1118     arch
1119     as
1120     build_suffix
1121     cc
1122     cpu
1123     cross_prefix
1124     dep_cc
1125     extra_version
1126     host_cc
1127     host_cflags
1128     host_ldflags
1129     host_libs
1130     host_os
1131     ld
1132     logfile
1133     malloc_prefix
1134     nm
1135     samples
1136     source_path
1137     strip
1138     sysinclude
1139     sysroot
1140     target_exec
1141     target_os
1142     target_path
1143 "
1144
1145 CMDLINE_APPEND="
1146     extra_cflags
1147 "
1148
1149 # code dependency declarations
1150
1151 # architecture extensions
1152
1153 armv5te_deps="arm"
1154 armv6_deps="arm"
1155 armv6t2_deps="arm"
1156 armvfp_deps="arm"
1157 iwmmxt_deps="arm"
1158 neon_deps="arm"
1159
1160 mmi_deps="mips"
1161
1162 altivec_deps="ppc"
1163 ppc4xx_deps="ppc"
1164
1165 vis_deps="sparc"
1166
1167 x86_64_suggest="cmov fast_cmov"
1168 amd3dnow_deps="mmx"
1169 amd3dnowext_deps="amd3dnow"
1170 mmx_deps="x86"
1171 mmx2_deps="mmx"
1172 sse_deps="mmx"
1173 ssse3_deps="sse"
1174
1175 fast_64bit_if_any="alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
1176 fast_clz_if_any="alpha armv5te avr32 mips ppc x86"
1177 fast_unaligned_if_any="armv6 ppc x86"
1178
1179 need_memalign="altivec neon sse"
1180 inline_asm_deps="!tms470"
1181
1182 symver_if_any="symver_asm_label symver_gnu_asm"
1183
1184 # subsystems
1185 mdct_select="fft"
1186 rdft_select="fft"
1187
1188 # decoders / encoders / hardware accelerators
1189 aac_decoder_select="mdct rdft aac_parser"
1190 aac_encoder_select="mdct"
1191 ac3_decoder_select="mdct ac3_parser"
1192 alac_encoder_select="lpc"
1193 amrnb_decoder_select="lsp"
1194 atrac1_decoder_select="mdct"
1195 atrac3_decoder_select="mdct"
1196 binkaudio_dct_decoder_select="mdct rdft dct"
1197 binkaudio_rdft_decoder_select="mdct rdft"
1198 cavs_decoder_select="golomb"
1199 cook_decoder_select="mdct"
1200 cscd_decoder_suggest="zlib"
1201 dca_decoder_select="mdct"
1202 dnxhd_encoder_select="aandct"
1203 dxa_decoder_select="zlib"
1204 eac3_decoder_select="ac3_decoder"
1205 eamad_decoder_select="aandct"
1206 eatgq_decoder_select="aandct"
1207 eatqi_decoder_select="aandct"
1208 ffv1_decoder_select="golomb"
1209 flac_decoder_select="golomb"
1210 flac_encoder_select="golomb lpc"
1211 flashsv_decoder_select="zlib"
1212 flashsv_encoder_select="zlib"
1213 flv_decoder_select="h263_decoder"
1214 flv_encoder_select="h263_encoder"
1215 h261_encoder_select="aandct"
1216 h263_decoder_select="h263_parser"
1217 h263_encoder_select="aandct"
1218 h263_vaapi_hwaccel_select="vaapi h263_decoder"
1219 h263i_decoder_select="h263_decoder"
1220 h263p_encoder_select="h263_encoder"
1221 h264_decoder_select="golomb h264dsp"
1222 h264_dxva2_hwaccel_deps="dxva2api_h"
1223 h264_dxva2_hwaccel_select="dxva2 h264_decoder"
1224 h264_vaapi_hwaccel_select="vaapi"
1225 h264_vdpau_decoder_select="vdpau h264_decoder"
1226 imc_decoder_select="fft mdct"
1227 jpegls_decoder_select="golomb"
1228 jpegls_encoder_select="golomb"
1229 ljpeg_encoder_select="aandct"
1230 loco_decoder_select="golomb"
1231 mjpeg_encoder_select="aandct"
1232 mlp_decoder_select="mlp_parser"
1233 mpeg1video_encoder_select="aandct"
1234 mpeg2video_encoder_select="aandct"
1235 mpeg4_decoder_select="h263_decoder mpeg4video_parser"
1236 mpeg4_encoder_select="h263_encoder"
1237 mpeg_vdpau_decoder_select="vdpau mpegvideo_decoder"
1238 mpeg1_vdpau_decoder_select="vdpau mpeg1video_decoder"
1239 mpeg2_dxva2_hwaccel_deps="dxva2api_h"
1240 mpeg2_dxva2_hwaccel_select="dxva2 mpeg2video_decoder"
1241 mpeg2_vaapi_hwaccel_select="vaapi mpeg2video_decoder"
1242 mpeg4_vaapi_hwaccel_select="vaapi mpeg4_decoder"
1243 mpeg4_vdpau_decoder_select="vdpau mpeg4_decoder"
1244 mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
1245 mpeg_xvmc_decoder_select="mpegvideo_decoder"
1246 msmpeg4v1_decoder_select="h263_decoder"
1247 msmpeg4v1_encoder_select="h263_encoder"
1248 msmpeg4v2_decoder_select="h263_decoder"
1249 msmpeg4v2_encoder_select="h263_encoder"
1250 msmpeg4v3_decoder_select="h263_decoder"
1251 msmpeg4v3_encoder_select="h263_encoder"
1252 nellymoser_decoder_select="mdct"
1253 nellymoser_encoder_select="mdct"
1254 png_decoder_select="zlib"
1255 png_encoder_select="zlib"
1256 qcelp_decoder_select="lsp"
1257 qdm2_decoder_select="mdct rdft"
1258 ra_144_encoder_select="lpc"
1259 rv10_decoder_select="h263_decoder"
1260 rv10_encoder_select="h263_encoder"
1261 rv20_decoder_select="h263_decoder"
1262 rv20_encoder_select="h263_encoder"
1263 rv30_decoder_select="golomb h264dsp"
1264 rv40_decoder_select="golomb h264dsp"
1265 shorten_decoder_select="golomb"
1266 sipr_decoder_select="lsp"
1267 snow_decoder_select="dwt"
1268 snow_encoder_select="aandct dwt"
1269 sonic_decoder_select="golomb"
1270 sonic_encoder_select="golomb"
1271 sonic_ls_encoder_select="golomb"
1272 svq1_encoder_select="aandct"
1273 svq3_decoder_select="golomb h264dsp"
1274 svq3_decoder_suggest="zlib"
1275 theora_decoder_select="vp3_decoder"
1276 tiff_decoder_suggest="zlib"
1277 tiff_encoder_suggest="zlib"
1278 truehd_decoder_select="mlp_decoder"
1279 tscc_decoder_select="zlib"
1280 twinvq_decoder_select="mdct lsp"
1281 vc1_decoder_select="h263_decoder"
1282 vc1_dxva2_hwaccel_deps="dxva2api_h DXVA_PictureParameters_wDecodedPictureIndex"
1283 vc1_dxva2_hwaccel_select="dxva2 vc1_decoder"
1284 vc1_vaapi_hwaccel_select="vaapi vc1_decoder"
1285 vc1_vdpau_decoder_select="vdpau vc1_decoder"
1286 vorbis_decoder_select="mdct"
1287 vorbis_encoder_select="mdct"
1288 vp6a_decoder_select="vp6_decoder"
1289 vp6f_decoder_select="vp6_decoder"
1290 wmapro_decoder_select="mdct"
1291 wmav1_decoder_select="mdct"
1292 wmav1_encoder_select="mdct"
1293 wmav2_decoder_select="mdct"
1294 wmav2_encoder_select="mdct"
1295 wmavoice_decoder_select="lsp rdft dct"
1296 wmv1_decoder_select="h263_decoder"
1297 wmv1_encoder_select="h263_encoder"
1298 wmv2_decoder_select="h263_decoder"
1299 wmv2_encoder_select="h263_encoder"
1300 wmv3_decoder_select="vc1_decoder"
1301 wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
1302 wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
1303 wmv3_vdpau_decoder_select="vc1_vdpau_decoder"
1304 zlib_decoder_select="zlib"
1305 zlib_encoder_select="zlib"
1306 zmbv_decoder_select="zlib"
1307 zmbv_encoder_select="zlib"
1308
1309 vaapi_deps="va_va_h"
1310 vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"
1311
1312 # parsers
1313 h264_parser_select="golomb h264dsp"
1314
1315 # bitstream_filters
1316 aac_adtstoasc_bsf_select="aac_parser"
1317
1318 # external libraries
1319 libdirac_decoder_deps="libdirac !libschroedinger"
1320 libdirac_encoder_deps="libdirac"
1321 libfaac_encoder_deps="libfaac"
1322 libgsm_decoder_deps="libgsm"
1323 libgsm_encoder_deps="libgsm"
1324 libgsm_ms_decoder_deps="libgsm"
1325 libgsm_ms_encoder_deps="libgsm"
1326 libmp3lame_encoder_deps="libmp3lame"
1327 libopencore_amrnb_decoder_deps="libopencore_amrnb"
1328 libopencore_amrnb_encoder_deps="libopencore_amrnb"
1329 libopencore_amrwb_decoder_deps="libopencore_amrwb"
1330 libopenjpeg_decoder_deps="libopenjpeg"
1331 libschroedinger_decoder_deps="libschroedinger"
1332 libschroedinger_encoder_deps="libschroedinger"
1333 libspeex_decoder_deps="libspeex"
1334 libtheora_encoder_deps="libtheora"
1335 libvorbis_encoder_deps="libvorbis"
1336 libvpx_decoder_deps="libvpx"
1337 libvpx_encoder_deps="libvpx"
1338 libx264_encoder_deps="libx264"
1339 libxvid_encoder_deps="libxvid"
1340
1341 # demuxers / muxers
1342 ac3_demuxer_deps="ac3_parser"
1343 asf_stream_muxer_select="asf_muxer"
1344 avisynth_demuxer_deps="avisynth"
1345 dirac_demuxer_deps="dirac_parser"
1346 eac3_demuxer_select="ac3_parser"
1347 ipod_muxer_select="mov_muxer"
1348 libnut_demuxer_deps="libnut"
1349 libnut_muxer_deps="libnut"
1350 matroska_audio_muxer_select="matroska_muxer"
1351 matroska_demuxer_suggest="zlib bzlib"
1352 mov_demuxer_suggest="zlib"
1353 mp3_demuxer_deps="mpegaudio_parser"
1354 mp4_muxer_select="mov_muxer"
1355 mpegtsraw_demuxer_select="mpegts_demuxer"
1356 mxf_d10_muxer_select="mxf_muxer"
1357 ogg_demuxer_select="golomb"
1358 psp_muxer_select="mov_muxer"
1359 rtsp_demuxer_deps="sdp_demuxer"
1360 rtsp_muxer_deps="sdp_demuxer"
1361 rtsp_muxer_select="rtp_muxer"
1362 sdp_demuxer_deps="rtp_protocol mpegts_demuxer"
1363 sdp_demuxer_select="asf_demuxer rm_demuxer"
1364 spdif_muxer_select="aac_parser"
1365 tg2_muxer_select="mov_muxer"
1366 tgp_muxer_select="mov_muxer"
1367 w64_demuxer_deps="wav_demuxer"
1368
1369 # indevs / outdevs
1370 alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
1371 alsa_indev_extralibs="-lasound"
1372 alsa_outdev_deps="alsa_asoundlib_h"
1373 alsa_outdev_extralibs="-lasound"
1374 bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
1375 dv1394_indev_deps="dv1394 dv_demuxer"
1376 jack_indev_deps="jack_jack_h"
1377 jack_indev_extralibs="-ljack"
1378 libdc1394_indev_deps="libdc1394"
1379 oss_indev_deps_any="soundcard_h sys_soundcard_h"
1380 oss_outdev_deps_any="soundcard_h sys_soundcard_h"
1381 v4l_indev_deps="linux_videodev_h"
1382 v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
1383 vfwcap_indev_deps="capCreateCaptureWindow"
1384 vfwcap_indev_extralibs="-lavicap32"
1385 x11_grab_device_indev_deps="x11grab XShmCreateImage"
1386 x11_grab_device_indev_extralibs="-lX11 -lXext -lXfixes"
1387
1388 # protocols
1389 gopher_protocol_deps="network"
1390 http_protocol_deps="network"
1391 http_protocol_select="tcp_protocol"
1392 mmst_protocol_deps="network"
1393 rtmp_protocol_select="tcp_protocol"
1394 rtp_protocol_select="udp_protocol"
1395 tcp_protocol_deps="network"
1396 udp_protocol_deps="network"
1397
1398 # filters
1399 movie_filter_deps="avfilter_lavf"
1400 avfilter_lavf_deps="avformat"
1401
1402 # libraries
1403 avdevice_deps="avcodec avformat"
1404 avformat_deps="avcodec"
1405
1406 # programs
1407 ffmpeg_deps="avcodec avformat swscale"
1408 ffmpeg_select="buffer_filter"
1409 ffplay_deps="avcodec avformat swscale sdl"
1410 ffplay_select="rdft"
1411 ffprobe_deps="avcodec avformat"
1412 ffserver_deps="avformat ffm_muxer rtp_protocol rtsp_demuxer"
1413 ffserver_extralibs='$ldl'
1414
1415 doc_deps="texi2html"
1416
1417 # default parameters
1418
1419 logfile="config.log"
1420
1421 # installation paths
1422 prefix_default="/usr/local"
1423 bindir_default='${prefix}/bin'
1424 datadir_default='${prefix}/share/ffmpeg'
1425 incdir_default='${prefix}/include'
1426 libdir_default='${prefix}/lib'
1427 mandir_default='${prefix}/share/man'
1428 shlibdir_default="$libdir_default"
1429
1430 # toolchain
1431 ar_default="ar"
1432 cc_default="gcc"
1433 cc_version=\"unknown\"
1434 host_cc_default="gcc"
1435 ln_s="ln -sf"
1436 nm_default="nm"
1437 objformat="elf"
1438 ranlib="ranlib"
1439 strip_default="strip"
1440 yasmexe="yasm"
1441
1442 nm_opts='-g'
1443
1444 # machine
1445 arch_default=$(uname -m)
1446 cpu="generic"
1447
1448 # OS
1449 target_os_default=$(tolower $(uname -s))
1450 host_os=$target_os_default
1451
1452 # configurable options
1453 enable avcodec
1454 enable avdevice
1455 enable avfilter
1456 enable avformat
1457 enable avutil
1458 enable asm
1459 enable debug
1460 enable doc
1461 enable fastdiv
1462 enable ffmpeg
1463 enable ffplay
1464 enable ffprobe
1465 enable ffserver
1466 enable mpegaudio_hp
1467 enable network
1468 enable optimizations
1469 enable protocols
1470 enable static
1471 enable stripping
1472 enable swscale
1473 enable swscale_alpha
1474
1475 # build settings
1476 SHFLAGS='-shared -Wl,-soname,$$(@F)'
1477 FFSERVERLDFLAGS=-Wl,-E
1478 LIBPREF="lib"
1479 LIBSUF=".a"
1480 FULLNAME='$(NAME)$(BUILDSUF)'
1481 LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
1482 SLIBPREF="lib"
1483 SLIBSUF=".so"
1484 SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
1485 SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
1486 SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
1487 LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
1488
1489 CC_O='-o $@'
1490
1491 host_cflags='-D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112 -O3 -g -Wall'
1492 host_libs='-lm'
1493
1494 target_path='$(CURDIR)'
1495
1496 # gcc stupidly only outputs the basename of targets with -MM, but we need the
1497 # full relative path for objects in subdirectories for non-recursive Make.
1498 DEPEND_CMD='$(DEPCC) $(DEPFLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
1499 DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -MM'
1500
1501 # find source path
1502 source_path="$(dirname "$0")"
1503 enable source_path_used
1504 if test -f configure; then
1505     source_path="$(pwd)"
1506     disable source_path_used
1507 else
1508     source_path="$(cd "$source_path"; pwd)"
1509     echo "$source_path" | grep -q '[[:blank:]]' &&
1510         die "Out of tree builds are impossible with whitespace in source path."
1511     test -e "$source_path/config.h" &&
1512         die "Out of tree builds are impossible with config.h in source dir."
1513 fi
1514
1515 for v in "$@"; do
1516     r=${v#*=}
1517     l=${v%"$r"}
1518     r=$(sh_quote "$r")
1519     FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}"
1520 done
1521
1522 find_things(){
1523     thing=$1
1524     pattern=$2
1525     file=$source_path/$3
1526     sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
1527 }
1528
1529 ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
1530 DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
1531 HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
1532 PARSER_LIST=$(find_things   parser   PARSER   libavcodec/allcodecs.c)
1533 BSF_LIST=$(find_things      bsf      BSF      libavcodec/allcodecs.c)
1534 MUXER_LIST=$(find_things    muxer    _MUX     libavformat/allformats.c)
1535 DEMUXER_LIST=$(find_things  demuxer  DEMUX    libavformat/allformats.c)
1536 OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
1537 INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
1538 PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
1539 FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
1540
1541 for n in $COMPONENT_LIST; do
1542     v=$(toupper ${n%s})_LIST
1543     eval enable \$$v
1544     eval ${n}_if_any="\$$v"
1545 done
1546
1547 enable $ARCH_EXT_LIST
1548
1549 die_unknown(){
1550     echo "Unknown option \"$1\"."
1551     echo "See $0 --help for available options."
1552     exit 1
1553 }
1554
1555 show_list() {
1556     suffix=_$1
1557     shift
1558     echo $* | sed s/$suffix//g | tr ' ' '\n' | sort | pr -3 -t
1559     exit 0
1560 }
1561
1562 for opt do
1563     optval="${opt#*=}"
1564     case "$opt" in
1565     --extra-ldflags=*) add_ldflags $optval
1566     ;;
1567     --extra-libs=*) add_extralibs $optval
1568     ;;
1569     --disable-devices) disable $INDEV_LIST $OUTDEV_LIST
1570     ;;
1571     --enable-debug=*) debuglevel="$optval"
1572     ;;
1573     --disable-everything)
1574     map 'eval disable \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
1575     ;;
1576     --enable-*=*|--disable-*=*)
1577     eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
1578     is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
1579     eval list=\$$(toupper $thing)_LIST
1580     name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
1581     $action $(filter "$name" $list)
1582     ;;
1583     --enable-?*|--disable-?*)
1584     eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
1585     if is_in $option $COMPONENT_LIST; then
1586         test $action = disable && action=unset
1587         eval $action \$$(toupper ${option%s})_LIST
1588     elif is_in $option $CMDLINE_SELECT; then
1589         $action $option
1590     else
1591         die_unknown $opt
1592     fi
1593     ;;
1594     --list-*)
1595         NAME="${opt#--list-}"
1596         is_in $NAME $COMPONENT_LIST || die_unknown $opt
1597         NAME=${NAME%s}
1598         eval show_list $NAME \$$(toupper $NAME)_LIST
1599     ;;
1600     --help|-h) show_help
1601     ;;
1602     *)
1603     optname="${opt%%=*}"
1604     optname="${optname#--}"
1605     optname=$(echo "$optname" | sed 's/-/_/g')
1606     if is_in $optname $CMDLINE_SET; then
1607         eval $optname='$optval'
1608     elif is_in $optname $CMDLINE_APPEND; then
1609         append $optname "$optval"
1610     else
1611          die_unknown $opt
1612     fi
1613     ;;
1614     esac
1615 done
1616
1617 disabled logging && logfile=/dev/null
1618
1619 echo "# $0 $FFMPEG_CONFIGURATION" > $logfile
1620 set >> $logfile
1621
1622 test -n "$cross_prefix" && enable cross_compile
1623
1624 if enabled cross_compile; then
1625     test -n "$arch" && test -n "$target_os" ||
1626         die "Must specify target arch and OS when cross-compiling"
1627 fi
1628
1629 set_default arch target_os
1630
1631 ar_default="${cross_prefix}${ar_default}"
1632 cc_default="${cross_prefix}${cc_default}"
1633 nm_default="${cross_prefix}${nm_default}"
1634 ranlib="${cross_prefix}${ranlib}"
1635 strip_default="${cross_prefix}${strip_default}"
1636
1637 sysinclude_default="${sysroot}/usr/include"
1638
1639 set_default cc nm strip sysinclude
1640 enabled cross_compile || host_cc_default=$cc
1641 set_default host_cc
1642
1643 exesuf() {
1644     case $1 in
1645         mingw32*|cygwin*|*-dos|freedos|opendos|os/2*) echo .exe ;;
1646     esac
1647 }
1648
1649 EXESUF=$(exesuf $target_os)
1650 HOSTEXESUF=$(exesuf $host_os)
1651
1652 # set temporary file name
1653 : ${TMPDIR:=$TEMPDIR}
1654 : ${TMPDIR:=$TMP}
1655 : ${TMPDIR:=/tmp}
1656
1657 if ! check_cmd type mktemp; then
1658     # simple replacement for missing mktemp
1659     # NOT SAFE FOR GENERAL USE
1660     mktemp(){
1661         echo "${2%XXX*}.${HOSTNAME}.${UID}.$$"
1662     }
1663 fi
1664
1665 tmpfile(){
1666     tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
1667         (set -C; exec > $tmp) 2>/dev/null ||
1668         die "Unable to create temporary file in $TMPDIR."
1669     append TMPFILES $tmp
1670     eval $1=$tmp
1671 }
1672
1673 trap 'rm -f -- $TMPFILES' EXIT
1674 trap exit HUP INT TERM
1675
1676 tmpfile TMPC  .c
1677 tmpfile TMPE  $EXESUF
1678 tmpfile TMPH  .h
1679 tmpfile TMPO  .o
1680 tmpfile TMPS  .S
1681 tmpfile TMPV  .ver
1682 tmpfile TMPSH .sh
1683
1684 unset -f mktemp
1685
1686 # make sure we can execute files in $TMPDIR
1687 cat > $TMPSH 2>> $logfile <<EOF
1688 #! /bin/sh
1689 EOF
1690 chmod +x $TMPSH >> $logfile 2>&1
1691 if ! $TMPSH >> $logfile 2>&1; then
1692     cat <<EOF
1693 Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
1694 variable to another directory and make sure that it is not mounted noexec.
1695 EOF
1696     die "Sanity test failed."
1697 fi
1698
1699 filter_cflags=echo
1700 filter_cppflags=echo
1701 filter_asflags=echo
1702
1703 if   $cc -v 2>&1 | grep -qi ^gcc; then
1704     cc_type=gcc
1705     cc_version=__VERSION__
1706     if ! $cc -dumpversion | grep -q '^2\.'; then
1707         CC_DEPFLAGS='-MMD -MF $(@:.o=.d) -MT $@'
1708         AS_DEPFLAGS='-MMD -MF $(@:.o=.d) -MT $@'
1709     fi
1710     speed_cflags='-O3'
1711     size_cflags='-Os'
1712 elif $cc --version 2>/dev/null | grep -q Intel; then
1713     cc_type=icc
1714     cc_version="AV_STRINGIFY(__INTEL_COMPILER)"
1715     CC_DEPFLAGS='-MMD'
1716     AS_DEPFLAGS='-MMD'
1717     speed_cflags='-O3'
1718     size_cflags='-Os'
1719     noopt_cflags='-O1'
1720 elif $cc -v 2>&1 | grep -q xlc; then
1721     cc_type=xlc
1722     cc_version="AV_STRINGIFY(__IBMC__)"
1723     speed_cflags='-O5'
1724     size_cflags='-O5 -qcompact'
1725 elif $cc -V 2>/dev/null | grep -q Compaq; then
1726     cc_type=ccc
1727     cc_version="AV_STRINGIFY(__DECC_VER)"
1728     DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -M'
1729     debuglevel=3
1730     add_ldflags -Wl,-z,now # calls to libots crash without this
1731     speed_cflags='-fast'
1732     size_cflags='-O1'
1733 elif $cc --vsn 2>/dev/null | grep -q "ARM C/C++ Compiler"; then
1734     test -d "$sysroot" || die "No valid sysroot specified."
1735     cc_type=armcc
1736     cc_version="AV_STRINGIFY(__ARMCC_VERSION)"
1737     armcc_conf="$PWD/armcc.conf"
1738     $cc --arm_linux_configure                 \
1739         --arm_linux_config_file="$armcc_conf" \
1740         --configure_sysroot="$sysroot"        \
1741         --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
1742         die "Error creating armcc configuration file."
1743     cc="$cc --arm_linux_config_file=$armcc_conf --translate_gcc"
1744     as_default="${cross_prefix}gcc"
1745     CC_DEPFLAGS='-MMD'
1746     AS_DEPFLAGS='-MMD'
1747     speed_cflags='-O3'
1748     size_cflags='-Os'
1749 elif $cc -version 2>/dev/null | grep -q TMS470; then
1750     cc_type=tms470
1751     cc_version="AV_STRINGIFY(__TI_COMPILER_VERSION__)"
1752     cc="$cc --gcc --abi=eabi -eo=.o -mc -me"
1753     CC_O='-fr=$(@D)'
1754     as_default="${cross_prefix}gcc"
1755     ld_default="${cross_prefix}gcc"
1756     TMPO=$(basename $TMPC .c).o
1757     append TMPFILES $TMPO
1758     add_cflags -D__gnuc_va_list=va_list -D__USER_LABEL_PREFIX__=
1759     CC_DEPFLAGS='-ppa -ppd=$(@:.o=.d)'
1760     AS_DEPFLAGS='-MMD'
1761     speed_cflags='-O3 -mf=5'
1762     size_cflags='-O3 -mf=2'
1763     filter_cflags=tms470_flags
1764     tms470_flags(){
1765         for flag; do
1766             case $flag in
1767                 -march=*|-mcpu=*)
1768                     case "${flag#*=}" in
1769                         armv7-a|cortex-a*)      echo -mv=7a8 ;;
1770                         armv7-r|cortex-r*)      echo -mv=7r4 ;;
1771                         armv7-m|cortex-m*)      echo -mv=7m3 ;;
1772                         armv6*|arm11*)          echo -mv=6   ;;
1773                         armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26])
1774                                                 echo -mv=5e  ;;
1775                         armv4*|arm7*|arm9[24]*) echo -mv=4   ;;
1776                     esac
1777                     ;;
1778                 -mfpu=neon)     echo --float_support=vfpv3 --neon ;;
1779                 -mfpu=vfp)      echo --float_support=vfpv2        ;;
1780                 -mfpu=vfpv3)    echo --float_support=vfpv3        ;;
1781                 -msoft-float)   echo --float_support=vfplib       ;;
1782                 -O[0-3]|-mf=*)  echo $flag                        ;;
1783                 -g)             echo -g -mn                       ;;
1784                 -pds=*)         echo $flag                        ;;
1785             esac
1786         done
1787     }
1788 elif $cc -v 2>&1 | grep -q clang; then
1789     cc_type=clang
1790     cc_version=__VERSION__
1791     CC_DEPFLAGS='-MMD'
1792     AS_DEPFLAGS='-MMD'
1793     speed_cflags='-O3'
1794     size_cflags='-Os'
1795 elif $cc -V 2>&1 | grep -q Sun; then
1796     cc_type=suncc
1797     cc_version="AV_STRINGIFY(__SUNPRO_C)"
1798     DEPEND_CMD='$(DEPCC) $(DEPFLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
1799     DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -xM1'
1800     speed_cflags='-O5'
1801     size_cflags='-O5 -xspace'
1802     filter_cflags=suncc_flags
1803     suncc_flags(){
1804         for flag; do
1805             case $flag in
1806                 -march=*|-mcpu=*)
1807                     case "${flag#*=}" in
1808                         native)                   echo -xtarget=native       ;;
1809                         v9|niagara)               echo -xarch=sparc          ;;
1810                         ultrasparc)               echo -xarch=sparcvis       ;;
1811                         ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
1812                         i586|pentium)             echo -xchip=pentium        ;;
1813                         i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
1814                         pentium3*|c3-2)           echo -xtarget=pentium3     ;;
1815                         pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
1816                         pentium4*)          echo -xtarget=pentium4           ;;
1817                         prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
1818                         *-sse3)             echo -xarch=sse3                 ;;
1819                         core2)              echo -xarch=ssse3 -xchip=core2   ;;
1820                         amdfam10|barcelona)       echo -xarch=sse4_1         ;;
1821                         athlon-4|athlon-[mx]p)    echo -xarch=ssea           ;;
1822                         k8|opteron|athlon64|athlon-fx)
1823                                                   echo -xarch=sse2a          ;;
1824                         athlon*)                  echo -xarch=pentium_proa   ;;
1825                     esac
1826                     ;;
1827                 -std=c99)             echo -xc99              ;;
1828                 -fomit-frame-pointer) echo -xregs=frameptr    ;;
1829                 -fPIC)                echo -KPIC -xcode=pic32 ;;
1830                 -W*,*)                echo $flag              ;;
1831                 -f*-*|-W*)                                    ;;
1832                 *)                    echo $flag              ;;
1833             esac
1834         done
1835     }
1836 fi
1837
1838 test -n "$cc_type" && enable $cc_type ||
1839     warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
1840
1841 : ${as_default:=$cc}
1842 : ${dep_cc_default:=$cc}
1843 : ${ld_default:=$cc}
1844 set_default ar as dep_cc ld
1845
1846 test -n "$CC_DEPFLAGS" || CCDEP=$DEPEND_CMD
1847 test -n "$AS_DEPFLAGS" || ASDEP=$DEPEND_CMD
1848
1849 add_cflags $extra_cflags
1850 add_asflags $extra_cflags
1851
1852 if test -n "$sysroot"; then
1853     case "$cc_type" in
1854         gcc)
1855             add_cppflags --sysroot="$sysroot"
1856             add_ldflags --sysroot="$sysroot"
1857         ;;
1858         tms470)
1859             add_cppflags -I"$sysinclude"
1860             add_ldflags  --sysroot="$sysroot"
1861         ;;
1862         clang)
1863             add_cppflags -isysroot "$sysroot"
1864             add_ldflags -isysroot "$sysroot"
1865         ;;
1866     esac
1867 fi
1868
1869 if test "$cpu" = host; then
1870     enabled cross_compile && die "--cpu=host makes no sense when cross-compiling."
1871
1872     case "$cc_type" in
1873         gcc)
1874             check_native(){
1875                 $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
1876                 sed -n "/$1=/{
1877                             s/.*$1=\\([^ ]*\\).*/\\1/
1878                             p
1879                             q
1880                         }" $TMPE
1881             }
1882             cpu=$(check_native -march || check_native -mcpu)
1883         ;;
1884     esac
1885
1886     test "${cpu:-host}" = host && die "--cpu=host not supported with compiler $cc"
1887 fi
1888
1889 # Deal with common $arch aliases
1890 case "$arch" in
1891     arm*)
1892         arch="arm"
1893     ;;
1894     mips|mipsel|IP*)
1895         arch="mips"
1896     ;;
1897     mips64*)
1898         arch="mips"
1899         subarch="mips64"
1900     ;;
1901     parisc|hppa)
1902         arch="parisc"
1903     ;;
1904     parisc64|hppa64)
1905         arch="parisc"
1906         subarch="parisc64"
1907     ;;
1908     "Power Macintosh"|ppc|powerpc)
1909         arch="ppc"
1910     ;;
1911     ppc64|powerpc64)
1912         arch="ppc"
1913         subarch="ppc64"
1914     ;;
1915     s390|s390x)
1916         arch="s390"
1917     ;;
1918     sh4|sh)
1919         arch="sh4"
1920     ;;
1921     sun4u|sparc64)
1922         arch="sparc"
1923         subarch="sparc64"
1924     ;;
1925     i[3-6]86|i86pc|BePC|x86_64|amd64)
1926         arch="x86"
1927     ;;
1928 esac
1929
1930 is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
1931 enable $arch
1932
1933 # Add processor-specific flags
1934 if test "$cpu" = generic; then
1935     : do nothing
1936 elif enabled ppc; then
1937
1938     case $(tolower $cpu) in
1939         601|ppc601|powerpc601)
1940             cpuflags="-mcpu=601"
1941             disable altivec
1942         ;;
1943         603*|ppc603*|powerpc603*)
1944             cpuflags="-mcpu=603"
1945             disable altivec
1946         ;;
1947         604*|ppc604*|powerpc604*)
1948             cpuflags="-mcpu=604"
1949             disable altivec
1950         ;;
1951         g3|75*|ppc75*|powerpc75*)
1952             cpuflags="-mcpu=750 -mpowerpc-gfxopt"
1953             disable altivec
1954         ;;
1955         g4|745*|ppc745*|powerpc745*)
1956             cpuflags="-mcpu=7450 -mpowerpc-gfxopt"
1957         ;;
1958         74*|ppc74*|powerpc74*)
1959             cpuflags="-mcpu=7400 -mpowerpc-gfxopt"
1960         ;;
1961         g5|970|ppc970|powerpc970|power4*)
1962             cpuflags="-mcpu=970 -mpowerpc-gfxopt -mpowerpc64"
1963         ;;
1964         cell)
1965             cpuflags="-mcpu=cell"
1966             enable ldbrx
1967         ;;
1968         e500v2)
1969             cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
1970             disable altivec
1971         ;;
1972         e500)
1973             cpuflags="-mcpu=8540 -mhard-float"
1974             disable altivec
1975         ;;
1976     esac
1977
1978 elif enabled x86; then
1979
1980     case $cpu in
1981         i[345]86|pentium)
1982             cpuflags="-march=$cpu"
1983             disable mmx
1984         ;;
1985         # targets that do NOT support conditional mov (cmov)
1986         pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
1987             cpuflags="-march=$cpu"
1988             disable cmov
1989         ;;
1990         # targets that do support conditional mov (cmov)
1991         i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64|k8|opteron|athlon-fx|core2|amdfam10|barcelona)
1992             cpuflags="-march=$cpu"
1993             enable cmov
1994             enable fast_cmov
1995         ;;
1996         # targets that do support conditional mov but on which it's slow
1997         pentium4|pentium4m|prescott|nocona)
1998             cpuflags="-march=$cpu"
1999             enable cmov
2000             disable fast_cmov
2001         ;;
2002     esac
2003
2004 elif enabled sparc; then
2005
2006     case $cpu in
2007         niagara)
2008             cpuflags="-mcpu=$cpu"
2009             disable vis
2010         ;;
2011         sparc64)
2012             cpuflags="-mcpu=v9"
2013         ;;
2014     esac
2015
2016 elif enabled arm; then
2017
2018     case $cpu in
2019         armv*)
2020             cpuflags="-march=$cpu"
2021         ;;
2022         *)
2023             cpuflags="-mcpu=$cpu"
2024         ;;
2025     esac
2026
2027 elif enabled alpha; then
2028
2029     enabled ccc && cpuflags="-arch $cpu" || cpuflags="-mcpu=$cpu"
2030
2031 elif enabled bfin; then
2032
2033     cpuflags="-mcpu=$cpu"
2034
2035 elif enabled mips; then
2036
2037     cpuflags="-march=$cpu"
2038
2039 elif enabled avr32; then
2040
2041     case $cpu in
2042         ap7[02]0[0-2])
2043             subarch="avr32_ap"
2044             cpuflags="-mpart=$cpu"
2045         ;;
2046         ap)
2047             subarch="avr32_ap"
2048             cpuflags="-march=$cpu"
2049         ;;
2050         uc3[ab]*)
2051             subarch="avr32_uc"
2052             cpuflags="-mcpu=$cpu"
2053         ;;
2054         uc)
2055             subarch="avr32_uc"
2056             cpuflags="-march=$cpu"
2057         ;;
2058     esac
2059
2060 fi
2061
2062 add_cflags $cpuflags
2063 add_asflags $cpuflags
2064
2065 # compiler sanity check
2066 check_exec <<EOF
2067 int main(void){ return 0; }
2068 EOF
2069 if test "$?" != 0; then
2070     echo "$cc is unable to create an executable file."
2071     if test -z "$cross_prefix" && ! enabled cross_compile ; then
2072         echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
2073         echo "Only do this if you know what cross compiling means."
2074     fi
2075     die "C compiler test failed."
2076 fi
2077
2078 add_cppflags -D_ISOC99_SOURCE -D_POSIX_C_SOURCE=200112
2079 check_cflags -std=c99
2080 check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
2081 #include <stdlib.h>
2082 EOF
2083 check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
2084 #include <stdlib.h>
2085 EOF
2086
2087 check_host_cflags -std=c99
2088
2089 case "$arch" in
2090     alpha|ia64|mips|parisc|sparc)
2091         spic=$shared
2092     ;;
2093     x86)
2094         subarch="x86_32"
2095         check_cc <<EOF && subarch="x86_64"
2096         int test[(int)sizeof(char*) - 7];
2097 EOF
2098         if test "$subarch" = "x86_64"; then
2099             spic=$shared
2100         fi
2101     ;;
2102 esac
2103
2104 enable $subarch
2105 enabled spic && enable pic
2106
2107 # OS specific
2108 case $target_os in
2109     haiku)
2110         prefix_default="/boot/common"
2111         network_extralibs="-lnetwork"
2112         ;;
2113     sunos)
2114         FFSERVERLDFLAGS=""
2115         SHFLAGS='-shared -Wl,-h,$$(@F)'
2116         enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
2117         network_extralibs="-lsocket -lnsl"
2118         add_cppflags -D__EXTENSIONS__
2119         nm_opts='-P -g'
2120         ;;
2121     netbsd)
2122         oss_indev_extralibs="-lossaudio"
2123         oss_outdev_extralibs="-lossaudio"
2124         add_cppflags -D_XOPEN_SOURCE=600
2125         ;;
2126     openbsd)
2127         enable malloc_aligned
2128         # On OpenBSD 4.5. the compiler does not use PIC unless
2129         # explicitly using -fPIC. FFmpeg builds fine without PIC,
2130         # however the generated executable will not do anything
2131         # (simply quits with exit-code 1, no crash, no output).
2132         # Thus explicitly enable PIC here.
2133         enable pic
2134         SHFLAGS='-shared'
2135         oss_indev_extralibs="-lossaudio"
2136         oss_outdev_extralibs="-lossaudio"
2137         ;;
2138     freebsd|dragonfly)
2139         enable malloc_aligned
2140         ;;
2141     bsd/os)
2142         osextralibs="-lpoll -lgnugetopt"
2143         strip="strip -d"
2144         ;;
2145     darwin)
2146         enable malloc_aligned
2147         SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR) -Wl,-read_only_relocs,suppress'
2148         strip="${strip} -x"
2149         FFLDFLAGS="-Wl,-dynamic,-search_paths_first"
2150         SLIBSUF=".dylib"
2151         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
2152         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
2153         FFSERVERLDFLAGS=-Wl,-bind_at_load
2154         objformat="macho"
2155         enabled x86_64 && objformat="macho64"
2156         enabled_any pic shared ||
2157             { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
2158         ;;
2159     mingw32*)
2160         if test $target_os = "mingw32ce"; then
2161             disable network
2162         else
2163             target_os=mingw32
2164         fi
2165         LIBTARGET=i386
2166         if enabled x86_64; then
2167             enable malloc_aligned
2168             LIBTARGET=x64
2169         elif enabled arm; then
2170             LIBTARGET=arm
2171         fi
2172         shlibdir_default="$bindir_default"
2173         disable ffserver
2174         SLIBPREF=""
2175         SLIBSUF=".dll"
2176         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
2177         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
2178         SLIB_EXTRA_CMD='-lib.exe /machine:$(LIBTARGET) /def:$$(@:$(SLIBSUF)=.def) /out:$(SUBDIR)$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.lib)'
2179         SLIB_INSTALL_EXTRA_CMD='-install -m 644 $(SUBDIR)$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.lib) "$(SHLIBDIR)/$(SLIBNAME:$(SLIBSUF)=.lib)"; \
2180             install -m 644 $(SUBDIR)$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.lib) "$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.lib)"; \
2181             install -d "$(LIBDIR)"; \
2182             install -m 644 $(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) "$(LIBDIR)/lib$(SLIBNAME:$(SLIBSUF)=.dll.a)"'
2183         SLIB_UNINSTALL_EXTRA_CMD='rm -f "$(SHLIBDIR)/$(SLIBNAME:$(SLIBSUF)=.lib)"'
2184         SHFLAGS='-shared -Wl,--output-def,$$(@:$(SLIBSUF)=.def) -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-image-base'
2185         objformat="win32"
2186         enable dos_paths
2187         check_cflags -fno-common
2188         if ! enabled x86_64; then
2189             check_cpp_condition _mingw.h "(__MINGW32_MAJOR_VERSION > 3) || (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
2190                 die "ERROR: MinGW runtime version must be >= 3.15."
2191             enabled_any avisynth vfwcap_indev &&
2192                 { check_cpp_condition w32api.h "(__W32API_MAJOR_VERSION > 3) || (__W32API_MAJOR_VERSION == 3 && __W32API_MINOR_VERSION >= 13)" ||
2193                   die "ERROR: avisynth and vfwcap_indev require w32api version 3.13 or later."; }
2194         fi
2195         ;;
2196     cygwin*)
2197         target_os=cygwin
2198         shlibdir_default="$bindir_default"
2199         SLIBPREF="cyg"
2200         SLIBSUF=".dll"
2201         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
2202         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
2203         SHFLAGS='-shared -Wl,--enable-auto-image-base'
2204         objformat="win32"
2205         enable dos_paths
2206         check_cflags -fno-common
2207         ;;
2208     *-dos|freedos|opendos)
2209         disable ffplay ffserver
2210         disable $INDEV_LIST $OUTDEV_LIST
2211         network_extralibs="-lsocket"
2212         objformat="coff"
2213         enable dos_paths
2214         ;;
2215     linux)
2216         enable dv1394
2217         ;;
2218     irix*)
2219         target_os=irix
2220         ranlib="echo ignoring ranlib"
2221         ;;
2222     os/2*)
2223         strip="lxlite"
2224         ln_s="cp -f"
2225         FFLDFLAGS="-Zomf -Zbin-files -Zargs-wild -Zmap"
2226         SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
2227         FFSERVERLDFLAGS=""
2228         LIBSUF="_s.a"
2229         SLIBPREF=""
2230         SLIBSUF=".dll"
2231         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
2232         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
2233         SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
2234           echo PROTMODE >> $(SUBDIR)$(NAME).def; \
2235           echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
2236           echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
2237           echo EXPORTS >> $(SUBDIR)$(NAME).def; \
2238           emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def'
2239         SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
2240           emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
2241         SLIB_INSTALL_EXTRA_CMD='install -m 644 $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib "$(LIBDIR)"'
2242         SLIB_UNINSTALL_EXTRA_CMD='rm -f "$(LIBDIR)"/$(LIBPREF)$(NAME)_dll.a "$(LIBDIR)"/$(LIBPREF)$(NAME)_dll.lib'
2243         enable dos_paths
2244         ;;
2245     gnu/kfreebsd)
2246         ;;
2247     gnu)
2248         ;;
2249     none)
2250         ;;
2251     *)
2252         die "Unknown OS '$target_os'."
2253         ;;
2254 esac
2255
2256 check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable pic
2257
2258 set_default $PATHS_LIST
2259
2260 add_extralibs $osextralibs
2261
2262 # Combine FFLDFLAGS and the LDFLAGS environment variable.
2263 LDFLAGS="$FFLDFLAGS $LDFLAGS"
2264
2265 # we need to build at least one lib type
2266 if ! enabled_any static shared; then
2267     cat <<EOF
2268 At least one library type must be built.
2269 Specify --enable-static to build the static libraries or --enable-shared to
2270 build the shared libraries as well. To only build the shared libraries specify
2271 --disable-static in addition to --enable-shared.
2272 EOF
2273     exit 1;
2274 fi
2275
2276 disabled static && LIBNAME=""
2277
2278 die_license_disabled() {
2279     enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
2280 }
2281
2282 die_license_disabled gpl libx264
2283 die_license_disabled gpl libxvid
2284 die_license_disabled gpl postproc
2285 die_license_disabled gpl x11grab
2286
2287 die_license_disabled nonfree libfaac
2288
2289 die_license_disabled version3 libopencore_amrnb
2290 die_license_disabled version3 libopencore_amrwb
2291
2292 enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
2293
2294 check_deps $ARCH_EXT_LIST
2295
2296 disabled optimizations || check_cflags -fomit-frame-pointer
2297
2298 enable_pic() {
2299     enable pic
2300     add_cppflags -DPIC
2301     add_cflags   -fPIC
2302     add_asflags  -fPIC
2303 }
2304
2305 enabled pic && enable_pic
2306
2307 check_cc <<EOF || die "Symbol mangling check failed."
2308 int ff_extern;
2309 EOF
2310 sym=$($nm $nm_opts $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
2311 extern_prefix=${sym%%ff_extern*}
2312
2313 check_cc <<EOF && enable inline_asm
2314 void foo(void) { __asm__ volatile ("" ::); }
2315 EOF
2316
2317 _restrict=
2318 for restrict_keyword in restrict __restrict__ __restrict; do
2319     check_cc <<EOF && _restrict=$restrict_keyword && break
2320 void foo(char * $restrict_keyword p);
2321 EOF
2322 done
2323
2324 check_cc <<EOF && enable attribute_packed
2325 struct { int x; } __attribute__((packed)) x;
2326 EOF
2327
2328 check_cc <<EOF && enable attribute_may_alias
2329 union { int x; } __attribute__((may_alias)) x;
2330 EOF
2331
2332 check_cc <<EOF || die "endian test failed"
2333 unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
2334 EOF
2335 od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
2336
2337 if enabled alpha; then
2338
2339     check_cflags -mieee
2340
2341 elif enabled arm; then
2342
2343     check_cflags -marm
2344
2345     check_ld <<EOF && enable vfp_args
2346 __asm__ (".eabi_attribute 28, 1");
2347 int main(void) { return 0; }
2348 EOF
2349
2350     # We have to check if pld is a nop and disable it.
2351     check_asm pld '"pld [r0]"'
2352
2353     enabled armv5te && check_asm armv5te '"qadd r0, r0, r0"'
2354     enabled armv6   && check_asm armv6   '"sadd16 r0, r0, r0"'
2355     enabled armv6t2 && check_asm armv6t2 '"movt r0, #0"'
2356     enabled armvfp  && check_asm armvfp  '"fadds s0, s0, s0"'
2357     enabled iwmmxt  && check_asm iwmmxt  '"wunpckelub wr6, wr4"'
2358     enabled neon    && check_asm neon    '"vadd.i16 q0, q0, q0"'
2359
2360     enabled_all armv6t2 shared !pic && enable_pic
2361
2362 elif enabled mips; then
2363
2364     check_asm loongson '"dmult.g $1, $2, $3"'
2365     enabled mmi     && check_asm mmi     '"lq $2, 0($2)"'
2366
2367 elif enabled ppc; then
2368
2369     enable local_aligned_8 local_aligned_16
2370
2371     check_asm dcbzl     '"dcbzl 0, 1"'
2372     check_asm ppc4xx    '"maclhw r10, r11, r12"'
2373     check_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'
2374
2375     # AltiVec flags: The FSF version of GCC differs from the Apple version
2376     if enabled altivec; then
2377         check_cflags -maltivec -mabi=altivec &&
2378         { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } ||
2379         check_cflags -faltivec
2380
2381         # check if our compiler supports Motorola AltiVec C API
2382         check_cc <<EOF || disable altivec
2383 $inc_altivec_h
2384 int main(void) {
2385     vector signed int v1, v2, v3;
2386     v1 = vec_add(v2,v3);
2387     return 0;
2388 }
2389 EOF
2390
2391         # check if our compiler supports braces for vector declarations
2392         check_cc <<EOF || die "You need a compiler that supports {} in AltiVec vector declarations."
2393 $inc_altivec_h
2394 int main (void) { (vector int) {1}; return 0; }
2395 EOF
2396     fi
2397
2398 elif enabled sparc; then
2399
2400     enabled vis && check_asm vis '"pdist %f0, %f0, %f0"' -mcpu=ultrasparc &&
2401         add_cflags -mcpu=ultrasparc -mtune=ultrasparc
2402
2403 elif enabled x86; then
2404
2405     enable local_aligned_8 local_aligned_16
2406
2407     # check whether EBP is available on x86
2408     # As 'i' is stored on the stack, this program will crash
2409     # if the base pointer is used to access it because the
2410     # base pointer is cleared in the inline assembly code.
2411     check_exec_crash <<EOF && enable ebp_available
2412     volatile int i=0;
2413     __asm__ volatile (
2414         "xorl %%ebp, %%ebp"
2415     ::: "%ebp");
2416     return i;
2417 EOF
2418
2419     # check whether EBX is available on x86
2420     check_asm ebx_available '""::"b"(0)' &&
2421         check_asm ebx_available '"":::"%ebx"'
2422
2423     # check whether more than 10 operands are supported
2424     check_cc <<EOF && enable ten_operands
2425 int main(void) {
2426     int x=0;
2427     __asm__ volatile(
2428         ""
2429         :"+&rm"(x), "+&rm"(x), "+&rm"(x), "+&rm"(x), "+&rm"(x), "+&rm"(x)
2430     );
2431     return 0;
2432 }
2433 EOF
2434
2435     # check whether binutils is new enough to compile SSSE3/MMX2
2436     enabled ssse3 && check_asm ssse3 '"pabsw %xmm0, %xmm0"'
2437     enabled mmx2  && check_asm mmx2  '"pmaxub %mm0, %mm1"'
2438
2439     check_asm bswap '"bswap %%eax" ::: "%eax"'
2440
2441     YASMFLAGS="-f $objformat -DARCH_$(toupper $subarch)"
2442     enabled     x86_64        && append YASMFLAGS "-m amd64"
2443     enabled     pic           && append YASMFLAGS "-DPIC"
2444     test -n "$extern_prefix"  && append YASMFLAGS "-DPREFIX"
2445     case "$objformat" in
2446         elf) enabled debug && append YASMFLAGS "-g dwarf2" ;;
2447     esac
2448     if ! disabled yasm; then
2449         check_yasm "pabsw xmm0, xmm0" && enable yasm ||
2450             warn "yasm not found, performance will suffer"
2451     fi
2452
2453     case "$cpu" in
2454         athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
2455             disable fast_clz
2456         ;;
2457     esac
2458
2459 fi
2460
2461 if check_func dlopen; then
2462     ldl=
2463 elif check_func dlopen -ldl; then
2464     ldl=-ldl
2465 fi
2466
2467 # Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
2468 check_func nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }
2469
2470 check_func  fork
2471 check_func  getaddrinfo $network_extralibs
2472 check_func  gethrtime
2473 check_func  getrusage
2474 check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
2475 check_func  inet_aton $network_extralibs
2476 check_func  isatty
2477 check_func  ${malloc_prefix}memalign            && enable memalign
2478 check_func  mkstemp
2479 check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
2480 check_func  setrlimit
2481 check_func  strerror_r
2482 check_func_headers io.h setmode
2483 check_func_headers lzo/lzo1x.h lzo1x_999_compress
2484 check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
2485 check_func_headers windows.h GetProcessTimes
2486 check_func_headers windows.h VirtualAlloc
2487
2488 check_header conio.h
2489 check_header dlfcn.h
2490 check_header dxva2api.h
2491 check_header malloc.h
2492 check_header poll.h
2493 check_header sys/mman.h
2494 check_header sys/resource.h
2495 check_header sys/select.h
2496 check_header termios.h
2497 check_header vdpau/vdpau.h
2498 check_header vdpau/vdpau_x11.h
2499 check_header X11/extensions/XvMClib.h
2500
2501 check_struct dxva2api.h DXVA_PictureParameters wDecodedPictureIndex
2502
2503 if ! enabled_any memalign memalign_hack posix_memalign malloc_aligned &&
2504      enabled_any $need_memalign ; then
2505     die "Error, no aligned memory allocator but SSE enabled, disable it or use --enable-memalign-hack."
2506 fi
2507
2508 disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
2509 disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
2510
2511 # check for some common methods of building with pthread support
2512 # do this before the optional library checks as some of them require pthreads
2513 if ! disabled pthreads && ! enabled w32threads; then
2514     enable pthreads
2515     if check_func pthread_create; then
2516         :
2517     elif check_func pthread_create -pthread; then
2518         add_cflags -pthread
2519         add_extralibs -pthread
2520     elif check_func pthread_create -pthreads; then
2521         add_cflags -pthreads
2522         add_extralibs -pthreads
2523     elif check_func pthread_create -lpthreadGC2; then
2524         add_extralibs -lpthreadGC2
2525     elif ! check_lib pthread.h pthread_create -lpthread; then
2526         disable pthreads
2527     fi
2528 fi
2529
2530 for thread in $THREADS_LIST; do
2531     if enabled $thread; then
2532         test -n "$thread_type" &&
2533             die "ERROR: Only one thread type must be selected." ||
2534             thread_type="$thread"
2535     fi
2536 done
2537
2538 check_lib math.h sin -lm
2539 disabled vaapi || check_lib va/va.h vaInitialize -lva
2540
2541 check_mathfunc exp2
2542 check_mathfunc exp2f
2543 check_mathfunc llrint
2544 check_mathfunc llrintf
2545 check_mathfunc log2
2546 check_mathfunc log2f
2547 check_mathfunc lrint
2548 check_mathfunc lrintf
2549 check_mathfunc round
2550 check_mathfunc roundf
2551 check_mathfunc truncf
2552
2553 # these are off by default, so fail if requested and not available
2554 enabled avisynth   && require2 vfw32 "windows.h vfw.h" AVIFileInit -lavifil32
2555 enabled libdirac   && add_cflags $(pkg-config --cflags dirac) &&
2556                       require  libdirac libdirac_decoder/dirac_parser.h dirac_decoder_init $(pkg-config --libs dirac) &&
2557                       require  libdirac libdirac_encoder/dirac_encoder.h dirac_encoder_init $(pkg-config --libs dirac)
2558 enabled libfaac    && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
2559 enabled libgsm     && require  libgsm gsm/gsm.h gsm_create -lgsm
2560 enabled libmp3lame && require  libmp3lame lame/lame.h lame_init -lmp3lame -lm
2561 enabled libnut     && require  libnut libnut.h nut_demuxer_init -lnut
2562 enabled libopencore_amrnb  && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb -lm
2563 enabled libopencore_amrwb  && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb -lm
2564 enabled libopenjpeg && require libopenjpeg openjpeg.h opj_version -lopenjpeg
2565 enabled librtmp    && require  librtmp librtmp/rtmp.h RTMP_Init $(pkg-config --libs librtmp)
2566 enabled libschroedinger && add_cflags $(pkg-config --cflags schroedinger-1.0) &&
2567                            require libschroedinger schroedinger/schro.h schro_init $(pkg-config --libs schroedinger-1.0)
2568 enabled libspeex   && require  libspeex speex/speex.h speex_decoder_init -lspeex
2569 enabled libtheora  && require  libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
2570 enabled libvorbis  && require  libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg
2571 enabled libvpx     && require2 libvpx "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_dec_init_ver" -lvpx &&
2572                       require2 libvpx "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver" -lvpx
2573 enabled libx264    && require  libx264 x264.h x264_encoder_encode -lx264 -lm &&
2574                       { check_cpp_condition x264.h "X264_BUILD >= 98" ||
2575                         die "ERROR: libx264 version must be >= 0.98."; }
2576 enabled libxvid    && require  libxvid xvid.h xvid_global -lxvidcore
2577 enabled mlib       && require  mediaLib mlib_types.h mlib_VectorSub_S16_U8_Mod -lmlib
2578
2579 # libdc1394 check
2580 if enabled libdc1394; then
2581     { check_lib dc1394/dc1394.h dc1394_new -ldc1394 -lraw1394 &&
2582         enable libdc1394_2; } ||
2583     { check_lib libdc1394/dc1394_control.h dc1394_create_handle -ldc1394_control -lraw1394 &&
2584         enable libdc1394_1; } ||
2585     die "ERROR: No version of libdc1394 found "
2586 fi
2587
2588 SDL_CONFIG="${cross_prefix}sdl-config"
2589 if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
2590     sdl_cflags=$("${SDL_CONFIG}" --cflags)
2591     sdl_libs=$("${SDL_CONFIG}" --libs)
2592     check_func_headers SDL.h SDL_Init $sdl_cflags $sdl_libs &&
2593     check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
2594     enable sdl &&
2595     check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
2596 fi
2597
2598 texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html
2599
2600 if enabled network; then
2601     check_type "sys/types.h sys/socket.h" socklen_t
2602     check_type netdb.h "struct addrinfo"
2603     check_type netinet/in.h "struct ipv6_mreq"
2604     check_type netinet/in.h "struct sockaddr_in6"
2605     check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
2606     check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
2607     # Prefer arpa/inet.h over winsock2
2608     if check_header arpa/inet.h ; then
2609         check_func closesocket
2610     elif check_header winsock2.h ; then
2611         check_func_headers winsock2.h closesocket -lws2 && \
2612             network_extralibs="-lws2" || \
2613         { check_func_headers winsock2.h closesocket -lws2_32 && \
2614             network_extralibs="-lws2_32"; }
2615         check_type ws2tcpip.h socklen_t
2616         check_type ws2tcpip.h "struct addrinfo"
2617         check_type ws2tcpip.h "struct ipv6_mreq"
2618         check_type ws2tcpip.h "struct sockaddr_in6"
2619         check_type ws2tcpip.h "struct sockaddr_storage"
2620         check_struct winsock2.h "struct sockaddr" sa_len
2621     else
2622         disable network
2623     fi
2624 fi
2625
2626 check_header linux/videodev.h
2627 check_header linux/videodev2.h
2628 check_header sys/videoio.h
2629
2630 check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
2631
2632 # check for ioctl_meteor.h, ioctl_bt848.h and alternatives
2633 { check_header dev/bktr/ioctl_meteor.h &&
2634   check_header dev/bktr/ioctl_bt848.h; } ||
2635 { check_header machine/ioctl_meteor.h &&
2636   check_header machine/ioctl_bt848.h; } ||
2637 { check_header dev/video/meteor/ioctl_meteor.h &&
2638   check_header dev/video/bktr/ioctl_bt848.h; } ||
2639 check_header dev/ic/bt8xx.h
2640
2641 check_header sys/soundcard.h
2642 check_header soundcard.h
2643
2644 enabled_any alsa_indev alsa_outdev && check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound
2645
2646 enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack
2647
2648 enabled x11grab                         &&
2649 check_header X11/Xlib.h                 &&
2650 check_header X11/extensions/XShm.h      &&
2651 check_header X11/extensions/Xfixes.h    &&
2652 check_func XOpenDisplay -lX11           &&
2653 check_func XShmCreateImage -lX11 -lXext &&
2654 check_func XFixesGetCursorImage -lX11 -lXext -lXfixes
2655
2656 if ! disabled vdpau && enabled vdpau_vdpau_h; then
2657 check_cpp_condition \
2658     vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" ||
2659     { echolog "Please upgrade to libvdpau >= 0.2 if you would like vdpau support." &&
2660       disable vdpau; }
2661 fi
2662
2663 enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
2664
2665 # add some useful compiler flags if supported
2666 check_cflags -Wdeclaration-after-statement
2667 check_cflags -Wall
2668 check_cflags -Wno-switch
2669 check_cflags -Wdisabled-optimization
2670 check_cflags -Wpointer-arith
2671 check_cflags -Wredundant-decls
2672 check_cflags -Wno-pointer-sign
2673 check_cflags -Wcast-qual
2674 check_cflags -Wwrite-strings
2675 check_cflags -Wtype-limits
2676 check_cflags -Wundef
2677 check_cflags -Wmissing-prototypes
2678 enabled extra_warnings && check_cflags -Winline
2679
2680 # add some linker flags
2681 check_ldflags -Wl,--warn-common
2682 check_ldflags -Wl,--as-needed
2683 check_ldflags '-Wl,-rpath-link,\$(BUILD_ROOT)/libpostproc -Wl,-rpath-link,\$(BUILD_ROOT)/libswscale -Wl,-rpath-link,\$(BUILD_ROOT)/libavfilter -Wl,-rpath-link,\$(BUILD_ROOT)/libavdevice -Wl,-rpath-link,\$(BUILD_ROOT)/libavformat -Wl,-rpath-link,\$(BUILD_ROOT)/libavcodec -Wl,-rpath-link,\$(BUILD_ROOT)/libavutil'
2684 check_ldflags -Wl,-Bsymbolic
2685
2686 echo "X{};" > $TMPV
2687 if test_ldflags -Wl,--version-script,$TMPV; then
2688     append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
2689     check_cc <<EOF && enable symver_asm_label
2690 void ff_foo(void) __asm__ ("av_foo@VERSION");
2691 void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
2692 EOF
2693     check_cc <<EOF && enable symver_gnu_asm
2694 __asm__(".symver ff_foo,av_foo@VERSION");
2695 void ff_foo(void) {}
2696 EOF
2697 fi
2698
2699 if enabled small; then
2700     add_cflags $size_cflags
2701     optimizations="small"
2702 elif enabled optimizations; then
2703     add_cflags $speed_cflags
2704 else
2705     add_cflags $noopt_cflags
2706 fi
2707 check_cflags -fno-math-errno
2708 check_cflags -fno-signed-zeros
2709
2710 if enabled icc; then
2711     # Just warnings, no remarks
2712     check_cflags -w1
2713     # -wd: Disable following warnings
2714     # 144, 167, 556: -Wno-pointer-sign
2715     # 10006: ignoring unknown option -fno-signed-zeros
2716     # 10156: ignoring option '-W'; no argument required
2717     check_cflags -wd144,167,556,10006,10156
2718     # 11030: Warning unknown option --as-needed
2719     # 10156: ignoring option '-export'; no argument required
2720     check_ldflags -wd10156,11030
2721     # Allow to compile with optimizations
2722     check_ldflags -march=$cpu
2723     # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
2724     enable ebp_available
2725 elif enabled ccc; then
2726     # disable some annoying warnings
2727     add_cflags -msg_disable cvtu32to64
2728     add_cflags -msg_disable embedcomment
2729     add_cflags -msg_disable needconstext
2730     add_cflags -msg_disable nomainieee
2731     add_cflags -msg_disable ptrmismatch1
2732     add_cflags -msg_disable unreachcode
2733 elif enabled gcc; then
2734     check_cflags -fno-tree-vectorize
2735     check_cflags -Werror=implicit
2736     check_cflags -Werror=missing-prototypes
2737 elif enabled clang; then
2738     check_cflags -Qunused-arguments
2739 elif enabled armcc; then
2740     # 2523: use of inline assembler is deprecated
2741     add_cflags -Wrvct,--diag_suppress=2523
2742     add_cflags -Wrvct,--diag_suppress=1207
2743 elif enabled tms470; then
2744     add_cflags -pds=824 -pds=837
2745 fi
2746
2747 if enabled gprof; then
2748     add_cflags  -p
2749     add_ldflags -p
2750 fi
2751
2752 enabled_any $THREADS_LIST      && enable threads
2753
2754 check_deps $CONFIG_LIST       \
2755            $CONFIG_EXTRA      \
2756            $HAVE_LIST         \
2757            $DECODER_LIST      \
2758            $ENCODER_LIST      \
2759            $HWACCEL_LIST      \
2760            $PARSER_LIST       \
2761            $BSF_LIST          \
2762            $DEMUXER_LIST      \
2763            $MUXER_LIST        \
2764            $FILTER_LIST       \
2765            $INDEV_LIST        \
2766            $OUTDEV_LIST       \
2767            $PROTOCOL_LIST     \
2768
2769 enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
2770
2771 echo "install prefix            $prefix"
2772 echo "source path               $source_path"
2773 echo "C compiler                $cc"
2774 echo "ARCH                      $arch ($cpu)"
2775 if test "$build_suffix" != ""; then
2776     echo "build suffix              $build_suffix"
2777 fi
2778 if test "$extra_version" != ""; then
2779     echo "version string suffix     $extra_version"
2780 fi
2781 echo "big-endian                ${bigendian-no}"
2782 echo "runtime cpu detection     ${runtime_cpudetect-no}"
2783 if enabled x86; then
2784     echo "yasm                      ${yasm-no}"
2785     echo "MMX enabled               ${mmx-no}"
2786     echo "MMX2 enabled              ${mmx2-no}"
2787     echo "3DNow! enabled            ${amd3dnow-no}"
2788     echo "3DNow! extended enabled   ${amd3dnowext-no}"
2789     echo "SSE enabled               ${sse-no}"
2790     echo "SSSE3 enabled             ${ssse3-no}"
2791     echo "CMOV enabled              ${cmov-no}"
2792     echo "CMOV is fast              ${fast_cmov-no}"
2793     echo "EBX available             ${ebx_available-no}"
2794     echo "EBP available             ${ebp_available-no}"
2795     echo "10 operands supported     ${ten_operands-no}"
2796 fi
2797 if enabled arm; then
2798     echo "ARMv5TE enabled           ${armv5te-no}"
2799     echo "ARMv6 enabled             ${armv6-no}"
2800     echo "ARMv6T2 enabled           ${armv6t2-no}"
2801     echo "ARM VFP enabled           ${armvfp-no}"
2802     echo "IWMMXT enabled            ${iwmmxt-no}"
2803     echo "NEON enabled              ${neon-no}"
2804 fi
2805 if enabled mips; then
2806     echo "MMI enabled               ${mmi-no}"
2807 fi
2808 if enabled ppc; then
2809     echo "AltiVec enabled           ${altivec-no}"
2810     echo "PPC 4xx optimizations     ${ppc4xx-no}"
2811     echo "dcbzl available           ${dcbzl-no}"
2812     echo "performance report        ${powerpc_perf-no}"
2813 fi
2814 if enabled sparc; then
2815     echo "VIS enabled               ${vis-no}"
2816 fi
2817 echo "gprof enabled             ${gprof-no}"
2818 echo "debug symbols             ${debug-no}"
2819 echo "strip symbols             ${stripping-no}"
2820 echo "optimizations             ${optimizations-no}"
2821 echo "static                    ${static-no}"
2822 echo "shared                    ${shared-no}"
2823 echo "postprocessing support    ${postproc-no}"
2824 echo "new filter support        ${avfilter-no}"
2825 echo "filters using lavformat   ${avfilter_lavf-no}"
2826 echo "network support           ${network-no}"
2827 echo "threading support         ${thread_type-no}"
2828 echo "SDL support               ${sdl-no}"
2829 echo "Sun medialib support      ${mlib-no}"
2830 echo "AVISynth enabled          ${avisynth-no}"
2831 echo "libdc1394 support         ${libdc1394-no}"
2832 echo "libdirac enabled          ${libdirac-no}"
2833 echo "libfaac enabled           ${libfaac-no}"
2834 echo "libgsm enabled            ${libgsm-no}"
2835 echo "libmp3lame enabled        ${libmp3lame-no}"
2836 echo "libnut enabled            ${libnut-no}"
2837 echo "libopencore-amrnb support ${libopencore_amrnb-no}"
2838 echo "libopencore-amrwb support ${libopencore_amrwb-no}"
2839 echo "libopenjpeg enabled       ${libopenjpeg-no}"
2840 echo "librtmp enabled           ${librtmp-no}"
2841 echo "libschroedinger enabled   ${libschroedinger-no}"
2842 echo "libspeex enabled          ${libspeex-no}"
2843 echo "libtheora enabled         ${libtheora-no}"
2844 echo "libvorbis enabled         ${libvorbis-no}"
2845 echo "libvpx enabled            ${libvpx-no}"
2846 echo "libx264 enabled           ${libx264-no}"
2847 echo "libxvid enabled           ${libxvid-no}"
2848 echo "zlib enabled              ${zlib-no}"
2849 echo "bzlib enabled             ${bzlib-no}"
2850 echo
2851
2852 for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
2853     echo "Enabled ${type}s:"
2854     eval list=\$$(toupper $type)_LIST
2855     for part in $list; do
2856         enabled $part && echo ${part%_*}
2857     done | sort | pr -3 -t
2858     echo
2859 done
2860
2861 license="LGPL version 2.1 or later"
2862 if enabled nonfree; then
2863     license="nonfree and unredistributable"
2864 elif enabled gplv3; then
2865     license="GPL version 3 or later"
2866 elif enabled lgplv3; then
2867     license="LGPL version 3 or later"
2868 elif enabled gpl; then
2869     license="GPL version 2 or later"
2870 fi
2871
2872 echo "License: $license"
2873
2874 echo "Creating config.mak and config.h..."
2875
2876 # build tree in object directory if source path is different from current one
2877 if enabled source_path_used; then
2878     DIRS="
2879         doc
2880         libavcodec
2881         libavcodec/$arch
2882         libavdevice
2883         libavfilter
2884         libavformat
2885         libavutil
2886         libavutil/$arch
2887         libpostproc
2888         libswscale
2889         libswscale/$arch
2890         tests
2891         tools
2892     "
2893     FILES="
2894         Makefile
2895         common.mak
2896         subdir.mak
2897         doc/texi2pod.pl
2898         libavcodec/Makefile
2899         libavcodec/${arch}/Makefile
2900         libavdevice/Makefile
2901         libavfilter/Makefile
2902         libavformat/Makefile
2903         libavutil/Makefile
2904         libpostproc/Makefile
2905         libswscale/Makefile
2906     "
2907     map 'mkdir -p $v' $DIRS;
2908     map 'test -f "$source_path/$v" && $ln_s "$source_path/$v" $v' $FILES
2909 fi
2910
2911 enabled stripping || strip="echo skipping strip"
2912
2913 cat > config.mak <<EOF
2914 # Automatically generated by configure - do not modify!
2915 ifndef FFMPEG_CONFIG_MAK
2916 FFMPEG_CONFIG_MAK=1
2917 FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
2918 prefix=$prefix
2919 LIBDIR=\$(DESTDIR)$libdir
2920 SHLIBDIR=\$(DESTDIR)$shlibdir
2921 INCDIR=\$(DESTDIR)$incdir
2922 BINDIR=\$(DESTDIR)$bindir
2923 DATADIR=\$(DESTDIR)$datadir
2924 MANDIR=\$(DESTDIR)$mandir
2925 SRC_PATH="$source_path"
2926 SRC_PATH_BARE=$source_path
2927 BUILD_ROOT="$PWD"
2928 ARCH=$arch
2929 CC=$cc
2930 AS=$as
2931 LD=$ld
2932 DEPCC=$dep_cc
2933 YASM=$yasmexe
2934 YASMDEP=$yasmexe
2935 AR=$ar
2936 RANLIB=$ranlib
2937 CP=cp -p
2938 LN_S=$ln_s
2939 STRIP=$strip
2940 CPPFLAGS=$CPPFLAGS
2941 CFLAGS=$CFLAGS
2942 ASFLAGS=$ASFLAGS
2943 CC_O=$CC_O
2944 LDFLAGS=$LDFLAGS
2945 FFSERVERLDFLAGS=$FFSERVERLDFLAGS
2946 SHFLAGS=$SHFLAGS
2947 YASMFLAGS=$YASMFLAGS
2948 BUILDSUF=$build_suffix
2949 FULLNAME=$FULLNAME
2950 LIBPREF=$LIBPREF
2951 LIBSUF=$LIBSUF
2952 LIBNAME=$LIBNAME
2953 SLIBPREF=$SLIBPREF
2954 SLIBSUF=$SLIBSUF
2955 EXESUF=$EXESUF
2956 EXTRA_VERSION=$extra_version
2957 DEPFLAGS=$DEPFLAGS
2958 CCDEP=$CCDEP
2959 ASDEP=$ASDEP
2960 CC_DEPFLAGS=$CC_DEPFLAGS
2961 AS_DEPFLAGS=$AS_DEPFLAGS
2962 HOSTCC=$host_cc
2963 HOSTCFLAGS=$host_cflags
2964 HOSTEXESUF=$HOSTEXESUF
2965 HOSTLDFLAGS=$host_ldflags
2966 HOSTLIBS=$host_libs
2967 TARGET_EXEC=$target_exec
2968 TARGET_PATH=$target_path
2969 SDL_LIBS=$sdl_libs
2970 SDL_CFLAGS=$sdl_cflags
2971 LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
2972 EXTRALIBS=$extralibs
2973 INSTALL=install
2974 LIBTARGET=${LIBTARGET}
2975 SLIBNAME=${SLIBNAME}
2976 SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
2977 SLIBNAME_WITH_MAJOR=${SLIBNAME_WITH_MAJOR}
2978 SLIB_CREATE_DEF_CMD=${SLIB_CREATE_DEF_CMD}
2979 SLIB_EXTRA_CMD=${SLIB_EXTRA_CMD}
2980 SLIB_INSTALL_EXTRA_CMD=${SLIB_INSTALL_EXTRA_CMD}
2981 SLIB_UNINSTALL_EXTRA_CMD=${SLIB_UNINSTALL_EXTRA_CMD}
2982 SAMPLES=$samples
2983 EOF
2984
2985 get_version(){
2986     name=$1
2987     file=$source_path/$2
2988     eval $(grep "#define ${name}_VERSION_M" "$file" | awk '{ print $2"="$3 }')
2989     eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
2990     lcname=$(tolower $name)
2991     eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
2992     eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
2993 }
2994
2995 get_version LIBSWSCALE  libswscale/swscale.h
2996 get_version LIBPOSTPROC libpostproc/postprocess.h
2997 get_version LIBAVCODEC  libavcodec/avcodec.h
2998 get_version LIBAVDEVICE libavdevice/avdevice.h
2999 get_version LIBAVFORMAT libavformat/avformat.h
3000 get_version LIBAVUTIL   libavutil/avutil.h
3001 get_version LIBAVFILTER libavfilter/avfilter.h
3002
3003 cat > $TMPH <<EOF
3004 /* Automatically generated by configure - do not modify! */
3005 #ifndef FFMPEG_CONFIG_H
3006 #define FFMPEG_CONFIG_H
3007 #define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
3008 #define FFMPEG_LICENSE "$(c_escape $license)"
3009 #define FFMPEG_DATADIR "$(eval c_escape $datadir)"
3010 #define CC_TYPE "$cc_type"
3011 #define CC_VERSION $cc_version
3012 #define restrict $_restrict
3013 #define ASMALIGN(ZEROBITS) ".p2align " #ZEROBITS "\\n\\t"
3014 #define EXTERN_PREFIX "${extern_prefix}"
3015 #define EXTERN_ASM ${extern_prefix}
3016 EOF
3017
3018 test -n "$malloc_prefix" &&
3019     echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH
3020
3021 if enabled small || disabled optimizations; then
3022     echo "#undef  av_always_inline"  >> $TMPH
3023     echo "#define av_always_inline"  >> $TMPH
3024 fi
3025
3026 print_config ARCH_   $TMPH config.mak $ARCH_LIST
3027 print_config HAVE_   $TMPH config.mak $HAVE_LIST
3028 print_config CONFIG_ $TMPH config.mak $CONFIG_LIST       \
3029                                       $CONFIG_EXTRA      \
3030                                       $DECODER_LIST      \
3031                                       $ENCODER_LIST      \
3032                                       $HWACCEL_LIST      \
3033                                       $PARSER_LIST       \
3034                                       $BSF_LIST          \
3035                                       $DEMUXER_LIST      \
3036                                       $MUXER_LIST        \
3037                                       $FILTER_LIST       \
3038                                       $PROTOCOL_LIST     \
3039                                       $INDEV_LIST        \
3040                                       $OUTDEV_LIST       \
3041
3042 echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH
3043 echo "endif # FFMPEG_CONFIG_MAK" >> config.mak
3044
3045 # Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
3046 cp_if_changed $TMPH config.h
3047
3048 cat > $TMPH <<EOF
3049 /* Generated by ffconf */
3050 #ifndef AVUTIL_AVCONFIG_H
3051 #define AVUTIL_AVCONFIG_H
3052 EOF
3053
3054 print_config AV_HAVE_ $TMPH /dev/null $HAVE_LIST_PUB
3055
3056 echo "#endif /* AVUTIL_AVCONFIG_H */" >> $TMPH
3057
3058 cp_if_changed $TMPH libavutil/avconfig.h
3059
3060 test -n "$WARNINGS" && printf "\n$WARNINGS"
3061
3062 # build pkg-config files
3063
3064 pkgconfig_generate(){
3065 name=$1
3066 shortname=${name#lib}${build_suffix}
3067 comment=$2
3068 version=$3
3069 libs=$4
3070 requires=$5
3071 cat <<EOF > $name/$name.pc
3072 prefix=$prefix
3073 exec_prefix=\${prefix}
3074 libdir=$libdir
3075 includedir=$incdir
3076
3077 Name: $name
3078 Description: $comment
3079 Version: $version
3080 Requires: $(enabled shared || echo $requires)
3081 Requires.private: $(enabled shared && echo $requires)
3082 Conflicts:
3083 Libs: -L\${libdir} -l${shortname} $(enabled shared || echo $libs)
3084 Libs.private: $(enabled shared && echo $libs)
3085 Cflags: -I\${includedir}
3086 EOF
3087 cat <<EOF > $name/$name-uninstalled.pc
3088 prefix=
3089 exec_prefix=
3090 libdir=\${pcfiledir}
3091 includedir=${source_path}
3092
3093 Name: $name
3094 Description: $comment
3095 Version: $version
3096 Requires: $requires
3097 Conflicts:
3098 Libs: \${libdir}/${LIBPREF}${shortname}${LIBSUF} $libs
3099 Cflags: -I\${includedir}
3100 EOF
3101 }
3102
3103 pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION"
3104 pkgconfig_generate libavcodec "FFmpeg codec library" "$LIBAVCODEC_VERSION" "$extralibs" "libavutil = $LIBAVUTIL_VERSION"
3105 pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVFORMAT_VERSION" "$extralibs" "libavcodec = $LIBAVCODEC_VERSION"
3106 pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" "libavformat = $LIBAVFORMAT_VERSION"
3107 enabled avfilter &&
3108     pkgconfig_generate libavfilter "FFmpeg video filtering library" "$LIBAVFILTER_VERSION" "$extralibs" "libavutil = $LIBAVUTIL_VERSION"
3109 enabled postproc &&
3110     pkgconfig_generate libpostproc "FFmpeg post processing library" "$LIBPOSTPROC_VERSION"
3111 pkgconfig_generate libswscale "FFmpeg image rescaling library" "$LIBSWSCALE_VERSION" "" "libavutil = $LIBAVUTIL_VERSION"