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