]> git.sesse.net Git - ffmpeg/blob - configure
Merge commit 'e1eaaec765d2e726618633fcbd2e06fded7647a8'
[ffmpeg] / configure
1 #!/bin/sh
2 #
3 # FFmpeg configure script
4 #
5 # Copyright (c) 2000-2002 Fabrice Bellard
6 # Copyright (c) 2005-2008 Diego Biurrun
7 # Copyright (c) 2005-2008 Mans Rullgard
8 #
9
10 # Prevent locale nonsense from breaking basic text processing.
11 LC_ALL=C
12 export LC_ALL
13
14 # make sure we are running under a compatible shell
15 # try to make this part work with most shells
16
17 try_exec(){
18     echo "Trying shell $1"
19     type "$1" > /dev/null 2>&1 && exec "$@"
20 }
21
22 unset foo
23 (: ${foo%%bar}) 2> /dev/null
24 E1="$?"
25
26 (: ${foo?}) 2> /dev/null
27 E2="$?"
28
29 if test "$E1" != 0 || test "$E2" = 0; then
30     echo "Broken shell detected.  Trying alternatives."
31     export FF_CONF_EXEC
32     if test "0$FF_CONF_EXEC" -lt 1; then
33         FF_CONF_EXEC=1
34         try_exec bash "$0" "$@"
35     fi
36     if test "0$FF_CONF_EXEC" -lt 2; then
37         FF_CONF_EXEC=2
38         try_exec ksh "$0" "$@"
39     fi
40     if test "0$FF_CONF_EXEC" -lt 3; then
41         FF_CONF_EXEC=3
42         try_exec /usr/xpg4/bin/sh "$0" "$@"
43     fi
44     echo "No compatible shell script interpreter found."
45     echo "This configure script requires a POSIX-compatible shell"
46     echo "such as bash or ksh."
47     echo "THIS IS NOT A BUG IN FFMPEG, DO NOT REPORT IT AS SUCH."
48     echo "Instead, install a working POSIX-compatible shell."
49     echo "Disabling this configure test will create a broken FFmpeg."
50     if test "$BASH_VERSION" = '2.04.0(1)-release'; then
51         echo "This bash version ($BASH_VERSION) is broken on your platform."
52         echo "Upgrade to a later version if available."
53     fi
54     exit 1
55 fi
56
57 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   --fatal-warnings         fail if any configure warning is generated
82   --prefix=PREFIX          install in PREFIX [$prefix]
83   --bindir=DIR             install binaries in DIR [PREFIX/bin]
84   --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]
85   --docdir=DIR             install documentation in DIR [PREFIX/share/doc/ffmpeg]
86   --libdir=DIR             install libs in DIR [PREFIX/lib]
87   --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
88   --incdir=DIR             install includes in DIR [PREFIX/include]
89   --mandir=DIR             install man page in DIR [PREFIX/share/man]
90   --enable-rpath           use rpath to allow installing libraries in paths
91                            not part of the dynamic linker search path
92
93 Licensing options:
94   --enable-gpl             allow use of GPL code, the resulting libs
95                            and binaries will be under GPL [no]
96   --enable-version3        upgrade (L)GPL to version 3 [no]
97   --enable-nonfree         allow use of nonfree code, the resulting libs
98                            and binaries will be unredistributable [no]
99
100 Configuration options:
101   --disable-static         do not build static libraries [no]
102   --enable-shared          build shared libraries [no]
103   --enable-small           optimize for size instead of speed
104   --disable-runtime-cpudetect disable detecting cpu capabilities at runtime (smaller binary)
105   --enable-gray            enable full grayscale support (slower color)
106   --disable-swscale-alpha  disable alpha channel support in swscale
107   --disable-all            disable building components, libraries and programs
108   --enable-incompatible-libav-abi enable incompatible Libav fork ABI [no]
109   --enable-incompatible-fork-abi  enable incompatible Libav fork ABI (deprecated) [no]
110
111 Program options:
112   --disable-programs       do not build command line programs
113   --disable-ffmpeg         disable ffmpeg build
114   --disable-ffplay         disable ffplay build
115   --disable-ffprobe        disable ffprobe build
116   --disable-ffserver       disable ffserver build
117
118 Documentation options:
119   --disable-doc            do not build documentation
120   --disable-htmlpages      do not build HTML documentation pages
121   --disable-manpages       do not build man documentation pages
122   --disable-podpages       do not build POD documentation pages
123   --disable-txtpages       do not build text documentation pages
124
125 Component options:
126   --disable-avdevice       disable libavdevice build
127   --disable-avcodec        disable libavcodec build
128   --disable-avformat       disable libavformat build
129   --disable-avutil         disable libavutil build
130   --disable-swresample     disable libswresample build
131   --disable-swscale        disable libswscale build
132   --disable-postproc       disable libpostproc build
133   --disable-avfilter       disable libavfilter build
134   --enable-avresample      enable libavresample build [no]
135   --disable-pthreads       disable pthreads [auto]
136   --disable-w32threads     disable Win32 threads [auto]
137   --disable-os2threads     disable OS/2 threads [auto]
138   --disable-network        disable network support [no]
139   --disable-dct            disable DCT code
140   --disable-dwt            disable DWT code
141   --disable-error-resilience disable error resilience code
142   --disable-lsp            disable LSP code
143   --disable-lzo            disable LZO decoder code
144   --disable-mdct           disable MDCT code
145   --disable-rdft           disable RDFT code
146   --disable-fft            disable FFT code
147
148 Hardware accelerators:
149   --disable-dxva2          disable DXVA2 code [autodetect]
150   --disable-vaapi          disable VAAPI code [autodetect]
151   --enable-vda             enable VDA code
152   --disable-vdpau          disable VDPAU code [autodetect]
153
154 Individual component options:
155   --disable-everything     disable all components listed below
156   --disable-encoder=NAME   disable encoder NAME
157   --enable-encoder=NAME    enable encoder NAME
158   --disable-encoders       disable all encoders
159   --disable-decoder=NAME   disable decoder NAME
160   --enable-decoder=NAME    enable decoder NAME
161   --disable-decoders       disable all decoders
162   --disable-hwaccel=NAME   disable hwaccel NAME
163   --enable-hwaccel=NAME    enable hwaccel NAME
164   --disable-hwaccels       disable all hwaccels
165   --disable-muxer=NAME     disable muxer NAME
166   --enable-muxer=NAME      enable muxer NAME
167   --disable-muxers         disable all muxers
168   --disable-demuxer=NAME   disable demuxer NAME
169   --enable-demuxer=NAME    enable demuxer NAME
170   --disable-demuxers       disable all demuxers
171   --enable-parser=NAME     enable parser NAME
172   --disable-parser=NAME    disable parser NAME
173   --disable-parsers        disable all parsers
174   --enable-bsf=NAME        enable bitstream filter NAME
175   --disable-bsf=NAME       disable bitstream filter NAME
176   --disable-bsfs           disable all bitstream filters
177   --enable-protocol=NAME   enable protocol NAME
178   --disable-protocol=NAME  disable protocol NAME
179   --disable-protocols      disable all protocols
180   --enable-indev=NAME      enable input device NAME
181   --disable-indev=NAME     disable input device NAME
182   --disable-indevs         disable input devices
183   --enable-outdev=NAME     enable output device NAME
184   --disable-outdev=NAME    disable output device NAME
185   --disable-outdevs        disable output devices
186   --disable-devices        disable all devices
187   --enable-filter=NAME     enable filter NAME
188   --disable-filter=NAME    disable filter NAME
189   --disable-filters        disable all filters
190
191 External library support:
192   --enable-avisynth        enable reading of AviSynth script files [no]
193   --disable-bzlib          disable bzlib [autodetect]
194   --enable-fontconfig      enable fontconfig
195   --enable-frei0r          enable frei0r video filtering
196   --enable-gnutls          enable gnutls [no]
197   --disable-iconv          disable iconv [autodetect]
198   --enable-ladspa          enable LADSPA audio filtering
199   --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
200   --enable-libass          enable libass subtitles rendering [no]
201   --enable-libbluray       enable BluRay reading using libbluray [no]
202   --enable-libcaca         enable textual display using libcaca
203   --enable-libcelt         enable CELT decoding via libcelt [no]
204   --enable-libcdio         enable audio CD grabbing with libcdio
205   --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
206                            and libraw1394 [no]
207   --enable-libfaac         enable AAC encoding via libfaac [no]
208   --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
209   --enable-libflite        enable flite (voice synthesis) support via libflite [no]
210   --enable-libfreetype     enable libfreetype [no]
211   --enable-libgme          enable Game Music Emu via libgme [no]
212   --enable-libgsm          enable GSM de/encoding via libgsm [no]
213   --enable-libiec61883     enable iec61883 via libiec61883 [no]
214   --enable-libilbc         enable iLBC de/encoding via libilbc [no]
215   --enable-libmodplug      enable ModPlug via libmodplug [no]
216   --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
217   --enable-libnut          enable NUT (de)muxing via libnut,
218                            native (de)muxer exists [no]
219   --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
220   --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
221   --enable-libopencv       enable video filtering via libopencv [no]
222   --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
223   --enable-libopus         enable Opus decoding via libopus [no]
224   --enable-libpulse        enable Pulseaudio input via libpulse [no]
225   --enable-libquvi         enable quvi input via libquvi [no]
226   --enable-librtmp         enable RTMP[E] support via librtmp [no]
227   --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
228   --enable-libshine        enable fixed-point MP3 encoding via libshine [no]
229   --enable-libsoxr         enable Include libsoxr resampling [no]
230   --enable-libspeex        enable Speex de/encoding via libspeex [no]
231   --enable-libssh          enable SFTP protocol via libssh [no]
232   --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
233   --enable-libtheora       enable Theora encoding via libtheora [no]
234   --enable-libtwolame      enable MP2 encoding via libtwolame [no]
235   --enable-libutvideo      enable Ut Video encoding and decoding via libutvideo [no]
236   --enable-libv4l2         enable libv4l2/v4l-utils [no]
237   --enable-libvidstab      enable video stabilization using vid.stab [no]
238   --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
239   --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
240   --enable-libvorbis       enable Vorbis en/decoding via libvorbis,
241                            native implementation exists [no]
242   --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
243   --enable-libwavpack      enable wavpack encoding via libwavpack [no]
244   --enable-libx264         enable H.264 encoding via x264 [no]
245   --enable-libxavs         enable AVS encoding via xavs [no]
246   --enable-libxvid         enable Xvid encoding via xvidcore,
247                            native MPEG-4/Xvid encoder exists [no]
248   --enable-libzmq          enable message passing via libzmq [no]
249   --enable-libzvbi         enable teletext support via libzvbi [no]
250   --enable-openal          enable OpenAL 1.1 capture support [no]
251   --enable-opencl          enable OpenCL code
252   --enable-openssl         enable openssl [no]
253   --enable-x11grab         enable X11 grabbing [no]
254   --disable-zlib           disable zlib [autodetect]
255
256 Advanced options (experts only):
257   --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
258   --enable-cross-compile   assume a cross-compiler is used
259   --sysroot=PATH           root of cross-build tree
260   --sysinclude=PATH        location of cross-build system headers
261   --target-os=OS           compiler targets OS [$target_os]
262   --target-exec=CMD        command to run executables on target
263   --target-path=DIR        path to view of build directory on target
264   --target-samples=DIR     path to samples directory on target
265   --tempprefix=PATH        force fixed dir/prefix instead of mktemp for checks
266   --toolchain=NAME         set tool defaults according to NAME
267   --nm=NM                  use nm tool NM [$nm_default]
268   --ar=AR                  use archive tool AR [$ar_default]
269   --as=AS                  use assembler AS [$as_default]
270   --windres=WINDRES        use windows resource compiler WINDRES [$windres_default]
271   --yasmexe=EXE            use yasm-compatible assembler EXE [$yasmexe_default]
272   --cc=CC                  use C compiler CC [$cc_default]
273   --cxx=CXX                use C compiler CXX [$cxx_default]
274   --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
275   --ld=LD                  use linker LD [$ld_default]
276   --host-cc=HOSTCC         use host C compiler HOSTCC
277   --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
278   --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
279   --host-ld=HOSTLD         use host linker HOSTLD
280   --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
281   --host-libs=HLIBS        use libs HLIBS when linking for host
282   --host-os=OS             compiler host OS [$target_os]
283   --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
284   --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
285   --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
286   --extra-libs=ELIBS       add ELIBS [$ELIBS]
287   --extra-version=STRING   version string suffix []
288   --optflags=OPTFLAGS      override optimization-related compiler flags
289   --build-suffix=SUFFIX    library name suffix []
290   --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
291   --progs-suffix=SUFFIX    program name suffix []
292   --arch=ARCH              select architecture [$arch]
293   --cpu=CPU                select the minimum required CPU (affects
294                            instruction selection, may crash on older CPUs)
295   --enable-pic             build position-independent code
296   --enable-sram            allow use of on-chip SRAM
297   --enable-thumb           compile for Thumb instruction set
298   --disable-symver         disable symbol versioning
299   --enable-hardcoded-tables use hardcoded tables instead of runtime generation
300   --disable-safe-bitstream-reader
301                            disable buffer boundary checking in bitreaders
302                            (faster, but may crash)
303   --enable-memalign-hack   emulate memalign, interferes with memory debuggers
304   --enable-lto             use link-time optimization
305
306 Optimization options (experts only):
307   --disable-asm            disable all assembler optimizations
308   --disable-altivec        disable AltiVec optimizations
309   --disable-amd3dnow       disable 3DNow! optimizations
310   --disable-amd3dnowext    disable 3DNow! extended optimizations
311   --disable-mmx            disable MMX optimizations
312   --disable-mmxext         disable MMXEXT optimizations
313   --disable-sse            disable SSE optimizations
314   --disable-sse2           disable SSE2 optimizations
315   --disable-sse3           disable SSE3 optimizations
316   --disable-ssse3          disable SSSE3 optimizations
317   --disable-sse4           disable SSE4 optimizations
318   --disable-sse42          disable SSE4.2 optimizations
319   --disable-avx            disable AVX optimizations
320   --disable-fma4           disable FMA4 optimizations
321   --disable-avx2           disable AVX2 optimizations
322   --disable-armv5te        disable armv5te optimizations
323   --disable-armv6          disable armv6 optimizations
324   --disable-armv6t2        disable armv6t2 optimizations
325   --disable-vfp            disable VFP optimizations
326   --disable-neon           disable NEON optimizations
327   --disable-vis            disable VIS optimizations
328   --disable-inline-asm     disable use of inline assembler
329   --disable-yasm           disable use of yasm assembler
330   --disable-mips32r2       disable MIPS32R2 optimizations
331   --disable-mipsdspr1      disable MIPS DSP ASE R1 optimizations
332   --disable-mipsdspr2      disable MIPS DSP ASE R2 optimizations
333   --disable-mipsfpu        disable floating point MIPS optimizations
334   --disable-fast-unaligned consider unaligned accesses slow
335
336 Developer options (useful when working on FFmpeg itself):
337   --disable-debug          disable debugging symbols
338   --enable-debug=LEVEL     set the debug level [$debuglevel]
339   --disable-optimizations  disable compiler optimizations
340   --enable-extra-warnings  enable more compiler warnings
341   --disable-stripping      disable stripping of executables and shared libraries
342   --assert-level=level     0(default), 1 or 2, amount of assertion testing,
343                            2 causes a slowdown at runtime.
344   --enable-memory-poisoning fill heap uninitialized allocated space with arbitrary data
345   --valgrind=VALGRIND      run "make fate" tests through valgrind to detect memory
346                            leaks and errors, using the specified valgrind binary.
347                            Cannot be combined with --target-exec
348   --enable-ftrapv          Trap arithmetic overflows
349   --samples=PATH           location of test samples for FATE, if not set use
350                            \$FATE_SAMPLES at make invocation time.
351   --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
352                            should be used only for debugging purposes)
353   --enable-random          randomly enable/disable components
354   --disable-random
355   --enable-random=LIST     randomly enable/disable specific components or
356   --disable-random=LIST    component groups. LIST is a comma-separated list
357                            of NAME[:PROB] entries where NAME is a component
358                            (group) and PROB the probability associated with
359                            NAME (default 0.5).
360   --random-seed=VALUE      seed value for --enable/disable-random
361
362 NOTE: Object files are built at the place where configure is launched.
363 EOF
364   exit 0
365 }
366
367 quotes='""'
368
369 log(){
370     echo "$@" >> $logfile
371 }
372
373 log_file(){
374     log BEGIN $1
375     pr -n -t $1 >> $logfile
376     log END $1
377 }
378
379 echolog(){
380     log "$@"
381     echo "$@"
382 }
383
384 warn(){
385     log "WARNING: $*"
386     WARNINGS="${WARNINGS}WARNING: $*\n"
387 }
388
389 die(){
390     echolog "$@"
391     cat <<EOF
392
393 If you think configure made a mistake, make sure you are using the latest
394 version from Git.  If the latest version fails, report the problem to the
395 ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
396 EOF
397     if disabled logging; then
398         cat <<EOF
399 Rerun configure with logging enabled (do not use --disable-logging), and
400 include the log this produces with your report.
401 EOF
402     else
403         cat <<EOF
404 Include the log file "$logfile" produced by configure as this will help
405 solving the problem.
406 EOF
407     fi
408     exit 1
409 }
410
411 # Avoid locale weirdness, besides we really just want to translate ASCII.
412 toupper(){
413     echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
414 }
415
416 tolower(){
417     echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
418 }
419
420 c_escape(){
421     echo "$*" | sed 's/["\\]/\\\0/g'
422 }
423
424 sh_quote(){
425     v=$(echo "$1" | sed "s/'/'\\\\''/g")
426     test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
427     echo "$v"
428 }
429
430 cleanws(){
431     echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//;s/\r//g'
432 }
433
434 filter(){
435     pat=$1
436     shift
437     for v; do
438         eval "case $v in $pat) echo $v ;; esac"
439     done
440 }
441
442 filter_out(){
443     pat=$1
444     shift
445     for v; do
446         eval "case $v in $pat) ;; *) echo $v ;; esac"
447     done
448 }
449
450 map(){
451     m=$1
452     shift
453     for v; do eval $m; done
454 }
455
456 add_suffix(){
457     suffix=$1
458     shift
459     for v; do echo ${v}${suffix}; done
460 }
461
462 set_all(){
463     value=$1
464     shift
465     for var in $*; do
466         eval $var=$value
467     done
468 }
469
470 set_weak(){
471     value=$1
472     shift
473     for var; do
474         eval : \${$var:=$value}
475     done
476 }
477
478 sanitize_var_name(){
479     echo $@ | sed 's/[^A-Za-z0-9_]/_/g'
480 }
481
482 set_safe(){
483     var=$1
484     shift
485     eval $(sanitize_var_name "$var")='$*'
486 }
487
488 get_safe(){
489     eval echo \$$(sanitize_var_name "$1")
490 }
491
492 pushvar(){
493     for pvar in $*; do
494         eval level=\${${pvar}_level:=0}
495         eval ${pvar}_${level}="\$$pvar"
496         eval ${pvar}_level=$(($level+1))
497     done
498 }
499
500 popvar(){
501     for pvar in $*; do
502         eval level=\${${pvar}_level:-0}
503         test $level = 0 && continue
504         eval level=$(($level-1))
505         eval $pvar="\${${pvar}_${level}}"
506         eval ${pvar}_level=$level
507         eval unset ${pvar}_${level}
508     done
509 }
510
511 enable(){
512     set_all yes $*
513 }
514
515 disable(){
516     set_all no $*
517 }
518
519 enable_weak(){
520     set_weak yes $*
521 }
522
523 disable_weak(){
524     set_weak no $*
525 }
526
527 enable_safe(){
528     for var; do
529         enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
530     done
531 }
532
533 disable_safe(){
534     for var; do
535         disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
536     done
537 }
538
539 do_enable_deep(){
540     for var; do
541         enabled $var && continue
542         eval sel="\$${var}_select"
543         eval sgs="\$${var}_suggest"
544         pushvar var sgs
545         enable_deep $sel
546         popvar sgs
547         enable_deep_weak $sgs
548         popvar var
549     done
550 }
551
552 enable_deep(){
553     do_enable_deep $*
554     enable $*
555 }
556
557 enable_deep_weak(){
558     for var; do
559         disabled $var && continue
560         pushvar var
561         do_enable_deep $var
562         popvar var
563         enable_weak $var
564     done
565 }
566
567 enabled(){
568     test "${1#!}" = "$1" && op== || op=!=
569     eval test "x\$${1#!}" $op "xyes"
570 }
571
572 disabled(){
573     test "${1#!}" = "$1" && op== || op=!=
574     eval test "x\$${1#!}" $op "xno"
575 }
576
577 enabled_all(){
578     for opt; do
579         enabled $opt || return 1
580     done
581 }
582
583 disabled_all(){
584     for opt; do
585         disabled $opt || return 1
586     done
587 }
588
589 enabled_any(){
590     for opt; do
591         enabled $opt && return 0
592     done
593 }
594
595 disabled_any(){
596     for opt; do
597         disabled $opt && return 0
598     done
599     return 1
600 }
601
602 set_default(){
603     for opt; do
604         eval : \${$opt:=\$${opt}_default}
605     done
606 }
607
608 is_in(){
609     value=$1
610     shift
611     for var in $*; do
612         [ $var = $value ] && return 0
613     done
614     return 1
615 }
616
617 do_check_deps(){
618     for cfg; do
619         cfg="${cfg#!}"
620         enabled ${cfg}_checking && die "Circular dependency for $cfg."
621         disabled ${cfg}_checking && continue
622         enable ${cfg}_checking
623         append allopts $cfg
624
625         eval dep_all="\$${cfg}_deps"
626         eval dep_any="\$${cfg}_deps_any"
627         eval dep_sel="\$${cfg}_select"
628         eval dep_sgs="\$${cfg}_suggest"
629         eval dep_ifa="\$${cfg}_if"
630         eval dep_ifn="\$${cfg}_if_any"
631
632         pushvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
633         do_check_deps $dep_all $dep_any $dep_sel $dep_sgs $dep_ifa $dep_ifn
634         popvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
635
636         [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
637         [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
638         enabled_all  $dep_all || disable $cfg
639         enabled_any  $dep_any || disable $cfg
640         disabled_any $dep_sel && disable $cfg
641
642         if enabled $cfg; then
643             enable_deep $dep_sel
644             enable_deep_weak $dep_sgs
645         fi
646
647         disable ${cfg}_checking
648     done
649 }
650
651 check_deps(){
652     unset allopts
653
654     do_check_deps "$@"
655
656     for cfg in $allopts; do
657         enabled $cfg || continue
658         eval dep_extralibs="\$${cfg}_extralibs"
659         test -n "$dep_extralibs" && add_extralibs $dep_extralibs
660     done
661 }
662
663 print_config(){
664     pfx=$1
665     files=$2
666     shift 2
667     map 'eval echo "$v \${$v:-no}"' "$@" |
668     awk "BEGIN { split(\"$files\", files) }
669         {
670             c = \"$pfx\" toupper(\$1);
671             v = \$2;
672             sub(/yes/, 1, v);
673             sub(/no/,  0, v);
674             for (f in files) {
675                 file = files[f];
676                 if (file ~ /\\.h\$/) {
677                     printf(\"#define %s %d\\n\", c, v) >>file;
678                 } else if (file ~ /\\.asm\$/) {
679                     printf(\"%%define %s %d\\n\", c, v) >>file;
680                 } else if (file ~ /\\.mak\$/) {
681                     n = -v ? \"\" : \"!\";
682                     printf(\"%s%s=yes\\n\", n, c) >>file;
683                 } else if (file ~ /\\.texi\$/) {
684                     pre = -v ? \"\" : \"@c \";
685                     yesno = \$2;
686                     c2 = tolower(c);
687                     gsub(/_/, \"-\", c2);
688                     printf(\"%s@set %s %s\\n\", pre, c2, yesno) >>file;
689                 }
690             }
691         }"
692 }
693
694 print_enabled(){
695     suf=$1
696     shift
697     for v; do
698         enabled $v && printf "%s\n" ${v%$suf};
699     done
700 }
701
702 append(){
703     var=$1
704     shift
705     eval "$var=\"\$$var $*\""
706 }
707
708 prepend(){
709     var=$1
710     shift
711     eval "$var=\"$* \$$var\""
712 }
713
714 add_cppflags(){
715     append CPPFLAGS "$@"
716 }
717
718 add_cflags(){
719     append CFLAGS $($cflags_filter "$@")
720 }
721
722 add_cxxflags(){
723     append CXXFLAGS $($cflags_filter "$@")
724 }
725
726 add_asflags(){
727     append ASFLAGS $($asflags_filter "$@")
728 }
729
730 add_ldflags(){
731     append LDFLAGS $($ldflags_filter "$@")
732 }
733
734 add_stripflags(){
735     append ASMSTRIPFLAGS "$@"
736 }
737
738 add_extralibs(){
739     prepend extralibs $($ldflags_filter "$@")
740 }
741
742 add_host_cppflags(){
743     append host_cppflags "$@"
744 }
745
746 add_host_cflags(){
747     append host_cflags $($host_cflags_filter "$@")
748 }
749
750 add_host_ldflags(){
751     append host_ldflags $($host_ldflags_filter "$@")
752 }
753
754 add_compat(){
755     append compat_objs $1
756     shift
757     map 'add_cppflags -D$v' "$@"
758 }
759
760 check_cmd(){
761     log "$@"
762     "$@" >> $logfile 2>&1
763 }
764
765 cc_o(){
766     eval printf '%s\\n' $CC_O
767 }
768
769 cc_e(){
770     eval printf '%s\\n' $CC_E
771 }
772
773 check_cc(){
774     log check_cc "$@"
775     cat > $TMPC
776     log_file $TMPC
777     check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
778 }
779
780 check_cxx(){
781     log check_cxx "$@"
782     cat > $TMPCPP
783     log_file $TMPCPP
784     check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
785 }
786
787 check_cpp(){
788     log check_cpp "$@"
789     cat > $TMPC
790     log_file $TMPC
791     check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
792 }
793
794 as_o(){
795     eval printf '%s\\n' $AS_O
796 }
797
798 check_as(){
799     log check_as "$@"
800     cat > $TMPS
801     log_file $TMPS
802     check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
803 }
804
805 check_inline_asm(){
806     log check_inline_asm "$@"
807     name="$1"
808     code="$2"
809     shift 2
810     disable $name
811     check_cc "$@" <<EOF && enable $name
812 void foo(void){ __asm__ volatile($code); }
813 EOF
814 }
815
816 check_insn(){
817     log check_insn "$@"
818     check_inline_asm ${1}_inline "\"$2\""
819     echo "$2" | check_as && enable ${1}_external || disable ${1}_external
820 }
821
822 check_yasm(){
823     log check_yasm "$@"
824     echo "$1" > $TMPS
825     log_file $TMPS
826     shift 1
827     check_cmd $yasmexe $YASMFLAGS -Werror "$@" -o $TMPO $TMPS
828 }
829
830 ld_o(){
831     eval printf '%s\\n' $LD_O
832 }
833
834 check_ld(){
835     log check_ld "$@"
836     type=$1
837     shift 1
838     flags=$(filter_out '-l*|*.so' $@)
839     libs=$(filter '-l*|*.so' $@)
840     check_$type $($cflags_filter $flags) || return
841     flags=$($ldflags_filter $flags)
842     libs=$($ldflags_filter $libs)
843     check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
844 }
845
846 check_code(){
847     log check_code "$@"
848     check=$1
849     headers=$2
850     code=$3
851     shift 3
852     {
853         for hdr in $headers; do
854             echo "#include <$hdr>"
855         done
856         echo "int main(void) { $code; return 0; }"
857     } | check_$check "$@"
858 }
859
860 check_cppflags(){
861     log check_cppflags "$@"
862     check_cc "$@" <<EOF && append CPPFLAGS "$@"
863 int x;
864 EOF
865 }
866
867 test_cflags(){
868     log test_cflags "$@"
869     set -- $($cflags_filter "$@")
870     check_cc "$@" <<EOF
871 int x;
872 EOF
873 }
874
875 check_cflags(){
876     log check_cflags "$@"
877     test_cflags "$@" && add_cflags "$@"
878 }
879
880 check_cxxflags(){
881     log check_cxxflags "$@"
882     set -- $($cflags_filter "$@")
883     check_cxx "$@" <<EOF && append CXXFLAGS "$@"
884 int x;
885 EOF
886 }
887
888 test_ldflags(){
889     log test_ldflags "$@"
890     check_ld "cc" "$@" <<EOF
891 int main(void){ return 0; }
892 EOF
893 }
894
895 check_ldflags(){
896     log check_ldflags "$@"
897     test_ldflags "$@" && add_ldflags "$@"
898 }
899
900 test_stripflags(){
901     log test_stripflags "$@"
902     # call check_cc to get a fresh TMPO
903     check_cc <<EOF
904 int main(void) { return 0; }
905 EOF
906     check_cmd $strip $ASMSTRIPFLAGS "$@" $TMPO
907 }
908
909 check_stripflags(){
910     log check_stripflags "$@"
911     test_stripflags "$@" && add_stripflags "$@"
912 }
913
914 check_header(){
915     log check_header "$@"
916     header=$1
917     shift
918     disable_safe $header
919     check_cpp "$@" <<EOF && enable_safe $header
920 #include <$header>
921 int x;
922 EOF
923 }
924
925 check_func(){
926     log check_func "$@"
927     func=$1
928     shift
929     disable $func
930     check_ld "cc" "$@" <<EOF && enable $func
931 extern int $func();
932 int main(void){ $func(); }
933 EOF
934 }
935
936 check_mathfunc(){
937     log check_mathfunc "$@"
938     func=$1
939     narg=$2
940     shift 2
941     test $narg = 2 && args="f, g" || args="f"
942     disable $func
943     check_ld "cc" "$@" <<EOF && enable $func
944 #include <math.h>
945 float foo(float f, float g) { return $func($args); }
946 int main(void){ return (int) foo; }
947 EOF
948 }
949
950 check_func_headers(){
951     log check_func_headers "$@"
952     headers=$1
953     funcs=$2
954     shift 2
955     {
956         for hdr in $headers; do
957             echo "#include <$hdr>"
958         done
959         for func in $funcs; do
960             echo "long check_$func(void) { return (long) $func; }"
961         done
962         echo "int main(void) { return 0; }"
963     } | check_ld "cc" "$@" && enable $funcs && enable_safe $headers
964 }
965
966 check_class_headers_cpp(){
967     log check_class_headers_cpp "$@"
968     headers=$1
969     classes=$2
970     shift 2
971     {
972         for hdr in $headers; do
973             echo "#include <$hdr>"
974         done
975         echo "int main(void) { "
976         i=1
977         for class in $classes; do
978             echo "$class obj$i;"
979             i=$(expr $i + 1)
980         done
981         echo "return 0; }"
982     } | check_ld "cxx" "$@" && enable $funcs && enable_safe $headers
983 }
984
985 check_cpp_condition(){
986     log check_cpp_condition "$@"
987     header=$1
988     condition=$2
989     shift 2
990     check_cpp "$@" <<EOF
991 #include <$header>
992 #if !($condition)
993 #error "unsatisfied condition: $condition"
994 #endif
995 EOF
996 }
997
998 check_lib(){
999     log check_lib "$@"
1000     header="$1"
1001     func="$2"
1002     shift 2
1003     check_header $header && check_func $func "$@" && add_extralibs "$@"
1004 }
1005
1006 check_lib2(){
1007     log check_lib2 "$@"
1008     headers="$1"
1009     funcs="$2"
1010     shift 2
1011     check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
1012 }
1013
1014 check_lib_cpp(){
1015     log check_lib_cpp "$@"
1016     headers="$1"
1017     classes="$2"
1018     shift 2
1019     check_class_headers_cpp "$headers" "$classes" "$@" && add_extralibs "$@"
1020 }
1021
1022 check_pkg_config(){
1023     log check_pkg_config "$@"
1024     pkg="$1"
1025     headers="$2"
1026     funcs="$3"
1027     shift 3
1028     check_cmd $pkg_config --exists --print-errors $pkg || return
1029     pkg_cflags=$($pkg_config --cflags $pkg)
1030     pkg_libs=$($pkg_config --libs $pkg)
1031     check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
1032         set_safe ${pkg}_cflags $pkg_cflags   &&
1033         set_safe ${pkg}_libs   $pkg_libs
1034 }
1035
1036 check_exec(){
1037     check_ld "cc" "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
1038 }
1039
1040 check_exec_crash(){
1041     code=$(cat)
1042
1043     # exit() is not async signal safe.  _Exit (C99) and _exit (POSIX)
1044     # are safe but may not be available everywhere.  Thus we use
1045     # raise(SIGTERM) instead.  The check is run in a subshell so we
1046     # can redirect the "Terminated" message from the shell.  SIGBUS
1047     # is not defined by standard C so it is used conditionally.
1048
1049     (check_exec "$@") >> $logfile 2>&1 <<EOF
1050 #include <signal.h>
1051 static void sighandler(int sig){
1052     raise(SIGTERM);
1053 }
1054 int foo(void){
1055     $code
1056 }
1057 int (*func_ptr)(void) = foo;
1058 int main(void){
1059     signal(SIGILL, sighandler);
1060     signal(SIGFPE, sighandler);
1061     signal(SIGSEGV, sighandler);
1062 #ifdef SIGBUS
1063     signal(SIGBUS, sighandler);
1064 #endif
1065     return func_ptr();
1066 }
1067 EOF
1068 }
1069
1070 check_type(){
1071     log check_type "$@"
1072     headers=$1
1073     type=$2
1074     shift 2
1075     disable_safe "$type"
1076     check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
1077 }
1078
1079 check_struct(){
1080     log check_struct "$@"
1081     headers=$1
1082     struct=$2
1083     member=$3
1084     shift 3
1085     disable_safe "${struct}_${member}"
1086     check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
1087         enable_safe "${struct}_${member}"
1088 }
1089
1090 check_builtin(){
1091     log check_builtin "$@"
1092     name=$1
1093     headers=$2
1094     builtin=$3
1095     shift 3
1096     disable "$name"
1097     check_code ld "$headers" "$builtin" "cc" "$@" && enable "$name"
1098 }
1099
1100 require(){
1101     name="$1"
1102     header="$2"
1103     func="$3"
1104     shift 3
1105     check_lib $header $func "$@" || die "ERROR: $name not found"
1106 }
1107
1108 require2(){
1109     name="$1"
1110     headers="$2"
1111     func="$3"
1112     shift 3
1113     check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
1114 }
1115
1116 require_cpp(){
1117     name="$1"
1118     headers="$2"
1119     classes="$3"
1120     shift 3
1121     check_lib_cpp "$headers" "$classes" "$@" || die "ERROR: $name not found"
1122 }
1123
1124 require_pkg_config(){
1125     pkg="$1"
1126     check_pkg_config "$@" || die "ERROR: $pkg not found"
1127     add_cflags    $(get_safe ${pkg}_cflags)
1128     add_extralibs $(get_safe ${pkg}_libs)
1129 }
1130
1131 hostcc_o(){
1132     eval printf '%s\\n' $HOSTCC_O
1133 }
1134
1135 check_host_cc(){
1136     log check_host_cc "$@"
1137     cat > $TMPC
1138     log_file $TMPC
1139     check_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
1140 }
1141
1142 check_host_cppflags(){
1143     log check_host_cppflags "$@"
1144     check_host_cc "$@" <<EOF && append host_cppflags "$@"
1145 int x;
1146 EOF
1147 }
1148
1149 check_host_cflags(){
1150     log check_host_cflags "$@"
1151     set -- $($host_cflags_filter "$@")
1152     check_host_cc "$@" <<EOF && append host_cflags "$@"
1153 int x;
1154 EOF
1155 }
1156
1157 apply(){
1158     file=$1
1159     shift
1160     "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
1161 }
1162
1163 cp_if_changed(){
1164     cmp -s "$1" "$2" && echo "$2 is unchanged" && return
1165     mkdir -p "$(dirname $2)"
1166     $cp_f "$1" "$2"
1167 }
1168
1169 # CONFIG_LIST contains configurable options, while HAVE_LIST is for
1170 # system-dependent things.
1171
1172 COMPONENT_LIST="
1173     bsfs
1174     decoders
1175     demuxers
1176     encoders
1177     filters
1178     hwaccels
1179     indevs
1180     muxers
1181     outdevs
1182     parsers
1183     protocols
1184 "
1185
1186 EXAMPLE_LIST="
1187     decoding_encoding_example
1188     demuxing_decoding_example
1189     filtering_audio_example
1190     filtering_video_example
1191     metadata_example
1192     muxing_example
1193     resampling_audio_example
1194     scaling_video_example
1195     transcode_aac_example
1196 "
1197
1198 EXTERNAL_LIBRARY_LIST="
1199     avisynth
1200     bzlib
1201     crystalhd
1202     fontconfig
1203     frei0r
1204     gnutls
1205     iconv
1206     ladspa
1207     libaacplus
1208     libass
1209     libbluray
1210     libcaca
1211     libcdio
1212     libcelt
1213     libdc1394
1214     libfaac
1215     libfdk_aac
1216     libflite
1217     libfreetype
1218     libgme
1219     libgsm
1220     libiec61883
1221     libilbc
1222     libmodplug
1223     libmp3lame
1224     libnut
1225     libopencore_amrnb
1226     libopencore_amrwb
1227     libopencv
1228     libopenjpeg
1229     libopus
1230     libpulse
1231     libquvi
1232     librtmp
1233     libschroedinger
1234     libshine
1235     libsoxr
1236     libspeex
1237     libssh
1238     libstagefright_h264
1239     libtheora
1240     libtwolame
1241     libutvideo
1242     libv4l2
1243     libvidstab
1244     libvo_aacenc
1245     libvo_amrwbenc
1246     libvorbis
1247     libvpx
1248     libwavpack
1249     libx264
1250     libxavs
1251     libxvid
1252     libzmq
1253     libzvbi
1254     openal
1255     opencl
1256     openssl
1257     x11grab
1258     zlib
1259 "
1260
1261 DOCUMENT_LIST="
1262     doc
1263     htmlpages
1264     manpages
1265     podpages
1266     txtpages
1267 "
1268
1269 HWACCEL_LIST="
1270     dxva2
1271     vaapi
1272     vda
1273     vdpau
1274 "
1275
1276 LIBRARY_LIST="
1277     avcodec
1278     avdevice
1279     avfilter
1280     avformat
1281     avresample
1282     avutil
1283     postproc
1284     swresample
1285     swscale
1286 "
1287
1288 PROGRAM_LIST="
1289     ffplay
1290     ffprobe
1291     ffserver
1292     ffmpeg
1293 "
1294
1295 CONFIG_LIST="
1296     $COMPONENT_LIST
1297     $DOCUMENT_LIST
1298     $EXAMPLE_LIST
1299     $EXTERNAL_LIBRARY_LIST
1300     $HWACCEL_LIST
1301     $LIBRARY_LIST
1302     $PROGRAM_LIST
1303     dct
1304     dwt
1305     error_resilience
1306     fast_unaligned
1307     fft
1308     ftrapv
1309     gpl
1310     gray
1311     hardcoded_tables
1312     incompatible_libav_abi
1313     incompatible_fork_abi
1314     lsp
1315     lzo
1316     mdct
1317     memalign_hack
1318     memory_poisoning
1319     network
1320     nonfree
1321     pic
1322     rdft
1323     runtime_cpudetect
1324     safe_bitstream_reader
1325     shared
1326     small
1327     sram
1328     static
1329     swscale_alpha
1330     thumb
1331     version3
1332     xmm_clobber_test
1333 "
1334
1335 THREADS_LIST='
1336     pthreads
1337     w32threads
1338     os2threads
1339 '
1340
1341 ATOMICS_LIST='
1342     atomics_gcc
1343     atomics_suncc
1344     atomics_win32
1345 '
1346
1347 ARCH_LIST='
1348     aarch64
1349     alpha
1350     arm
1351     avr32
1352     avr32_ap
1353     avr32_uc
1354     bfin
1355     ia64
1356     m68k
1357     mips
1358     mips64
1359     parisc
1360     ppc
1361     ppc64
1362     s390
1363     sh4
1364     sparc
1365     sparc64
1366     tilegx
1367     tilepro
1368     tomi
1369     x86
1370     x86_32
1371     x86_64
1372 '
1373
1374 ARCH_EXT_LIST_ARM='
1375     armv5te
1376     armv6
1377     armv6t2
1378     neon
1379     vfp
1380     vfpv3
1381 '
1382
1383 ARCH_EXT_LIST_X86='
1384     amd3dnow
1385     amd3dnowext
1386     avx
1387     avx2
1388     fma4
1389     i686
1390     mmx
1391     mmxext
1392     sse
1393     sse2
1394     sse3
1395     sse4
1396     sse42
1397     ssse3
1398 '
1399
1400 ARCH_EXT_LIST="
1401     $ARCH_EXT_LIST_ARM
1402     $ARCH_EXT_LIST_X86
1403     altivec
1404     ppc4xx
1405     vis
1406     mipsfpu
1407     mips32r2
1408     mipsdspr1
1409     mipsdspr2
1410 "
1411
1412 HAVE_LIST_CMDLINE='
1413     inline_asm
1414     symver
1415     yasm
1416 '
1417
1418 HAVE_LIST_PUB='
1419     bigendian
1420     fast_unaligned
1421     incompatible_libav_abi
1422     incompatible_fork_abi
1423 '
1424
1425 MATH_FUNCS="
1426     atanf
1427     atan2f
1428     cbrt
1429     cbrtf
1430     cosf
1431     exp2
1432     exp2f
1433     expf
1434     isinf
1435     isnan
1436     ldexpf
1437     llrint
1438     llrintf
1439     log2
1440     log2f
1441     log10f
1442     lrint
1443     lrintf
1444     powf
1445     rint
1446     round
1447     roundf
1448     sinf
1449     trunc
1450     truncf
1451 "
1452
1453 HAVE_LIST="
1454     $ARCH_EXT_LIST
1455     $(add_suffix _external $ARCH_EXT_LIST)
1456     $(add_suffix _inline   $ARCH_EXT_LIST)
1457     $HAVE_LIST_CMDLINE
1458     $HAVE_LIST_PUB
1459     $THREADS_LIST
1460     $ATOMICS_LIST
1461     $MATH_FUNCS
1462     access
1463     aligned_malloc
1464     aligned_stack
1465     alsa_asoundlib_h
1466     altivec_h
1467     arpa_inet_h
1468     asm_mod_q
1469     asm_mod_y
1470     asm_types_h
1471     atomic_cas_ptr
1472     atomics_native
1473     attribute_may_alias
1474     attribute_packed
1475     cdio_paranoia_h
1476     cdio_paranoia_paranoia_h
1477     CL_cl_h
1478     clock_gettime
1479     closesocket
1480     CommandLineToArgvW
1481     cpunop
1482     CryptGenRandom
1483     dcbzl
1484     dev_bktr_ioctl_bt848_h
1485     dev_bktr_ioctl_meteor_h
1486     dev_ic_bt8xx_h
1487     dev_video_bktr_ioctl_bt848_h
1488     dev_video_meteor_ioctl_meteor_h
1489     direct_h
1490     dlfcn_h
1491     dlopen
1492     dos_paths
1493     dxva_h
1494     ebp_available
1495     ebx_available
1496     fast_64bit
1497     fast_clz
1498     fast_cmov
1499     fcntl
1500     fork
1501     getaddrinfo
1502     gethrtime
1503     getopt
1504     GetProcessAffinityMask
1505     GetProcessMemoryInfo
1506     GetProcessTimes
1507     GetSystemTimeAsFileTime
1508     getrusage
1509     getservbyport
1510     gettimeofday
1511     glob
1512     gnu_as
1513     gnu_windres
1514     gsm_h
1515     ibm_asm
1516     inet_aton
1517     io_h
1518     inline_asm_labels
1519     isatty
1520     jack_port_get_latency_range
1521     kbhit
1522     ldbrx
1523     libdc1394_1
1524     libdc1394_2
1525     local_aligned_16
1526     local_aligned_8
1527     localtime_r
1528     loongson
1529     lzo1x_999_compress
1530     machine_ioctl_bt848_h
1531     machine_ioctl_meteor_h
1532     machine_rw_barrier
1533     makeinfo
1534     malloc_h
1535     MapViewOfFile
1536     memalign
1537     MemoryBarrier
1538     mkstemp
1539     mm_empty
1540     mmap
1541     mprotect
1542     msvcrt
1543     nanosleep
1544     openjpeg_1_5_openjpeg_h
1545     PeekNamedPipe
1546     perl
1547     pod2man
1548     poll_h
1549     posix_memalign
1550     pragma_deprecated
1551     pthread_cancel
1552     rdtsc
1553     rsync_contimeout
1554     sarestart
1555     sched_getaffinity
1556     sdl
1557     SetConsoleTextAttribute
1558     setmode
1559     setrlimit
1560     Sleep
1561     sndio_h
1562     socklen_t
1563     soundcard_h
1564     strerror_r
1565     struct_addrinfo
1566     struct_group_source_req
1567     struct_ip_mreq_source
1568     struct_ipv6_mreq
1569     struct_pollfd
1570     struct_rusage_ru_maxrss
1571     struct_sctp_event_subscribe
1572     struct_sockaddr_in6
1573     struct_sockaddr_sa_len
1574     struct_sockaddr_storage
1575     struct_stat_st_mtim_tv_nsec
1576     struct_v4l2_frmivalenum_discrete
1577     symver_asm_label
1578     symver_gnu_asm
1579     sync_val_compare_and_swap
1580     sysconf
1581     sysctl
1582     sys_mman_h
1583     sys_param_h
1584     sys_resource_h
1585     sys_select_h
1586     sys_soundcard_h
1587     sys_time_h
1588     sys_un_h
1589     sys_videoio_h
1590     termios_h
1591     texi2html
1592     threads
1593     unistd_h
1594     usleep
1595     vdpau_x11
1596     vfp_args
1597     VirtualAlloc
1598     windows_h
1599     winsock2_h
1600     xform_asm
1601     xlib
1602     xmm_clobbers
1603 "
1604
1605 # options emitted with CONFIG_ prefix but not available on the command line
1606 CONFIG_EXTRA="
1607     aandcttables
1608     ac3dsp
1609     audio_frame_queue
1610     dsputil
1611     exif
1612     frame_thread_encoder
1613     gcrypt
1614     golomb
1615     gplv3
1616     h263dsp
1617     h264chroma
1618     h264dsp
1619     h264pred
1620     h264qpel
1621     hpeldsp
1622     huffman
1623     lgplv3
1624     lpc
1625     mpegaudio
1626     mpegaudiodsp
1627     mpegvideo
1628     mpegvideoenc
1629     nettle
1630     rangecoder
1631     riffdec
1632     riffenc
1633     rtpdec
1634     rtpenc_chain
1635     sinewin
1636     videodsp
1637     vp3dsp
1638 "
1639
1640 CMDLINE_SELECT="
1641     $ARCH_EXT_LIST
1642     $CONFIG_LIST
1643     $HAVE_LIST_CMDLINE
1644     $THREADS_LIST
1645     asm
1646     cross_compile
1647     debug
1648     extra_warnings
1649     logging
1650     lto
1651     optimizations
1652     rpath
1653     stripping
1654 "
1655
1656 PATHS_LIST='
1657     bindir
1658     datadir
1659     docdir
1660     incdir
1661     libdir
1662     mandir
1663     prefix
1664     shlibdir
1665 '
1666
1667 CMDLINE_SET="
1668     $PATHS_LIST
1669     ar
1670     arch
1671     as
1672     assert_level
1673     build_suffix
1674     cc
1675     cpu
1676     cross_prefix
1677     cxx
1678     dep_cc
1679     extra_version
1680     host_cc
1681     host_cflags
1682     host_ld
1683     host_ldflags
1684     host_libs
1685     host_os
1686     install
1687     ld
1688     logfile
1689     malloc_prefix
1690     nm
1691     optflags
1692     pkg_config
1693     progs_suffix
1694     random_seed
1695     samples
1696     strip
1697     sysinclude
1698     sysroot
1699     target_exec
1700     target_os
1701     target_path
1702     target_samples
1703     tempprefix
1704     toolchain
1705     valgrind
1706     yasmexe
1707 "
1708
1709 CMDLINE_APPEND="
1710     extra_cflags
1711     extra_cxxflags
1712     host_cppflags
1713 "
1714
1715 # code dependency declarations
1716
1717 # architecture extensions
1718
1719 armv5te_deps="arm"
1720 armv6_deps="arm"
1721 armv6t2_deps="arm"
1722 neon_deps="arm"
1723 vfp_deps="arm"
1724 vfpv3_deps="vfp"
1725
1726 map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM
1727
1728 mipsfpu_deps="mips"
1729 mips32r2_deps="mips"
1730 mipsdspr1_deps="mips"
1731 mipsdspr2_deps="mips"
1732
1733 altivec_deps="ppc"
1734 ppc4xx_deps="ppc"
1735
1736 vis_deps="sparc"
1737
1738 cpunop_deps="i686"
1739 x86_64_select="i686"
1740 x86_64_suggest="fast_cmov"
1741
1742 amd3dnow_deps="mmx"
1743 amd3dnowext_deps="amd3dnow"
1744 mmx_deps="x86"
1745 mmxext_deps="mmx"
1746 sse_deps="mmxext"
1747 sse2_deps="sse"
1748 sse3_deps="sse2"
1749 ssse3_deps="sse3"
1750 sse4_deps="ssse3"
1751 sse42_deps="sse4"
1752 avx_deps="sse42"
1753 fma4_deps="avx"
1754 avx2_deps="avx"
1755
1756 mmx_external_deps="yasm"
1757 mmx_inline_deps="inline_asm"
1758 mmx_suggest="mmx_external mmx_inline"
1759
1760 for ext in $(filter_out mmx $ARCH_EXT_LIST_X86); do
1761     eval dep=\$${ext}_deps
1762     eval ${ext}_external_deps='"${dep}_external"'
1763     eval ${ext}_inline_deps='"${dep}_inline"'
1764     eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
1765 done
1766
1767 aligned_stack_if_any="ppc x86"
1768 fast_64bit_if_any="alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
1769 fast_clz_if_any="alpha avr32 mips ppc x86"
1770 fast_unaligned_if_any="ppc x86"
1771
1772 inline_asm_deps="!tms470"
1773 need_memalign="altivec neon sse"
1774
1775 symver_if_any="symver_asm_label symver_gnu_asm"
1776
1777 log2_deps="!msvcrt"
1778
1779 # subsystems
1780 dct_select="rdft"
1781 error_resilience_select="dsputil"
1782 frame_thread_encoder_deps="encoders threads"
1783 lpc_select="dsputil"
1784 mdct_select="fft"
1785 rdft_select="fft"
1786 mpegaudio_select="mpegaudiodsp"
1787 mpegaudiodsp_select="dct"
1788 mpegvideo_select="dsputil h264chroma hpeldsp videodsp"
1789 mpegvideoenc_select="mpegvideo"
1790
1791 # decoders / encoders
1792 aac_decoder_select="mdct sinewin"
1793 aac_encoder_select="audio_frame_queue mdct sinewin"
1794 aac_latm_decoder_select="aac_decoder aac_latm_parser"
1795 ac3_decoder_select="mdct ac3dsp ac3_parser dsputil"
1796 ac3_encoder_select="mdct ac3dsp dsputil"
1797 ac3_fixed_encoder_select="mdct ac3dsp dsputil"
1798 aic_decoder_select="dsputil golomb"
1799 alac_encoder_select="lpc"
1800 als_decoder_select="dsputil"
1801 amrnb_decoder_select="lsp"
1802 amrwb_decoder_select="lsp"
1803 amv_decoder_select="dsputil hpeldsp exif"
1804 amv_encoder_select="aandcttables"
1805 ape_decoder_select="dsputil"
1806 asv1_decoder_select="dsputil"
1807 asv1_encoder_select="dsputil"
1808 asv2_decoder_select="dsputil"
1809 asv2_encoder_select="dsputil"
1810 atrac1_decoder_select="mdct sinewin"
1811 atrac3_decoder_select="mdct"
1812 avrn_decoder_select="exif"
1813 bink_decoder_select="dsputil hpeldsp"
1814 binkaudio_dct_decoder_select="mdct rdft dct sinewin"
1815 binkaudio_rdft_decoder_select="mdct rdft sinewin"
1816 cavs_decoder_select="dsputil golomb h264chroma videodsp"
1817 cllc_decoder_select="dsputil"
1818 comfortnoise_encoder_select="lpc"
1819 cook_decoder_select="dsputil mdct sinewin"
1820 cscd_decoder_select="lzo"
1821 cscd_decoder_suggest="zlib"
1822 dca_decoder_select="mdct"
1823 dirac_decoder_select="dsputil dwt golomb videodsp"
1824 dnxhd_decoder_select="dsputil"
1825 dnxhd_encoder_select="aandcttables dsputil mpegvideoenc"
1826 dvvideo_decoder_select="dsputil"
1827 dvvideo_encoder_select="dsputil"
1828 dxa_decoder_select="zlib"
1829 eac3_decoder_select="ac3_decoder"
1830 eac3_encoder_select="ac3_encoder"
1831 eamad_decoder_select="aandcttables dsputil mpegvideo"
1832 eatgq_decoder_select="aandcttables"
1833 eatqi_decoder_select="aandcttables error_resilience mpegvideo"
1834 exr_decoder_select="zlib"
1835 ffv1_decoder_select="dsputil golomb rangecoder"
1836 ffv1_encoder_select="dsputil rangecoder"
1837 ffvhuff_decoder_select="dsputil"
1838 ffvhuff_encoder_select="dsputil huffman"
1839 flac_decoder_select="golomb"
1840 flac_encoder_select="dsputil golomb lpc"
1841 flashsv_decoder_select="zlib"
1842 flashsv_encoder_select="zlib"
1843 flashsv2_encoder_select="zlib"
1844 flashsv2_decoder_select="zlib"
1845 flv_decoder_select="h263_decoder"
1846 flv_encoder_select="h263_encoder"
1847 fourxm_decoder_select="dsputil"
1848 fraps_decoder_select="dsputil huffman"
1849 g2m_decoder_select="dsputil zlib"
1850 g729_decoder_select="dsputil"
1851 h261_decoder_select="error_resilience mpegvideo"
1852 h261_encoder_select="aandcttables mpegvideoenc"
1853 h263_decoder_select="error_resilience h263_parser h263dsp mpegvideo"
1854 h263_encoder_select="aandcttables h263dsp mpegvideoenc"
1855 h263i_decoder_select="h263_decoder"
1856 h263p_encoder_select="h263_encoder"
1857 h264_decoder_select="golomb h264chroma h264dsp h264pred h264qpel videodsp"
1858 h264_decoder_suggest="error_resilience"
1859 hevc_decoder_select="dsputil golomb videodsp"
1860 huffyuv_decoder_select="dsputil"
1861 huffyuv_encoder_select="dsputil huffman"
1862 iac_decoder_select="dsputil fft mdct sinewin"
1863 imc_decoder_select="dsputil fft mdct sinewin"
1864 indeo3_decoder_select="hpeldsp"
1865 interplay_video_decoder_select="hpeldsp"
1866 jpegls_decoder_select="dsputil golomb hpeldsp exif"
1867 jpegls_encoder_select="golomb"
1868 jv_decoder_select="dsputil"
1869 lagarith_decoder_select="dsputil"
1870 ljpeg_encoder_select="aandcttables mpegvideoenc"
1871 loco_decoder_select="golomb"
1872 mdec_decoder_select="dsputil error_resilience mpegvideo"
1873 metasound_decoder_select="lsp mdct sinewin"
1874 mimic_decoder_select="dsputil hpeldsp"
1875 mjpeg_decoder_select="dsputil hpeldsp exif"
1876 mjpegb_decoder_select="dsputil hpeldsp exif"
1877 mjpeg_encoder_select="aandcttables dsputil mpegvideoenc"
1878 mlp_decoder_select="dsputil mlp_parser"
1879 motionpixels_decoder_select="dsputil"
1880 mp1_decoder_select="mpegaudio"
1881 mp1float_decoder_select="mpegaudio"
1882 mp2_decoder_select="mpegaudio"
1883 mp2float_decoder_select="mpegaudio"
1884 mp3_decoder_select="mpegaudio"
1885 mp3adu_decoder_select="mpegaudio"
1886 mp3adufloat_decoder_select="mpegaudio"
1887 mp3float_decoder_select="mpegaudio"
1888 mp3on4_decoder_select="mpegaudio"
1889 mp3on4float_decoder_select="mpegaudio"
1890 mpc7_decoder_select="dsputil mpegaudiodsp"
1891 mpc8_decoder_select="dsputil mpegaudiodsp"
1892 mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
1893 mpeg_xvmc_decoder_select="mpeg2video_decoder"
1894 mpeg1video_decoder_select="error_resilience mpegvideo"
1895 mpeg1video_encoder_select="aandcttables mpegvideoenc"
1896 mpeg2video_decoder_select="error_resilience mpegvideo"
1897 mpeg2video_encoder_select="aandcttables mpegvideoenc"
1898 mpeg4_decoder_select="h263_decoder mpeg4video_parser"
1899 mpeg4_encoder_select="h263_encoder"
1900 msmpeg4v1_decoder_select="h263_decoder"
1901 msmpeg4v2_decoder_select="h263_decoder"
1902 msmpeg4v2_encoder_select="h263_encoder"
1903 msmpeg4v3_decoder_select="h263_decoder"
1904 msmpeg4v3_encoder_select="h263_encoder"
1905 mss2_decoder_select="error_resilience vc1_decoder"
1906 mxpeg_decoder_select="dsputil hpeldsp exif"
1907 nellymoser_decoder_select="mdct sinewin"
1908 nellymoser_encoder_select="audio_frame_queue mdct sinewin"
1909 nuv_decoder_select="dsputil lzo"
1910 png_decoder_select="zlib"
1911 png_encoder_select="dsputil zlib"
1912 prores_decoder_select="dsputil"
1913 prores_encoder_select="dsputil"
1914 qcelp_decoder_select="lsp"
1915 qdm2_decoder_select="mdct rdft mpegaudiodsp"
1916 ra_144_encoder_select="audio_frame_queue lpc"
1917 ralf_decoder_select="golomb"
1918 rtjpeg_decoder_select="dsputil"
1919 rv10_decoder_select="error_resilience h263_decoder h263dsp"
1920 rv10_encoder_select="h263_encoder"
1921 rv20_decoder_select="error_resilience h263_decoder h263dsp"
1922 rv20_encoder_select="h263_encoder"
1923 rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpegvideo videodsp"
1924 rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpegvideo videodsp"
1925 shorten_decoder_select="golomb"
1926 sipr_decoder_select="lsp"
1927 snow_decoder_select="dsputil dwt h264qpel hpeldsp rangecoder"
1928 snow_encoder_select="aandcttables dsputil dwt h264qpel hpeldsp mpegvideoenc rangecoder"
1929 sonic_decoder_select="golomb"
1930 sonic_encoder_select="golomb"
1931 sonic_ls_encoder_select="golomb"
1932 sp5x_decoder_select="dsputil hpeldsp exif"
1933 svq1_decoder_select="hpeldsp"
1934 svq1_encoder_select="aandcttables dsputil hpeldsp mpegvideoenc"
1935 svq3_decoder_select="golomb h264chroma h264dsp h264pred h264qpel hpeldsp mpegvideo videodsp"
1936 svq3_decoder_suggest="error_resilience zlib"
1937 tak_decoder_select="dsputil"
1938 theora_decoder_select="vp3_decoder"
1939 tiff_decoder_suggest="zlib"
1940 tiff_encoder_suggest="zlib"
1941 thp_decoder_select="dsputil hpeldsp exif"
1942 truehd_decoder_select="mlp_parser"
1943 truemotion2_decoder_select="dsputil"
1944 truespeech_decoder_select="dsputil"
1945 tscc_decoder_select="zlib"
1946 twinvq_decoder_select="mdct lsp sinewin"
1947 utvideo_decoder_select="dsputil"
1948 utvideo_encoder_select="dsputil huffman"
1949 vble_decoder_select="dsputil"
1950 vc1_decoder_select="error_resilience h263_decoder h264chroma h264qpel"
1951 vc1image_decoder_select="vc1_decoder"
1952 vorbis_decoder_select="mdct"
1953 vorbis_encoder_select="mdct"
1954 vp3_decoder_select="hpeldsp vp3dsp videodsp"
1955 vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp"
1956 vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp"
1957 vp6a_decoder_select="vp6_decoder"
1958 vp6f_decoder_select="vp6_decoder"
1959 vp8_decoder_select="h264pred videodsp"
1960 vp9_decoder_select="videodsp"
1961 webp_decoder_select="vp8_decoder"
1962 wmapro_decoder_select="mdct sinewin"
1963 wmav1_decoder_select="mdct sinewin"
1964 wmav1_encoder_select="mdct sinewin"
1965 wmav2_decoder_select="mdct sinewin"
1966 wmav2_encoder_select="mdct sinewin"
1967 wmavoice_decoder_select="lsp rdft dct mdct sinewin"
1968 wmv1_decoder_select="h263_decoder"
1969 wmv1_encoder_select="h263_encoder"
1970 wmv2_decoder_select="h263_decoder videodsp"
1971 wmv2_encoder_select="h263_encoder"
1972 wmv3_decoder_select="vc1_decoder"
1973 wmv3image_decoder_select="wmv3_decoder"
1974 zerocodec_decoder_select="zlib"
1975 zlib_decoder_select="zlib"
1976 zlib_encoder_select="zlib"
1977 zmbv_decoder_select="zlib"
1978 zmbv_encoder_select="zlib"
1979
1980 # hardware accelerators
1981 crystalhd_deps="libcrystalhd_libcrystalhd_if_h"
1982 dxva2_deps="dxva2api_h"
1983 vaapi_deps="va_va_h"
1984 vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
1985 vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore"
1986 vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"
1987
1988 h263_vaapi_hwaccel_deps="vaapi"
1989 h263_vaapi_hwaccel_select="h263_decoder"
1990 h263_vdpau_hwaccel_deps="vdpau"
1991 h263_vdpau_hwaccel_select="h263_decoder"
1992 h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser"
1993 h264_dxva2_hwaccel_deps="dxva2"
1994 h264_dxva2_hwaccel_select="h264_decoder"
1995 h264_vaapi_hwaccel_deps="vaapi"
1996 h264_vaapi_hwaccel_select="h264_decoder"
1997 h264_vda_decoder_deps="vda"
1998 h264_vda_decoder_select="h264_decoder"
1999 h264_vda_hwaccel_deps="vda"
2000 h264_vda_hwaccel_select="h264_decoder"
2001 h264_vdpau_decoder_deps="vdpau"
2002 h264_vdpau_decoder_select="h264_decoder"
2003 h264_vdpau_hwaccel_deps="vdpau"
2004 h264_vdpau_hwaccel_select="h264_decoder"
2005 mpeg_vdpau_decoder_deps="vdpau"
2006 mpeg_vdpau_decoder_select="mpeg2video_decoder"
2007 mpeg1_vdpau_decoder_deps="vdpau"
2008 mpeg1_vdpau_decoder_select="mpeg1video_decoder"
2009 mpeg1_vdpau_hwaccel_deps="vdpau"
2010 mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
2011 mpeg2_crystalhd_decoder_select="crystalhd"
2012 mpeg2_dxva2_hwaccel_deps="dxva2"
2013 mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
2014 mpeg2_vaapi_hwaccel_deps="vaapi"
2015 mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
2016 mpeg2_vdpau_hwaccel_deps="vdpau"
2017 mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
2018 mpeg4_crystalhd_decoder_select="crystalhd"
2019 mpeg4_vaapi_hwaccel_deps="vaapi"
2020 mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
2021 mpeg4_vdpau_decoder_deps="vdpau"
2022 mpeg4_vdpau_decoder_select="mpeg4_decoder"
2023 mpeg4_vdpau_hwaccel_deps="vdpau"
2024 mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
2025 msmpeg4_crystalhd_decoder_select="crystalhd"
2026 vc1_crystalhd_decoder_select="crystalhd"
2027 vc1_dxva2_hwaccel_deps="dxva2"
2028 vc1_dxva2_hwaccel_select="vc1_decoder"
2029 vc1_vaapi_hwaccel_deps="vaapi"
2030 vc1_vaapi_hwaccel_select="vc1_decoder"
2031 vc1_vdpau_decoder_deps="vdpau"
2032 vc1_vdpau_decoder_select="vc1_decoder"
2033 vc1_vdpau_hwaccel_deps="vdpau"
2034 vc1_vdpau_hwaccel_select="vc1_decoder"
2035 wmv3_crystalhd_decoder_select="crystalhd"
2036 wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
2037 wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
2038 wmv3_vdpau_decoder_select="vc1_vdpau_decoder"
2039 wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
2040
2041 # parsers
2042 h264_parser_select="golomb h264chroma h264dsp h264pred h264qpel videodsp"
2043 hevc_parser_select="hevc_decoder"
2044 mpeg4video_parser_select="error_resilience mpegvideo"
2045 mpegvideo_parser_select="error_resilience mpegvideo"
2046 vc1_parser_select="mpegvideo"
2047
2048 # external libraries
2049 libaacplus_encoder_deps="libaacplus"
2050 libcelt_decoder_deps="libcelt"
2051 libfaac_encoder_deps="libfaac"
2052 libfaac_encoder_select="audio_frame_queue"
2053 libfdk_aac_decoder_deps="libfdk_aac"
2054 libfdk_aac_encoder_deps="libfdk_aac"
2055 libfdk_aac_encoder_select="audio_frame_queue"
2056 libgme_demuxer_deps="libgme"
2057 libgsm_decoder_deps="libgsm"
2058 libgsm_encoder_deps="libgsm"
2059 libgsm_ms_decoder_deps="libgsm"
2060 libgsm_ms_encoder_deps="libgsm"
2061 libilbc_decoder_deps="libilbc"
2062 libilbc_encoder_deps="libilbc"
2063 libmodplug_demuxer_deps="libmodplug"
2064 libmp3lame_encoder_deps="libmp3lame"
2065 libmp3lame_encoder_select="audio_frame_queue"
2066 libopencore_amrnb_decoder_deps="libopencore_amrnb"
2067 libopencore_amrnb_encoder_deps="libopencore_amrnb"
2068 libopencore_amrnb_encoder_select="audio_frame_queue"
2069 libopencore_amrwb_decoder_deps="libopencore_amrwb"
2070 libopenjpeg_decoder_deps="libopenjpeg"
2071 libopenjpeg_encoder_deps="libopenjpeg"
2072 libopus_decoder_deps="libopus"
2073 libopus_encoder_deps="libopus"
2074 libopus_encoder_select="audio_frame_queue"
2075 libquvi_demuxer_deps="libquvi"
2076 libschroedinger_decoder_deps="libschroedinger"
2077 libschroedinger_encoder_deps="libschroedinger"
2078 libshine_encoder_deps="libshine"
2079 libshine_encoder_select="audio_frame_queue"
2080 libspeex_decoder_deps="libspeex"
2081 libspeex_encoder_deps="libspeex"
2082 libspeex_encoder_select="audio_frame_queue"
2083 libstagefright_h264_decoder_deps="libstagefright_h264"
2084 libtheora_encoder_deps="libtheora"
2085 libtwolame_encoder_deps="libtwolame"
2086 libvo_aacenc_encoder_deps="libvo_aacenc"
2087 libvo_aacenc_encoder_select="audio_frame_queue"
2088 libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
2089 libvorbis_decoder_deps="libvorbis"
2090 libvorbis_encoder_deps="libvorbis"
2091 libvorbis_encoder_select="audio_frame_queue"
2092 libvpx_vp8_decoder_deps="libvpx"
2093 libvpx_vp8_encoder_deps="libvpx"
2094 libvpx_vp9_decoder_deps="libvpx"
2095 libvpx_vp9_encoder_deps="libvpx"
2096 libwavpack_encoder_deps="libwavpack"
2097 libx264_encoder_deps="libx264"
2098 libx264rgb_encoder_deps="libx264"
2099 libxavs_encoder_deps="libxavs"
2100 libxvid_encoder_deps="libxvid"
2101 libutvideo_decoder_deps="libutvideo"
2102 libutvideo_encoder_deps="libutvideo"
2103 libzvbi_teletext_decoder_deps="libzvbi"
2104
2105 # demuxers / muxers
2106 ac3_demuxer_select="ac3_parser"
2107 asf_demuxer_select="riffdec"
2108 asf_muxer_select="riffenc"
2109 asf_stream_muxer_select="asf_muxer"
2110 avi_demuxer_select="riffdec"
2111 avi_muxer_select="riffenc"
2112 avisynth_demuxer_deps="avisynth"
2113 avisynth_demuxer_select="riffdec"
2114 caf_demuxer_select="riffdec"
2115 dirac_demuxer_select="dirac_parser"
2116 dts_demuxer_select="dca_parser"
2117 dtshd_demuxer_select="dca_parser"
2118 dxa_demuxer_select="riffdec"
2119 eac3_demuxer_select="ac3_parser"
2120 f4v_muxer_select="mov_muxer"
2121 flac_demuxer_select="flac_parser"
2122 hds_muxer_select="flv_muxer"
2123 hls_muxer_select="mpegts_muxer"
2124 ipod_muxer_select="mov_muxer"
2125 ismv_muxer_select="mov_muxer"
2126 libnut_demuxer_deps="libnut"
2127 libnut_muxer_deps="libnut"
2128 matroska_audio_muxer_select="matroska_muxer"
2129 matroska_demuxer_select="riffdec"
2130 matroska_demuxer_suggest="bzlib lzo zlib"
2131 matroska_muxer_select="riffenc"
2132 mmf_muxer_select="riffenc"
2133 mov_demuxer_select="riffdec"
2134 mov_demuxer_suggest="zlib"
2135 mov_muxer_select="riffenc rtpenc_chain"
2136 mp3_demuxer_select="mpegaudio_parser"
2137 mp4_muxer_select="mov_muxer"
2138 mpegts_muxer_select="adts_muxer latm_muxer"
2139 mpegtsraw_demuxer_select="mpegts_demuxer"
2140 mxf_d10_muxer_select="mxf_muxer"
2141 nut_muxer_select="riffenc"
2142 nuv_demuxer_select="riffdec"
2143 ogg_demuxer_select="golomb"
2144 psp_muxer_select="mov_muxer"
2145 rtp_demuxer_select="sdp_demuxer"
2146 rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
2147 rtsp_demuxer_select="http_protocol rtpdec"
2148 rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
2149 sap_demuxer_select="sdp_demuxer"
2150 sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
2151 sdp_demuxer_select="rtpdec"
2152 smoothstreaming_muxer_select="ismv_muxer"
2153 spdif_muxer_select="aac_parser"
2154 tak_demuxer_select="tak_parser"
2155 tg2_muxer_select="mov_muxer"
2156 tgp_muxer_select="mov_muxer"
2157 vobsub_demuxer_select="mpegps_demuxer"
2158 w64_demuxer_select="wav_demuxer"
2159 w64_muxer_select="wav_muxer"
2160 wav_demuxer_select="riffdec"
2161 wav_muxer_select="riffenc"
2162 webm_muxer_select="riffenc"
2163 wtv_demuxer_select="riffdec"
2164 xmv_demuxer_select="riffdec"
2165 xwma_demuxer_select="riffdec"
2166
2167 # indevs / outdevs
2168 alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
2169 alsa_outdev_deps="alsa_asoundlib_h"
2170 bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
2171 caca_outdev_deps="libcaca"
2172 dshow_indev_deps="IBaseFilter"
2173 dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
2174 dv1394_indev_deps="dv1394"
2175 dv1394_indev_select="dv_demuxer"
2176 fbdev_indev_deps="linux_fb_h"
2177 fbdev_outdev_deps="linux_fb_h"
2178 iec61883_indev_deps="libiec61883"
2179 jack_indev_deps="jack_jack_h sem_timedwait"
2180 lavfi_indev_deps="avfilter"
2181 libcdio_indev_deps="libcdio"
2182 libdc1394_indev_deps="libdc1394"
2183 libv4l2_indev_deps="libv4l2"
2184 openal_indev_deps="openal"
2185 oss_indev_deps_any="soundcard_h sys_soundcard_h"
2186 oss_outdev_deps_any="soundcard_h sys_soundcard_h"
2187 pulse_indev_deps="libpulse"
2188 pulse_outdev_deps="libpulse"
2189 sdl_outdev_deps="sdl"
2190 sndio_indev_deps="sndio_h"
2191 sndio_outdev_deps="sndio_h"
2192 v4l_indev_deps="linux_videodev_h"
2193 v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
2194 v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h"
2195 vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
2196 vfwcap_indev_extralibs="-lavicap32"
2197 xv_outdev_deps="X11_extensions_Xvlib_h XvGetPortAttribute"
2198 xv_outdev_extralibs="-lXv -lX11 -lXext"
2199 x11grab_indev_deps="x11grab"
2200
2201 # protocols
2202 bluray_protocol_deps="libbluray"
2203 ffrtmpcrypt_protocol_deps="!librtmp_protocol"
2204 ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
2205 ffrtmpcrypt_protocol_select="tcp_protocol"
2206 ffrtmphttp_protocol_deps="!librtmp_protocol"
2207 ffrtmphttp_protocol_select="http_protocol"
2208 ftp_protocol_select="tcp_protocol"
2209 gopher_protocol_select="network"
2210 httpproxy_protocol_select="tcp_protocol"
2211 http_protocol_select="tcp_protocol"
2212 https_protocol_select="tls_protocol"
2213 librtmp_protocol_deps="librtmp"
2214 librtmpe_protocol_deps="librtmp"
2215 librtmps_protocol_deps="librtmp"
2216 librtmpt_protocol_deps="librtmp"
2217 librtmpte_protocol_deps="librtmp"
2218 libssh_protocol_deps="libssh"
2219 mmsh_protocol_select="http_protocol"
2220 mmst_protocol_select="network"
2221 rtmp_protocol_deps="!librtmp_protocol"
2222 rtmp_protocol_select="tcp_protocol"
2223 rtmpe_protocol_select="ffrtmpcrypt_protocol"
2224 rtmps_protocol_deps="!librtmp_protocol"
2225 rtmps_protocol_select="tls_protocol"
2226 rtmpt_protocol_select="ffrtmphttp_protocol"
2227 rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2228 rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2229 rtp_protocol_select="udp_protocol"
2230 sctp_protocol_deps="struct_sctp_event_subscribe"
2231 sctp_protocol_select="network"
2232 srtp_protocol_select="rtp_protocol"
2233 tcp_protocol_select="network"
2234 tls_protocol_deps_any="openssl gnutls"
2235 tls_protocol_select="tcp_protocol"
2236 udp_protocol_select="network"
2237 unix_protocol_deps="sys_un_h"
2238 unix_protocol_select="network"
2239
2240 # filters
2241 aconvert_filter_deps="swresample"
2242 amovie_filter_deps="avcodec avformat"
2243 aresample_filter_deps="swresample"
2244 ass_filter_deps="libass"
2245 asyncts_filter_deps="avresample"
2246 atempo_filter_deps="avcodec"
2247 atempo_filter_select="rdft"
2248 azmq_filter_deps="libzmq"
2249 blackframe_filter_deps="gpl"
2250 boxblur_filter_deps="gpl"
2251 colormatrix_filter_deps="gpl"
2252 cropdetect_filter_deps="gpl"
2253 dctdnoiz_filter_deps="avcodec"
2254 dctdnoiz_filter_select="fft"
2255 delogo_filter_deps="gpl"
2256 deshake_filter_deps="avcodec"
2257 deshake_filter_select="dsputil"
2258 drawtext_filter_deps="libfreetype"
2259 ebur128_filter_deps="gpl"
2260 flite_filter_deps="libflite"
2261 frei0r_filter_deps="frei0r dlopen"
2262 frei0r_filter_extralibs='$ldl'
2263 frei0r_src_filter_deps="frei0r dlopen"
2264 frei0r_src_filter_extralibs='$ldl'
2265 geq_filter_deps="gpl"
2266 histeq_filter_deps="gpl"
2267 hqdn3d_filter_deps="gpl"
2268 interlace_filter_deps="gpl"
2269 kerndeint_filter_deps="gpl"
2270 ladspa_filter_deps="ladspa dlopen"
2271 mcdeint_filter_deps="avcodec gpl"
2272 movie_filter_deps="avcodec avformat"
2273 mp_filter_deps="gpl avcodec swscale inline_asm"
2274 mpdecimate_filter_deps="gpl avcodec"
2275 mptestsrc_filter_deps="gpl"
2276 negate_filter_deps="lut_filter"
2277 perspective_filter_deps="gpl"
2278 resample_filter_deps="avresample"
2279 ocv_filter_deps="libopencv"
2280 owdenoise_filter_deps="gpl"
2281 pan_filter_deps="swresample"
2282 phase_filter_deps="gpl"
2283 pp_filter_deps="gpl postproc"
2284 pullup_filter_deps="gpl"
2285 removelogo_filter_deps="avcodec avformat swscale"
2286 sab_filter_deps="gpl swscale"
2287 scale_filter_deps="swscale"
2288 smartblur_filter_deps="gpl swscale"
2289 showspectrum_filter_deps="avcodec"
2290 showspectrum_filter_select="rdft"
2291 spp_filter_deps="gpl avcodec"
2292 spp_filter_select="fft"
2293 stereo3d_filter_deps="gpl"
2294 subtitles_filter_deps="avformat avcodec libass"
2295 super2xsai_filter_deps="gpl"
2296 tinterlace_filter_deps="gpl"
2297 vidstabdetect_filter_deps="libvidstab"
2298 vidstabtransform_filter_deps="libvidstab"
2299 yadif_filter_deps="gpl"
2300 pixfmts_super2xsai_test_deps="super2xsai_filter"
2301 tinterlace_merge_test_deps="tinterlace_filter"
2302 tinterlace_pad_test_deps="tinterlace_filter"
2303 zmq_filter_deps="libzmq"
2304
2305 # examples
2306 decoding_encoding_example_deps="avcodec avutil"
2307 demuxing_decoding_example_deps="avcodec avformat avutil"
2308 filtering_audio_example_deps="avfilter avcodec avformat avutil"
2309 filtering_video_example_deps="avfilter avcodec avformat avutil"
2310 metadata_example_deps="avformat avutil"
2311 muxing_example_deps="avcodec avformat avutil swscale"
2312 resampling_audio_example_deps="avutil swresample"
2313 scaling_video_example_deps="avutil swscale"
2314 transcode_aac_example_deps="avcodec avformat swresample"
2315
2316 # libraries
2317 avcodec_deps="avutil"
2318 avdevice_deps="avutil avcodec avformat"
2319 avfilter_deps="avutil"
2320 avformat_deps="avutil avcodec"
2321 avresample_deps="avutil"
2322 postproc_deps="avutil gpl"
2323 swscale_deps="avutil"
2324
2325 # programs
2326 ffmpeg_deps="avcodec avfilter avformat swresample"
2327 ffmpeg_select="aformat_filter anull_filter atrim_filter format_filter
2328                null_filter
2329                setpts_filter trim_filter"
2330 ffplay_deps="avcodec avformat swscale swresample sdl"
2331 ffplay_select="rdft crop_filter"
2332 ffprobe_deps="avcodec avformat"
2333 ffserver_deps="avformat fork sarestart"
2334 ffserver_select="ffm_muxer rtp_protocol rtsp_demuxer"
2335 ffserver_extralibs='$ldl'
2336
2337 # documentation
2338 podpages_deps="perl"
2339 manpages_deps="perl pod2man"
2340 htmlpages_deps="texi2html"
2341 txtpages_deps="makeinfo"
2342 doc_deps_any="manpages htmlpages podpages txtpages"
2343
2344 # default parameters
2345
2346 logfile="config.log"
2347
2348 # installation paths
2349 prefix_default="/usr/local"
2350 bindir_default='${prefix}/bin'
2351 datadir_default='${prefix}/share/ffmpeg'
2352 docdir_default='${prefix}/share/doc/ffmpeg'
2353 incdir_default='${prefix}/include'
2354 libdir_default='${prefix}/lib'
2355 mandir_default='${prefix}/share/man'
2356 shlibdir_default="$libdir_default"
2357
2358 # toolchain
2359 ar_default="ar"
2360 cc_default="gcc"
2361 cxx_default="g++"
2362 host_cc_default="gcc"
2363 cp_f="cp -f"
2364 install="install"
2365 ln_s="ln -s -f"
2366 nm_default="nm -g"
2367 objformat="elf"
2368 pkg_config_default=pkg-config
2369 ranlib="ranlib"
2370 strip_default="strip"
2371 yasmexe_default="yasm"
2372 windres_default="windres"
2373
2374 nogas=":"
2375
2376 # machine
2377 arch_default=$(uname -m)
2378 cpu="generic"
2379
2380 # OS
2381 target_os_default=$(tolower $(uname -s))
2382 host_os=$target_os_default
2383
2384 # configurable options
2385 enable $PROGRAM_LIST
2386 enable $DOCUMENT_LIST
2387 enable $EXAMPLE_LIST
2388 enable $(filter_out avresample $LIBRARY_LIST)
2389 enable stripping
2390
2391 enable asm
2392 enable debug
2393 enable doc
2394 enable optimizations
2395 enable runtime_cpudetect
2396 enable safe_bitstream_reader
2397 enable static
2398 enable swscale_alpha
2399
2400 # Enable hwaccels by default.
2401 enable dxva2 vaapi vdpau
2402
2403 # build settings
2404 SHFLAGS='-shared -Wl,-soname,$$(@F)'
2405 LIBPREF="lib"
2406 LIBSUF=".a"
2407 FULLNAME='$(NAME)$(BUILDSUF)'
2408 LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
2409 SLIBPREF="lib"
2410 SLIBSUF=".so"
2411 SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
2412 SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
2413 SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
2414 LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2415 SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
2416 SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2417
2418 asflags_filter=echo
2419 cflags_filter=echo
2420 ldflags_filter=echo
2421
2422 AS_C='-c'
2423 AS_O='-o $@'
2424 CC_C='-c'
2425 CC_E='-E -o $@'
2426 CC_O='-o $@'
2427 CXX_C='-c'
2428 CXX_O='-o $@'
2429 LD_O='-o $@'
2430 LD_LIB='-l%'
2431 LD_PATH='-L'
2432 HOSTCC_C='-c'
2433 HOSTCC_O='-o $@'
2434 HOSTLD_O='-o $@'
2435
2436 host_cflags='-O3 -g'
2437 host_cppflags='-D_ISOC99_SOURCE -D_XOPEN_SOURCE=600'
2438 host_libs='-lm'
2439 host_cflags_filter=echo
2440 host_ldflags_filter=echo
2441
2442 target_path='$(CURDIR)'
2443
2444 # since the object filename is not given with the -MM flag, the compiler
2445 # is only able to print the basename, and we must add the path ourselves
2446 DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
2447 DEPFLAGS='-MM'
2448
2449 # find source path
2450 if test -f configure; then
2451     source_path=.
2452 else
2453     source_path=$(cd $(dirname "$0"); pwd)
2454     echo "$source_path" | grep -q '[[:blank:]]' &&
2455         die "Out of tree builds are impossible with whitespace in source path."
2456     test -e "$source_path/config.h" &&
2457         die "Out of tree builds are impossible with config.h in source dir."
2458 fi
2459
2460 for v in "$@"; do
2461     r=${v#*=}
2462     l=${v%"$r"}
2463     r=$(sh_quote "$r")
2464     FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}"
2465 done
2466
2467 find_things(){
2468     thing=$1
2469     pattern=$2
2470     file=$source_path/$3
2471     sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2472 }
2473
2474 ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
2475 DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2476 HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
2477 PARSER_LIST=$(find_things   parser   PARSER   libavcodec/allcodecs.c)
2478 BSF_LIST=$(find_things      bsf      BSF      libavcodec/allcodecs.c)
2479 MUXER_LIST=$(find_things    muxer    _MUX     libavformat/allformats.c)
2480 DEMUXER_LIST=$(find_things  demuxer  DEMUX    libavformat/allformats.c)
2481 OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
2482 INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2483 PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
2484 FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2485
2486 ALL_COMPONENTS="
2487     $BSF_LIST
2488     $DECODER_LIST
2489     $DEMUXER_LIST
2490     $ENCODER_LIST
2491     $FILTER_LIST
2492     $HWACCEL_LIST
2493     $INDEV_LIST
2494     $MUXER_LIST
2495     $OUTDEV_LIST
2496     $PARSER_LIST
2497     $PROTOCOL_LIST
2498 "
2499
2500 for n in $COMPONENT_LIST; do
2501     v=$(toupper ${n%s})_LIST
2502     eval enable \$$v
2503     eval ${n}_if_any="\$$v"
2504 done
2505
2506 enable $ARCH_EXT_LIST
2507
2508 die_unknown(){
2509     echo "Unknown option \"$1\"."
2510     echo "See $0 --help for available options."
2511     exit 1
2512 }
2513
2514 print_3_columns() {
2515     cat | tr ' ' '\n' | sort | pr -r -3 -t
2516 }
2517
2518 show_list() {
2519     suffix=_$1
2520     shift
2521     echo $* | sed s/$suffix//g | print_3_columns
2522     exit 0
2523 }
2524
2525 rand_list(){
2526     IFS=', '
2527     set -- $*
2528     unset IFS
2529     for thing; do
2530         comp=${thing%:*}
2531         prob=${thing#$comp}
2532         prob=${prob#:}
2533         is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
2534         echo "prob ${prob:-0.5}"
2535         printf '%s\n' $comp
2536     done
2537 }
2538
2539 do_random(){
2540     action=$1
2541     shift
2542     random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
2543     $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
2544 }
2545
2546 for opt do
2547     optval="${opt#*=}"
2548     case "$opt" in
2549         --extra-ldflags=*)
2550             add_ldflags $optval
2551         ;;
2552         --extra-libs=*)
2553             add_extralibs $optval
2554         ;;
2555         --disable-devices)
2556             disable $INDEV_LIST $OUTDEV_LIST
2557         ;;
2558         --enable-debug=*)
2559             debuglevel="$optval"
2560         ;;
2561         --disable-programs)
2562             disable $PROGRAM_LIST
2563         ;;
2564         --disable-everything)
2565             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2566         ;;
2567         --disable-all)
2568             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2569             disable $LIBRARY_LIST $PROGRAM_LIST doc
2570         ;;
2571         --enable-random|--disable-random)
2572             action=${opt%%-random}
2573             do_random ${action#--} $COMPONENT_LIST
2574         ;;
2575         --enable-random=*|--disable-random=*)
2576             action=${opt%%-random=*}
2577             do_random ${action#--} $optval
2578         ;;
2579         --enable-*=*|--disable-*=*)
2580             eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
2581             is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
2582             eval list=\$$(toupper $thing)_LIST
2583             name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
2584             list=$(filter "$name" $list)
2585             [ "$list" = "" ] && warn "Option $opt did not match anything"
2586             $action $list
2587         ;;
2588         --enable-?*|--disable-?*)
2589             eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
2590             if is_in $option $COMPONENT_LIST; then
2591                 test $action = disable && action=unset
2592                 eval $action \$$(toupper ${option%s})_LIST
2593             elif is_in $option $CMDLINE_SELECT; then
2594                 $action $option
2595             else
2596                 die_unknown $opt
2597             fi
2598         ;;
2599         --list-*)
2600             NAME="${opt#--list-}"
2601             is_in $NAME $COMPONENT_LIST || die_unknown $opt
2602             NAME=${NAME%s}
2603             eval show_list $NAME \$$(toupper $NAME)_LIST
2604         ;;
2605         --help|-h) show_help
2606         ;;
2607         --fatal-warnings) enable fatal_warnings
2608         ;;
2609         *)
2610             optname="${opt%%=*}"
2611             optname="${optname#--}"
2612             optname=$(echo "$optname" | sed 's/-/_/g')
2613             if is_in $optname $CMDLINE_SET; then
2614                 eval $optname='$optval'
2615             elif is_in $optname $CMDLINE_APPEND; then
2616                 append $optname "$optval"
2617             else
2618                 die_unknown $opt
2619             fi
2620         ;;
2621     esac
2622 done
2623
2624 disabled logging && logfile=/dev/null
2625
2626 echo "# $0 $FFMPEG_CONFIGURATION" > $logfile
2627 set >> $logfile
2628
2629 test -n "$cross_prefix" && enable cross_compile
2630
2631 if enabled cross_compile; then
2632     test -n "$arch" && test -n "$target_os" ||
2633         die "Must specify target arch and OS when cross-compiling"
2634 fi
2635
2636 ar_default="${cross_prefix}${ar_default}"
2637 cc_default="${cross_prefix}${cc_default}"
2638 cxx_default="${cross_prefix}${cxx_default}"
2639 nm_default="${cross_prefix}${nm_default}"
2640 pkg_config_default="${cross_prefix}${pkg_config_default}"
2641 ranlib="${cross_prefix}${ranlib}"
2642 strip_default="${cross_prefix}${strip_default}"
2643 windres_default="${cross_prefix}${windres_default}"
2644
2645 sysinclude_default="${sysroot}/usr/include"
2646
2647 test -n "$valgrind" && toolchain="valgrind-memcheck"
2648
2649 case "$toolchain" in
2650     clang-asan)
2651         cc_default="clang"
2652         add_cflags  -fsanitize=address
2653         add_ldflags -fsanitize=address
2654     ;;
2655     clang-tsan)
2656         cc_default="clang"
2657         add_cflags  -fsanitize=thread -pie
2658         add_ldflags -fsanitize=thread -pie
2659     ;;
2660     gcc-asan)
2661         cc_default="gcc"
2662         add_cflags  -fsanitize=address
2663         add_ldflags -fsanitize=address
2664     ;;
2665     gcc-tsan)
2666         cc_default="gcc"
2667         add_cflags  -fsanitize=thread -pie -fPIC
2668         add_ldflags -fsanitize=thread -pie -fPIC
2669     ;;
2670     valgrind-massif)
2671         target_exec_default=${valgrind:-"valgrind"}
2672         target_exec_args="--tool=massif --alloc-fn=av_malloc --alloc-fn=av_mallocz --alloc-fn=av_calloc --alloc-fn=av_fast_padded_malloc --alloc-fn=av_fast_malloc --alloc-fn=av_realloc_f --alloc-fn=av_fast_realloc --alloc-fn=av_realloc"
2673     ;;
2674     valgrind-memcheck)
2675         target_exec_default=${valgrind:-"valgrind"}
2676         target_exec_args="--error-exitcode=1 --malloc-fill=0x2a --track-origins=yes --leak-check=full --gen-suppressions=all --suppressions=$source_path/tests/fate-valgrind.supp"
2677     ;;
2678     msvc)
2679         # Check whether the current MSVC version needs the C99 converter.
2680         # From MSVC 2013 (compiler major version 18) onwards, it does actually
2681         # support enough of C99 to build ffmpeg. Default to the new
2682         # behaviour if the regexp was unable to match anything, since this
2683         # successfully parses the version number of existing supported
2684         # versions that require the converter (MSVC 2010 and 2012).
2685         cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
2686         if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
2687             cc_default="cl"
2688         else
2689             cc_default="c99wrap cl"
2690         fi
2691         ld_default="link"
2692         nm_default="dumpbin -symbols"
2693         ar_default="lib"
2694         target_os_default="win32"
2695         # Use a relative path for TMPDIR. This makes sure all the
2696         # ffconf temp files are written with a relative path, avoiding
2697         # issues with msys/win32 path conversion for MSVC parameters
2698         # such as -Fo<file> or -out:<file>.
2699         TMPDIR=.
2700     ;;
2701     icl)
2702         cc_default="icl"
2703         ld_default="xilink"
2704         nm_default="dumpbin -symbols"
2705         ar_default="xilib"
2706         target_os_default="win32"
2707         TMPDIR=.
2708     ;;
2709     gcov)
2710         add_cflags  -fprofile-arcs -ftest-coverage
2711         add_ldflags -fprofile-arcs -ftest-coverage
2712     ;;
2713     hardened)
2714         add_cflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all
2715         add_ldflags -Wl,-z,relro -Wl,-z,now
2716     ;;
2717     ?*)
2718         die "Unknown toolchain $toolchain"
2719     ;;
2720 esac
2721
2722 set_default arch cc cxx pkg_config strip sysinclude target_exec target_os yasmexe
2723 enabled cross_compile || host_cc_default=$cc
2724 set_default host_cc
2725
2726 if ! $pkg_config --version >/dev/null 2>&1; then
2727     warn "$pkg_config not found, library detection may fail."
2728     pkg_config=false
2729 fi
2730
2731 exesuf() {
2732     case $1 in
2733         mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
2734     esac
2735 }
2736
2737 EXESUF=$(exesuf $target_os)
2738 HOSTEXESUF=$(exesuf $host_os)
2739
2740 # set temporary file name
2741 : ${TMPDIR:=$TEMPDIR}
2742 : ${TMPDIR:=$TMP}
2743 : ${TMPDIR:=/tmp}
2744
2745 if [ -n "$tempprefix" ] ; then
2746     mktemp(){
2747         echo $tempprefix.${HOSTNAME}.${UID}
2748     }
2749 elif ! check_cmd mktemp -u XXXXXX; then
2750     # simple replacement for missing mktemp
2751     # NOT SAFE FOR GENERAL USE
2752     mktemp(){
2753         echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
2754     }
2755 fi
2756
2757 tmpfile(){
2758     tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
2759         (set -C; exec > $tmp) 2>/dev/null ||
2760         die "Unable to create temporary file in $TMPDIR."
2761     append TMPFILES $tmp
2762     eval $1=$tmp
2763 }
2764
2765 trap 'rm -f -- $TMPFILES' EXIT
2766
2767 tmpfile TMPASM .asm
2768 tmpfile TMPC   .c
2769 tmpfile TMPCPP .cpp
2770 tmpfile TMPE   $EXESUF
2771 tmpfile TMPH   .h
2772 tmpfile TMPO   .o
2773 tmpfile TMPS   .S
2774 tmpfile TMPSH  .sh
2775 tmpfile TMPV   .ver
2776
2777 unset -f mktemp
2778
2779 chmod +x $TMPE
2780
2781 # make sure we can execute files in $TMPDIR
2782 cat > $TMPSH 2>> $logfile <<EOF
2783 #! /bin/sh
2784 EOF
2785 chmod +x $TMPSH >> $logfile 2>&1
2786 if ! $TMPSH >> $logfile 2>&1; then
2787     cat <<EOF
2788 Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
2789 variable to another directory and make sure that it is not mounted noexec.
2790 EOF
2791     die "Sanity test failed."
2792 fi
2793
2794 ccc_flags(){
2795     for flag; do
2796         case $flag in
2797             -std=c99)           echo -c99                       ;;
2798             -mcpu=*)            echo -arch ${flag#*=}           ;;
2799             -mieee)             echo -ieee                      ;;
2800             -O*|-fast)          echo $flag                      ;;
2801             -fno-math-errno)    echo -assume nomath_errno       ;;
2802             -g)                 echo -g3                        ;;
2803             -Wall)              echo -msg_enable level2         ;;
2804             -Wno-pointer-sign)  echo -msg_disable ptrmismatch1  ;;
2805             -Wl,*)              echo $flag                      ;;
2806             -f*|-W*)                                            ;;
2807             *)                  echo $flag                      ;;
2808         esac
2809    done
2810 }
2811
2812 cparser_flags(){
2813     for flag; do
2814         case $flag in
2815             -Wno-switch)             echo -Wno-switch-enum ;;
2816             -Wno-format-zero-length) ;;
2817             -Wdisabled-optimization) ;;
2818             -Wno-pointer-sign)       echo -Wno-other ;;
2819             *)                       echo $flag ;;
2820         esac
2821     done
2822 }
2823
2824 msvc_common_flags(){
2825     for flag; do
2826         case $flag in
2827             # In addition to specifying certain flags under the compiler
2828             # specific filters, they must be specified here as well or else the
2829             # generic catch all at the bottom will print the original flag.
2830             -Wall)                ;;
2831             -std=c99)             ;;
2832             # Common flags
2833             -fomit-frame-pointer) ;;
2834             -g)                   echo -Z7 ;;
2835             -fno-math-errno)      ;;
2836             -fno-common)          ;;
2837             -fno-signed-zeros)    ;;
2838             -fPIC)                ;;
2839             -mthumb)              ;;
2840             -march=*)             ;;
2841             -lz)                  echo zlib.lib ;;
2842             -lavifil32)           echo vfw32.lib ;;
2843             -lavicap32)           echo vfw32.lib user32.lib ;;
2844             -l*)                  echo ${flag#-l}.lib ;;
2845             *)                    echo $flag ;;
2846         esac
2847     done
2848 }
2849
2850 msvc_flags(){
2851     msvc_common_flags "$@"
2852     for flag; do
2853         case $flag in
2854             -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
2855                                        -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
2856                                        -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
2857                                        -wd4554 \
2858                                        -wd4273 ;;
2859         esac
2860     done
2861 }
2862
2863 icl_flags(){
2864     msvc_common_flags "$@"
2865     for flag; do
2866         case $flag in
2867             # Despite what Intel's documentation says -Wall, which is supported
2868             # on Windows, does enable remarks so disable them here.
2869             -Wall)                echo $flag -Qdiag-disable:remark ;;
2870             -std=c99)             echo -Qstd=c99 ;;
2871         esac
2872     done
2873 }
2874
2875 pgi_flags(){
2876     for flag; do
2877         case $flag in
2878             -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
2879             -fomit-frame-pointer) echo -Mnoframe ;;
2880             -g)                   echo -gopt ;;
2881             *)                    echo $flag ;;
2882         esac
2883     done
2884 }
2885
2886 suncc_flags(){
2887     for flag; do
2888         case $flag in
2889             -march=*|-mcpu=*)
2890                 case "${flag#*=}" in
2891                     native)                   echo -xtarget=native       ;;
2892                     v9|niagara)               echo -xarch=sparc          ;;
2893                     ultrasparc)               echo -xarch=sparcvis       ;;
2894                     ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
2895                     i586|pentium)             echo -xchip=pentium        ;;
2896                     i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
2897                     pentium3*|c3-2)           echo -xtarget=pentium3     ;;
2898                     pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
2899                     pentium4*)          echo -xtarget=pentium4           ;;
2900                     prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
2901                     *-sse3)             echo -xarch=sse3                 ;;
2902                     core2)              echo -xarch=ssse3 -xchip=core2   ;;
2903                     corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
2904                     corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
2905                     amdfam10|barcelona)        echo -xtarget=barcelona   ;;
2906                     bdver*)                    echo -xarch=avx           ;;
2907                     athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
2908                     k8|opteron|athlon64|athlon-fx)
2909                                                echo -xarch=sse2a         ;;
2910                     athlon*)                   echo -xarch=pentium_proa  ;;
2911                 esac
2912                 ;;
2913             -std=c99)             echo -xc99              ;;
2914             -fomit-frame-pointer) echo -xregs=frameptr    ;;
2915             -fPIC)                echo -KPIC -xcode=pic32 ;;
2916             -W*,*)                echo $flag              ;;
2917             -f*-*|-W*|-mimpure-text)                      ;;
2918             -shared)              echo -G                 ;;
2919             *)                    echo $flag              ;;
2920         esac
2921     done
2922 }
2923
2924 tms470_flags(){
2925     for flag; do
2926         case $flag in
2927             -march=*|-mcpu=*)
2928                 case "${flag#*=}" in
2929                     armv7-a|cortex-a*)      echo -mv=7a8 ;;
2930                     armv7-r|cortex-r*)      echo -mv=7r4 ;;
2931                     armv7-m|cortex-m*)      echo -mv=7m3 ;;
2932                     armv6*|arm11*)          echo -mv=6   ;;
2933                     armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26])
2934                                             echo -mv=5e  ;;
2935                     armv4*|arm7*|arm9[24]*) echo -mv=4   ;;
2936                 esac
2937                 ;;
2938             -mfpu=neon)     echo --float_support=vfpv3 --neon ;;
2939             -mfpu=vfp)      echo --float_support=vfpv2        ;;
2940             -mfpu=vfpv3)    echo --float_support=vfpv3        ;;
2941             -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
2942             -msoft-float)   echo --float_support=vfplib       ;;
2943             -O[0-3]|-mf=*)  echo $flag                        ;;
2944             -g)             echo -g -mn                       ;;
2945             -pds=*)         echo $flag                        ;;
2946             -D*|-I*)        echo $flag                        ;;
2947             --gcc|--abi=*)  echo $flag                        ;;
2948             -me)            echo $flag                        ;;
2949         esac
2950     done
2951 }
2952
2953 probe_cc(){
2954     pfx=$1
2955     _cc=$2
2956
2957     unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
2958     unset _ld_o _ldflags _ld_lib _ld_path
2959     unset _depflags _DEPCMD _DEPFLAGS
2960     _flags_filter=echo
2961
2962     if $_cc --version 2>&1 | grep -q '^GNU assembler'; then
2963         true # no-op to avoid reading stdin in following checks
2964     elif $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
2965         _type=llvm_gcc
2966         gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)')
2967         _ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver"
2968         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2969         _cflags_speed='-O3'
2970         _cflags_size='-Os'
2971     elif $_cc -v 2>&1 | grep -qi ^gcc; then
2972         _type=gcc
2973         gcc_version=$($_cc --version | head -n1)
2974         gcc_basever=$($_cc -dumpversion)
2975         gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
2976         gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
2977         _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
2978         if ! $_cc -dumpversion | grep -q '^2\.'; then
2979             _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2980         fi
2981         _cflags_speed='-O3'
2982         _cflags_size='-Os'
2983     elif $_cc --version 2>/dev/null | grep -q ^icc; then
2984         _type=icc
2985         _ident=$($_cc --version | head -n1)
2986         _depflags='-MMD'
2987         _cflags_speed='-O3'
2988         _cflags_size='-Os'
2989         _cflags_noopt='-O1'
2990     elif $_cc -v 2>&1 | grep -q xlc; then
2991         _type=xlc
2992         _ident=$($_cc -qversion 2>/dev/null | head -n1)
2993         _cflags_speed='-O5'
2994         _cflags_size='-O5 -qcompact'
2995     elif $_cc -V 2>/dev/null | grep -q Compaq; then
2996         _type=ccc
2997         _ident=$($_cc -V | head -n1 | cut -d' ' -f1-3)
2998         _DEPFLAGS='-M'
2999         _cflags_speed='-fast'
3000         _cflags_size='-O1'
3001         _flags_filter=ccc_flags
3002     elif $_cc --vsn 2>/dev/null | grep -q "ARM C/C++ Compiler"; then
3003         test -d "$sysroot" || die "No valid sysroot specified."
3004         _type=armcc
3005         _ident=$($_cc --vsn | head -n1)
3006         armcc_conf="$PWD/armcc.conf"
3007         $_cc --arm_linux_configure                 \
3008              --arm_linux_config_file="$armcc_conf" \
3009              --configure_sysroot="$sysroot"        \
3010              --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
3011              die "Error creating armcc configuration file."
3012         $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
3013         _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
3014         as_default="${cross_prefix}gcc"
3015         _depflags='-MMD'
3016         _cflags_speed='-O3'
3017         _cflags_size='-Os'
3018     elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
3019         _type=tms470
3020         _ident=$($_cc -version | head -n1 | tr -s ' ')
3021         _flags='--gcc --abi=eabi -me'
3022         _cc_e='-ppl -fe=$@'
3023         _cc_o='-fe=$@'
3024         _depflags='-ppa -ppd=$(@:.o=.d)'
3025         _cflags_speed='-O3 -mf=5'
3026         _cflags_size='-O3 -mf=2'
3027         _flags_filter=tms470_flags
3028     elif $_cc -v 2>&1 | grep -q clang; then
3029         _type=clang
3030         _ident=$($_cc --version | head -n1)
3031         _depflags='-MMD'
3032         _cflags_speed='-O3'
3033         _cflags_size='-Os'
3034     elif $_cc -V 2>&1 | grep -q Sun; then
3035         _type=suncc
3036         _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
3037         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
3038         _DEPFLAGS='-xM1 -xc99'
3039         _ldflags='-std=c99'
3040         _cflags_speed='-O5'
3041         _cflags_size='-O5 -xspace'
3042         _flags_filter=suncc_flags
3043     elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
3044         _type=pathscale
3045         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
3046         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
3047         _cflags_speed='-O2'
3048         _cflags_size='-Os'
3049         _flags_filter='filter_out -Wdisabled-optimization'
3050     elif $_cc -v 2>&1 | grep -q Open64; then
3051         _type=open64
3052         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
3053         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
3054         _cflags_speed='-O2'
3055         _cflags_size='-Os'
3056         _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
3057     elif $_cc -V 2>&1 | grep -q Portland; then
3058         _type=pgi
3059         _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')"
3060         opt_common='-alias=ansi -Mdse -Mlre -Mpre'
3061         _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
3062         _cflags_size="-O2 -Munroll=c:1 $opt_common"
3063         _cflags_noopt="-O"
3064         _flags_filter=pgi_flags
3065     elif $_cc 2>&1 | grep -q Microsoft; then
3066         _type=msvc
3067         _ident=$($cc 2>&1 | head -n1)
3068         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
3069         _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
3070         _cflags_speed="-O2"
3071         _cflags_size="-O1"
3072         if $_cc 2>&1 | grep -q Linker; then
3073             _ld_o='-out:$@'
3074         else
3075             _ld_o='-Fe$@'
3076         fi
3077         _cc_o='-Fo$@'
3078         _cc_e='-P -Fi$@'
3079         _flags_filter=msvc_flags
3080         _ld_lib='lib%.a'
3081         _ld_path='-libpath:'
3082         _flags='-nologo'
3083         _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
3084         if [ $pfx = hostcc ]; then
3085             append _cflags -Dsnprintf=_snprintf
3086         fi
3087         disable stripping
3088     elif $_cc 2>&1 | grep -q Intel; then
3089         _type=icl
3090         _ident=$($cc 2>&1 | head -n1)
3091         _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
3092         # Not only is O3 broken on 13.x+ but it is slower on all previous
3093         # versions (tested) as well.
3094         _cflags_speed="-O2"
3095         _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
3096         if $_cc 2>&1 | grep -q Linker; then
3097             _ld_o='-out:$@'
3098         else
3099             _ld_o='-Fe$@'
3100         fi
3101         _cc_o='-Fo$@'
3102         _cc_e='-P'
3103         _flags_filter=icl_flags
3104         _ld_lib='lib%.a'
3105         _ld_path='-libpath:'
3106         # -Qdiag-error to make icl error when seeing certain unknown arguments
3107         _flags='-nologo -Qdiag-error:4044,10157'
3108         # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency
3109         # with MSVC which enables it by default.
3110         _cflags='-D_USE_MATH_DEFINES -FIstdlib.h -Dstrtoll=_strtoi64 -Qms0 -Qvec- -Qsimd- -GS'
3111         if [ $pfx = hostcc ]; then
3112             append _cflags -Dsnprintf=_snprintf
3113         fi
3114     elif $_cc --version 2>/dev/null | grep -q ^cparser; then
3115         _type=cparser
3116         _ident=$($_cc --version | head -n1)
3117         _depflags='-MMD'
3118         _cflags_speed='-O4'
3119         _cflags_size='-O2'
3120         _flags_filter=cparser_flags
3121     fi
3122
3123     eval ${pfx}_type=\$_type
3124     eval ${pfx}_ident=\$_ident
3125 }
3126
3127 set_ccvars(){
3128     eval ${1}_C=\${_cc_c-\${${1}_C}}
3129     eval ${1}_E=\${_cc_e-\${${1}_E}}
3130     eval ${1}_O=\${_cc_o-\${${1}_O}}
3131
3132     if [ -n "$_depflags" ]; then
3133         eval ${1}_DEPFLAGS=\$_depflags
3134     else
3135         eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
3136         eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
3137         eval DEP${1}FLAGS=\$_flags
3138     fi
3139 }
3140
3141 probe_cc cc "$cc"
3142 cflags_filter=$_flags_filter
3143 cflags_speed=$_cflags_speed
3144 cflags_size=$_cflags_size
3145 cflags_noopt=$_cflags_noopt
3146 add_cflags $_flags $_cflags
3147 cc_ldflags=$_ldflags
3148 set_ccvars CC
3149
3150 probe_cc hostcc "$host_cc"
3151 host_cflags_filter=$_flags_filter
3152 add_host_cflags  $_flags $_cflags
3153 set_ccvars HOSTCC
3154
3155 test -n "$cc_type" && enable $cc_type ||
3156     warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
3157
3158 : ${as_default:=$cc}
3159 : ${dep_cc_default:=$cc}
3160 : ${ld_default:=$cc}
3161 : ${host_ld_default:=$host_cc}
3162 set_default ar as dep_cc ld host_ld windres
3163
3164 probe_cc as "$as"
3165 asflags_filter=$_flags_filter
3166 add_asflags $_flags $_cflags
3167 set_ccvars AS
3168
3169 probe_cc ld "$ld"
3170 ldflags_filter=$_flags_filter
3171 add_ldflags $_flags $_ldflags
3172 test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
3173 LD_O=${_ld_o-$LD_O}
3174 LD_LIB=${_ld_lib-$LD_LIB}
3175 LD_PATH=${_ld_path-$LD_PATH}
3176
3177 probe_cc hostld "$host_ld"
3178 host_ldflags_filter=$_flags_filter
3179 add_host_ldflags $_flags $_ldflags
3180 HOSTLD_O=${_ld_o-$HOSTLD_O}
3181
3182 if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
3183     probe_cc depcc "$dep_cc"
3184     CCDEP=${_DEPCMD:-$DEPCMD}
3185     CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
3186     DEPCCFLAGS=$_flags
3187 fi
3188
3189 if $ar 2>&1 | grep -q Microsoft; then
3190     arflags="-nologo"
3191     ar_o='-out:$@'
3192 elif $ar 2>&1 | grep -q 'Texas Instruments'; then
3193     arflags="rq"
3194     ar_o='$@'
3195 elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then
3196     arflags='-Xany -r -c'
3197     ar_o='$@'
3198 else
3199     arflags="rc"
3200     ar_o='$@'
3201 fi
3202
3203 add_cflags $extra_cflags
3204 add_cxxflags $extra_cxxflags
3205 add_asflags $extra_cflags
3206
3207 if test -n "$sysroot"; then
3208     case "$cc_type" in
3209         gcc|llvm_gcc|clang)
3210             add_cppflags --sysroot="$sysroot"
3211             add_ldflags --sysroot="$sysroot"
3212         ;;
3213         tms470)
3214             add_cppflags -I"$sysinclude"
3215             add_ldflags  --sysroot="$sysroot"
3216         ;;
3217     esac
3218 fi
3219
3220 if test "$cpu" = host; then
3221     enabled cross_compile &&
3222         die "--cpu=host makes no sense when cross-compiling."
3223
3224     case "$cc_type" in
3225         gcc|llvm_gcc)
3226             check_native(){
3227                 $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
3228                 sed -n "/cc1.*$1=/{
3229                             s/.*$1=\\([^ ]*\\).*/\\1/
3230                             p
3231                             q
3232                         }" $TMPE
3233             }
3234             cpu=$(check_native -march || check_native -mcpu)
3235         ;;
3236     esac
3237
3238     test "${cpu:-host}" = host &&
3239         die "--cpu=host not supported with compiler $cc"
3240 fi
3241
3242 # Deal with common $arch aliases
3243 case "$arch" in
3244     aarch64|arm64)
3245         arch="aarch64"
3246     ;;
3247     arm*|iPad*|iPhone*)
3248         arch="arm"
3249     ;;
3250     mips*|IP*)
3251         arch="mips"
3252     ;;
3253     parisc*|hppa*)
3254         arch="parisc"
3255     ;;
3256     "Power Macintosh"|ppc*|powerpc*)
3257         arch="ppc"
3258     ;;
3259     s390|s390x)
3260         arch="s390"
3261     ;;
3262     sh4|sh)
3263         arch="sh4"
3264     ;;
3265     sun4u|sparc*)
3266         arch="sparc"
3267     ;;
3268     tilegx|tile-gx)
3269         arch="tilegx"
3270     ;;
3271     i[3-6]86|i86pc|BePC|x86pc|x86_64|x86_32|amd64)
3272         arch="x86"
3273     ;;
3274 esac
3275
3276 is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
3277 enable $arch
3278
3279 # Add processor-specific flags
3280 if enabled aarch64; then
3281
3282     case $cpu in
3283         armv*)
3284             cpuflags="-march=$cpu"
3285         ;;
3286         *)
3287             cpuflags="-mcpu=$cpu"
3288         ;;
3289     esac
3290
3291 elif enabled alpha; then
3292
3293     cpuflags="-mcpu=$cpu"
3294
3295 elif enabled arm; then
3296
3297     check_arm_arch() {
3298         check_cpp_condition stddef.h \
3299             "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
3300             $cpuflags
3301     }
3302
3303     probe_arm_arch() {
3304         if   check_arm_arch 4;        then echo armv4;
3305         elif check_arm_arch 4T;       then echo armv4t;
3306         elif check_arm_arch 5;        then echo armv5;
3307         elif check_arm_arch 5E;       then echo armv5e;
3308         elif check_arm_arch 5T;       then echo armv5t;
3309         elif check_arm_arch 5TE;      then echo armv5te;
3310         elif check_arm_arch 5TEJ;     then echo armv5te;
3311         elif check_arm_arch 6;        then echo armv6;
3312         elif check_arm_arch 6J;       then echo armv6j;
3313         elif check_arm_arch 6K;       then echo armv6k;
3314         elif check_arm_arch 6Z;       then echo armv6z;
3315         elif check_arm_arch 6ZK;      then echo armv6zk;
3316         elif check_arm_arch 6T2;      then echo armv6t2;
3317         elif check_arm_arch 7;        then echo armv7;
3318         elif check_arm_arch 7A  7_A;  then echo armv7-a;
3319         elif check_arm_arch 7R  7_R;  then echo armv7-r;
3320         elif check_arm_arch 7M  7_M;  then echo armv7-m;
3321         elif check_arm_arch 7EM 7E_M; then echo armv7-m;
3322         elif check_arm_arch 8A  8_A;  then echo armv8-a;
3323         fi
3324     }
3325
3326     [ "$cpu" = generic ] && cpu=$(probe_arm_arch)
3327
3328     case $cpu in
3329         armv*)
3330             cpuflags="-march=$cpu"
3331             subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
3332         ;;
3333         *)
3334             cpuflags="-mcpu=$cpu"
3335             case $cpu in
3336                 cortex-a*)                               subarch=armv7a  ;;
3337                 cortex-r*)                               subarch=armv7r  ;;
3338                 cortex-m*)                 enable thumb; subarch=armv7m  ;;
3339                 arm11*)                                  subarch=armv6   ;;
3340                 arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
3341                 armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
3342                 *)                             subarch=$(probe_arm_arch) ;;
3343             esac
3344         ;;
3345     esac
3346
3347     case "$subarch" in
3348         armv5t*)    enable fast_clz                ;;
3349         armv[6-8]*) enable fast_clz fast_unaligned ;;
3350     esac
3351
3352 elif enabled avr32; then
3353
3354     case $cpu in
3355         ap7[02]0[0-2])
3356             subarch="avr32_ap"
3357             cpuflags="-mpart=$cpu"
3358         ;;
3359         ap)
3360             subarch="avr32_ap"
3361             cpuflags="-march=$cpu"
3362         ;;
3363         uc3[ab]*)
3364             subarch="avr32_uc"
3365             cpuflags="-mcpu=$cpu"
3366         ;;
3367         uc)
3368             subarch="avr32_uc"
3369             cpuflags="-march=$cpu"
3370         ;;
3371     esac
3372
3373 elif enabled bfin; then
3374
3375     cpuflags="-mcpu=$cpu"
3376
3377 elif enabled mips; then
3378
3379     cpuflags="-march=$cpu"
3380
3381     case $cpu in
3382         24kc)
3383             disable mipsfpu
3384             disable mipsdspr1
3385             disable mipsdspr2
3386         ;;
3387         24kf*)
3388             disable mipsdspr1
3389             disable mipsdspr2
3390         ;;
3391         24kec|34kc|1004kc)
3392             disable mipsfpu
3393             disable mipsdspr2
3394         ;;
3395         24kef*|34kf*|1004kf*)
3396             disable mipsdspr2
3397         ;;
3398         74kc)
3399             disable mipsfpu
3400         ;;
3401     esac
3402
3403 elif enabled ppc; then
3404
3405     case $(tolower $cpu) in
3406         601|ppc601|powerpc601)
3407             cpuflags="-mcpu=601"
3408             disable altivec
3409         ;;
3410         603*|ppc603*|powerpc603*)
3411             cpuflags="-mcpu=603"
3412             disable altivec
3413         ;;
3414         604*|ppc604*|powerpc604*)
3415             cpuflags="-mcpu=604"
3416             disable altivec
3417         ;;
3418         g3|75*|ppc75*|powerpc75*)
3419             cpuflags="-mcpu=750"
3420             disable altivec
3421         ;;
3422         g4|745*|ppc745*|powerpc745*)
3423             cpuflags="-mcpu=7450"
3424         ;;
3425         74*|ppc74*|powerpc74*)
3426             cpuflags="-mcpu=7400"
3427         ;;
3428         g5|970|ppc970|powerpc970)
3429             cpuflags="-mcpu=970"
3430         ;;
3431         power[3-7]*)
3432             cpuflags="-mcpu=$cpu"
3433         ;;
3434         cell)
3435             cpuflags="-mcpu=cell"
3436             enable ldbrx
3437         ;;
3438         e500mc)
3439             cpuflags="-mcpu=e500mc"
3440             disable altivec
3441         ;;
3442         e500v2)
3443             cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
3444             disable altivec
3445         ;;
3446         e500)
3447             cpuflags="-mcpu=8540 -mhard-float"
3448             disable altivec
3449         ;;
3450     esac
3451
3452 elif enabled sparc; then
3453
3454     case $cpu in
3455         cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
3456             cpuflags="-mcpu=$cpu"
3457             disable vis
3458         ;;
3459         ultrasparc*|niagara[234])
3460             cpuflags="-mcpu=$cpu"
3461         ;;
3462     esac
3463
3464 elif enabled x86; then
3465
3466     case $cpu in
3467         i[345]86|pentium)
3468             cpuflags="-march=$cpu"
3469             disable mmx
3470         ;;
3471         # targets that do NOT support nopl and conditional mov (cmov)
3472         pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
3473             cpuflags="-march=$cpu"
3474             disable i686
3475         ;;
3476         # targets that do support nopl and conditional mov (cmov)
3477         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*)
3478             cpuflags="-march=$cpu"
3479             enable i686
3480             enable fast_cmov
3481         ;;
3482         # targets that do support conditional mov but on which it's slow
3483         pentium4|pentium4m|prescott|nocona)
3484             cpuflags="-march=$cpu"
3485             enable i686
3486             disable fast_cmov
3487         ;;
3488     esac
3489
3490 fi
3491
3492 if [ "$cpu" != generic ]; then
3493     add_cflags  $cpuflags
3494     add_asflags $cpuflags
3495 fi
3496
3497 # compiler sanity check
3498 check_exec <<EOF
3499 int main(void){ return 0; }
3500 EOF
3501 if test "$?" != 0; then
3502     echo "$cc is unable to create an executable file."
3503     if test -z "$cross_prefix" && ! enabled cross_compile ; then
3504         echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
3505         echo "Only do this if you know what cross compiling means."
3506     fi
3507     die "C compiler test failed."
3508 fi
3509
3510 add_cppflags -D_ISOC99_SOURCE
3511 add_cxxflags -D__STDC_CONSTANT_MACROS
3512 check_cflags -std=c99
3513 check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
3514 #include <stdlib.h>
3515 EOF
3516 check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
3517 #include <stdlib.h>
3518 EOF
3519
3520 check_host_cflags -std=c99
3521 check_host_cflags -Wall
3522
3523 check_64bit(){
3524     arch32=$1
3525     arch64=$2
3526     expr=$3
3527     check_code cc "" "int test[2*($expr) - 1]" &&
3528         subarch=$arch64 || subarch=$arch32
3529 }
3530
3531 case "$arch" in
3532     aarch64|alpha|ia64)
3533         spic=$shared
3534     ;;
3535     mips)
3536         check_64bit mips mips64 '_MIPS_SIM > 1'
3537         spic=$shared
3538     ;;
3539     parisc)
3540         check_64bit parisc parisc64 'sizeof(void *) > 4'
3541         spic=$shared
3542     ;;
3543     ppc)
3544         check_64bit ppc ppc64 'sizeof(void *) > 4'
3545         spic=$shared
3546     ;;
3547     sparc)
3548         check_64bit sparc sparc64 'sizeof(void *) > 4'
3549         spic=$shared
3550     ;;
3551     x86)
3552         check_64bit x86_32 x86_64 'sizeof(void *) > 4'
3553         if test "$subarch" = "x86_64"; then
3554             spic=$shared
3555         fi
3556     ;;
3557     ppc)
3558         check_cc <<EOF && subarch="ppc64"
3559         int test[(int)sizeof(char*) - 7];
3560 EOF
3561     ;;
3562 esac
3563
3564 enable $subarch
3565 enabled spic && enable_weak pic
3566
3567 # OS specific
3568 case $target_os in
3569     aix)
3570         SHFLAGS=-shared
3571         add_cppflags '-I\$(SRC_PATH)/compat/aix'
3572         enabled shared && add_ldflags -Wl,-brtl
3573         ;;
3574     haiku)
3575         prefix_default="/boot/common"
3576         network_extralibs="-lnetwork"
3577         host_libs=
3578         ;;
3579     sunos)
3580         SHFLAGS='-shared -Wl,-h,$$(@F)'
3581         enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
3582         network_extralibs="-lsocket -lnsl"
3583         add_cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
3584         # When using suncc to build, the Solaris linker will mark
3585         # an executable with each instruction set encountered by
3586         # the Solaris assembler.  As our libraries contain their own
3587         # guards for processor-specific code, instead suppress
3588         # generation of the HWCAPS ELF section on Solaris x86 only.
3589         enabled_all suncc x86 &&
3590             echo "hwcap_1 = OVERRIDE;" > mapfile &&
3591             add_ldflags -Wl,-M,mapfile
3592         nm_default='nm -P -g'
3593         ;;
3594     netbsd)
3595         disable symver
3596         oss_indev_extralibs="-lossaudio"
3597         oss_outdev_extralibs="-lossaudio"
3598         enabled gcc || check_ldflags -Wl,-zmuldefs
3599         ;;
3600     openbsd|bitrig)
3601         disable symver
3602         SHFLAGS='-shared'
3603         SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
3604         SLIB_INSTALL_LINKS=
3605         oss_indev_extralibs="-lossaudio"
3606         oss_outdev_extralibs="-lossaudio"
3607         ;;
3608     dragonfly)
3609         disable symver
3610         ;;
3611     freebsd)
3612         ;;
3613     bsd/os)
3614         add_extralibs -lpoll -lgnugetopt
3615         strip="strip -d"
3616         ;;
3617     darwin)
3618         gas="gas-preprocessor.pl $cc"
3619         enabled ppc && add_asflags -force_cpusubtype_ALL
3620         SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
3621         enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
3622         strip="${strip} -x"
3623         add_ldflags -Wl,-dynamic,-search_paths_first
3624         SLIBSUF=".dylib"
3625         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
3626         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
3627         objformat="macho"
3628         enabled x86_64 && objformat="macho64"
3629         enabled_any pic shared ||
3630             { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
3631         ;;
3632     mingw32*)
3633         if test $target_os = "mingw32ce"; then
3634             disable network
3635         else
3636             target_os=mingw32
3637         fi
3638         LIBTARGET=i386
3639         if enabled x86_64; then
3640             LIBTARGET="i386:x86-64"
3641         elif enabled arm; then
3642             LIBTARGET=arm-wince
3643         fi
3644         enabled shared && ! enabled small && check_cmd $windres --version && enable gnu_windres
3645         check_ldflags -Wl,--nxcompat
3646         check_ldflags -Wl,--dynamicbase
3647         shlibdir_default="$bindir_default"
3648         SLIBPREF=""
3649         SLIBSUF=".dll"
3650         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3651         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3652         dlltool="${cross_prefix}dlltool"
3653         if check_cmd lib.exe -list; then
3654             SLIB_EXTRA_CMD=-'sed -e "s/ @[^ ]*//" $$(@:$(SLIBSUF)=.orig.def) > $$(@:$(SLIBSUF)=.def); lib.exe /machine:$(LIBTARGET) /def:$$(@:$(SLIBSUF)=.def) /out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
3655             if enabled x86_64; then
3656                 LIBTARGET=x64
3657             fi
3658         elif check_cmd $dlltool --version; then
3659             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)'
3660         fi
3661         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3662         SLIB_INSTALL_LINKS=
3663         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3664         SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3665         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'
3666         objformat="win32"
3667         ranlib=:
3668         enable dos_paths
3669         ;;
3670     win32|win64)
3671         disable symver
3672         if enabled shared; then
3673             # Link to the import library instead of the normal static library
3674             # for shared libs.
3675             LD_LIB='%.lib'
3676             # Cannot build both shared and static libs with MSVC or icl.
3677             disable static
3678         fi
3679         shlibdir_default="$bindir_default"
3680         SLIBPREF=""
3681         SLIBSUF=".dll"
3682         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3683         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3684         SLIB_CREATE_DEF_CMD='$(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
3685         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3686         SLIB_INSTALL_LINKS=
3687         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3688         SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3689         SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
3690         objformat="win32"
3691         ranlib=:
3692         enable dos_paths
3693         ;;
3694     cygwin*)
3695         target_os=cygwin
3696         shlibdir_default="$bindir_default"
3697         SLIBPREF="cyg"
3698         SLIBSUF=".dll"
3699         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3700         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3701         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3702         SLIB_INSTALL_LINKS=
3703         SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a'
3704         SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a'
3705         objformat="win32"
3706         enable dos_paths
3707         enabled shared && ! enabled small && check_cmd $windres --version && enable gnu_windres
3708         ;;
3709     *-dos|freedos|opendos)
3710         network_extralibs="-lsocket"
3711         objformat="coff"
3712         enable dos_paths
3713         add_cppflags -U__STRICT_ANSI__
3714         ;;
3715     linux)
3716         enable dv1394
3717         ;;
3718     irix*)
3719         target_os=irix
3720         ranlib="echo ignoring ranlib"
3721         ;;
3722     os/2*)
3723         strip="lxlite -CS"
3724         ln_s="cp -f"
3725         objformat="aout"
3726         add_cppflags -D_GNU_SOURCE
3727         add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
3728         SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
3729         LIBSUF="_s.a"
3730         SLIBPREF=""
3731         SLIBSUF=".dll"
3732         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
3733         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
3734         SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
3735             echo PROTMODE >> $(SUBDIR)$(NAME).def; \
3736             echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
3737             echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
3738             echo EXPORTS >> $(SUBDIR)$(NAME).def; \
3739             emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def'
3740         SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
3741             emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
3742         SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
3743         enable dos_paths
3744         enable_weak os2threads
3745         ;;
3746     gnu/kfreebsd)
3747         add_cppflags -D_BSD_SOURCE
3748         ;;
3749     gnu)
3750         ;;
3751     qnx)
3752         add_cppflags -D_QNX_SOURCE
3753         network_extralibs="-lsocket"
3754         ;;
3755     symbian)
3756         SLIBSUF=".dll"
3757         enable dos_paths
3758         add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default
3759         add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS
3760         add_ldflags -Wl,--target1-abs,--no-undefined \
3761                     -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \
3762                     -Wl,--entry=_E32Startup -Wl,-u,_E32Startup
3763         add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \
3764                       -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
3765                       -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
3766         ;;
3767     osf1)
3768         add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
3769         ;;
3770     minix)
3771         ;;
3772     plan9)
3773         add_cppflags -D_C99_SNPRINTF_EXTENSION  \
3774                      -D_REENTRANT_SOURCE        \
3775                      -D_RESEARCH_SOURCE         \
3776                      -DFD_SETSIZE=96            \
3777                      -DHAVE_SOCK_OPTS
3778         add_compat strtod.o strtod=avpriv_strtod
3779         network_extralibs='-lbsd'
3780         exeobjs=compat/plan9/main.o
3781         disable ffserver
3782         cp_f='cp'
3783         ;;
3784     none)
3785         ;;
3786     *)
3787         die "Unknown OS '$target_os'."
3788         ;;
3789 esac
3790
3791 # determine libc flavour
3792
3793 # uclibc defines __GLIBC__, so it needs to be checked before glibc.
3794 if check_cpp_condition features.h "defined __UCLIBC__"; then
3795     libc_type=uclibc
3796     add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3797 elif check_cpp_condition features.h "defined __GLIBC__"; then
3798     libc_type=glibc
3799     add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3800 # MinGW headers can be installed on Cygwin, so check for newlib first.
3801 elif check_cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
3802     libc_type=newlib
3803     add_cppflags -U__STRICT_ANSI__
3804 elif check_header _mingw.h; then
3805     libc_type=mingw
3806     check_cpp_condition _mingw.h \
3807         "defined (__MINGW64_VERSION_MAJOR) || (__MINGW32_MAJOR_VERSION > 3) || \
3808             (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
3809         die "ERROR: MinGW runtime version must be >= 3.15."
3810     add_cppflags -U__STRICT_ANSI__
3811     if check_cpp_condition _mingw.h "defined(__MINGW64_VERSION_MAJOR) && \
3812             __MINGW64_VERSION_MAJOR < 3"; then
3813         add_compat msvcrt/snprintf.o
3814         add_cflags "-include $source_path/compat/msvcrt/snprintf.h"
3815     else
3816         add_cppflags -D__USE_MINGW_ANSI_STDIO=1
3817     fi
3818 elif check_cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
3819     libc_type=msvcrt
3820     add_compat strtod.o strtod=avpriv_strtod
3821     add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
3822                                  _snprintf=avpriv_snprintf  \
3823                                  vsnprintf=avpriv_vsnprintf
3824     # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to
3825     # 0x601 by default unless something else is set by the user.
3826     # This can easily lead to us detecting functions only present
3827     # in such new versions and producing binaries requiring windows 7.0.
3828     # Therefore explicitly set the default to XP unless the user has
3829     # set something else on the command line.
3830     check_cpp_condition stdlib.h "defined(_WIN32_WINNT)" || add_cppflags -D_WIN32_WINNT=0x0502
3831 elif check_cpp_condition stddef.h "defined __KLIBC__"; then
3832     libc_type=klibc
3833 elif check_cpp_condition sys/cdefs.h "defined __BIONIC__"; then
3834     libc_type=bionic
3835     add_compat strtod.o strtod=avpriv_strtod
3836 fi
3837
3838 test -n "$libc_type" && enable $libc_type
3839
3840 # hacks for compiler/libc/os combinations
3841
3842 if enabled_all tms470 glibc; then
3843     CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
3844     add_cppflags -D__USER_LABEL_PREFIX__=
3845     add_cppflags -D__builtin_memset=memset
3846     add_cppflags -D__gnuc_va_list=va_list -D_VA_LIST_DEFINED
3847     add_cflags   -pds=48    # incompatible redefinition of macro
3848 fi
3849
3850 if enabled_all ccc glibc; then
3851     add_ldflags -Wl,-z,now  # calls to libots crash without this
3852 fi
3853
3854 esc(){
3855     echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
3856 }
3857
3858 echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFIGURATION)" >config.fate
3859
3860 check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
3861
3862 set_default $PATHS_LIST
3863 set_default nm
3864
3865 # we need to build at least one lib type
3866 if ! enabled_any static shared; then
3867     cat <<EOF
3868 At least one library type must be built.
3869 Specify --enable-static to build the static libraries or --enable-shared to
3870 build the shared libraries as well. To only build the shared libraries specify
3871 --disable-static in addition to --enable-shared.
3872 EOF
3873     exit 1;
3874 fi
3875
3876 # backward compatibility layer for incompatible_libav/fork_abi
3877 enabled incompatible_fork_abi  && enable incompatible_libav_abi
3878 enabled incompatible_libav_abi && enable incompatible_fork_abi
3879
3880 die_license_disabled() {
3881     enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
3882 }
3883
3884 die_license_disabled_gpl() {
3885     enabled $1 || { enabled $2 && die "$2 is incompatible with the gpl and --enable-$1 is not specified."; }
3886 }
3887
3888 die_license_disabled gpl frei0r
3889 die_license_disabled gpl libcdio
3890 die_license_disabled gpl libutvideo
3891 die_license_disabled gpl libvidstab
3892 die_license_disabled gpl libx264
3893 die_license_disabled gpl libxavs
3894 die_license_disabled gpl libxvid
3895 die_license_disabled gpl libzvbi
3896 die_license_disabled gpl x11grab
3897
3898 die_license_disabled nonfree libaacplus
3899 die_license_disabled nonfree libfaac
3900 enabled gpl && die_license_disabled_gpl nonfree libfdk_aac
3901 enabled gpl && die_license_disabled_gpl nonfree openssl
3902
3903 die_license_disabled version3 libopencore_amrnb
3904 die_license_disabled version3 libopencore_amrwb
3905 die_license_disabled version3 libvo_aacenc
3906 die_license_disabled version3 libvo_amrwbenc
3907
3908 enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
3909
3910 disabled optimizations || check_cflags -fomit-frame-pointer
3911
3912 enable_weak_pic() {
3913     disabled pic && return
3914     enable pic
3915     add_cppflags -DPIC
3916     case "$target_os" in
3917     mingw*|cygwin*)
3918         ;;
3919     *)
3920         add_cflags -fPIC
3921         ;;
3922     esac
3923     add_asflags  -fPIC
3924 }
3925
3926 enabled pic && enable_weak_pic
3927
3928 check_cc <<EOF || die "Symbol mangling check failed."
3929 int ff_extern;
3930 EOF
3931 sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
3932 extern_prefix=${sym%%ff_extern*}
3933
3934 check_cc <<EOF && enable_weak inline_asm
3935 void foo(void) { __asm__ volatile ("" ::); }
3936 EOF
3937
3938 _restrict=
3939 for restrict_keyword in restrict __restrict__ __restrict; do
3940     check_cc <<EOF && _restrict=$restrict_keyword && break
3941 void foo(char * $restrict_keyword p);
3942 EOF
3943 done
3944
3945 check_cc <<EOF && enable pragma_deprecated
3946 void foo(void) { _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") }
3947 EOF
3948
3949 check_cc <<EOF && enable attribute_packed
3950 struct { int x; } __attribute__((packed)) x;
3951 EOF
3952
3953 check_cc <<EOF && enable attribute_may_alias
3954 union { int x; } __attribute__((may_alias)) x;
3955 EOF
3956
3957 check_cc <<EOF || die "endian test failed"
3958 unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
3959 EOF
3960 od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
3961
3962 check_inline_asm inline_asm_labels '"1:\n"'
3963
3964 if enabled alpha; then
3965
3966     check_cflags -mieee
3967
3968 elif enabled arm; then
3969
3970     check_cpp_condition stddef.h "defined __thumb__" && check_cc <<EOF && enable_weak thumb
3971 float func(float a, float b){ return a+b; }
3972 EOF
3973
3974     enabled thumb && check_cflags -mthumb || check_cflags -marm
3975     nogas=die
3976
3977     if     check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then
3978         enable vfp_args
3979     elif ! check_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__"; then
3980         case "${cross_prefix:-$cc}" in
3981             *hardfloat*)         enable vfp_args;   fpabi=vfp ;;
3982             *) check_ld "cc" <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
3983 __asm__ (".eabi_attribute 28, 1");
3984 int main(void) { return 0; }
3985 EOF
3986         esac
3987         warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
3988     fi
3989
3990     enabled armv5te && check_insn armv5te 'qadd r0, r0, r0'
3991     enabled armv6   && check_insn armv6   'sadd16 r0, r0, r0'
3992     enabled armv6t2 && check_insn armv6t2 'movt r0, #0'
3993     enabled neon    && check_insn neon    'vadd.i16 q0, q0, q0'
3994     enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
3995     enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'
3996
3997     [ $target_os = linux ] ||
3998         map 'enabled_any ${v}_external ${v}_inline || disable $v' \
3999             $ARCH_EXT_LIST_ARM
4000
4001     check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
4002     check_inline_asm asm_mod_y '"vmul.i32 d0, d0, %y0" :: "x"(0)'
4003
4004     [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
4005
4006 elif enabled mips; then
4007
4008     check_inline_asm loongson '"dmult.g $1, $2, $3"'
4009     enabled mips32r2  && add_cflags "-mips32r2" && add_asflags "-mips32r2" &&
4010      check_inline_asm mips32r2  '"rotr $t0, $t1, 1"'
4011     enabled mipsdspr1 && add_cflags "-mdsp" && add_asflags "-mdsp" &&
4012      check_inline_asm mipsdspr1 '"addu.qb $t0, $t1, $t2"'
4013     enabled mipsdspr2 && add_cflags "-mdspr2" && add_asflags "-mdspr2" &&
4014      check_inline_asm mipsdspr2 '"absq_s.qb $t0, $t1"'
4015     enabled mipsfpu   && add_cflags "-mhard-float" && add_asflags "-mhard-float" &&
4016      check_inline_asm mipsfpu   '"madd.d $f0, $f2, $f4, $f6"'
4017
4018 elif enabled parisc; then
4019
4020     if enabled gcc; then
4021         case $($cc -dumpversion) in
4022             4.[3-8].*) check_cflags -fno-optimize-sibling-calls ;;
4023         esac
4024     fi
4025
4026 elif enabled ppc; then
4027
4028     enable local_aligned_8 local_aligned_16
4029
4030     check_inline_asm dcbzl     '"dcbzl 0, %0" :: "r"(0)'
4031     check_inline_asm ibm_asm   '"add 0, 0, 0"'
4032     check_inline_asm ppc4xx    '"maclhw r10, r11, r12"'
4033     check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'
4034
4035     # AltiVec flags: The FSF version of GCC differs from the Apple version
4036     if enabled altivec; then
4037         if ! enabled_any pic ppc64; then
4038             nogas=warn
4039         fi
4040         check_cflags -maltivec -mabi=altivec &&
4041         { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } ||
4042         check_cflags -faltivec
4043
4044         # check if our compiler supports Motorola AltiVec C API
4045         check_cc <<EOF || disable altivec
4046 $inc_altivec_h
4047 int main(void) {
4048     vector signed int v1 = (vector signed int) { 0 };
4049     vector signed int v2 = (vector signed int) { 1 };
4050     v1 = vec_add(v1, v2);
4051     return 0;
4052 }
4053 EOF
4054
4055         enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
4056     fi
4057
4058 elif enabled sparc; then
4059
4060     enabled vis && check_inline_asm vis '"pdist %f0, %f0, %f0"'
4061
4062 elif enabled x86; then
4063
4064     check_builtin rdtsc    intrin.h   "__rdtsc()"
4065     check_builtin mm_empty mmintrin.h "_mm_empty()"
4066
4067     enable local_aligned_8 local_aligned_16
4068
4069     # check whether EBP is available on x86
4070     # As 'i' is stored on the stack, this program will crash
4071     # if the base pointer is used to access it because the
4072     # base pointer is cleared in the inline assembly code.
4073     check_exec_crash <<EOF && enable ebp_available
4074 volatile int i=0;
4075 __asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
4076 return i;
4077 EOF
4078
4079     # check whether EBX is available on x86
4080     check_inline_asm ebx_available '""::"b"(0)' &&
4081         check_inline_asm ebx_available '"":::"%ebx"'
4082
4083     # check whether xmm clobbers are supported
4084     check_inline_asm xmm_clobbers '"":::"%xmm0"'
4085
4086     # check whether binutils is new enough to compile SSSE3/MMXEXT
4087     enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
4088     enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
4089
4090     if ! disabled_any asm mmx yasm; then
4091         if check_cmd $yasmexe --version; then
4092             enabled x86_64 && yasm_extra="-m amd64"
4093             yasm_debug="-g dwarf2"
4094         elif check_cmd nasm -v; then
4095             yasmexe=nasm
4096             yasm_debug="-g -F dwarf"
4097             enabled x86_64 && test "$objformat" = elf && objformat=elf64
4098         fi
4099
4100         YASMFLAGS="-f $objformat $yasm_extra"
4101         enabled pic               && append YASMFLAGS "-DPIC"
4102         test -n "$extern_prefix"  && append YASMFLAGS "-DPREFIX"
4103         case "$objformat" in
4104             elf*) enabled debug && append YASMFLAGS $yasm_debug ;;
4105         esac
4106
4107         check_yasm "movbe ecx, [5]" && enable yasm ||
4108             die "yasm/nasm not found or too old. Use --disable-yasm for a crippled build."
4109         check_yasm "vextractf128 xmm0, ymm0, 0"      || disable avx_external avresample
4110         check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
4111         check_yasm "CPU amdnop" && enable cpunop
4112     fi
4113
4114     case "$cpu" in
4115         athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
4116             disable fast_clz
4117         ;;
4118     esac
4119
4120 fi
4121
4122 if enabled asm; then
4123     as=${gas:=$as}
4124     check_as <<EOF && enable gnu_as || \
4125         $nogas "GNU assembler not found, install gas-preprocessor"
4126 .macro m n
4127 \n: .int 0
4128 .endm
4129 m x
4130 EOF
4131 fi
4132
4133 check_ldflags -Wl,--as-needed
4134
4135 if check_func dlopen; then
4136     ldl=
4137 elif check_func dlopen -ldl; then
4138     ldl=-ldl
4139 fi
4140
4141 if ! disabled network; then
4142     check_type "sys/types.h sys/socket.h" socklen_t
4143     check_type netdb.h "struct addrinfo"
4144     check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
4145     check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
4146     check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
4147     check_type netinet/in.h "struct sockaddr_in6"
4148     check_type poll.h "struct pollfd"
4149     check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
4150     check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
4151     check_type netinet/sctp.h "struct sctp_event_subscribe"
4152     check_func getaddrinfo $network_extralibs
4153     check_func getservbyport $network_extralibs
4154     # Prefer arpa/inet.h over winsock2
4155     if check_header arpa/inet.h ; then
4156         check_func closesocket
4157     elif check_header winsock2.h ; then
4158         check_func_headers winsock2.h closesocket -lws2 &&
4159             network_extralibs="-lws2" ||
4160         { check_func_headers winsock2.h closesocket -lws2_32 &&
4161             network_extralibs="-lws2_32"; }
4162         check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
4163         check_type ws2tcpip.h socklen_t
4164         check_type ws2tcpip.h "struct addrinfo"
4165         check_type ws2tcpip.h "struct group_source_req"
4166         check_type ws2tcpip.h "struct ip_mreq_source"
4167         check_type ws2tcpip.h "struct ipv6_mreq"
4168         check_type winsock2.h "struct pollfd"
4169         check_type ws2tcpip.h "struct sockaddr_in6"
4170         check_type ws2tcpip.h "struct sockaddr_storage"
4171         check_struct winsock2.h "struct sockaddr" sa_len
4172     else
4173         disable network
4174     fi
4175 fi
4176
4177 # Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
4178 check_func nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }
4179
4180 check_func  access
4181 check_func  clock_gettime || { check_func clock_gettime -lrt && add_extralibs -lrt; }
4182 check_func  fcntl
4183 check_func  fork
4184 check_func_headers stdlib.h getenv
4185 check_func  gethrtime
4186 check_func  getopt
4187 check_func  getrusage
4188 check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
4189 check_func  gettimeofday
4190 check_func  inet_aton $network_extralibs
4191 check_func  isatty
4192 check_func  localtime_r
4193 check_func  ${malloc_prefix}memalign            && enable memalign
4194 check_func  mkstemp
4195 check_func  mmap
4196 check_func  mprotect
4197 check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
4198 check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
4199 check_func  setrlimit
4200 check_struct "sys/stat.h" "struct stat" st_mtim.tv_nsec -D_BSD_SOURCE
4201 check_func  strerror_r
4202 check_func  sched_getaffinity
4203 check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
4204 check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
4205 check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
4206 check_builtin MemoryBarrier windows.h "MemoryBarrier()"
4207 check_builtin sarestart signal.h "SA_RESTART"
4208 check_func  sysconf
4209 check_func  sysctl
4210 check_func  usleep
4211 check_func_headers conio.h kbhit
4212 check_func_headers windows.h PeekNamedPipe
4213 check_func_headers io.h setmode
4214 check_func_headers lzo/lzo1x.h lzo1x_999_compress
4215 check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
4216 check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
4217 check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
4218 check_func_headers windows.h GetProcessAffinityMask
4219 check_func_headers windows.h GetProcessTimes
4220 check_func_headers windows.h GetSystemTimeAsFileTime
4221 check_func_headers windows.h MapViewOfFile
4222 check_func_headers windows.h SetConsoleTextAttribute
4223 check_func_headers windows.h Sleep
4224 check_func_headers windows.h VirtualAlloc
4225 check_func_headers glob.h glob
4226 check_func_headers "X11/Xlib.h X11/extensions/Xvlib.h" XvGetPortAttribute -lXv -lX11 -lXext
4227
4228 check_header cl/cl.h
4229 check_header direct.h
4230 check_header dlfcn.h
4231 check_header dxva.h
4232 check_header dxva2api.h -D_WIN32_WINNT=0x0600
4233 check_header io.h
4234 check_header libcrystalhd/libcrystalhd_if.h
4235 check_header malloc.h
4236 check_header poll.h
4237 check_header sys/mman.h
4238 check_header sys/param.h
4239 check_header sys/resource.h
4240 check_header sys/select.h
4241 check_header sys/time.h
4242 check_header sys/un.h
4243 check_header termios.h
4244 check_header unistd.h
4245 check_header vdpau/vdpau.h
4246 check_header vdpau/vdpau_x11.h
4247 check_header VideoDecodeAcceleration/VDADecoder.h
4248 check_header windows.h
4249 check_header X11/extensions/XvMClib.h
4250 check_header asm/types.h
4251
4252 disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
4253 disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
4254
4255 if ! disabled w32threads && ! enabled pthreads; then
4256     check_func_headers "windows.h process.h" _beginthreadex && enable w32threads
4257 fi
4258
4259 # check for some common methods of building with pthread support
4260 # do this before the optional library checks as some of them require pthreads
4261 if ! disabled pthreads && ! enabled w32threads && ! enabled os2threads; then
4262     enable pthreads
4263     if check_func pthread_join && check_func pthread_create; then
4264         :
4265     elif check_func pthread_join -pthread && check_func pthread_create -pthread; then
4266         add_cflags -pthread
4267         add_extralibs -pthread
4268     elif check_func pthread_join -pthreads && check_func pthread_create -pthreads; then
4269         add_cflags -pthreads
4270         add_extralibs -pthreads
4271     elif check_func pthread_join -lpthreadGC2 && check_func pthread_create -lpthreadGC2; then
4272         add_extralibs -lpthreadGC2
4273     elif ! check_lib pthread.h pthread_join -lpthread && ! check_lib pthread.h pthread_create -lpthread; then
4274         disable pthreads
4275     fi
4276 fi
4277
4278 for thread in $THREADS_LIST; do
4279     if enabled $thread; then
4280         test -n "$thread_type" &&
4281             die "ERROR: Only one thread type must be selected." ||
4282             thread_type="$thread"
4283     fi
4284 done
4285
4286 if enabled pthreads; then
4287   check_func pthread_cancel
4288 fi
4289
4290 enabled sync_val_compare_and_swap && enable atomics_gcc
4291 enabled_all atomic_cas_ptr machine_rw_barrier && enable atomics_suncc
4292 enabled MemoryBarrier && enable atomics_win32
4293
4294 check_lib math.h sin -lm && LIBM="-lm"
4295 disabled crystalhd || check_lib libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersion -lcrystalhd || disable crystalhd
4296
4297 atan2f_args=2
4298 ldexpf_args=2
4299 powf_args=2
4300
4301 for func in $MATH_FUNCS; do
4302     eval check_mathfunc $func \${${func}_args:-1}
4303 done
4304
4305 # these are off by default, so fail if requested and not available
4306 enabled avisynth          && { { check_lib2 "windows.h" LoadLibrary; } ||
4307                                { check_lib2 "dlfcn.h" dlopen -ldl; } ||
4308                                die "ERROR: LoadLibrary/dlopen not found for avisynth"; }
4309 enabled fontconfig        && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
4310 enabled frei0r            && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; }
4311 enabled gnutls            && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
4312 enabled ladspa            && { check_header ladspa.h || die "ERROR: ladspa.h header not found"; }
4313 enabled libiec61883       && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883
4314 enabled libaacplus        && require "libaacplus >= 2.0.0" aacplus.h aacplusEncOpen -laacplus
4315 enabled libass            && require_pkg_config libass ass/ass.h ass_library_init
4316 enabled libbluray         && require libbluray libbluray/bluray.h bd_open -lbluray
4317 enabled libcelt           && require libcelt celt/celt.h celt_decode -lcelt0 &&
4318                              { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
4319                                die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
4320 enabled libcaca           && require_pkg_config caca caca.h caca_create_canvas
4321 enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
4322 enabled libfdk_aac        && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
4323 flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
4324 enabled libflite          && require2 libflite "flite/flite.h" flite_init $flite_libs
4325 enabled libfreetype       && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType
4326 enabled libgme            && require  libgme gme/gme.h gme_new_emu -lgme -lstdc++
4327 enabled libgsm            && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
4328                                    check_lib "${gsm_hdr}" gsm_create -lgsm && break;
4329                                done || die "ERROR: libgsm not found"; }
4330 enabled libilbc           && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
4331 enabled libmodplug        && require libmodplug libmodplug/modplug.h ModPlug_Load -lmodplug
4332 enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
4333 enabled libnut            && require libnut libnut.h nut_demuxer_init -lnut
4334 enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
4335 enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
4336 enabled libopencv         && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader
4337 enabled libopenjpeg       && { check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg ||
4338                                check_lib openjpeg.h opj_version -lopenjpeg ||
4339                                die "ERROR: libopenjpeg not found"; }
4340 enabled libopus           && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
4341 enabled libpulse          && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
4342 enabled libquvi           && require_pkg_config libquvi quvi/quvi.h quvi_init
4343 enabled librtmp           && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
4344 enabled libschroedinger   && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
4345 enabled libshine          && require_pkg_config shine shine/layer3.h shine_encode_buffer
4346 enabled libsoxr           && require libsoxr soxr.h soxr_create -lsoxr
4347 enabled libssh            && require_pkg_config libssh libssh/sftp.h sftp_init
4348 enabled libspeex          && require libspeex speex/speex.h speex_decoder_init -lspeex
4349 enabled libstagefright_h264 && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h
4350     media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h
4351     media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder -lgnustl_static
4352 enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
4353 enabled libtwolame        && require libtwolame twolame.h twolame_init -ltwolame &&
4354                              { check_lib twolame.h twolame_encode_buffer_float32_interleaved -ltwolame ||
4355                                die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; }
4356 enabled libutvideo        && require_cpp utvideo "stdint.h stdlib.h utvideo/utvideo.h utvideo/Codec.h" 'CCodec*' -lutvideo -lstdc++
4357 enabled libv4l2           && require_pkg_config libv4l2 libv4l2.h v4l2_ioctl
4358 enabled libvidstab        && require_pkg_config vidstab vid.stab/libvidstab.h vsMotionDetectInit
4359 enabled libvo_aacenc      && require libvo_aacenc vo-aacenc/voAAC.h voGetAACEncAPI -lvo-aacenc
4360 enabled libvo_amrwbenc    && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
4361 enabled libvorbis         && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg
4362 enabled libvpx            && {
4363     enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
4364                                     die "ERROR: libvpx decoder version must be >=0.9.1"; }
4365     enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx ||
4366                                     die "ERROR: libvpx encoder version must be >=0.9.7"; }
4367     enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder; }
4368     enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } }
4369 enabled libwavpack        && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput  -lwavpack
4370 enabled libx264           && require libx264 x264.h x264_encoder_encode -lx264 &&
4371                              { check_cpp_condition x264.h "X264_BUILD >= 118" ||
4372                                die "ERROR: libx264 must be installed and version must be >= 0.118."; }
4373 enabled libxavs           && require libxavs xavs.h xavs_encoder_encode -lxavs
4374 enabled libxvid           && require libxvid xvid.h xvid_global -lxvidcore
4375 enabled libzmq            && require_pkg_config libzmq zmq.h zmq_ctx_new
4376 enabled libzvbi           && require libzvbi libzvbi.h vbi_decoder_new -lzvbi
4377 enabled openal            && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do
4378                                check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } ||
4379                                die "ERROR: openal not found"; } &&
4380                              { check_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" ||
4381                                die "ERROR: openal must be installed and version must be 1.1 or compatible"; }
4382 enabled opencl            && { check_lib2 OpenCL/cl.h clEnqueueNDRangeKernel -Wl,-framework,OpenCL ||
4383                                check_lib2 CL/cl.h clEnqueueNDRangeKernel -lOpenCL ||
4384                                die "ERROR: opencl not found"; } &&
4385                              { ! enabled_any w32threads os2threads ||
4386                                die "opencl currently needs --enable-pthreads or --disable-w32threads"; } &&
4387                              { check_cpp_condition "OpenCL/cl.h" "defined(CL_VERSION_1_2)" ||
4388                                check_cpp_condition "CL/cl.h" "defined(CL_VERSION_1_2)" ||
4389                                die "ERROR: opencl must be installed and version must be 1.2 or compatible"; }
4390 enabled openssl           && { check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto ||
4391                                check_lib openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
4392                                check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
4393                                die "ERROR: openssl not found"; }
4394
4395 if enabled gnutls; then
4396     { check_lib nettle/bignum.h nettle_mpz_get_str_256 -lnettle -lhogweed -lgmp && enable nettle; } ||
4397     { check_lib gcrypt.h gcry_mpi_new -lgcrypt && enable gcrypt; }
4398 fi
4399
4400 # libdc1394 check
4401 if enabled libdc1394; then
4402     { check_lib dc1394/dc1394.h dc1394_new -ldc1394 -lraw1394 &&
4403         enable libdc1394_2; } ||
4404     { check_lib libdc1394/dc1394_control.h dc1394_create_handle -ldc1394_control -lraw1394 &&
4405         enable libdc1394_1; } ||
4406     die "ERROR: No version of libdc1394 found "
4407 fi
4408
4409 SDL_CONFIG="${cross_prefix}sdl-config"
4410 if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
4411     check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
4412     check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
4413     enable sdl
4414 else
4415   if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
4416     sdl_cflags=$("${SDL_CONFIG}" --cflags)
4417     sdl_libs=$("${SDL_CONFIG}" --libs)
4418     check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
4419     check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
4420     check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
4421     enable sdl
4422   fi
4423 fi
4424 enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
4425
4426 texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
4427 makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
4428 perl -v            > /dev/null 2>&1 && enable perl      || disable perl
4429 pod2man --help     > /dev/null 2>&1 && enable pod2man   || disable pod2man
4430 rsync --help 2> /dev/null | grep -q 'contimeout' && enable rsync_contimeout || disable rsync_contimeout
4431
4432 check_header linux/fb.h
4433 check_header linux/videodev.h
4434 check_header linux/videodev2.h
4435 check_code cc linux/videodev2.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_safe struct_v4l2_frmivalenum_discrete
4436
4437 check_header sys/videoio.h
4438
4439 check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
4440 # check that WM_CAP_DRIVER_CONNECT is defined to the proper value
4441 # w32api 3.12 had it defined wrong
4442 check_cpp_condition vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER" && enable vfwcap_defines
4443
4444 check_type "dshow.h" IBaseFilter
4445
4446 # check for ioctl_meteor.h, ioctl_bt848.h and alternatives
4447 { check_header dev/bktr/ioctl_meteor.h &&
4448   check_header dev/bktr/ioctl_bt848.h; } ||
4449 { check_header machine/ioctl_meteor.h &&
4450   check_header machine/ioctl_bt848.h; } ||
4451 { check_header dev/video/meteor/ioctl_meteor.h &&
4452   check_header dev/video/bktr/ioctl_bt848.h; } ||
4453 check_header dev/ic/bt8xx.h
4454
4455 check_header sndio.h
4456 if check_struct sys/soundcard.h audio_buf_info bytes; then
4457     enable_safe sys/soundcard.h
4458 else
4459     check_cc -D__BSD_VISIBLE -D__XSI_VISIBLE <<EOF && add_cppflags -D__BSD_VISIBLE -D__XSI_VISIBLE && enable_safe sys/soundcard.h
4460     #include <sys/soundcard.h>
4461     audio_buf_info abc;
4462 EOF
4463 fi
4464 check_header soundcard.h
4465
4466 enabled_any alsa_indev alsa_outdev &&
4467     check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound
4468
4469 enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack && check_func sem_timedwait &&
4470     check_func jack_port_get_latency_range -ljack
4471
4472 enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio
4473
4474 if enabled libcdio; then
4475     check_lib2 "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
4476     check_lib2 "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
4477     die "ERROR: libcdio-paranoia not found"
4478 fi
4479
4480 check_lib X11/Xlib.h XOpenDisplay -lX11 && enable xlib
4481
4482 enabled x11grab                                           &&
4483 require Xext X11/extensions/XShm.h XShmCreateImage -lXext &&
4484 require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes &&
4485 { enabled xlib || die "ERROR: Xlib not found"; }
4486
4487 enabled vaapi &&
4488     check_lib va/va.h vaInitialize -lva ||
4489     disable vaapi
4490
4491 enabled vdpau &&
4492     check_cpp_condition vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" ||
4493     disable vdpau
4494
4495 enabled vdpau && enabled xlib &&
4496     check_lib2 "vdpau/vdpau.h vdpau/vdpau_x11.h" vdp_device_create_x11 -lvdpau &&
4497     enable vdpau_x11
4498
4499 # Funny iconv installations are not unusual, so check it after all flags have been set
4500 disabled iconv || check_func_headers iconv.h iconv || check_lib2 iconv.h iconv -liconv || disable iconv
4501
4502 enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
4503
4504 # add some useful compiler flags if supported
4505 check_cflags -Wdeclaration-after-statement
4506 check_cflags -Wall
4507 check_cflags -Wdisabled-optimization
4508 check_cflags -Wpointer-arith
4509 check_cflags -Wredundant-decls
4510 check_cflags -Wwrite-strings
4511 check_cflags -Wtype-limits
4512 check_cflags -Wundef
4513 check_cflags -Wmissing-prototypes
4514 check_cflags -Wno-pointer-to-int-cast
4515 check_cflags -Wstrict-prototypes
4516 enabled extra_warnings && check_cflags -Winline
4517
4518 check_disable_warning(){
4519     warning_flag=-W${1#-Wno-}
4520     test_cflags $warning_flag && add_cflags $1
4521 }
4522
4523 check_disable_warning -Wno-parentheses
4524 check_disable_warning -Wno-switch
4525 check_disable_warning -Wno-format-zero-length
4526 check_disable_warning -Wno-pointer-sign
4527
4528 # add some linker flags
4529 check_ldflags -Wl,--warn-common
4530 check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
4531 enabled rpath && add_ldflags -Wl,-rpath=$libdir
4532 test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
4533
4534 # add some strip flags
4535 # -wN '..@*' is more selective than -x, but not available everywhere.
4536 check_stripflags -wN \'..@*\' || check_stripflags -x
4537
4538 enabled xmm_clobber_test &&
4539     check_ldflags -Wl,--wrap,avcodec_open2              \
4540                   -Wl,--wrap,avcodec_decode_audio4      \
4541                   -Wl,--wrap,avcodec_decode_video2      \
4542                   -Wl,--wrap,avcodec_decode_subtitle2   \
4543                   -Wl,--wrap,avcodec_encode_audio2      \
4544                   -Wl,--wrap,avcodec_encode_video       \
4545                   -Wl,--wrap,avcodec_encode_video2      \
4546                   -Wl,--wrap,avcodec_encode_subtitle    \
4547                   -Wl,--wrap,sws_scale ||
4548     disable xmm_clobber_test
4549
4550 echo "X{};" > $TMPV
4551 if test_ldflags -Wl,--version-script,$TMPV; then
4552     append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
4553     check_cc <<EOF && enable symver_asm_label
4554 void ff_foo(void) __asm__ ("av_foo@VERSION");
4555 void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
4556 EOF
4557     check_cc <<EOF && enable symver_gnu_asm
4558 __asm__(".symver ff_foo,av_foo@VERSION");
4559 void ff_foo(void) {}
4560 EOF
4561 fi
4562
4563 if [ -z "$optflags" ]; then
4564     if enabled small; then
4565         optflags=$cflags_size
4566     elif enabled optimizations; then
4567         optflags=$cflags_speed
4568     else
4569         optflags=$cflags_noopt
4570     fi
4571 fi
4572
4573 check_optflags(){
4574     check_cflags "$@"
4575     enabled lto && check_ldflags "$@"
4576 }
4577
4578
4579 if enabled lto; then
4580     test "$cc_type" != "$ld_type" && die "LTO requires same compiler and linker"
4581     check_cflags  -flto
4582     check_ldflags -flto $cpuflags
4583 fi
4584
4585 check_optflags $optflags
4586 check_optflags -fno-math-errno
4587 check_optflags -fno-signed-zeros
4588
4589 enabled ftrapv && check_cflags -ftrapv
4590
4591 check_cc -mno-red-zone <<EOF && noredzone_flags="-mno-red-zone"
4592 int x;
4593 EOF
4594
4595
4596 if enabled icc; then
4597     # Just warnings, no remarks
4598     check_cflags -w1
4599     # -wd: Disable following warnings
4600     # 144, 167, 556: -Wno-pointer-sign
4601     # 188: enumerated type mixed with another type
4602     # 1292: attribute "foo" ignored
4603     # 1419: external declaration in primary source file
4604     # 10006: ignoring unknown option -fno-signed-zeros
4605     # 10148: ignoring unknown option -Wno-parentheses
4606     # 10156: ignoring option '-W'; no argument required
4607     check_cflags -wd144,167,188,556,1292,1419,10006,10148,10156
4608     # 11030: Warning unknown option --as-needed
4609     # 10156: ignoring option '-export'; no argument required
4610     check_ldflags -wd10156,11030
4611     # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
4612     enable ebp_available
4613     if enabled x86_32; then
4614         icc_version=$($cc -dumpversion)
4615         test ${icc_version%%.*} -ge 11 &&
4616             check_cflags -falign-stack=maintain-16-byte ||
4617             disable aligned_stack
4618     fi
4619 elif enabled ccc; then
4620     # disable some annoying warnings
4621     add_cflags -msg_disable bitnotint
4622     add_cflags -msg_disable mixfuncvoid
4623     add_cflags -msg_disable nonstandcast
4624     add_cflags -msg_disable unsupieee
4625 elif enabled gcc; then
4626     check_optflags -fno-tree-vectorize
4627     check_cflags -Werror=implicit-function-declaration
4628     check_cflags -Werror=missing-prototypes
4629     check_cflags -Werror=return-type
4630     check_cflags -Werror=vla
4631     enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
4632 elif enabled llvm_gcc; then
4633     check_cflags -mllvm -stack-alignment=16
4634 elif enabled clang; then
4635     check_cflags -mllvm -stack-alignment=16
4636     check_cflags -Qunused-arguments
4637     check_cflags -Werror=implicit-function-declaration
4638     check_cflags -Werror=missing-prototypes
4639     check_cflags -Werror=return-type
4640 elif enabled cparser; then
4641     add_cflags -Wno-missing-variable-declarations
4642     add_cflags -Wno-empty-statement
4643 elif enabled armcc; then
4644     # 2523: use of inline assembler is deprecated
4645     add_cflags -W${armcc_opt},--diag_suppress=2523
4646     add_cflags -W${armcc_opt},--diag_suppress=1207
4647     add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
4648     add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
4649     add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
4650     add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
4651 elif enabled tms470; then
4652     add_cflags -pds=824 -pds=837
4653 elif enabled pathscale; then
4654     add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
4655 elif enabled_any msvc icl; then
4656     enabled x86_32 && disable aligned_stack
4657     enabled_all x86_32 debug && add_cflags -Oy-
4658     enabled debug && add_ldflags -debug
4659     enable pragma_deprecated
4660     if enabled icl; then
4661         # -Qansi-alias is basically -fstrict-aliasing, but does not work
4662         # (correctly) on icl 13.x.
4663         check_cpp_condition "windows.h" "__ICL < 1300 || __ICL >= 1400" &&
4664             add_cflags -Qansi-alias
4665         # icl will pass the inline asm tests but inline asm is currently
4666         # not supported (build will fail)
4667         disabled inline_asm || warn "inline asm disabled due to issues with it in ICL"
4668         disable inline_asm
4669     fi
4670 fi
4671
4672 case $target_os in
4673     osf1)
4674         enabled ccc && add_ldflags '-Wl,-expect_unresolved,*'
4675     ;;
4676     plan9)
4677         add_cppflags -Dmain=plan9_main
4678     ;;
4679 esac
4680
4681 enable frame_thread_encoder
4682 enabled_any $THREADS_LIST      && enable threads
4683 enabled_any $ATOMICS_LIST      && enable atomics_native
4684
4685 enabled threads && ! enabled pthreads && ! enabled atomics_native && die "non pthread threading without atomics not supported, try adding --enable-pthreads or --cpu=i486 or higher if you are on x86"
4686
4687 enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
4688
4689 check_deps $CONFIG_LIST       \
4690            $CONFIG_EXTRA      \
4691            $HAVE_LIST         \
4692            $ALL_COMPONENTS    \
4693
4694
4695 if test $target_os = "haiku"; then
4696     disable memalign
4697     disable posix_memalign
4698 fi
4699
4700 ! enabled_any memalign posix_memalign aligned_malloc &&
4701     enabled_any $need_memalign && enable memalign_hack
4702
4703 # add_dep lib dep
4704 # -> enable ${lib}_deps_${dep}
4705 # -> add $dep to ${lib}_deps only once
4706 add_dep() {
4707     lib=$1
4708     dep=$2
4709     enabled "${lib}_deps_${dep}" && return 0
4710     enable  "${lib}_deps_${dep}"
4711     prepend "${lib}_deps" $dep
4712 }
4713
4714 # merge deps lib components
4715 # merge all ${component}_deps into ${lib}_deps and ${lib}_deps_*
4716 merge_deps() {
4717     lib=$1
4718     shift
4719     for comp in $*; do
4720         enabled $comp || continue
4721         eval "dep=\"\$${comp}_deps\""
4722         for d in $dep; do
4723             add_dep $lib $d
4724         done
4725     done
4726 }
4727
4728 merge_deps libavfilter $FILTER_LIST
4729
4730 echo "install prefix            $prefix"
4731 echo "source path               $source_path"
4732 echo "C compiler                $cc"
4733 if test "$host_cc" != "$cc"; then
4734     echo "host C compiler           $host_cc"
4735 fi
4736 echo "C library                 $libc_type"
4737 echo "ARCH                      $arch ($cpu)"
4738 if test "$build_suffix" != ""; then
4739     echo "build suffix              $build_suffix"
4740 fi
4741 if test "$progs_suffix" != ""; then
4742     echo "progs suffix              $progs_suffix"
4743 fi
4744 if test "$extra_version" != ""; then
4745     echo "version string suffix     $extra_version"
4746 fi
4747 echo "big-endian                ${bigendian-no}"
4748 echo "runtime cpu detection     ${runtime_cpudetect-no}"
4749 if enabled x86; then
4750     echo "${yasmexe}                      ${yasm-no}"
4751     echo "MMX enabled               ${mmx-no}"
4752     echo "MMXEXT enabled            ${mmxext-no}"
4753     echo "3DNow! enabled            ${amd3dnow-no}"
4754     echo "3DNow! extended enabled   ${amd3dnowext-no}"
4755     echo "SSE enabled               ${sse-no}"
4756     echo "SSSE3 enabled             ${ssse3-no}"
4757     echo "AVX enabled               ${avx-no}"
4758     echo "FMA4 enabled              ${fma4-no}"
4759     echo "i686 features enabled     ${i686-no}"
4760     echo "CMOV is fast              ${fast_cmov-no}"
4761     echo "EBX available             ${ebx_available-no}"
4762     echo "EBP available             ${ebp_available-no}"
4763 fi
4764 if enabled arm; then
4765     echo "ARMv5TE enabled           ${armv5te-no}"
4766     echo "ARMv6 enabled             ${armv6-no}"
4767     echo "ARMv6T2 enabled           ${armv6t2-no}"
4768     echo "VFP enabled               ${vfp-no}"
4769     echo "NEON enabled              ${neon-no}"
4770     echo "THUMB enabled             ${thumb-no}"
4771 fi
4772 if enabled mips; then
4773     echo "MIPS FPU enabled          ${mipsfpu-no}"
4774     echo "MIPS32R2 enabled          ${mips32r2-no}"
4775     echo "MIPS DSP R1 enabled       ${mipsdspr1-no}"
4776     echo "MIPS DSP R2 enabled       ${mipsdspr2-no}"
4777 fi
4778 if enabled ppc; then
4779     echo "AltiVec enabled           ${altivec-no}"
4780     echo "PPC 4xx optimizations     ${ppc4xx-no}"
4781     echo "dcbzl available           ${dcbzl-no}"
4782 fi
4783 if enabled sparc; then
4784     echo "VIS enabled               ${vis-no}"
4785 fi
4786 echo "debug symbols             ${debug-no}"
4787 echo "strip symbols             ${stripping-no}"
4788 echo "optimize for size         ${small-no}"
4789 echo "optimizations             ${optimizations-no}"
4790 echo "static                    ${static-no}"
4791 echo "shared                    ${shared-no}"
4792 echo "postprocessing support    ${postproc-no}"
4793 echo "new filter support        ${avfilter-no}"
4794 echo "network support           ${network-no}"
4795 echo "threading support         ${thread_type-no}"
4796 echo "safe bitstream reader     ${safe_bitstream_reader-no}"
4797 echo "SDL support               ${sdl-no}"
4798 echo "opencl enabled            ${opencl-no}"
4799 echo "libzvbi enabled           ${libzvbi-no}"
4800 echo "texi2html enabled         ${texi2html-no}"
4801 echo "perl enabled              ${perl-no}"
4802 echo "pod2man enabled           ${pod2man-no}"
4803 echo "makeinfo enabled          ${makeinfo-no}"
4804 test -n "$random_seed" &&
4805     echo "random seed               ${random_seed}"
4806 echo
4807
4808 echo "External libraries:"
4809 print_enabled '' $EXTERNAL_LIBRARY_LIST | print_3_columns
4810 echo
4811
4812 for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
4813     echo "Enabled ${type}s:"
4814     eval list=\$$(toupper $type)_LIST
4815     print_enabled '_*' $list | print_3_columns
4816     echo
4817 done
4818
4819 license="LGPL version 2.1 or later"
4820 if enabled nonfree; then
4821     license="nonfree and unredistributable"
4822 elif enabled gplv3; then
4823     license="GPL version 3 or later"
4824 elif enabled lgplv3; then
4825     license="LGPL version 3 or later"
4826 elif enabled gpl; then
4827     license="GPL version 2 or later"
4828 fi
4829
4830 echo "License: $license"
4831
4832 echo "Creating config.mak, config.h, and doc/config.texi..."
4833
4834 test -e Makefile || echo "include $source_path/Makefile" > Makefile
4835
4836 enabled stripping || strip="echo skipping strip"
4837
4838 config_files="$TMPH config.mak doc/config.texi"
4839
4840 cat > config.mak <<EOF
4841 # Automatically generated by configure - do not modify!
4842 ifndef FFMPEG_CONFIG_MAK
4843 FFMPEG_CONFIG_MAK=1
4844 FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
4845 prefix=$prefix
4846 LIBDIR=\$(DESTDIR)$libdir
4847 SHLIBDIR=\$(DESTDIR)$shlibdir
4848 INCDIR=\$(DESTDIR)$incdir
4849 BINDIR=\$(DESTDIR)$bindir
4850 DATADIR=\$(DESTDIR)$datadir
4851 DOCDIR=\$(DESTDIR)$docdir
4852 MANDIR=\$(DESTDIR)$mandir
4853 SRC_PATH=$source_path
4854 ifndef MAIN_MAKEFILE
4855 SRC_PATH:=\$(SRC_PATH:.%=..%)
4856 endif
4857 CC_IDENT=$cc_ident
4858 ARCH=$arch
4859 CC=$cc
4860 CXX=$cxx
4861 AS=$as
4862 LD=$ld
4863 DEPCC=$dep_cc
4864 DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
4865 DEPAS=$as
4866 DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
4867 YASM=$yasmexe
4868 DEPYASM=$yasmexe
4869 AR=$ar
4870 ARFLAGS=$arflags
4871 AR_O=$ar_o
4872 RANLIB=$ranlib
4873 STRIP=$strip
4874 CP=cp -p
4875 LN_S=$ln_s
4876 CPPFLAGS=$CPPFLAGS
4877 CFLAGS=$CFLAGS
4878 CXXFLAGS=$CXXFLAGS
4879 ASFLAGS=$ASFLAGS
4880 AS_C=$AS_C
4881 AS_O=$AS_O
4882 CC_C=$CC_C
4883 CC_E=$CC_E
4884 CC_O=$CC_O
4885 CXX_C=$CXX_C
4886 CXX_O=$CXX_O
4887 LD_O=$LD_O
4888 LD_LIB=$LD_LIB
4889 LD_PATH=$LD_PATH
4890 DLLTOOL=$dlltool
4891 WINDRES=$windres
4892 LDFLAGS=$LDFLAGS
4893 SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
4894 ASMSTRIPFLAGS=$ASMSTRIPFLAGS
4895 YASMFLAGS=$YASMFLAGS
4896 BUILDSUF=$build_suffix
4897 PROGSSUF=$progs_suffix
4898 FULLNAME=$FULLNAME
4899 LIBPREF=$LIBPREF
4900 LIBSUF=$LIBSUF
4901 LIBNAME=$LIBNAME
4902 SLIBPREF=$SLIBPREF
4903 SLIBSUF=$SLIBSUF
4904 EXESUF=$EXESUF
4905 EXTRA_VERSION=$extra_version
4906 CCDEP=$CCDEP
4907 CXXDEP=$CXXDEP
4908 CCDEP_FLAGS=$CCDEP_FLAGS
4909 ASDEP=$ASDEP
4910 ASDEP_FLAGS=$ASDEP_FLAGS
4911 CC_DEPFLAGS=$CC_DEPFLAGS
4912 AS_DEPFLAGS=$AS_DEPFLAGS
4913 HOSTCC=$host_cc
4914 HOSTLD=$host_ld
4915 HOSTCFLAGS=$host_cflags
4916 HOSTCPPFLAGS=$host_cppflags
4917 HOSTEXESUF=$HOSTEXESUF
4918 HOSTLDFLAGS=$host_ldflags
4919 HOSTLIBS=$host_libs
4920 DEPHOSTCC=$host_cc
4921 DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
4922 HOSTCCDEP=$HOSTCCDEP
4923 HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
4924 HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
4925 HOSTCC_C=$HOSTCC_C
4926 HOSTCC_O=$HOSTCC_O
4927 HOSTLD_O=$HOSTLD_O
4928 TARGET_EXEC=$target_exec $target_exec_args
4929 TARGET_PATH=$target_path
4930 TARGET_SAMPLES=${target_samples:-\$(SAMPLES)}
4931 LIBS-ffplay=$sdl_libs
4932 CFLAGS-ffplay=$sdl_cflags
4933 ZLIB=$($ldflags_filter -lz)
4934 LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
4935 EXTRALIBS=$extralibs
4936 COMPAT_OBJS=$compat_objs
4937 EXEOBJS=$exeobjs
4938 INSTALL=$install
4939 LIBTARGET=${LIBTARGET}
4940 SLIBNAME=${SLIBNAME}
4941 SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
4942 SLIBNAME_WITH_MAJOR=${SLIBNAME_WITH_MAJOR}
4943 SLIB_CREATE_DEF_CMD=${SLIB_CREATE_DEF_CMD}
4944 SLIB_EXTRA_CMD=${SLIB_EXTRA_CMD}
4945 SLIB_INSTALL_NAME=${SLIB_INSTALL_NAME}
4946 SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS}
4947 SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
4948 SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
4949 SAMPLES:=${samples:-\$(FATE_SAMPLES)}
4950 NOREDZONE_FLAGS=$noredzone_flags
4951 EOF
4952
4953 get_version(){
4954     lcname=lib${1}
4955     name=$(toupper $lcname)
4956     file=$source_path/$lcname/version.h
4957     eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file")
4958     eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
4959     eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
4960     eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
4961     eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> config.mak
4962 }
4963
4964 map 'get_version $v' $LIBRARY_LIST
4965
4966 cat > $TMPH <<EOF
4967 /* Automatically generated by configure - do not modify! */
4968 #ifndef FFMPEG_CONFIG_H
4969 #define FFMPEG_CONFIG_H
4970 #define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
4971 #define FFMPEG_LICENSE "$(c_escape $license)"
4972 #define CONFIG_THIS_YEAR 2013
4973 #define FFMPEG_DATADIR "$(eval c_escape $datadir)"
4974 #define AVCONV_DATADIR "$(eval c_escape $datadir)"
4975 #define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
4976 #define av_restrict $_restrict
4977 #define EXTERN_PREFIX "${extern_prefix}"
4978 #define EXTERN_ASM ${extern_prefix}
4979 #define BUILDSUF "$build_suffix"
4980 #define SLIBSUF "$SLIBSUF"
4981 #define HAVE_MMX2 HAVE_MMXEXT
4982 EOF
4983
4984 test -n "$assert_level" &&
4985     echo "#define ASSERT_LEVEL $assert_level" >>$TMPH
4986
4987 test -n "$malloc_prefix" &&
4988     echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH
4989
4990 if enabled yasm; then
4991     append config_files $TMPASM
4992     printf '' >$TMPASM
4993 fi
4994
4995 enabled getenv || echo "#define getenv(x) NULL" >> $TMPH
4996
4997
4998 mkdir -p doc
4999 echo "@c auto-generated by configure" > doc/config.texi
5000
5001 print_config ARCH_   "$config_files" $ARCH_LIST
5002 print_config HAVE_   "$config_files" $HAVE_LIST
5003 print_config CONFIG_ "$config_files" $CONFIG_LIST       \
5004                                      $CONFIG_EXTRA      \
5005                                      $ALL_COMPONENTS    \
5006
5007 echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH
5008 echo "endif # FFMPEG_CONFIG_MAK" >> config.mak
5009
5010 # Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
5011 cp_if_changed $TMPH config.h
5012 touch .config
5013
5014 enabled yasm && cp_if_changed $TMPASM config.asm
5015
5016 cat > $TMPH <<EOF
5017 /* Generated by ffconf */
5018 #ifndef AVUTIL_AVCONFIG_H
5019 #define AVUTIL_AVCONFIG_H
5020 EOF
5021
5022 print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
5023
5024 echo "#endif /* AVUTIL_AVCONFIG_H */" >> $TMPH
5025
5026 cp_if_changed $TMPH libavutil/avconfig.h
5027
5028 if test -n "$WARNINGS"; then
5029     printf "\n$WARNINGS"
5030     enabled fatal_warnings && exit 1
5031 fi
5032
5033 # build pkg-config files
5034
5035 pkgconfig_generate(){
5036     name=$1
5037     shortname=${name#lib}${build_suffix}
5038     comment=$2
5039     version=$3
5040     libs=$4
5041     requires=$5
5042     enabled ${name#lib} || return 0
5043     mkdir -p $name
5044     cat <<EOF > $name/$name${build_suffix}.pc
5045 prefix=$prefix
5046 exec_prefix=\${prefix}
5047 libdir=$libdir
5048 includedir=$incdir
5049
5050 Name: $name
5051 Description: $comment
5052 Version: $version
5053 Requires: $(enabled shared || echo $requires)
5054 Requires.private: $(enabled shared && echo $requires)
5055 Conflicts:
5056 Libs: -L\${libdir} $(enabled rpath && echo "-Wl,-rpath,\${libdir}") -l${shortname} $(enabled shared || echo $libs)
5057 Libs.private: $(enabled shared && echo $libs)
5058 Cflags: -I\${includedir}
5059 EOF
5060
5061 mkdir -p doc/examples/pc-uninstalled
5062 includedir=${source_path}
5063 [ "$includedir" = . ] && includedir="\${pcfiledir}/../../.."
5064     cat <<EOF > doc/examples/pc-uninstalled/$name.pc
5065 prefix=
5066 exec_prefix=
5067 libdir=\${pcfiledir}/../../../$name
5068 includedir=${includedir}
5069
5070 Name: $name
5071 Description: $comment
5072 Version: $version
5073 Requires: $requires
5074 Conflicts:
5075 Libs: -L\${libdir} -Wl,-rpath,\${libdir} -l${shortname} $(enabled shared || echo $libs)
5076 Cflags: -I\${includedir}
5077 EOF
5078 }
5079
5080 lavfi_libs="libavutil${build_suffix} = $LIBAVUTIL_VERSION"
5081 enabled libavfilter_deps_avcodec    && prepend lavfi_libs "libavcodec${build_suffix} = $LIBAVCODEC_VERSION,"
5082 enabled libavfilter_deps_avformat   && prepend lavfi_libs "libavformat${build_suffix} = $LIBAVFORMAT_VERSION,"
5083 enabled libavfilter_deps_avresample && prepend lavfi_libs "libavresample${build_suffix} = $LIBAVRESAMPLE_VERSION,"
5084 enabled libavfilter_deps_swscale    && prepend lavfi_libs "libswscale${build_suffix} = $LIBSWSCALE_VERSION,"
5085 enabled libavfilter_deps_swresample && prepend lavfi_libs "libswresample${build_suffix} = $LIBSWRESAMPLE_VERSION,"
5086 enabled libavfilter_deps_postproc   && prepend lavfi_libs "libpostproc${build_suffix} = $LIBPOSTPROC_VERSION,"
5087 lavfi_libs=${lavfi_libs%, }
5088
5089 lavd_libs="libavformat${build_suffix} = $LIBAVFORMAT_VERSION"
5090 enabled lavfi_indev && prepend lavd_libs "libavfilter${build_suffix} = $LIBAVFILTER_VERSION,"
5091
5092 pkgconfig_generate libavutil     "FFmpeg utility library"               "$LIBAVUTIL_VERSION"     "$LIBM"
5093 pkgconfig_generate libavcodec    "FFmpeg codec library"                 "$LIBAVCODEC_VERSION"    "$extralibs" "libavutil${build_suffix} = $LIBAVUTIL_VERSION"
5094 pkgconfig_generate libavformat   "FFmpeg container format library"      "$LIBAVFORMAT_VERSION"   "$extralibs" "libavcodec${build_suffix} = $LIBAVCODEC_VERSION"
5095 pkgconfig_generate libavdevice   "FFmpeg device handling library"       "$LIBAVDEVICE_VERSION"   "$extralibs" "$lavd_libs"
5096 pkgconfig_generate libavfilter   "FFmpeg audio/video filtering library" "$LIBAVFILTER_VERSION"   "$extralibs" "$lavfi_libs"
5097 pkgconfig_generate libpostproc   "FFmpeg postprocessing library"        "$LIBPOSTPROC_VERSION"   ""           "libavutil${build_suffix} = $LIBAVUTIL_VERSION"
5098 pkgconfig_generate libavresample "Libav audio resampling library"       "$LIBAVRESAMPLE_VERSION" "$extralibs" "libavutil${build_suffix} = $LIBAVUTIL_VERSION"
5099 pkgconfig_generate libswscale    "FFmpeg image rescaling library"       "$LIBSWSCALE_VERSION"    "$LIBM"      "libavutil${build_suffix} = $LIBAVUTIL_VERSION"
5100 pkgconfig_generate libswresample "FFmpeg audio resampling library"      "$LIBSWRESAMPLE_VERSION" "$LIBM"      "libavutil${build_suffix} = $LIBAVUTIL_VERSION"
5101
5102 fix_ffmpeg_remote(){
5103     git_remote_from=$1
5104     git_remote_to=$2
5105     fixme_remote=$(git --git-dir=$source_path/.git --work-tree=$source_path remote -v | grep $git_remote_from | cut -f 1 | sort | uniq)
5106     if [ "$fixme_remote" != "" ]; then
5107         echolog "
5108 Outdated domain in git config, the official domain for ffmpeg git is since
5109 November 2011, source.ffmpeg.org, both the old and the new point to the same
5110 repository and server. To update it enter the following commands:
5111 "
5112         for remote in $fixme_remote; do
5113             echolog "git remote set-url $remote $git_remote_to"
5114         done
5115     fi
5116 }
5117
5118 if test -f "$source_path/.git/config"; then
5119     remote_from=git.videolan.org
5120     remote_to=source.ffmpeg.org
5121     fix_ffmpeg_remote git@$remote_from:ffmpeg   git@$remote_to:ffmpeg
5122     fix_ffmpeg_remote git://$remote_from/ffmpeg git://$remote_to/ffmpeg
5123 fi