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