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