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