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