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