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