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