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