]> git.sesse.net Git - ffmpeg/blob - configure
http: pass return code from http_open_cnx_internal() on its failure
[ffmpeg] / configure
1 #!/bin/sh
2 #
3 # Libav 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 LIBAV, 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 Libav."
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-filters           show all available filters
77
78 Standard options:
79   --logfile=FILE           log tests and output to FILE [avbuild/config.log]
80   --disable-logging        do not log configure debug information
81   --prefix=PREFIX          install in PREFIX [$prefix_default]
82   --bindir=DIR             install binaries in DIR [PREFIX/bin]
83   --datadir=DIR            install data files in DIR [PREFIX/share/avconv]
84   --docdir=DIR             install documentation in DIR [PREFIX/share/doc/libav]
85   --libdir=DIR             install libs in DIR [PREFIX/lib]
86   --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
87   --incdir=DIR             install includes in DIR [PREFIX/include]
88   --mandir=DIR             install man page in DIR [PREFIX/share/man]
89   --enable-rpath           use rpath when linking programs (USE WITH CARE)
90
91 Licensing options:
92   --enable-gpl             allow use of GPL code, the resulting libs
93                            and binaries will be under GPL [no]
94   --enable-version3        upgrade (L)GPL to version 3 [no]
95   --enable-nonfree         allow use of nonfree code, the resulting libs
96                            and binaries will be unredistributable [no]
97
98 Configuration options:
99   --disable-static         do not build static libraries [no]
100   --enable-shared          build shared libraries [no]
101   --enable-small           optimize for size instead of speed
102   --enable-runtime-cpudetect detect CPU capabilities at runtime (bigger binary)
103   --enable-gray            enable full grayscale support (slower color)
104   --disable-swscale-alpha  disable alpha channel support in swscale
105   --disable-all            disable building components, libraries and programs
106
107 Program options:
108   --disable-programs       do not build command line programs
109   --disable-avconv         disable avconv build
110   --disable-avplay         disable avplay build
111   --disable-avprobe        disable avprobe build
112
113 Component options:
114   --disable-doc            do not build documentation
115   --disable-pod2man        do not build manual pages
116   --disable-texi2html      do not build HTML documentation
117   --disable-avdevice       disable libavdevice build
118   --disable-avcodec        disable libavcodec build
119   --disable-avformat       disable libavformat build
120   --disable-avutil         disable libavutil build
121   --disable-swscale        disable libswscale build
122   --disable-avfilter       disable video filter support [no]
123   --disable-avresample     disable libavresample build [no]
124   --disable-pthreads       disable pthreads [auto]
125   --disable-w32threads     disable Win32 threads [auto]
126   --disable-network        disable network support [no]
127   --disable-dct            disable DCT code
128   --disable-error-resilience disable error resilience code
129   --disable-lsp            disable LSP code
130   --disable-lzo            disable LZO decoder code
131   --disable-mdct           disable MDCT code
132   --disable-rdft           disable RDFT code
133   --disable-fft            disable FFT code
134   --disable-faan           disable floating point AAN (I)DCT code
135
136 Individual component options:
137   --disable-everything     disable all components listed below
138   --disable-encoder=NAME   disable encoder NAME
139   --enable-encoder=NAME    enable encoder NAME
140   --disable-encoders       disable all encoders
141   --disable-decoder=NAME   disable decoder NAME
142   --enable-decoder=NAME    enable decoder NAME
143   --disable-decoders       disable all decoders
144   --disable-hwaccel=NAME   disable hwaccel NAME
145   --enable-hwaccel=NAME    enable hwaccel NAME
146   --disable-hwaccels       disable all hwaccels
147   --disable-muxer=NAME     disable muxer NAME
148   --enable-muxer=NAME      enable muxer NAME
149   --disable-muxers         disable all muxers
150   --disable-demuxer=NAME   disable demuxer NAME
151   --enable-demuxer=NAME    enable demuxer NAME
152   --disable-demuxers       disable all demuxers
153   --enable-parser=NAME     enable parser NAME
154   --disable-parser=NAME    disable parser NAME
155   --disable-parsers        disable all parsers
156   --enable-bsf=NAME        enable bitstream filter NAME
157   --disable-bsf=NAME       disable bitstream filter NAME
158   --disable-bsfs           disable all bitstream filters
159   --enable-protocol=NAME   enable protocol NAME
160   --disable-protocol=NAME  disable protocol NAME
161   --disable-protocols      disable all protocols
162   --enable-indev=NAME      enable input device NAME
163   --disable-indev=NAME     disable input device NAME
164   --disable-indevs         disable input devices
165   --disable-devices        disable all devices
166   --enable-filter=NAME     enable filter NAME
167   --disable-filter=NAME    disable filter NAME
168   --disable-filters        disable all filters
169
170 External library support:
171
172   Using any of the following switches will allow Libav to link to the
173   corresponding external library. All the components depending on that library
174   will become enabled, if all their other dependencies are met and they are not
175   explicitly disabled. E.g. --enable-libwavpack will enable linking to
176   libwavpack and allow the libwavpack encoder to be built, unless it is
177   specifically disabled with --disable-encoder=libwavpack.
178
179   Note that only the system libraries are auto-detected. All the other external
180   libraries must be explicitly enabled.
181
182   Also note that the following help text describes the purpose of the libraries
183   themselves, not all their features will necessarily be usable by Libav.
184
185   --enable-avisynth          video frameserver
186   --enable-avxsynth          Linux version of AviSynth
187   --enable-bzlib             bzip2 compression [autodetect]
188   --enable-frei0r            video filtering plugins
189   --enable-gnutls            crypto
190   --enable-libaom            AV1 video encoding/decoding
191   --enable-libbs2b           Bauer stereophonic-to-binaural DSP
192   --enable-libcdio           audio CD input
193   --enable-libdc1394         IEEE 1394/Firewire camera input
194   --enable-libdcadec         DCA audio decoding
195   --enable-libfaac           AAC audio encoding
196   --enable-libfdk-aac        AAC audio encoding/decoding
197   --enable-libfontconfig     font configuration and management
198   --enable-libfreetype       font rendering
199   --enable-libgsm            GSM audio encoding/decoding
200   --enable-libhdcd           HDCD decoding filter
201   --enable-libilbc           ILBC audio encoding/decoding
202   --enable-libjack           JACK audio sound server
203   --enable-libkvazaar        HEVC video encoding
204   --enable-libmp3lame        MP3 audio encoding
205   --enable-libopencore-amrnb AMR-NB audio encoding/decoding
206   --enable-libopencore-amrwb AMR-WB audio decoding
207   --enable-libopencv         computer vision
208   --enable-libopenh264       H.264 video encoding/decoding
209   --enable-libopenjpeg       JPEG 2000 image encoding/decoding
210   --enable-libopus           Opus audio encoding/decoding
211   --enable-libpulse          Pulseaudio sound server
212   --enable-librtmp           RTMP streaming
213   --enable-libschroedinger   Dirac video encoding/decoding
214   --enable-libsnappy         snappy compression
215   --enable-libspeex          Speex audio encoding/decoding
216   --enable-libsrt            Haivision SRT protocol
217   --enable-libtheora         Theora video encoding/decoding
218   --enable-libtwolame        MP2 audio encoding
219   --enable-libvo-aacenc      AAC audio encoding
220   --enable-libvo-amrwbenc    AMR-WB audio encoding
221   --enable-libvorbis         Vorbis audio encoding/decoding
222   --enable-libvpx            VP* video encoding/decoding
223   --enable-libwavpack        Wavpack audio encoding/decoding
224   --enable-libwebp           WebP image encoding/decoding
225   --enable-libx264           H.264 video encoding
226   --enable-libx265           HEVC video encoding
227   --enable-libxavs           Chinese AVS video encoding
228   --enable-libxcb            X window system protocol communication
229   --enable-libxcb-shm        X11 shm communication [auto]
230   --enable-libxcb-xfixes     X11 mouse rendering [auto]
231   --enable-libxvid           MPEG-4 ASP video encoding
232   --enable-mbedtls           crypto
233   --enable-openssl           crypto
234   --enable-zlib              compression [autodetect]
235
236   The following libraries provide various hardware acceleration features:
237   --enable-amf     AMF video encoding code [auto]
238   --enable-cuda    Nvidia CUDA (dynamically linked)
239   --enable-cuvid   Nvidia CUVID video decode acceleration
240   --enable-d3d11va Microsoft Direct3D 11 video acceleration [auto]
241   --enable-dxva2   Microsoft DirectX 9 video acceleration [auto]
242   --enable-libmfx  Intel MediaSDK (AKA Quick Sync Video)
243   --enable-libnpp  Nvidia CUDA processing
244   --enable-mmal    Broadcom Multi-Media Abstraction Layer (Raspberry Pi)
245   --enable-nvenc   Nvidia video encoding
246   --enable-omx     OpenMAX IL
247   --enable-omx-rpi OpenMAX IL for Raspberry Pi
248   --enable-vaapi   Video Acceleration API (mainly Unix/Intel)
249   --enable-vda     Apple Video Decode Acceleration [auto]
250   --enable-vdpau   Nvidia Video Decode and Presentation API for Unix [auto]
251
252 Toolchain options:
253   --arch=ARCH              select architecture [$arch]
254   --cpu=CPU                select the minimum required CPU (affects
255                            instruction selection, may crash on older CPUs)
256   --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
257   --enable-cross-compile   assume a cross-compiler is used
258   --sysroot=PATH           root of cross-build tree
259   --sysinclude=PATH        location of cross-build system headers
260   --target-os=OS           compiler targets OS [$target_os]
261   --target-exec=CMD        command to run executables on target
262   --target-path=DIR        path to view of build directory on target
263   --target-samples=DIR     path to samples directory on target
264   --toolchain=NAME         set tool defaults according to NAME
265                            (gcc-asan, clang-asan, gcc-msan, clang-msan,
266                            gcc-tsan, clang-tsan, gcc-usan, clang-usan,
267                            valgrind-massif, valgrind-memcheck,
268                            msvc, icl, gcov, llvm-cov, hardened)
269   --nm=NM                  use nm tool
270   --ar=AR                  use archive tool AR [$ar_default]
271   --as=AS                  use assembler AS [$as_default]
272   --cc=CC                  use C compiler CC [$cc_default]
273   --objcc=OCC              use ObjC compiler OCC [$cc_default]
274   --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
275   --ld=LD                  use linker LD
276   --x86asmexe=X86ASM       use x86 assembler X86ASM
277   --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [$pkg_config_default]
278   --pkg-config-flags=FLAGS pass additional flags to pkgconf []
279   --host-cc=HOSTCC         use host C compiler HOSTCC
280   --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
281   --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
282   --host-ld=HOSTLD         use host linker HOSTLD
283   --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
284   --host-libs=HLIBS        use libs HLIBS when linking for host
285   --host-os=OS             compiler host OS [$target_os]
286   --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
287   --extra-objcflags=FLAGS  add FLAGS to OBJCFLAGS [$CFLAGS]
288   --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
289   --extra-ldexeflags=ELDFLAGS add ELDFLAGS to LDEXEFLAGS [$LDEXEFLAGS]
290   --extra-ldsoflags=ELDFLAGS add ELDFLAGS to LDSOFLAGS [$LDSOFLAGS]
291   --extra-libs=ELIBS       add ELIBS [$ELIBS]
292   --extra-version=STRING   version string suffix []
293   --optflags=OPTFLAGS      override optimization-related compiler flags
294   --enable-pic             build position-independent code
295   --enable-thumb           compile for Thumb instruction set
296   --enable-lto             use link-time optimization
297   --env="ENV=override"     override the environment variables
298
299 Advanced options (experts only):
300   --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
301   --custom-allocator=NAME  use a supported custom allocator
302   --disable-symver         disable symbol versioning
303   --enable-hardcoded-tables use hardcoded tables instead of runtime generation
304   --disable-safe-bitstream-reader
305                            disable buffer boundary checking in bitreaders
306                            (faster, but may crash)
307   --enable-sram            allow use of on-chip SRAM
308
309 Optimization options (experts only):
310   --disable-asm            disable all assembly optimizations
311   --disable-altivec        disable AltiVec optimizations
312   --disable-vsx            disable VSX optimizations
313   --disable-power8         disable POWER8 optimizations
314   --disable-amd3dnow       disable 3DNow! optimizations
315   --disable-amd3dnowext    disable 3DNow! extended optimizations
316   --disable-mmx            disable MMX optimizations
317   --disable-mmxext         disable MMXEXT optimizations
318   --disable-sse            disable SSE optimizations
319   --disable-sse2           disable SSE2 optimizations
320   --disable-sse3           disable SSE3 optimizations
321   --disable-ssse3          disable SSSE3 optimizations
322   --disable-sse4           disable SSE4 optimizations
323   --disable-sse42          disable SSE4.2 optimizations
324   --disable-avx            disable AVX optimizations
325   --disable-xop            disable XOP optimizations
326   --disable-fma3           disable FMA3 optimizations
327   --disable-fma4           disable FMA4 optimizations
328   --disable-avx2           disable AVX2 optimizations
329   --disable-armv5te        disable armv5te optimizations
330   --disable-armv6          disable armv6 optimizations
331   --disable-armv6t2        disable armv6t2 optimizations
332   --disable-vfp            disable VFP optimizations
333   --disable-neon           disable NEON optimizations
334   --disable-inline-asm     disable use of inline assembly
335   --disable-x86asm         disable use of standalone x86 assembly
336
337 Developer options (useful when working on Libav itself):
338   --disable-debug          disable debugging symbols
339   --enable-debug=LEVEL     set the debug level [$debuglevel]
340   --disable-optimizations  disable compiler optimizations
341   --enable-extra-warnings  enable more compiler warnings
342   --samples=PATH           location of test samples for FATE, if not set use
343                            \$LIBAV_SAMPLES at make invocation time.
344   --enable-neon-clobber-test check NEON registers for clobbering (should be
345                            used only for debugging purposes)
346   --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
347                            should be used only for debugging purposes)
348   --disable-valgrind-backtrace do not print a backtrace under Valgrind
349                            (only applies to --disable-optimizations builds)
350   --ignore-tests=TESTS     comma-separated list (without "fate-" prefix
351                            in the name) of tests whose result is ignored
352
353 NOTE: Object files are built at the place where configure is launched.
354 EOF
355   exit 0
356 }
357
358 log(){
359     echo "$@" >> $logfile
360 }
361
362 log_file(){
363     log BEGIN $1
364     i=1
365     while read line; do
366         printf '%5s   %s\n' "${i}" "${line}"
367         i=$(($i+1))
368     done < $1 >> $logfile
369     log END $1
370 }
371
372 echolog(){
373     log "$@"
374     echo "$@"
375 }
376
377 warn(){
378     log "WARNING: $*"
379     WARNINGS="${WARNINGS}WARNING: $*\n"
380 }
381
382 die(){
383     echolog "$@"
384     cat <<EOF
385
386 If you think configure made a mistake, make sure you are using the latest
387 version from Git.  If the latest version fails, report the problem to the
388 libav-tools@libav.org mailing list or IRC #libav on irc.freenode.net.
389 EOF
390     if disabled logging; then
391         cat <<EOF
392 Rerun configure with logging enabled (do not use --disable-logging), and
393 include the log this produces with your report.
394 EOF
395     else
396         cat <<EOF
397 Include the log file "$logfile" produced by configure as this will help
398 solving the problem.
399 EOF
400     fi
401     exit 1
402 }
403
404 # Avoid locale weirdness, besides we really just want to translate ASCII.
405 toupper(){
406     echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
407 }
408
409 tolower(){
410     echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
411 }
412
413 c_escape(){
414     echo "$*" | sed 's/["\\]/\\\0/g'
415 }
416
417 sh_quote(){
418     v=$(echo "$1" | sed "s/'/'\\\\''/g")
419     test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
420     echo "$v"
421 }
422
423 cleanws(){
424     echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//'
425 }
426
427 filter(){
428     pat=$1
429     shift
430     for v; do
431         eval "case '$v' in $pat) printf '%s ' '$v' ;; esac"
432     done
433 }
434
435 filter_out(){
436     pat=$1
437     shift
438     for v; do
439         eval "case '$v' in $pat) ;; *) printf '%s ' '$v' ;; esac"
440     done
441 }
442
443 map(){
444     m=$1
445     shift
446     for v; do eval $m; done
447 }
448
449 add_suffix(){
450     suffix=$1
451     shift
452     for v; do echo ${v}${suffix}; done
453 }
454
455 set_all(){
456     value=$1
457     shift
458     for var in $*; do
459         eval $var=$value
460     done
461 }
462
463 set_weak(){
464     value=$1
465     shift
466     for var; do
467         eval : \${$var:=$value}
468     done
469 }
470
471 sanitize_var_name(){
472     echo $@ | sed 's/[^A-Za-z0-9_]/_/g'
473 }
474
475 set_sanitized(){
476     var=$1
477     shift
478     eval $(sanitize_var_name "$var")='$*'
479 }
480
481 get_sanitized(){
482     eval echo \$$(sanitize_var_name "$1")
483 }
484
485 pushvar(){
486     for pvar in $*; do
487         eval level=\${${pvar}_level:=0}
488         eval ${pvar}_${level}="\$$pvar"
489         eval ${pvar}_level=$(($level+1))
490     done
491 }
492
493 popvar(){
494     for pvar in $*; do
495         eval level=\${${pvar}_level:-0}
496         test $level = 0 && continue
497         eval level=$(($level-1))
498         eval $pvar="\${${pvar}_${level}}"
499         eval ${pvar}_level=$level
500         eval unset ${pvar}_${level}
501     done
502 }
503
504 enable(){
505     set_all yes $*
506 }
507
508 disable(){
509     set_all no $*
510 }
511
512 enable_weak(){
513     set_weak yes $*
514 }
515
516 disable_weak(){
517     set_weak no $*
518 }
519
520 enable_sanitized(){
521     for var; do
522         enable $(sanitize_var_name $var)
523     done
524 }
525
526 disable_sanitized(){
527     for var; do
528         disable $(sanitize_var_name $var)
529     done
530 }
531
532 do_enable_deep(){
533     for var; do
534         enabled $var && continue
535         eval sel="\$${var}_select"
536         eval sgs="\$${var}_suggest"
537         pushvar var sgs
538         enable_deep $sel
539         popvar sgs
540         enable_deep_weak $sgs
541         popvar var
542     done
543 }
544
545 enable_deep(){
546     do_enable_deep $*
547     enable $*
548 }
549
550 enable_deep_weak(){
551     for var; do
552         disabled $var && continue
553         pushvar var
554         do_enable_deep $var
555         popvar var
556         enable_weak $var
557     done
558 }
559
560 enabled(){
561     test "${1#!}" = "$1" && op="=" || op="!="
562     eval test "x\$${1#!}" $op "xyes"
563 }
564
565 disabled(){
566     test "${1#!}" = "$1" && op="=" || op="!="
567     eval test "x\$${1#!}" $op "xno"
568 }
569
570 enabled_all(){
571     for opt; do
572         enabled $opt || return 1
573     done
574 }
575
576 disabled_all(){
577     for opt; do
578         disabled $opt || return 1
579     done
580 }
581
582 enabled_any(){
583     for opt; do
584         enabled $opt && return 0
585     done
586 }
587
588 disabled_any(){
589     for opt; do
590         disabled $opt && return 0
591     done
592     return 1
593 }
594
595 set_default(){
596     for opt; do
597         eval : \${$opt:=\$${opt}_default}
598     done
599 }
600
601 is_in(){
602     value=$1
603     shift
604     for var in $*; do
605         [ $var = $value ] && return 0
606     done
607     return 1
608 }
609
610 check_deps(){
611     for cfg; do
612         enabled ${cfg}_checking && die "Circular dependency for $cfg."
613         disabled ${cfg}_checking && continue
614         enable ${cfg}_checking
615
616         eval dep_all="\$${cfg}_deps"
617         eval dep_any="\$${cfg}_deps_any"
618         eval dep_con="\$${cfg}_conflict"
619         eval dep_sel="\$${cfg}_select"
620         eval dep_sgs="\$${cfg}_suggest"
621         eval dep_ifa="\$${cfg}_if"
622         eval dep_ifn="\$${cfg}_if_any"
623
624         pushvar cfg dep_all dep_any dep_con dep_sel dep_sgs dep_ifa dep_ifn
625         check_deps $dep_all $dep_any $dep_con $dep_sel $dep_sgs $dep_ifa $dep_ifn
626         popvar cfg dep_all dep_any dep_con dep_sel dep_sgs dep_ifa dep_ifn
627
628         [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
629         [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
630         enabled_all  $dep_all || disable $cfg
631         enabled_any  $dep_any || disable $cfg
632         disabled_all $dep_con || disable $cfg
633         disabled_any $dep_sel && disable $cfg
634
635         enabled $cfg && enable_deep_weak $dep_sel $dep_sgs
636
637         for dep in $dep_all $dep_any $dep_sel $dep_sgs; do
638             # filter out library deps, these do not belong in extralibs
639             is_in $dep $LIBRARY_LIST && continue
640             enabled $dep && eval append ${cfg}_extralibs ${dep}_extralibs
641         done
642
643         disable ${cfg}_checking
644     done
645 }
646
647 print_config(){
648     pfx=$1
649     files=$2
650     shift 2
651     map 'eval echo "$v \${$v:-no}"' "$@" |
652     awk "BEGIN { split(\"$files\", files) }
653         {
654             c = \"$pfx\" toupper(\$1);
655             v = \$2;
656             sub(/yes/, 1, v);
657             sub(/no/,  0, v);
658             for (f in files) {
659                 file = files[f];
660                 if (file ~ /\\.h\$/) {
661                     printf(\"#define %s %d\\n\", c, v) >>file;
662                 } else if (file ~ /\\.asm\$/) {
663                     printf(\"%%define %s %d\\n\", c, v) >>file;
664                 } else if (file ~ /\\.mak\$/) {
665                     n = -v ? \"\" : \"!\";
666                     printf(\"%s%s=yes\\n\", n, c) >>file;
667                 }
668             }
669         }"
670 }
671
672 print_enabled(){
673     suf=$1
674     shift
675     for v; do
676         enabled $v && printf "%s\n" ${v%$suf}
677     done
678 }
679
680 append(){
681     var=$1
682     shift
683     eval "$var=\"\$$var $*\""
684 }
685
686 prepend(){
687     var=$1
688     shift
689     eval "$var=\"$* \$$var\""
690 }
691
692 unique(){
693     var=$1
694     uniq_list=""
695     for tok in $(eval echo \$$var); do
696         uniq_list="$(filter_out $tok $uniq_list) $tok"
697     done
698     eval "$var=\"${uniq_list}\""
699 }
700
701 resolve(){
702     var=$1
703     tmpvar=
704     for entry in $(eval echo \$$var); do
705         tmpvar="$tmpvar $(eval echo \$${entry})"
706     done
707     eval "$var=\"${tmpvar}\""
708 }
709
710 add_cppflags(){
711     append CPPFLAGS "$@"
712 }
713
714 add_cflags(){
715     append CFLAGS $($cflags_filter "$@")
716 }
717
718 add_cflags_headers(){
719     append CFLAGS_HEADERS $($cflags_filter "$@")
720 }
721
722 add_objcflags(){
723     append OBJCFLAGS $($objcflags_filter "$@")
724 }
725
726 add_asflags(){
727     append ASFLAGS $($asflags_filter "$@")
728 }
729
730 add_ldflags(){
731     append LDFLAGS $($ldflags_filter "$@")
732 }
733
734 add_ldexeflags(){
735     append LDEXEFLAGS $($ldflags_filter "$@")
736 }
737
738 add_ldsoflags(){
739     append LDSOFLAGS $($ldflags_filter "$@")
740 }
741
742 add_extralibs(){
743     prepend extralibs $($ldflags_filter "$@")
744 }
745
746 add_stripflags(){
747     append STRIPFLAGS "$@"
748 }
749
750 add_host_cppflags(){
751     append host_cppflags "$@"
752 }
753
754 add_host_cflags(){
755     append host_cflags $($host_cflags_filter "$@")
756 }
757
758 add_host_ldflags(){
759     append host_ldflags $($host_ldflags_filter "$@")
760 }
761
762 add_compat(){
763     append compat_objs $1
764     shift
765     map 'add_cppflags -D$v' "$@"
766 }
767
768 test_cmd(){
769     log "$@"
770     "$@" >> $logfile 2>&1
771 }
772
773 cc_e(){
774     eval printf '%s\\n' $CC_E
775 }
776
777 cc_o(){
778     eval printf '%s\\n' $CC_O
779 }
780
781 as_o(){
782     eval printf '%s\\n' $AS_O
783 }
784
785 x86asm_o(){
786     eval printf '%s\\n' $X86ASM_O
787 }
788
789 ld_o(){
790     eval printf '%s\\n' $LD_O
791 }
792
793 hostcc_e(){
794     eval printf '%s\\n' $HOSTCC_E
795 }
796
797 hostcc_o(){
798     eval printf '%s\\n' $HOSTCC_O
799 }
800
801 test_cc(){
802     log test_cc "$@"
803     cat > $TMPC
804     log_file $TMPC
805     test_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
806 }
807
808 test_objcc(){
809     log test_objcc "$@"
810     cat > $TMPC
811     log_file $TMPC
812     test_cmd $objcc $CPPFLAGS $CFLAGS $OBJCFLAGS "$@" $OBJCC_C $(cc_o $TMPO) $TMPC
813 }
814
815 test_cpp(){
816     log test_cpp "$@"
817     cat > $TMPC
818     log_file $TMPC
819     test_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
820 }
821
822 test_as(){
823     log test_as "$@"
824     cat > $TMPS
825     log_file $TMPS
826     test_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
827 }
828
829 test_x86asm(){
830     log test_x86asm "$@"
831     echo "$1" > $TMPASM
832     log_file $TMPASM
833     shift
834     test_cmd $x86asmexe $X86ASMFLAGS "$@" $(x86asm_o $TMPO) $TMPASM
835 }
836
837 check_cmd(){
838     log check_cmd "$@"
839     cmd=$1
840     disabled $cmd && return
841     disable $cmd
842     test_cmd $@ && enable $cmd
843 }
844
845 check_as(){
846     log check_as "$@"
847     name=$1
848     code=$2
849     shift 2
850     disable $name
851     test_as $@ <<EOF && enable $name
852 $code
853 EOF
854 }
855
856 check_inline_asm(){
857     log check_inline_asm "$@"
858     name="$1"
859     code="$2"
860     shift 2
861     disable $name
862     test_cc "$@" <<EOF && enable $name
863 void foo(void){ __asm__ volatile($code); }
864 EOF
865 }
866
867 check_insn(){
868     log check_insn "$@"
869     check_inline_asm ${1}_inline "\"$2\""
870     check_as ${1}_external "$2"
871 }
872
873 check_x86asm(){
874     log check_x86asm "$@"
875     name=$1
876     shift
877     disable $name
878     test_x86asm "$@" && enable $name
879 }
880
881 test_ld(){
882     log test_ld "$@"
883     flags=$(filter_out '-l*' "$@")
884     libs=$(filter '-l*' "$@")
885     test_cc $($cflags_filter $flags) || return
886     flags=$($ldflags_filter $flags)
887     libs=$($ldflags_filter $libs)
888     test_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
889 }
890
891 check_ld(){
892     log check_ld "$@"
893     name=$1
894     shift
895     disable $name
896     test_ld $@ && enable $name
897 }
898
899 print_include(){
900     hdr=$1
901     test "${hdr%.h}" = "${hdr}" &&
902         echo "#include $hdr"    ||
903         echo "#include <$hdr>"
904 }
905
906 test_code(){
907     log test_code "$@"
908     check=$1
909     headers=$2
910     code=$3
911     shift 3
912     {
913         for hdr in $headers; do
914             print_include $hdr
915         done
916         echo "int main(void) { $code; return 0; }"
917     } | test_$check "$@"
918 }
919
920 check_cppflags(){
921     log check_cppflags "$@"
922     test_cpp "$@" <<EOF && add_cppflags "$@"
923 #include <stdlib.h>;
924 EOF
925 }
926
927 test_cflags(){
928     log test_cflags "$@"
929     set -- $($cflags_filter "$@")
930     test_cc "$@" <<EOF
931 int x;
932 EOF
933 }
934
935 check_cflags(){
936     log check_cflags "$@"
937     test_cflags "$@" && add_cflags "$@"
938 }
939
940 test_objcflags(){
941     log test_objcflags "$@"
942     set -- $($objcflags_filter "$@")
943     test_objcc "$@" <<EOF
944 int x;
945 EOF
946 }
947
948 check_objcflags(){
949     log check_objcflags "$@"
950     test_objcflags "$@" && add_objcflags "$@"
951 }
952
953 test_ldflags(){
954     log test_ldflags "$@"
955     set -- $($ldflags_filter "$@")
956     test_ld "$@" <<EOF
957 int main(void){ return 0; }
958 EOF
959 }
960
961 check_ldflags(){
962     log check_ldflags "$@"
963     test_ldflags "$@" && add_ldflags "$@"
964 }
965
966 test_stripflags(){
967     log test_stripflags "$@"
968     # call test_cc to get a fresh TMPO
969     test_cc <<EOF
970 int main(void) { return 0; }
971 EOF
972     test_cmd $strip $STRIPFLAGS "$@" $TMPO
973 }
974
975 check_stripflags(){
976     log check_stripflags "$@"
977     test_stripflags "$@" && add_stripflags "$@"
978 }
979
980 check_headers(){
981     log check_headers "$@"
982     headers=$1
983     shift
984     disable_sanitized $headers
985     {
986         for hdr in $headers; do
987             print_include $hdr
988         done
989         echo "int x;"
990     } | test_cpp "$@" && enable_sanitized $headers
991 }
992
993 check_func(){
994     log check_func "$@"
995     func=$1
996     shift
997     disable $func
998     test_ld "$@" <<EOF && enable $func
999 extern int $func();
1000 int main(void){ $func(); }
1001 EOF
1002 }
1003
1004 check_mathfunc(){
1005     log check_mathfunc "$@"
1006     func=$1
1007     narg=$2
1008     shift 2
1009     test $narg = 2 && args="f, g" || args="f"
1010     disable $func
1011     test_ld "$@" <<EOF && enable $func
1012 #include <math.h>
1013 float foo(float f, float g) { return $func($args); }
1014 int main(void){ return 0; }
1015 EOF
1016 }
1017
1018 check_func_headers(){
1019     log check_func_headers "$@"
1020     headers=$1
1021     funcs=$2
1022     shift 2
1023     {
1024         for hdr in $headers; do
1025             print_include $hdr
1026         done
1027         for func in $funcs; do
1028             echo "long check_$func(void) { return (long) $func; }"
1029         done
1030         echo "int main(void) { return 0; }"
1031     } | test_ld "$@" && enable $funcs && enable_sanitized $headers
1032 }
1033
1034 test_cpp_condition(){
1035     log test_cpp_condition "$@"
1036     header=$1
1037     condition=$2
1038     shift 2
1039     test_cpp "$@" <<EOF
1040 #include <$header>
1041 #if !($condition)
1042 #error "unsatisfied condition: $condition"
1043 #endif
1044 EOF
1045 }
1046
1047 check_cpp_condition(){
1048     log check_cpp_condition "$@"
1049     name=$1
1050     shift 1
1051     disable $name
1052     test_cpp_condition "$@" && enable $name
1053 }
1054
1055 check_lib(){
1056     log check_lib "$@"
1057     name="$1"
1058     headers="$2"
1059     funcs="$3"
1060     shift 3
1061     disable $name
1062     check_func_headers "$headers" "$funcs" "$@" &&
1063         enable $name && eval ${name}_extralibs="\$@"
1064 }
1065
1066 test_pkg_config(){
1067     log test_pkg_config "$@"
1068     name="$1"
1069     pkg_version="$2"
1070     pkg="${2%% *}"
1071     headers="$3"
1072     funcs="$4"
1073     shift 4
1074     disable $name
1075     test_cmd $pkg_config --exists --print-errors $pkg_version || return
1076     pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
1077     pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
1078     check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
1079         enable $name &&
1080         set_sanitized "${name}_cflags"    $pkg_cflags &&
1081         set_sanitized "${name}_extralibs" $pkg_libs
1082 }
1083
1084 check_pkg_config(){
1085     log check_pkg_config "$@"
1086     name="$1"
1087     test_pkg_config "$@" &&
1088         eval add_cflags \$${name}_cflags
1089 }
1090
1091 test_exec(){
1092     log test_exec "$@"
1093     test_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
1094 }
1095
1096 check_exec_crash(){
1097     log check_exec_crash "$@"
1098     code=$(cat)
1099
1100     # exit() is not async signal safe.  _Exit (C99) and _exit (POSIX)
1101     # are safe but may not be available everywhere.  Thus we use
1102     # raise(SIGTERM) instead.  The check is run in a subshell so we
1103     # can redirect the "Terminated" message from the shell.  SIGBUS
1104     # is not defined by standard C so it is used conditionally.
1105
1106     (test_exec "$@") >> $logfile 2>&1 <<EOF
1107 #include <signal.h>
1108 static void sighandler(int sig){
1109     raise(SIGTERM);
1110 }
1111 int foo(void){
1112     $code
1113 }
1114 int (*func_ptr)(void) = foo;
1115 int main(void){
1116     signal(SIGILL, sighandler);
1117     signal(SIGFPE, sighandler);
1118     signal(SIGSEGV, sighandler);
1119 #ifdef SIGBUS
1120     signal(SIGBUS, sighandler);
1121 #endif
1122     return func_ptr();
1123 }
1124 EOF
1125 }
1126
1127 check_type(){
1128     log check_type "$@"
1129     headers=$1
1130     type=$2
1131     shift 2
1132     disable_sanitized "$type"
1133     test_code cc "$headers" "$type v" "$@" && enable_sanitized "$type"
1134 }
1135
1136 check_struct(){
1137     log check_struct "$@"
1138     headers=$1
1139     struct=$2
1140     member=$3
1141     shift 3
1142     disable_sanitized "${struct}_${member}"
1143     test_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
1144         enable_sanitized "${struct}_${member}"
1145 }
1146
1147 check_builtin(){
1148     log check_builtin "$@"
1149     name=$1
1150     shift
1151     disable "$name"
1152     test_code ld "$@" && enable "$name"
1153 }
1154
1155 check_compile_assert(){
1156     log check_compile_assert "$@"
1157     name=$1
1158     headers=$2
1159     condition=$3
1160     shift 3
1161     disable "$name"
1162     test_code cc "$headers" "char c[2 * !!($condition) - 1]" "$@" && enable "$name"
1163 }
1164
1165 check_cc(){
1166     log check_cc "$@"
1167     name=$1
1168     shift
1169     disable "$name"
1170     test_code cc "$@" && enable "$name"
1171 }
1172
1173 require(){
1174     log require "$@"
1175     name_version="$1"
1176     name="${1%% *}"
1177     shift
1178     check_lib $name "$@" || die "ERROR: $name_version not found"
1179 }
1180
1181 require_cc(){
1182     log require_cc "$@"
1183     name="$1"
1184     check_cc "$@" || die "ERROR: $name failed"
1185 }
1186
1187 require_headers(){
1188     log require_headers "$@"
1189     headers="$1"
1190     check_headers "$@" || die "ERROR: $headers not found"
1191 }
1192
1193 require_cpp_condition(){
1194     log require_cpp_condition "$@"
1195     condition="$2"
1196     check_cpp_condition "$@" || die "ERROR: $condition not satisfied"
1197 }
1198
1199 require_pkg_config(){
1200     log require_pkg_config "$@"
1201     pkg_version="$2"
1202     check_pkg_config "$@" || die "ERROR: $pkg_version not found"
1203 }
1204
1205 test_host_cc(){
1206     log test_host_cc "$@"
1207     cat > $TMPC
1208     log_file $TMPC
1209     test_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
1210 }
1211
1212 test_host_cpp(){
1213     log test_host_cpp "$@"
1214     cat > $TMPC
1215     log_file $TMPC
1216     test_cmd $host_cc $host_cppflags $host_cflags "$@" $(hostcc_e $TMPO) $TMPC
1217 }
1218
1219 check_host_cppflags(){
1220     log check_host_cppflags "$@"
1221     test_host_cpp "$@" <<EOF && append host_cppflags "$@"
1222 #include <stdlib.h>;
1223 EOF
1224 }
1225
1226 check_host_cflags(){
1227     log check_host_cflags "$@"
1228     set -- $($host_cflags_filter "$@")
1229     test_host_cc "$@" <<EOF && append host_cflags "$@"
1230 int x;
1231 EOF
1232 }
1233
1234 test_host_cpp_condition(){
1235     log test_host_cpp_condition "$@"
1236     header=$1
1237     condition=$2
1238     shift 2
1239     test_host_cpp "$@" <<EOF
1240 #include <$header>
1241 #if !($condition)
1242 #error "unsatisfied condition: $condition"
1243 #endif
1244 EOF
1245 }
1246
1247 check_host_cpp_condition(){
1248     log check_host_cpp_condition "$@"
1249     name=$1
1250     shift 1
1251     disable $name
1252     test_host_cpp_condition "$@" && enable $name
1253 }
1254
1255 cp_if_changed(){
1256     cmp -s "$1" "$2" && { test "$quiet" != "yes" && echo "$2 is unchanged"; } && return
1257     mkdir -p "$(dirname $2)"
1258     cp -f "$1" "$2"
1259 }
1260
1261 # CONFIG_LIST contains configurable options, while HAVE_LIST is for
1262 # system-dependent things.
1263
1264 AVCODEC_COMPONENTS="
1265     bsfs
1266     decoders
1267     encoders
1268     hwaccels
1269     parsers
1270 "
1271
1272 AVDEVICE_COMPONENTS="
1273     indevs
1274 "
1275 AVFILTER_COMPONENTS="
1276     filters
1277 "
1278 AVFORMAT_COMPONENTS="
1279     demuxers
1280     muxers
1281     protocols
1282 "
1283
1284 COMPONENT_LIST="
1285     $AVCODEC_COMPONENTS
1286     $AVDEVICE_COMPONENTS
1287     $AVFILTER_COMPONENTS
1288     $AVFORMAT_COMPONENTS
1289 "
1290
1291 EXAMPLE_LIST="
1292     decode_audio_example
1293     decode_video_example
1294     encode_audio_example
1295     encode_video_example
1296     filter_audio_example
1297     metadata_example
1298     output_example
1299     qsvdec_example
1300     transcode_aac_example
1301 "
1302
1303 # catchall list of things that require external libs to link
1304 EXTRALIBS_LIST="
1305     cpu_init
1306     cws2fws
1307 "
1308
1309 HWACCEL_LIBRARY_NONFREE_LIST="
1310     cuda
1311     cuvid
1312     libnpp
1313 "
1314 HWACCEL_LIBRARY_LIST="
1315     $HWACCEL_LIBRARY_NONFREE_LIST
1316     amf
1317     d3d11va
1318     dxva2
1319     libmfx
1320     mmal
1321     nvenc
1322     omx
1323     vaapi
1324     vda
1325     vdpau
1326 "
1327
1328 EXTERNAL_LIBRARY_GPL_LIST="
1329     libcdio
1330     libx264
1331     libx265
1332     libxavs
1333     libxvid
1334 "
1335
1336 EXTERNAL_LIBRARY_NONFREE_LIST="
1337     libfaac
1338     libfdk_aac
1339     openssl
1340 "
1341
1342 EXTERNAL_LIBRARY_VERSION3_LIST="
1343     libopencore_amrnb
1344     libopencore_amrwb
1345     libvo_aacenc
1346     libvo_amrwbenc
1347     mbedtls
1348 "
1349
1350 EXTERNAL_LIBRARY_LIST="
1351     $EXTERNAL_LIBRARY_GPL_LIST
1352     $EXTERNAL_LIBRARY_NONFREE_LIST
1353     $EXTERNAL_LIBRARY_VERSION3_LIST
1354     avisynth
1355     avxsynth
1356     frei0r
1357     gnutls
1358     libaom
1359     libbs2b
1360     libdc1394
1361     libdcadec
1362     libfontconfig
1363     libfreetype
1364     libgsm
1365     libhdcd
1366     libilbc
1367     libjack
1368     libkvazaar
1369     libmp3lame
1370     libopencv
1371     libopenh264
1372     libopenjpeg
1373     libopus
1374     libpulse
1375     librtmp
1376     libschroedinger
1377     libsnappy
1378     libspeex
1379     libsrt
1380     libtheora
1381     libtwolame
1382     libvorbis
1383     libvpx
1384     libwavpack
1385     libwebp
1386     libxcb
1387     libxcb_shm
1388     libxcb_xfixes
1389 "
1390
1391 SYSTEM_LIBRARY_LIST="
1392     bzlib
1393     zlib
1394 "
1395
1396 FEATURE_LIST="
1397     gray
1398     hardcoded_tables
1399     omx_rpi
1400     runtime_cpudetect
1401     safe_bitstream_reader
1402     shared
1403     small
1404     sram
1405     static
1406     swscale_alpha
1407 "
1408
1409 LIBRARY_LIST="
1410     avcodec
1411     avdevice
1412     avfilter
1413     avformat
1414     avresample
1415     avutil
1416     swscale
1417 "
1418
1419 LICENSE_LIST="
1420     gpl
1421     nonfree
1422     version3
1423 "
1424
1425 PROGRAM_LIST="
1426     avconv
1427     avplay
1428     avprobe
1429 "
1430
1431 SUBSYSTEM_LIST="
1432     dct
1433     doc
1434     error_resilience
1435     faan
1436     fft
1437     lsp
1438     lzo
1439     mdct
1440     network
1441     rdft
1442 "
1443
1444 # COMPONENT_LIST needs to come last to ensure correct dependency checking
1445 CONFIG_LIST="
1446     $EXAMPLE_LIST
1447     $EXTERNAL_LIBRARY_LIST
1448     $HWACCEL_LIBRARY_LIST
1449     $FEATURE_LIST
1450     $LICENSE_LIST
1451     $LIBRARY_LIST
1452     $PROGRAM_LIST
1453     $SUBSYSTEM_LIST
1454     $SYSTEM_LIBRARY_LIST
1455     neon_clobber_test
1456     pic
1457     pod2man
1458     texi2html
1459     thumb
1460     valgrind_backtrace
1461     xmm_clobber_test
1462     $COMPONENT_LIST
1463 "
1464
1465 THREADS_LIST="
1466     pthreads
1467     w32threads
1468 "
1469
1470 ATOMICS_LIST="
1471     atomics_gcc
1472     atomics_suncc
1473     atomics_win32
1474 "
1475
1476 ARCH_LIST="
1477     aarch64
1478     alpha
1479     arm
1480     avr32
1481     avr32_ap
1482     avr32_uc
1483     bfin
1484     ia64
1485     m68k
1486     mips
1487     mips64
1488     parisc
1489     ppc
1490     ppc64
1491     s390
1492     sh4
1493     sparc
1494     sparc64
1495     tilegx
1496     tilepro
1497     tomi
1498     x86
1499     x86_32
1500     x86_64
1501 "
1502
1503 ARCH_EXT_LIST_ARM="
1504     armv5te
1505     armv6
1506     armv6t2
1507     armv8
1508     neon
1509     vfp
1510     vfpv3
1511 "
1512
1513 ARCH_EXT_LIST_X86_SIMD="
1514     amd3dnow
1515     amd3dnowext
1516     avx
1517     avx2
1518     fma3
1519     fma4
1520     mmx
1521     mmxext
1522     sse
1523     sse2
1524     sse3
1525     sse4
1526     sse42
1527     ssse3
1528     xop
1529 "
1530
1531 ARCH_EXT_LIST_PPC="
1532     altivec
1533     dcbzl
1534     ldbrx
1535     power8
1536     ppc4xx
1537     vsx
1538 "
1539
1540 ARCH_EXT_LIST_X86="
1541     $ARCH_EXT_LIST_X86_SIMD
1542     cpunop
1543     i686
1544 "
1545
1546 ARCH_EXT_LIST_MIPS="
1547     loongson
1548     mips32r1
1549     mips64r1
1550     mips32r2
1551     mips64r2
1552     mips32r6
1553     mips64r6
1554 "
1555
1556 ARCH_EXT_LIST="
1557     $ARCH_EXT_LIST_ARM
1558     $ARCH_EXT_LIST_MIPS
1559     $ARCH_EXT_LIST_PPC
1560     $ARCH_EXT_LIST_X86
1561     vis
1562 "
1563
1564 ARCH_FEATURES="
1565     aligned_stack
1566     fast_64bit
1567     fast_clz
1568     fast_cmov
1569     local_aligned_8
1570     local_aligned_16
1571     local_aligned_32
1572     simd_align_16
1573     simd_align_32
1574 "
1575
1576 BUILTIN_LIST="
1577     atomic_cas_ptr
1578     machine_rw_barrier
1579     MemoryBarrier
1580     mm_empty
1581     rdtsc
1582     sem_timedwait
1583     sync_val_compare_and_swap
1584 "
1585 HAVE_LIST_CMDLINE="
1586     inline_asm
1587     symver
1588     x86asm
1589 "
1590
1591 HAVE_LIST_PUB="
1592     bigendian
1593     fast_unaligned
1594 "
1595
1596 HEADERS_LIST="
1597     AVFoundation_AVFoundation_h
1598     arpa_inet_h
1599     cdio_paranoia_h
1600     cdio_paranoia_paranoia_h
1601     dispatch_dispatch_h
1602     dev_bktr_ioctl_bt848_h
1603     dev_bktr_ioctl_meteor_h
1604     dev_ic_bt8xx_h
1605     dev_video_bktr_ioctl_bt848_h
1606     dev_video_meteor_ioctl_meteor_h
1607     direct_h
1608     dxgidebug_h
1609     dxva_h
1610     io_h
1611     machine_ioctl_bt848_h
1612     machine_ioctl_meteor_h
1613     malloc_h
1614     poll_h
1615     sys_param_h
1616     sys_resource_h
1617     sys_select_h
1618     sys_soundcard_h
1619     sys_time_h
1620     sys_un_h
1621     sys_videoio_h
1622     unistd_h
1623     valgrind_valgrind_h
1624     windows_h
1625     winsock2_h
1626 "
1627
1628 INTRINSICS_LIST="
1629     intrinsics_neon
1630 "
1631
1632 MATH_FUNCS="
1633     atanf
1634     atan2f
1635     cbrtf
1636     cosf
1637     exp2
1638     exp2f
1639     expf
1640     isinf
1641     isnan
1642     ldexpf
1643     llrint
1644     llrintf
1645     log2
1646     log2f
1647     log10f
1648     lrint
1649     lrintf
1650     powf
1651     rint
1652     round
1653     roundf
1654     sinf
1655     trunc
1656     truncf
1657 "
1658
1659 SYSTEM_FEATURES="
1660     dos_paths
1661     libc_msvcrt
1662     MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS
1663     section_data_rel_ro
1664     threads
1665     uwp
1666 "
1667
1668 SYSTEM_FUNCS="
1669     aligned_malloc
1670     clock_gettime
1671     closesocket
1672     CommandLineToArgvW
1673     fcntl
1674     getaddrinfo
1675     gethrtime
1676     getopt
1677     GetProcessAffinityMask
1678     GetProcessMemoryInfo
1679     GetProcessTimes
1680     getrusage
1681     GetSystemTimeAsFileTime
1682     gettimeofday
1683     gmtime_r
1684     inet_aton
1685     isatty
1686     localtime_r
1687     mach_absolute_time
1688     MapViewOfFile
1689     memalign
1690     mmap
1691     mprotect
1692     nanosleep
1693     posix_memalign
1694     sched_getaffinity
1695     SetConsoleTextAttribute
1696     setmode
1697     setrlimit
1698     Sleep
1699     strerror_r
1700     sysconf
1701     sysctl
1702     usleep
1703     VirtualAlloc
1704 "
1705
1706 SYSTEM_LIBRARIES="
1707     bcrypt
1708     sdl
1709     vaapi_1
1710     vaapi_drm
1711     vaapi_x11
1712     vdpau_x11
1713 "
1714
1715 TOOLCHAIN_FEATURES="
1716     as_arch_directive
1717     as_fpu_directive
1718     as_func
1719     as_object_arch
1720     asm_mod_q
1721     blocks_extension
1722     ebp_available
1723     ebx_available
1724     gnu_as
1725     ibm_asm
1726     inline_asm_labels
1727     pragma_deprecated
1728     symver_asm_label
1729     symver_gnu_asm
1730     vfp_args
1731     xform_asm
1732     xmm_clobbers
1733 "
1734
1735 TYPES_LIST="
1736     CUVIDDECODECREATEINFO_bitDepthMinus8
1737     socklen_t
1738     struct_addrinfo
1739     struct_group_source_req
1740     struct_ip_mreq_source
1741     struct_ipv6_mreq
1742     struct_pollfd
1743     struct_rusage_ru_maxrss
1744     struct_sockaddr_in6
1745     struct_sockaddr_sa_len
1746     struct_sockaddr_storage
1747     struct_v4l2_frmivalenum_discrete
1748 "
1749
1750 HAVE_LIST="
1751     $ARCH_EXT_LIST
1752     $(add_suffix _external $ARCH_EXT_LIST)
1753     $(add_suffix _inline   $ARCH_EXT_LIST)
1754     $ARCH_FEATURES
1755     $BUILTIN_LIST
1756     $HAVE_LIST_CMDLINE
1757     $HAVE_LIST_PUB
1758     $HEADERS_LIST
1759     $INTRINSICS_LIST
1760     $MATH_FUNCS
1761     $SYSTEM_FEATURES
1762     $SYSTEM_FUNCS
1763     $SYSTEM_LIBRARIES
1764     $THREADS_LIST
1765     $TOOLCHAIN_FEATURES
1766     $TYPES_LIST
1767 "
1768
1769 # options emitted with CONFIG_ prefix but not available on the command line
1770 CONFIG_EXTRA="
1771     aandcttables
1772     ac3dsp
1773     adts_header
1774     audio_frame_queue
1775     audiodsp
1776     blockdsp
1777     bswapdsp
1778     cabac
1779     cbs
1780     cbs_h264
1781     cbs_h265
1782     cbs_mpeg2
1783     dirac_parse
1784     dvprofile
1785     faandct
1786     faanidct
1787     fdctdsp
1788     flacdsp
1789     fmtconvert
1790     g722dsp
1791     gmp
1792     golomb
1793     gplv3
1794     h263dsp
1795     h264chroma
1796     h264dsp
1797     h264parse
1798     h264pred
1799     h264qpel
1800     hevcparse
1801     hpeldsp
1802     huffman
1803     huffyuvdsp
1804     huffyuvencdsp
1805     idctdsp
1806     iirfilter
1807     imdct15
1808     intrax8
1809     iso_media
1810     ividsp
1811     jpegtables
1812     lgplv3
1813     libx262
1814     libxcb_shape
1815     lpc
1816     lzf
1817     me_cmp
1818     mpeg_er
1819     mpegaudio
1820     mpegaudiodsp
1821     mpegaudioheader
1822     mpegvideo
1823     mpegvideoenc
1824     mss34dsp
1825     pixblockdsp
1826     qpeldsp
1827     qsv
1828     qsvdec
1829     qsvenc
1830     qsvvpp
1831     rangecoder
1832     riffdec
1833     riffenc
1834     rtpdec
1835     rtpenc_chain
1836     rv34dsp
1837     sinewin
1838     snappy
1839     srtp
1840     startcode
1841     texturedsp
1842     texturedspenc
1843     tpeldsp
1844     vaapi_encode
1845     vc1dsp
1846     videodsp
1847     vp3dsp
1848     vp56dsp
1849     vp8dsp
1850     wma_freqs
1851     wmv2dsp
1852 "
1853
1854 CMDLINE_SELECT="
1855     $ARCH_EXT_LIST
1856     $CONFIG_LIST
1857     $HAVE_LIST_CMDLINE
1858     $THREADS_LIST
1859     asm
1860     cross_compile
1861     debug
1862     extra_warnings
1863     logging
1864     lto
1865     optimizations
1866     rpath
1867 "
1868
1869 PATHS_LIST="
1870     bindir
1871     datadir
1872     docdir
1873     incdir
1874     libdir
1875     mandir
1876     prefix
1877     shlibdir
1878 "
1879
1880 CMDLINE_SET="
1881     $PATHS_LIST
1882     ar
1883     arch
1884     as
1885     cc
1886     objcc
1887     cpu
1888     cross_prefix
1889     custom_allocator
1890     dep_cc
1891     env
1892     extra_version
1893     host_cc
1894     host_cflags
1895     host_extralibs
1896     host_ld
1897     host_ldflags
1898     host_os
1899     ignore_tests
1900     ld
1901     logfile
1902     malloc_prefix
1903     nm
1904     optflags
1905     pkg_config
1906     pkg_config_flags
1907     samples
1908     sysinclude
1909     sysroot
1910     target_exec
1911     target_os
1912     target_path
1913     target_samples
1914     toolchain
1915     x86asmexe
1916 "
1917
1918 CMDLINE_APPEND="
1919     extra_cflags
1920     extra_objcflags
1921     host_cppflags
1922 "
1923
1924 # code dependency declarations
1925
1926 # architecture extensions
1927
1928 armv5te_deps="arm"
1929 armv6_deps="arm"
1930 armv6t2_deps="arm"
1931 armv8_deps="aarch64"
1932 neon_deps_any="aarch64 arm"
1933 intrinsics_neon_deps="neon"
1934 vfp_deps_any="aarch64 arm"
1935 vfpv3_deps="vfp"
1936
1937 map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM
1938
1939 altivec_deps="ppc"
1940 dcbzl_deps="ppc"
1941 ldbrx_deps="ppc"
1942 ppc4xx_deps="ppc"
1943 vsx_deps="altivec"
1944 power8_deps="vsx"
1945
1946 loongson_deps="mips"
1947 mips32r1_deps="mips32"
1948 mips32r2_deps="mips32"
1949 mips32r6_deps="mips32"
1950 mips64r1_deps="mips64"
1951 mips64r2_deps="mips64"
1952 mips64r6_deps="mips64"
1953
1954 vis_deps="sparc"
1955
1956 cpunop_deps="i686"
1957 x86_64_select="i686"
1958 x86_64_suggest="fast_cmov"
1959
1960 amd3dnow_deps="mmx"
1961 amd3dnowext_deps="amd3dnow"
1962 i686_deps="x86"
1963 mmx_deps="x86"
1964 mmxext_deps="mmx"
1965 sse_deps="mmxext"
1966 sse2_deps="sse"
1967 sse3_deps="sse2"
1968 ssse3_deps="sse3"
1969 sse4_deps="ssse3"
1970 sse42_deps="sse4"
1971 avx_deps="sse42"
1972 xop_deps="avx"
1973 fma3_deps="avx"
1974 fma4_deps="avx"
1975 avx2_deps="avx"
1976
1977 mmx_external_deps="x86asm"
1978 mmx_inline_deps="inline_asm x86"
1979 mmx_suggest="mmx_external mmx_inline"
1980
1981 for ext in $(filter_out mmx $ARCH_EXT_LIST_X86_SIMD); do
1982     eval dep=\$${ext}_deps
1983     eval ${ext}_external_deps='"${dep}_external"'
1984     eval ${ext}_inline_deps='"${dep}_inline"'
1985     eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
1986 done
1987
1988 aligned_stack_if_any="aarch64 ppc x86"
1989 fast_64bit_if_any="aarch64 alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
1990 fast_clz_if_any="aarch64 alpha avr32 mips ppc x86"
1991 fast_unaligned_if_any="aarch64 ppc x86"
1992 simd_align_16_if_any="altivec neon sse"
1993 simd_align_32_if_any="avx"
1994
1995 # system capabilities
1996 symver_if_any="symver_asm_label symver_gnu_asm"
1997 valgrind_backtrace_conflict="optimizations"
1998 valgrind_backtrace_deps="valgrind_valgrind_h"
1999
2000 # threading support
2001 atomics_gcc_if="sync_val_compare_and_swap"
2002 atomics_suncc_if="atomic_cas_ptr machine_rw_barrier"
2003 atomics_win32_if="MemoryBarrier"
2004 atomics_native_if_any="$ATOMICS_LIST"
2005 w32threads_deps="atomics_native CONDITION_VARIABLE"
2006 threads_if_any="$THREADS_LIST"
2007
2008 # subsystems
2009 cbs_h264_select="cbs golomb"
2010 cbs_h265_select="cbs golomb"
2011 cbs_mpeg2_select="cbs"
2012 dct_select="rdft"
2013 dirac_parse_select="golomb"
2014 error_resilience_select="me_cmp"
2015 faandct_deps="faan"
2016 faandct_select="fdctdsp"
2017 faanidct_deps="faan"
2018 faanidct_select="idctdsp"
2019 h264dsp_select="startcode"
2020 hevcparse_select="golomb"
2021 intrax8_select="blockdsp idctdsp"
2022 mdct_select="fft"
2023 rdft_select="fft"
2024 me_cmp_select="fdctdsp idctdsp pixblockdsp"
2025 mpeg_er_select="error_resilience"
2026 mpegaudio_select="mpegaudiodsp mpegaudioheader"
2027 mpegaudiodsp_select="dct"
2028 mpegvideo_select="blockdsp hpeldsp idctdsp me_cmp mpeg_er videodsp"
2029 mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
2030 vc1dsp_select="h264chroma qpeldsp startcode"
2031
2032 # decoders / encoders
2033 aac_decoder_select="adts_header imdct15 mdct sinewin"
2034 aac_encoder_select="audio_frame_queue iirfilter mdct sinewin"
2035 aac_latm_decoder_select="aac_decoder aac_latm_parser"
2036 ac3_decoder_select="ac3_parser ac3dsp bswapdsp fmtconvert mdct"
2037 ac3_encoder_select="ac3dsp audiodsp mdct me_cmp"
2038 ac3_fixed_encoder_select="ac3dsp audiodsp mdct me_cmp"
2039 adpcm_g722_decoder_select="g722dsp"
2040 adpcm_g722_encoder_select="g722dsp"
2041 aic_decoder_select="golomb idctdsp"
2042 alac_encoder_select="lpc"
2043 als_decoder_select="bswapdsp"
2044 amrnb_decoder_select="lsp"
2045 amrwb_decoder_select="lsp"
2046 amv_decoder_select="sp5x_decoder"
2047 ape_decoder_select="bswapdsp"
2048 asv1_decoder_select="blockdsp bswapdsp idctdsp"
2049 asv1_encoder_select="bswapdsp fdctdsp pixblockdsp"
2050 asv2_decoder_select="blockdsp bswapdsp idctdsp"
2051 asv2_encoder_select="bswapdsp fdctdsp pixblockdsp"
2052 atrac1_decoder_select="mdct sinewin"
2053 atrac3_decoder_select="mdct"
2054 atrac3p_decoder_select="mdct sinewin"
2055 bink_decoder_select="blockdsp hpeldsp"
2056 binkaudio_dct_decoder_select="mdct rdft dct sinewin wma_freqs"
2057 binkaudio_rdft_decoder_select="mdct rdft sinewin wma_freqs"
2058 cavs_decoder_select="blockdsp golomb h264chroma idctdsp qpeldsp videodsp"
2059 clearvideo_decoder_select="idctdsp"
2060 cllc_decoder_select="bswapdsp"
2061 comfortnoise_encoder_select="lpc"
2062 cook_decoder_select="audiodsp mdct sinewin"
2063 cscd_decoder_select="lzo"
2064 cscd_decoder_suggest="zlib"
2065 dca_decoder_select="fmtconvert mdct"
2066 dds_decoder_select="texturedsp"
2067 dnxhd_decoder_select="blockdsp idctdsp"
2068 dnxhd_encoder_select="aandcttables blockdsp fdctdsp idctdsp mpegvideoenc pixblockdsp"
2069 dvvideo_decoder_select="dvprofile idctdsp"
2070 dvvideo_encoder_select="dvprofile fdctdsp me_cmp pixblockdsp"
2071 dxa_decoder_deps="zlib"
2072 dxv_decoder_select="lzf texturedsp"
2073 eac3_decoder_select="ac3_decoder"
2074 eac3_encoder_select="ac3_encoder"
2075 eamad_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpegvideo"
2076 eatgq_decoder_select="aandcttables idctdsp"
2077 eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp"
2078 exr_decoder_deps="zlib"
2079 ffv1_decoder_select="rangecoder"
2080 ffv1_encoder_select="rangecoder"
2081 ffvhuff_decoder_select="huffyuv_decoder"
2082 ffvhuff_encoder_select="huffyuv_encoder"
2083 fic_decoder_select="golomb"
2084 flac_decoder_select="flacdsp"
2085 flac_encoder_select="bswapdsp flacdsp lpc"
2086 flashsv_decoder_deps="zlib"
2087 flashsv_encoder_deps="zlib"
2088 flashsv2_decoder_deps="zlib"
2089 flv_decoder_select="h263_decoder"
2090 flv_encoder_select="h263_encoder"
2091 fourxm_decoder_select="blockdsp bswapdsp"
2092 fraps_decoder_select="bswapdsp huffman"
2093 g2m_decoder_deps="zlib"
2094 g2m_decoder_select="blockdsp idctdsp jpegtables"
2095 h261_decoder_select="mpeg_er mpegvideo"
2096 h261_encoder_select="aandcttables mpegvideoenc"
2097 h263_decoder_select="error_resilience h263_parser h263dsp mpeg_er mpegvideo qpeldsp"
2098 h263_encoder_select="aandcttables h263dsp mpegvideoenc"
2099 h263i_decoder_select="h263_decoder"
2100 h263p_encoder_select="h263_encoder"
2101 h264_decoder_select="cabac golomb h264chroma h264dsp h264parse h264pred h264qpel videodsp"
2102 h264_decoder_suggest="error_resilience"
2103 hap_decoder_select="snappy texturedsp"
2104 hap_encoder_deps="libsnappy"
2105 hap_encoder_select="texturedspenc"
2106 hevc_decoder_select="bswapdsp cabac hevcparse videodsp"
2107 huffyuv_decoder_select="bswapdsp huffyuvdsp"
2108 huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp"
2109 iac_decoder_select="imc_decoder"
2110 imc_decoder_select="bswapdsp fft mdct sinewin"
2111 indeo3_decoder_select="hpeldsp"
2112 indeo4_decoder_select="ividsp"
2113 indeo5_decoder_select="ividsp"
2114 interplay_video_decoder_select="hpeldsp"
2115 jpegls_decoder_select="mjpeg_decoder"
2116 jv_decoder_select="blockdsp"
2117 lagarith_decoder_select="huffyuvdsp"
2118 ljpeg_encoder_select="aandcttables idctdsp jpegtables"
2119 magicyuv_decoder_select="huffyuvdsp"
2120 mdec_decoder_select="blockdsp idctdsp mpegvideo"
2121 metasound_decoder_select="lsp mdct sinewin"
2122 mimic_decoder_select="blockdsp bswapdsp hpeldsp idctdsp"
2123 mjpeg_decoder_select="blockdsp hpeldsp idctdsp jpegtables"
2124 mjpeg_encoder_select="aandcttables jpegtables mpegvideoenc"
2125 mjpegb_decoder_select="mjpeg_decoder"
2126 mlp_decoder_select="mlp_parser"
2127 motionpixels_decoder_select="bswapdsp"
2128 mp1_decoder_select="mpegaudio"
2129 mp1float_decoder_select="mpegaudio"
2130 mp2_decoder_select="mpegaudio"
2131 mp2float_decoder_select="mpegaudio"
2132 mp3_decoder_select="mpegaudio"
2133 mp3adu_decoder_select="mpegaudio"
2134 mp3adufloat_decoder_select="mpegaudio"
2135 mp3float_decoder_select="mpegaudio"
2136 mp3on4_decoder_select="mpegaudio"
2137 mp3on4float_decoder_select="mpegaudio"
2138 mpc7_decoder_select="bswapdsp mpegaudiodsp"
2139 mpc8_decoder_select="mpegaudiodsp"
2140 mpeg1video_decoder_select="error_resilience mpeg_er mpegvideo"
2141 mpeg1video_encoder_select="aandcttables mpegvideoenc"
2142 mpeg2video_decoder_select="error_resilience mpeg_er mpegvideo"
2143 mpeg2video_encoder_select="aandcttables mpegvideoenc"
2144 mpeg4_decoder_select="h263_decoder mpeg4video_parser"
2145 mpeg4_encoder_select="h263_encoder"
2146 msa1_decoder_select="mss34dsp"
2147 msmpeg4v1_decoder_select="h263_decoder"
2148 msmpeg4v2_decoder_select="h263_decoder"
2149 msmpeg4v2_encoder_select="h263_encoder"
2150 msmpeg4v3_decoder_select="h263_decoder"
2151 msmpeg4v3_encoder_select="h263_encoder"
2152 mss2_decoder_select="error_resilience mpeg_er mpegvideo qpeldsp vc1_decoder"
2153 mts2_decoder_select="mss34dsp"
2154 mxpeg_decoder_select="mjpeg_decoder"
2155 nellymoser_decoder_select="mdct sinewin"
2156 nellymoser_encoder_select="audio_frame_queue mdct sinewin"
2157 nuv_decoder_select="idctdsp lzo"
2158 on2avc_decoder_select="mdct"
2159 opus_decoder_deps="avresample"
2160 opus_decoder_select="imdct15"
2161 png_decoder_deps="zlib"
2162 png_encoder_deps="zlib"
2163 png_encoder_select="huffyuvencdsp"
2164 prores_decoder_select="idctdsp"
2165 prores_encoder_select="fdctdsp"
2166 qcelp_decoder_select="lsp"
2167 qdm2_decoder_select="mdct rdft mpegaudiodsp"
2168 ra_144_encoder_select="audio_frame_queue lpc"
2169 ralf_decoder_select="golomb"
2170 rscc_decoder_deps="zlib"
2171 rv10_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
2172 rv10_encoder_select="h263_encoder"
2173 rv20_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
2174 rv20_encoder_select="h263_encoder"
2175 rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo rv34dsp videodsp"
2176 rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo rv34dsp videodsp"
2177 screenpresso_decoder_deps="zlib"
2178 sipr_decoder_select="lsp"
2179 sp5x_decoder_select="mjpeg_decoder"
2180 svq1_decoder_select="hpeldsp"
2181 svq1_encoder_select="aandcttables hpeldsp me_cmp mpegvideoenc"
2182 svq3_decoder_select="golomb h264dsp h264parse h264pred hpeldsp tpeldsp videodsp"
2183 svq3_decoder_suggest="zlib"
2184 tak_decoder_select="audiodsp"
2185 tdsc_decoder_deps="zlib"
2186 tdsc_decoder_select="mjpeg_decoder"
2187 theora_decoder_select="vp3_decoder"
2188 thp_decoder_select="mjpeg_decoder"
2189 tiff_decoder_suggest="zlib"
2190 tiff_encoder_suggest="zlib"
2191 truehd_decoder_select="mlp_decoder"
2192 truemotion2_decoder_select="bswapdsp"
2193 truespeech_decoder_select="bswapdsp"
2194 tscc_decoder_deps="zlib"
2195 txd_decoder_select="texturedsp"
2196 twinvq_decoder_select="mdct lsp sinewin"
2197 utvideo_decoder_select="bswapdsp huffyuvdsp"
2198 utvideo_encoder_select="bswapdsp huffman huffyuvencdsp"
2199 vble_decoder_select="huffyuvdsp"
2200 vc1_decoder_select="blockdsp error_resilience h263_decoder h264qpel intrax8 mpeg_er mpegvideo vc1dsp"
2201 vc1image_decoder_select="vc1_decoder"
2202 vorbis_decoder_select="mdct"
2203 vorbis_encoder_select="mdct"
2204 vp3_decoder_select="hpeldsp vp3dsp videodsp"
2205 vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp vp56dsp"
2206 vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp vp56dsp"
2207 vp6a_decoder_select="vp6_decoder"
2208 vp6f_decoder_select="vp6_decoder"
2209 vp7_decoder_select="h264pred videodsp vp8dsp"
2210 vp8_decoder_select="h264pred videodsp vp8dsp"
2211 vp9_decoder_select="videodsp vp9_superframe_split_bsf"
2212 webp_decoder_select="vp8_decoder"
2213 wmapro_decoder_select="mdct sinewin wma_freqs"
2214 wmav1_decoder_select="mdct sinewin wma_freqs"
2215 wmav1_encoder_select="mdct sinewin wma_freqs"
2216 wmav2_decoder_select="mdct sinewin wma_freqs"
2217 wmav2_encoder_select="mdct sinewin wma_freqs"
2218 wmavoice_decoder_select="lsp rdft dct mdct sinewin"
2219 wmv1_decoder_select="h263_decoder"
2220 wmv1_encoder_select="h263_encoder"
2221 wmv2_decoder_select="blockdsp error_resilience h263_decoder idctdsp intrax8 videodsp wmv2dsp"
2222 wmv2_encoder_select="h263_encoder wmv2dsp"
2223 wmv3_decoder_select="vc1_decoder"
2224 wmv3image_decoder_select="wmv3_decoder"
2225 zerocodec_decoder_deps="zlib"
2226 zlib_decoder_deps="zlib"
2227 zlib_encoder_deps="zlib"
2228 zmbv_decoder_deps="zlib"
2229 zmbv_encoder_deps="zlib"
2230
2231 # hardware accelerators
2232 d3d11va_deps="dxva_h ID3D11VideoDecoder"
2233 dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode ole32"
2234 vda_deps="VideoDecodeAcceleration_VDADecoder_h blocks_extension pthreads"
2235 vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore"
2236
2237 h263_vaapi_hwaccel_deps="vaapi"
2238 h263_vaapi_hwaccel_select="h263_decoder"
2239 h264_cuvid_hwaccel_deps="cuvid CUVIDH264PICPARAMS"
2240 h264_cuvid_hwaccel_select="h264_decoder"
2241 h264_d3d11va_hwaccel_deps="d3d11va"
2242 h264_d3d11va_hwaccel_select="h264_decoder"
2243 h264_d3d11va2_hwaccel_deps="d3d11va"
2244 h264_d3d11va2_hwaccel_select="h264_decoder"
2245 h264_dxva2_hwaccel_deps="dxva2"
2246 h264_dxva2_hwaccel_select="h264_decoder"
2247 h264_vaapi_hwaccel_deps="vaapi"
2248 h264_vaapi_hwaccel_select="h264_decoder"
2249 h264_vda_hwaccel_deps="vda"
2250 h264_vda_hwaccel_select="h264_decoder"
2251 h264_vda_old_hwaccel_deps="vda"
2252 h264_vda_old_hwaccel_select="h264_decoder"
2253 h264_vdpau_hwaccel_deps="vdpau"
2254 h264_vdpau_hwaccel_select="h264_decoder"
2255 hevc_cuvid_hwaccel_deps="cuvid CUVIDHEVCPICPARAMS"
2256 hevc_cuvid_hwaccel_select="hevc_decoder"
2257 hevc_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_HEVC"
2258 hevc_d3d11va_hwaccel_select="hevc_decoder"
2259 hevc_d3d11va2_hwaccel_deps="d3d11va DXVA_PicParams_HEVC"
2260 hevc_d3d11va2_hwaccel_select="hevc_decoder"
2261 hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC"
2262 hevc_dxva2_hwaccel_select="hevc_decoder"
2263 hevc_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferHEVC"
2264 hevc_vaapi_hwaccel_select="hevc_decoder"
2265 hevc_vdpau_hwaccel_deps="vdpau VdpPictureInfoHEVC"
2266 hevc_vdpau_hwaccel_select="hevc_decoder"
2267 mpeg1_vdpau_hwaccel_deps="vdpau"
2268 mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
2269 mpeg2_d3d11va_hwaccel_deps="d3d11va"
2270 mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder"
2271 mpeg2_d3d11va2_hwaccel_deps="d3d11va"
2272 mpeg2_d3d11va2_hwaccel_select="mpeg2video_decoder"
2273 mpeg2_dxva2_hwaccel_deps="dxva2"
2274 mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
2275 mpeg2_vaapi_hwaccel_deps="vaapi"
2276 mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
2277 mpeg2_vdpau_hwaccel_deps="vdpau"
2278 mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
2279 mpeg4_vaapi_hwaccel_deps="vaapi"
2280 mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
2281 mpeg4_vdpau_hwaccel_deps="vdpau"
2282 mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
2283 vc1_d3d11va_hwaccel_deps="d3d11va"
2284 vc1_d3d11va_hwaccel_select="vc1_decoder"
2285 vc1_d3d11va2_hwaccel_deps="d3d11va"
2286 vc1_d3d11va2_hwaccel_select="vc1_decoder"
2287 vc1_dxva2_hwaccel_deps="dxva2"
2288 vc1_dxva2_hwaccel_select="vc1_decoder"
2289 vc1_vaapi_hwaccel_deps="vaapi"
2290 vc1_vaapi_hwaccel_select="vc1_decoder"
2291 vc1_vdpau_hwaccel_deps="vdpau"
2292 vc1_vdpau_hwaccel_select="vc1_decoder"
2293 vp8_vaapi_hwaccel_deps="vaapi VAPictureParameterBufferVP8"
2294 vp8_vaapi_hwaccel_select="vp8_decoder"
2295 wmv3_d3d11va_hwaccel_select="vc1_d3d11va_hwaccel"
2296 wmv3_d3d11va2_hwaccel_select="vc1_d3d11va2_hwaccel"
2297 wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
2298 wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
2299 wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
2300
2301 # hardware-accelerated codecs
2302 amf_deps_any="libdl LoadLibrary"
2303 nvenc_deps_any="libdl LoadLibrary"
2304 omx_deps="libdl pthreads"
2305 omx_rpi_select="omx"
2306 qsv_deps="libmfx"
2307 qsvdec_select="qsv"
2308 qsvenc_select="qsv"
2309 qsvvpp_select="qsv"
2310 vaapi_encode_deps="vaapi"
2311
2312 hwupload_cuda_filter_deps="cuda"
2313 scale_npp_filter_deps="cuda libnpp"
2314
2315 h264_amf_encoder_deps="amf"
2316 h264_mmal_decoder_deps="mmal"
2317 h264_nvenc_encoder_deps="nvenc"
2318 h264_omx_encoder_deps="omx"
2319 h264_qsv_decoder_select="h264_mp4toannexb_bsf h264_parser qsvdec"
2320 h264_qsv_encoder_select="qsvenc"
2321 h264_vaapi_encoder_deps="VAEncPictureParameterBufferH264"
2322 h264_vaapi_encoder_select="cbs_h264 vaapi_encode"
2323 hevc_amf_encoder_deps="amf"
2324 hevc_nvenc_encoder_deps="nvenc"
2325 hevc_qsv_decoder_select="hevc_mp4toannexb_bsf hevc_parser qsvdec"
2326 hevc_qsv_encoder_select="hevcparse qsvenc"
2327 hevc_vaapi_encoder_deps="VAEncPictureParameterBufferHEVC"
2328 hevc_vaapi_encoder_select="cbs_h265 vaapi_encode"
2329 mjpeg_qsv_encoder_deps="libmfx"
2330 mjpeg_qsv_encoder_select="qsvenc"
2331 mjpeg_vaapi_encoder_deps="VAEncPictureParameterBufferJPEG"
2332 mjpeg_vaapi_encoder_select="vaapi_encode jpegtables"
2333 mpeg2_mmal_decoder_deps="mmal"
2334 mpeg2_qsv_decoder_select="qsvdec mpegvideo_parser"
2335 mpeg2_qsv_encoder_select="qsvenc"
2336 mpeg2_vaapi_encoder_deps="VAEncPictureParameterBufferMPEG2"
2337 mpeg2_vaapi_encoder_select="cbs_mpeg2 vaapi_encode"
2338 mpeg4_omx_encoder_deps="omx"
2339 vc1_mmal_decoder_deps="mmal"
2340 vc1_qsv_decoder_select="qsvdec vc1_parser"
2341 vp8_qsv_decoder_select="qsvdec vp8_parser"
2342 vp8_vaapi_encoder_deps="VAEncPictureParameterBufferVP8"
2343 vp8_vaapi_encoder_select="vaapi_encode"
2344 vp9_vaapi_encoder_deps="VAEncPictureParameterBufferVP9"
2345 vp9_vaapi_encoder_select="vaapi_encode"
2346
2347 nvenc_h264_encoder_select="h264_nvenc_encoder"
2348 nvenc_hevc_encoder_select="hevc_nvenc_encoder"
2349
2350 # parsers
2351 aac_parser_select="adts_header"
2352 h264_parser_select="golomb h264dsp h264parse"
2353 hevc_parser_select="hevcparse"
2354 mpegaudio_parser_select="mpegaudioheader"
2355 mpegvideo_parser_select="mpegvideo"
2356 mpeg4video_parser_select="error_resilience h263dsp mpegvideo qpeldsp"
2357 vc1_parser_select="vc1dsp"
2358
2359 # bitstream_filters
2360 aac_adtstoasc_bsf_select="adts_header"
2361 h264_metadata_bsf_select="cbs_h264"
2362 h264_redundant_pps_bsf_select="cbs_h264"
2363 hevc_metadata_bsf_select="cbs_h265"
2364 mjpeg2jpeg_bsf_select="jpegtables"
2365 mpeg2_metadata_bsf_select="cbs_mpeg2"
2366 trace_headers_bsf_select="cbs_h264 cbs_h265 cbs_mpeg2"
2367
2368 # external libraries
2369 avisynth_deps="LoadLibrary"
2370 avxsynth_deps="libdl"
2371 avisynth_demuxer_deps_any="avisynth avxsynth"
2372 avisynth_demuxer_select="riffdec"
2373 libaom_av1_decoder_deps="libaom"
2374 libaom_av1_encoder_deps="libaom"
2375 libdcadec_decoder_deps="libdcadec"
2376 libfaac_encoder_deps="libfaac"
2377 libfaac_encoder_select="audio_frame_queue"
2378 libfdk_aac_decoder_deps="libfdk_aac"
2379 libfdk_aac_encoder_deps="libfdk_aac"
2380 libfdk_aac_encoder_select="audio_frame_queue"
2381 libgsm_decoder_deps="libgsm"
2382 libgsm_encoder_deps="libgsm"
2383 libgsm_ms_decoder_deps="libgsm"
2384 libgsm_ms_encoder_deps="libgsm"
2385 libilbc_decoder_deps="libilbc"
2386 libilbc_encoder_deps="libilbc"
2387 libkvazaar_encoder_deps="libkvazaar"
2388 libmp3lame_encoder_deps="libmp3lame"
2389 libmp3lame_encoder_select="audio_frame_queue mpegaudioheader"
2390 libopencore_amrnb_decoder_deps="libopencore_amrnb"
2391 libopencore_amrnb_encoder_deps="libopencore_amrnb"
2392 libopencore_amrnb_encoder_select="audio_frame_queue"
2393 libopencore_amrwb_decoder_deps="libopencore_amrwb"
2394 libopenh264_decoder_deps="libopenh264"
2395 libopenh264_decoder_select="h264_mp4toannexb_bsf"
2396 libopenh264_encoder_deps="libopenh264"
2397 libopenjpeg_decoder_deps="libopenjpeg"
2398 libopenjpeg_encoder_deps="libopenjpeg"
2399 libopus_decoder_deps="libopus"
2400 libopus_encoder_deps="libopus"
2401 libopus_encoder_select="audio_frame_queue"
2402 libschroedinger_decoder_deps="libschroedinger"
2403 libschroedinger_encoder_deps="libschroedinger"
2404 libspeex_decoder_deps="libspeex"
2405 libspeex_encoder_deps="libspeex"
2406 libspeex_encoder_select="audio_frame_queue"
2407 libtheora_encoder_deps="libtheora"
2408 libtwolame_encoder_deps="libtwolame"
2409 libvo_aacenc_encoder_deps="libvo_aacenc"
2410 libvo_aacenc_encoder_select="audio_frame_queue"
2411 libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
2412 libvorbis_encoder_deps="libvorbis"
2413 libvorbis_encoder_select="audio_frame_queue"
2414 libvpx_vp8_decoder_deps="libvpx"
2415 libvpx_vp8_encoder_deps="libvpx"
2416 libvpx_vp9_decoder_deps="libvpx"
2417 libvpx_vp9_encoder_deps="libvpx"
2418 libwavpack_encoder_deps="libwavpack"
2419 libwavpack_encoder_select="audio_frame_queue"
2420 libwebp_encoder_deps="libwebp"
2421 libx262_encoder_deps="libx262"
2422 libx264_encoder_deps="libx264"
2423 libx265_encoder_deps="libx265"
2424 libxavs_encoder_deps="libxavs"
2425 libxvid_encoder_deps="libxvid mkstemp"
2426
2427 # demuxers / muxers
2428 ac3_demuxer_select="ac3_parser"
2429 asf_demuxer_select="riffdec"
2430 asf_muxer_select="riffenc"
2431 asf_stream_muxer_select="asf_muxer"
2432 avi_demuxer_select="iso_media riffdec"
2433 avi_muxer_select="riffenc"
2434 caf_demuxer_select="iso_media riffdec"
2435 dash_muxer_select="mp4_muxer"
2436 dirac_demuxer_select="dirac_parser"
2437 dv_demuxer_select="dvprofile"
2438 dv_muxer_select="dvprofile"
2439 dxa_demuxer_select="riffdec"
2440 eac3_demuxer_select="ac3_parser"
2441 f4v_muxer_select="mov_muxer"
2442 flac_demuxer_select="flac_parser"
2443 hds_muxer_select="flv_muxer"
2444 hls_muxer_select="mpegts_muxer"
2445 ipod_muxer_select="mov_muxer"
2446 ismv_muxer_select="mov_muxer"
2447 matroska_audio_muxer_select="matroska_muxer"
2448 matroska_demuxer_select="iso_media riffdec"
2449 matroska_demuxer_suggest="bzlib lzo zlib"
2450 matroska_muxer_select="iso_media riffenc"
2451 mmf_muxer_select="riffenc"
2452 mov_demuxer_select="iso_media riffdec"
2453 mov_demuxer_suggest="zlib"
2454 mov_muxer_select="iso_media riffenc rtpenc_chain"
2455 mp3_demuxer_select="mpegaudio_parser"
2456 mp3_muxer_select="mpegaudioheader"
2457 mp4_muxer_select="mov_muxer"
2458 mpegts_demuxer_select="iso_media"
2459 mpegts_muxer_select="adts_muxer latm_muxer"
2460 mpegtsraw_demuxer_select="mpegts_demuxer"
2461 mxf_d10_muxer_select="mxf_muxer"
2462 nut_muxer_select="riffenc"
2463 nuv_demuxer_select="riffdec"
2464 oga_muxer_select="ogg_muxer"
2465 ogg_demuxer_select="dirac_parse"
2466 opus_muxer_select="ogg_muxer"
2467 psp_muxer_select="mov_muxer"
2468 rtp_demuxer_select="sdp_demuxer"
2469 rtpdec_select="asf_demuxer jpegtables mov_demuxer mpegts_demuxer rm_demuxer rtp_protocol srtp"
2470 rtsp_demuxer_select="http_protocol rtpdec"
2471 rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
2472 sap_demuxer_select="sdp_demuxer"
2473 sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
2474 sdp_demuxer_select="rtpdec"
2475 smoothstreaming_muxer_select="ismv_muxer"
2476 spdif_demuxer_select="adts_header"
2477 spdif_muxer_select="adts_header"
2478 spx_muxer_select="ogg_muxer"
2479 swf_demuxer_suggest="zlib"
2480 tak_demuxer_select="tak_parser"
2481 tg2_muxer_select="mov_muxer"
2482 tgp_muxer_select="mov_muxer"
2483 w64_demuxer_select="wav_demuxer"
2484 wav_demuxer_select="riffdec"
2485 wav_muxer_select="riffenc"
2486 webm_muxer_select="iso_media riffenc"
2487 wtv_demuxer_select="mpegts_demuxer riffdec"
2488 xmv_demuxer_select="riffdec"
2489 xwma_demuxer_select="riffdec"
2490
2491 # indevs
2492 alsa_indev_deps="alsa"
2493 avfoundation_indev_deps="AVFoundation_AVFoundation_h objc_arc pthreads"
2494 avfoundation_indev_extralibs="-framework Foundation -framework AVFoundation -framework CoreVideo -framework CoreMedia"
2495 bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
2496 fbdev_indev_deps="linux_fb_h"
2497 jack_indev_deps="libjack"
2498 jack_indev_deps_any="sem_timedwait dispatch_dispatch_h"
2499 libcdio_indev_deps="libcdio"
2500 libdc1394_indev_deps="libdc1394"
2501 oss_indev_deps_any="sys_soundcard_h"
2502 pulse_indev_deps="libpulse"
2503 sndio_indev_deps="sndio"
2504 v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
2505 vfwcap_indev_deps="vfw32 vfwcap_defines"
2506 xcbgrab_indev_deps="libxcb libxcb_shape"
2507 xcbgrab_indev_suggest="libxcb_shm libxcb_xfixes"
2508
2509 # protocols
2510 ffrtmpcrypt_protocol_conflict="librtmp_protocol"
2511 ffrtmpcrypt_protocol_deps_any="gmp mbedtls openssl"
2512 ffrtmpcrypt_protocol_select="tcp_protocol"
2513 ffrtmphttp_protocol_conflict="librtmp_protocol"
2514 ffrtmphttp_protocol_select="http_protocol"
2515 gopher_protocol_select="network"
2516 http_protocol_select="tcp_protocol"
2517 http_protocol_suggest="zlib"
2518 httpproxy_protocol_select="tcp_protocol"
2519 httpproxy_protocol_suggest="zlib"
2520 https_protocol_select="tls_protocol"
2521 https_protocol_suggest="zlib"
2522 icecast_protocol_select="http_protocol"
2523 mmsh_protocol_select="http_protocol"
2524 mmst_protocol_select="network"
2525 rtmp_protocol_conflict="librtmp_protocol"
2526 rtmp_protocol_select="tcp_protocol"
2527 rtmp_protocol_suggest="zlib"
2528 rtmpe_protocol_select="ffrtmpcrypt_protocol"
2529 rtmpe_protocol_suggest="zlib"
2530 rtmps_protocol_conflict="librtmp_protocol"
2531 rtmps_protocol_select="tls_protocol"
2532 rtmps_protocol_suggest="zlib"
2533 rtmpt_protocol_select="ffrtmphttp_protocol"
2534 rtmpt_protocol_suggest="zlib"
2535 rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2536 rtmpte_protocol_suggest="zlib"
2537 rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2538 rtmpts_protocol_suggest="zlib"
2539 rtp_protocol_select="udp_protocol"
2540 sctp_protocol_deps="struct_sctp_event_subscribe"
2541 sctp_protocol_select="network"
2542 srtp_protocol_select="rtp_protocol srtp"
2543 tcp_protocol_select="network"
2544 tls_protocol_deps_any="gnutls mbedtls openssl"
2545 tls_protocol_select="tcp_protocol"
2546 udp_protocol_select="network"
2547 unix_protocol_deps="sys_un_h"
2548 unix_protocol_select="network"
2549
2550 # external library protocols
2551 librtmp_protocol_deps="librtmp"
2552 librtmpe_protocol_deps="librtmp"
2553 librtmps_protocol_deps="librtmp"
2554 librtmpt_protocol_deps="librtmp"
2555 librtmpte_protocol_deps="librtmp"
2556 libsrt_protocol_deps="libsrt"
2557 libsrt_protocol_select="network"
2558
2559 # filters
2560 asyncts_filter_deps="avresample"
2561 blackframe_filter_deps="gpl"
2562 boxblur_filter_deps="gpl"
2563 bs2b_filter_deps="libbs2b"
2564 cropdetect_filter_deps="gpl"
2565 deinterlace_qsv_filter_deps="libmfx"
2566 deinterlace_vaapi_filter_deps="vaapi"
2567 delogo_filter_deps="gpl"
2568 drawtext_filter_deps="libfreetype"
2569 drawtext_filter_suggest="libfontconfig"
2570 frei0r_filter_deps="frei0r libdl"
2571 frei0r_src_filter_deps="frei0r libdl"
2572 hdcd_filter_deps="libhdcd"
2573 hqdn3d_filter_deps="gpl"
2574 interlace_filter_deps="gpl"
2575 movie_filter_deps="avcodec avformat"
2576 ocv_filter_deps="libopencv"
2577 overlay_qsv_filter_deps="libmfx"
2578 overlay_qsv_filter_select="qsvvpp"
2579 resample_filter_deps="avresample"
2580 scale_filter_deps="swscale"
2581 scale_qsv_filter_deps="libmfx"
2582 scale_vaapi_filter_deps="vaapi VAProcPipelineParameterBuffer"
2583 vpp_qsv_filter_deps="libmfx"
2584 vpp_qsv_filter_select="qsvvpp"
2585
2586 # examples
2587 decode_audio_example_deps="avcodec avutil"
2588 decode_video_example_deps="avcodec avutil"
2589 encode_audio_example_deps="avcodec avutil"
2590 encode_video_example_deps="avcodec avutil"
2591 filter_audio_example_deps="avfilter avutil"
2592 metadata_example_deps="avformat avutil"
2593 output_example_deps="avcodec avformat avresample avutil swscale"
2594 qsvdec_example_deps="avcodec avutil libmfx h264_qsv_decoder"
2595 transcode_aac_example_deps="avcodec avformat avresample"
2596
2597 # EXTRALIBS_LIST
2598 cpu_init_extralibs="pthreads_extralibs"
2599 cws2fws_extralibs="zlib_extralibs"
2600
2601 # libraries, in linking order
2602 avcodec_deps="avutil"
2603 avcodec_select="null_bsf"
2604 avdevice_deps="avformat avcodec avutil"
2605 avfilter_deps="avutil"
2606 avformat_deps="avcodec avutil"
2607 avformat_suggest="network"
2608 avresample_deps="avutil"
2609 swscale_deps="avutil"
2610
2611 avcodec_extralibs="pthreads_extralibs libm_extralibs"
2612 avdevice_extralibs="libm_extralibs"
2613 avformat_extralibs="libm_extralibs"
2614 avfilter_extralibs="pthreads_extralibs libm_extralibs"
2615 avresample_extralibs="libm_extralibs"
2616 avutil_extralibs="bcrypt_extralibs clock_gettime_extralibs cuda_extralibs cuvid_extralibs d3d11va_extralibs libm_extralibs libmfx_extralibs nanosleep_extralibs pthreads_extralibs user32_extralibs vaapi_extralibs vaapi_drm_extralibs vaapi_x11_extralibs vdpau_x11_extralibs"
2617 swscale_extralibs="libm_extralibs"
2618
2619 # programs
2620 avconv_deps="avcodec avfilter avformat avresample swscale"
2621 avconv_select="aformat_filter anull_filter asyncts_filter atrim_filter format_filter
2622                fps_filter null_filter resample_filter scale_filter
2623                trim_filter"
2624 avconv_suggest="psapi shell32"
2625 avplay_deps="avcodec avfilter avformat avresample sdl"
2626 avplay_select="rdft format_filter transpose_filter hflip_filter vflip_filter"
2627 avplay_suggest="shell32"
2628 avprobe_deps="avcodec avformat"
2629 avprobe_suggest="shell32"
2630
2631 # documentation
2632 pod2man_deps="doc"
2633 texi2html_deps="doc"
2634
2635 # default parameters
2636
2637 logfile="avbuild/config.log"
2638
2639 # installation paths
2640 prefix_default="/usr/local"
2641 bindir_default='${prefix}/bin'
2642 datadir_default='${prefix}/share/avconv'
2643 docdir_default='${prefix}/share/doc/libav'
2644 incdir_default='${prefix}/include'
2645 libdir_default='${prefix}/lib'
2646 mandir_default='${prefix}/share/man'
2647 shlibdir_default="$libdir_default"
2648
2649 # toolchain
2650 ar_default="ar"
2651 cc_default="gcc"
2652 host_cc_default="gcc"
2653 x86asmexe_default="nasm"
2654 ln_s="ln -s -f"
2655 nm_default="nm -g"
2656 pkg_config_default=pkg-config
2657 ranlib="ranlib"
2658 strip="strip"
2659 version_script='--version-script'
2660 objformat="elf32"
2661
2662 # machine
2663 arch_default=$(uname -m)
2664 cpu="generic"
2665 intrinsics="none"
2666
2667 # OS
2668 target_os_default=$(tolower $(uname -s))
2669 host_os=$target_os_default
2670
2671 # configurable options
2672 enable $EXAMPLE_LIST $LIBRARY_LIST $PROGRAM_LIST
2673
2674 enable asm
2675 enable debug
2676 enable doc
2677 enable faan faandct faanidct
2678 enable optimizations
2679 enable safe_bitstream_reader
2680 enable static
2681 enable swscale_alpha
2682 enable valgrind_backtrace
2683
2684 # By default, enable only those hwaccels that have no external dependencies.
2685 enable d3d11va dxva2 vda vdpau
2686
2687 # internal components are enabled by default
2688 enable $EXTRALIBS_LIST
2689
2690 # Avoid external, non-system, libraries getting enabled by dependency resolution
2691 disable $EXTERNAL_LIBRARY_LIST
2692
2693 # build settings
2694 SHFLAGS='-shared -Wl,-soname,$$(@F)'
2695 LIBPREF="lib"
2696 LIBSUF=".a"
2697 LIBNAME='$(LIBPREF)$(NAME)$(LIBSUF)'
2698 SLIBPREF="lib"
2699 SLIBSUF=".so"
2700 SLIBNAME='$(SLIBPREF)$(NAME)$(SLIBSUF)'
2701 SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
2702 SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
2703 LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2704 SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
2705 SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2706 VERSION_SCRIPT_POSTPROCESS_CMD="cat"
2707
2708 asflags_filter=echo
2709 cflags_filter=echo
2710 ldflags_filter=echo
2711
2712 AS_C='-c'
2713 AS_O='-o $@'
2714 CC_C='-c'
2715 CC_E='-E -o $@'
2716 CC_O='-o $@'
2717 OBJCC_C='-c'
2718 OBJCC_E='-E -o $@'
2719 OBJCC_O='-o $@'
2720 X86ASM_O='-o $@'
2721 LD_O='-o $@'
2722 LD_LIB='-l%'
2723 LD_PATH='-L'
2724 HOSTCC_C='-c'
2725 HOSTCC_E='-E -o $@'
2726 HOSTCC_O='-o $@'
2727 HOSTLD_O='-o $@'
2728
2729 host_extralibs='-lm'
2730 host_cflags_filter=echo
2731 host_ldflags_filter=echo
2732
2733 target_path='$(CURDIR)'
2734
2735 # since the object filename is not given with the -MM flag, the compiler
2736 # is only able to print the basename, and we must add the path ourselves
2737 DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
2738 DEPFLAGS='-MM'
2739
2740 mkdir -p avbuild
2741
2742 # find source path
2743 if test -f configure; then
2744     source_path=.
2745 else
2746     source_path=$(cd $(dirname "$0"); pwd)
2747     echo "$source_path" | grep -q '[[:blank:]]' &&
2748         die "Out of tree builds are impossible with whitespace in source path."
2749     test -e "$source_path/config.h" &&
2750         die "Out of tree builds are impossible with config.h in source dir."
2751 fi
2752
2753 for v in "$@"; do
2754     r=${v#*=}
2755     l=${v%"$r"}
2756     r=$(sh_quote "$r")
2757     LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
2758 done
2759
2760 find_things(){
2761     thing=$1
2762     pattern=$2
2763     file=$source_path/$3
2764     sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2765 }
2766
2767 ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
2768 DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2769 PARSER_LIST=$(find_things   parser   PARSER   libavcodec/allcodecs.c)
2770 MUXER_LIST=$(find_things    muxer    _MUX     libavformat/allformats.c)
2771 DEMUXER_LIST=$(find_things  demuxer  DEMUX    libavformat/allformats.c)
2772 INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2773 FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2774
2775 find_things_extern(){
2776     thing=$1
2777     pattern=$2
2778     file=$source_path/$3
2779     sed -n "s/^[^#]*extern.*$pattern *ff_\([^ ]*\)_$thing;/\1_$thing/p" "$file"
2780 }
2781
2782 BSF_LIST=$(find_things_extern bsf AVBitStreamFilter libavcodec/bitstream_filters.c)
2783 HWACCEL_LIST=$(find_things_extern hwaccel AVHWAccel libavcodec/hwaccels.h)
2784 PROTOCOL_LIST=$(find_things_extern protocol URLProtocol libavformat/protocols.c)
2785
2786 AVCODEC_COMPONENTS_LIST="
2787     $BSF_LIST
2788     $DECODER_LIST
2789     $ENCODER_LIST
2790     $HWACCEL_LIST
2791     $PARSER_LIST
2792 "
2793
2794 AVDEVICE_COMPONENTS_LIST="
2795     $INDEV_LIST
2796 "
2797
2798 AVFILTER_COMPONENTS_LIST="
2799     $FILTER_LIST
2800 "
2801
2802 AVFORMAT_COMPONENTS_LIST="
2803     $DEMUXER_LIST
2804     $MUXER_LIST
2805     $PROTOCOL_LIST
2806 "
2807
2808 ALL_COMPONENTS="
2809     $AVCODEC_COMPONENTS_LIST
2810     $AVDEVICE_COMPONENTS_LIST
2811     $AVFILTER_COMPONENTS_LIST
2812     $AVFORMAT_COMPONENTS_LIST
2813 "
2814
2815 for n in $COMPONENT_LIST; do
2816     v=$(toupper ${n%s})_LIST
2817     eval enable \$$v
2818     eval ${n}_if_any="\$$v"
2819 done
2820
2821 enable $ARCH_EXT_LIST
2822
2823 die_unknown(){
2824     echo "Unknown option \"$1\"."
2825     echo "See $0 --help for available options."
2826     exit 1
2827 }
2828
2829 print_3_columns() {
2830     printf "%-25s %-25s %-25s\n" $(cat | tr ' ' '\n' | sort)
2831 }
2832
2833 show_list() {
2834     suffix=_$1
2835     shift
2836     echo $* | sed s/$suffix//g | print_3_columns
2837     exit 0
2838 }
2839
2840 for opt do
2841     optval="${opt#*=}"
2842     case "$opt" in
2843         --extra-ldflags=*)
2844             add_ldflags $optval
2845         ;;
2846         --extra-ldexeflags=*)
2847             add_ldexeflags $optval
2848         ;;
2849         --extra-ldsoflags=*)
2850             add_ldsoflags $optval
2851         ;;
2852         --extra-libs=*)
2853             add_extralibs $optval
2854         ;;
2855         --disable-devices)
2856             disable $INDEV_LIST
2857         ;;
2858         --enable-debug=*)
2859             debuglevel="$optval"
2860         ;;
2861         --disable-programs)
2862             disable $PROGRAM_LIST
2863         ;;
2864         --disable-everything)
2865             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2866         ;;
2867         --disable-all)
2868             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2869             disable $LIBRARY_LIST $PROGRAM_LIST doc
2870         ;;
2871         --enable-*=*|--disable-*=*)
2872             eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
2873             is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
2874             eval list=\$$(toupper $thing)_LIST
2875             name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
2876             $action $(filter "$name" $list)
2877         ;;
2878         --enable-yasm|--disable-yasm)
2879             warn "The ${opt} option is only provided for compatibility and will be\n"\
2880                  "removed in the future. Use --enable-x86asm / --disable-x86asm instead."
2881             test $opt = --enable-yasm && x86asm=yes || x86asm=no
2882         ;;
2883         --enable-?*|--disable-?*)
2884             eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
2885             if is_in $option $COMPONENT_LIST; then
2886                 test $action = disable && action=unset
2887                 eval $action \$$(toupper ${option%s})_LIST
2888             elif is_in $option $CMDLINE_SELECT; then
2889                 $action $option
2890             else
2891                 die_unknown $opt
2892             fi
2893         ;;
2894         --list-*)
2895             NAME="${opt#--list-}"
2896             is_in $NAME $COMPONENT_LIST || die_unknown $opt
2897             NAME=${NAME%s}
2898             eval show_list $NAME \$$(toupper $NAME)_LIST
2899         ;;
2900         --help|-h) show_help
2901         ;;
2902         --quiet|-q) quiet=yes
2903         ;;
2904         *)
2905             optname="${opt%%=*}"
2906             optname="${optname#--}"
2907             optname=$(echo "$optname" | sed 's/-/_/g')
2908             if is_in $optname $CMDLINE_SET; then
2909                 eval $optname='$optval'
2910             elif is_in $optname $CMDLINE_APPEND; then
2911                 append $optname "$optval"
2912             else
2913                 die_unknown $opt
2914             fi
2915         ;;
2916     esac
2917 done
2918
2919 for e in $env; do
2920     eval "export $e"
2921 done
2922
2923 disabled logging && logfile=/dev/null
2924
2925 # command line configuration sanity checks
2926
2927 # we need to build at least one lib type
2928 if ! enabled_any static shared; then
2929     cat <<EOF
2930 At least one library type must be built.
2931 Specify --enable-static to build the static libraries or --enable-shared to
2932 build the shared libraries as well. To only build the shared libraries specify
2933 --disable-static in addition to --enable-shared.
2934 EOF
2935     exit 1
2936 fi
2937
2938 # Die early if licensing-related configure options are incompatible.
2939 die_license_disabled() {
2940     enabled $1 || { enabled $v && die "$v is $1 and --enable-$1 is not specified."; }
2941 }
2942
2943 map "die_license_disabled gpl"      $EXTERNAL_LIBRARY_GPL_LIST
2944 map "die_license_disabled nonfree"  $EXTERNAL_LIBRARY_NONFREE_LIST $HWACCEL_LIBRARY_NONFREE_LIST
2945 map "die_license_disabled version3" $EXTERNAL_LIBRARY_VERSION3_LIST
2946
2947 enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
2948
2949 if enabled nonfree; then
2950     license="nonfree and unredistributable"
2951 elif enabled gplv3; then
2952     license="GPL version 3 or later"
2953 elif enabled lgplv3; then
2954     license="LGPL version 3 or later"
2955 elif enabled gpl; then
2956     license="GPL version 2 or later"
2957 else
2958     license="LGPL version 2.1 or later"
2959 fi
2960
2961 enabled_all gnutls openssl &&
2962     die "GnuTLS and OpenSSL must not be enabled at the same time."
2963
2964 enabled_all gnutls mbedtls &&
2965     die "GnuTLS and mbedTLS must not be enabled at the same time."
2966
2967 enabled_all openssl mbedtls &&
2968     die "OpenSSL and mbedTLS must not be enabled at the same time."
2969
2970 # Disable all the library-specific components if the library itself
2971 # is disabled, see AVCODEC_LIST and following _LIST variables.
2972
2973 disable_components(){
2974     disabled ${1} && disable $(
2975         eval components="\$$(toupper ${1})_COMPONENTS"
2976         map 'eval echo \${$(toupper ${v%s})_LIST}' $components
2977     )
2978 }
2979
2980 map 'disable_components $v' $LIBRARY_LIST
2981
2982 echo "# $0 $LIBAV_CONFIGURATION" > $logfile
2983 set >> $logfile
2984
2985 case "$toolchain" in
2986     *-asan)
2987         cc_default="${toolchain%-asan}"
2988         add_cflags  -fsanitize=address
2989         add_ldflags -fsanitize=address
2990     ;;
2991     *-msan)
2992         cc_default="${toolchain%-msan}"
2993         add_cflags  -fsanitize=memory -fsanitize-memory-track-origins
2994         add_ldflags -fsanitize=memory
2995     ;;
2996     *-tsan)
2997         cc_default="${toolchain%-tsan}"
2998         add_cflags  -fsanitize=thread -fPIE
2999         add_ldflags -fsanitize=thread -pie
3000         case "$toolchain" in
3001             gcc-tsan)
3002                 add_cflags  -fPIC
3003                 add_ldflags -fPIC
3004                 ;;
3005         esac
3006     ;;
3007     *-usan)
3008         cc_default="${toolchain%-usan}"
3009         add_cflags  -fsanitize=undefined
3010         add_ldflags -fsanitize=undefined
3011         case "$toolchain" in
3012             clang-usan)
3013                 add_cflags -O1
3014                 ;;
3015         esac
3016     ;;
3017     valgrind-*)
3018         target_exec_default="valgrind"
3019         case "$toolchain" in
3020             valgrind-massif)
3021                 target_exec_args="--alloc-fn=av_malloc --alloc-fn=av_mallocz"
3022                 ;;
3023             valgrind-memcheck)
3024                 target_exec_args="--track-origins=yes --leak-check=full"
3025                 ;;
3026         esac
3027     ;;
3028     msvc)
3029         # Check whether the current MSVC version needs the C99 converter.
3030         # From MSVC 2013 (compiler major version 18) onwards, it does actually
3031         # support enough of C99 to build libav. Default to the new
3032         # behaviour if the regexp was unable to match anything, since this
3033         # successfully parses the version number of existing supported
3034         # versions that require the converter (MSVC 2010 and 2012).
3035         cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
3036         if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
3037             cc_default="cl"
3038         else
3039             cc_default="c99wrap cl"
3040         fi
3041         ld_default="$source_path/compat/windows/mslink"
3042         nm_default="dumpbin -symbols"
3043         ar_default="lib"
3044         case "$arch" in
3045         aarch64|arm64)
3046             as_default="armasm64"
3047             ;;
3048         arm*)
3049             as_default="armasm"
3050             ;;
3051         esac
3052         target_os_default="win32"
3053         # Use a relative path for TMPDIR. This makes sure all the
3054         # ffconf temp files are written with a relative path, avoiding
3055         # issues with msys/win32 path conversion for MSVC parameters
3056         # such as -Fo<file> or -out:<file>.
3057         TMPDIR=.
3058     ;;
3059     icl)
3060         cc_default="icl"
3061         ld_default="xilink"
3062         nm_default="dumpbin -symbols"
3063         ar_default="xilib"
3064         target_os_default="win32"
3065         TMPDIR=.
3066     ;;
3067     gcov)
3068         add_cflags  -fprofile-arcs -ftest-coverage
3069         add_ldflags -fprofile-arcs -ftest-coverage
3070     ;;
3071     llvm-cov)
3072         add_cflags -fprofile-arcs -ftest-coverage
3073         add_ldflags --coverage
3074     ;;
3075     hardened)
3076         add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
3077         add_cflags   -fno-strict-overflow -fstack-protector-all
3078         add_ldflags  -Wl,-z,relro -Wl,-z,now
3079     ;;
3080     ?*)
3081         die "Unknown toolchain $toolchain"
3082     ;;
3083 esac
3084
3085 if test -n "$cross_prefix"; then
3086     test -n "$arch" && test -n "$target_os" ||
3087         die "Must specify target arch (--arch) and OS (--target-os) when cross-compiling"
3088     enable cross_compile
3089 fi
3090
3091 ar_default="${cross_prefix}${ar_default}"
3092 cc_default="${cross_prefix}${cc_default}"
3093 objcc_default="${cross_prefix}${objcc_default}"
3094 x86asmexe_default="${cross_prefix}${x86asmexe_default}"
3095 nm_default="${cross_prefix}${nm_default}"
3096 pkg_config_default="${cross_prefix}${pkg_config_default}"
3097 ranlib="${cross_prefix}${ranlib}"
3098 strip="${cross_prefix}${strip}"
3099
3100 sysinclude_default="${sysroot}/usr/include"
3101
3102 set_default arch cc pkg_config sysinclude target_exec target_os x86asmexe
3103 enabled cross_compile || host_cc_default=$cc
3104 set_default host_cc
3105
3106 if ! $pkg_config --version >/dev/null 2>&1; then
3107     warn "$pkg_config not found, library detection may fail."
3108     pkg_config=false
3109 fi
3110
3111 exesuf() {
3112     case $1 in
3113         mingw32*|mingw64*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
3114     esac
3115 }
3116
3117 EXESUF=$(exesuf $target_os)
3118 HOSTEXESUF=$(exesuf $host_os)
3119
3120 # set temporary file name
3121 : ${TMPDIR:=$TEMPDIR}
3122 : ${TMPDIR:=$TMP}
3123 : ${TMPDIR:=/tmp}
3124
3125 if ! test_cmd mktemp -u XXXXXX; then
3126     # simple replacement for missing mktemp
3127     # NOT SAFE FOR GENERAL USE
3128     mktemp(){
3129         tmpname="${2%%XXX*}.${HOSTNAME}.${UID}.$$"
3130         echo "$tmpname"
3131         mkdir "$tmpname"
3132     }
3133 fi
3134
3135 AVTMPDIR=$(mktemp -d "${TMPDIR}/avconf.XXXXXXXX" 2> /dev/null) ||
3136     die "Unable to create temporary directory in $TMPDIR."
3137
3138 tmpfile(){
3139     tmp="${AVTMPDIR}/test"$2
3140     (set -C; exec > $tmp) 2> /dev/null ||
3141         die "Unable to create temporary file in $AVTMPDIR."
3142     eval $1=$tmp
3143 }
3144
3145 trap 'rm -rf -- "$AVTMPDIR"' EXIT
3146 trap 'exit 2' INT
3147
3148 tmpfile TMPASM .asm
3149 tmpfile TMPC   .c
3150 tmpfile TMPE   $EXESUF
3151 tmpfile TMPH   .h
3152 tmpfile TMPO   .o
3153 tmpfile TMPS   .S
3154 tmpfile TMPSH  .sh
3155 tmpfile TMPV   .ver
3156
3157 unset -f mktemp
3158
3159 chmod +x $TMPE
3160
3161 # make sure we can execute files in $TMPDIR
3162 cat > $TMPSH 2>> $logfile <<EOF
3163 #! /bin/sh
3164 EOF
3165 chmod +x $TMPSH >> $logfile 2>&1
3166 if ! $TMPSH >> $logfile 2>&1; then
3167     cat <<EOF
3168 Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
3169 variable to another directory and make sure that it is not mounted noexec.
3170 EOF
3171     die "Sanity test failed."
3172 fi
3173
3174 armasm_flags(){
3175     for flag; do
3176         case $flag in
3177             # Filter out MSVC cl.exe options from cflags that shouldn't
3178             # be passed to gas-preprocessor
3179             -M[TD]*)                                            ;;
3180             *)                  echo $flag                      ;;
3181         esac
3182    done
3183 }
3184
3185 cparser_flags(){
3186     for flag; do
3187         case $flag in
3188             -Wno-switch)             echo -Wno-switch-enum ;;
3189             -Wno-format-zero-length) ;;
3190             -Wdisabled-optimization) ;;
3191             -Wno-pointer-sign)       echo -Wno-other ;;
3192             *)                       echo $flag ;;
3193         esac
3194     done
3195 }
3196
3197 msvc_common_flags(){
3198     for flag; do
3199         case $flag in
3200             # In addition to specifying certain flags under the compiler
3201             # specific filters, they must be specified here as well or else the
3202             # generic catch all at the bottom will print the original flag.
3203             -Wall)                ;;
3204             -Wextra)              ;;
3205             -std=c99)             ;;
3206             # Common flags
3207             -fomit-frame-pointer) ;;
3208             -g)                   echo -Z7 ;;
3209             -fno-math-errno)      ;;
3210             -fno-common)          ;;
3211             -fno-signed-zeros)    ;;
3212             -fPIC)                ;;
3213             -mthumb)              ;;
3214             -march=*)             ;;
3215             -lz)                  echo zlib.lib ;;
3216             -lx264)               echo libx264.lib ;;
3217             -l*)                  echo ${flag#-l}.lib ;;
3218             -L*)                  echo -libpath:${flag#-L} ;;
3219             *)                    echo $flag ;;
3220         esac
3221     done
3222 }
3223
3224 msvc_flags(){
3225     msvc_common_flags "$@"
3226     for flag; do
3227         case $flag in
3228             -Wall)                echo -W3 -wd4018 -wd4146 -wd4244 -wd4305     \
3229                                        -wd4554 ;;
3230             -Wextra)              echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
3231                                        -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
3232                                        -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
3233                                        -wd4273 -wd4554 -wd4701 -wd4703 ;;
3234         esac
3235     done
3236 }
3237
3238 icl_flags(){
3239     msvc_common_flags "$@"
3240     for flag; do
3241         case $flag in
3242             # Despite what Intel's documentation says -Wall, which is supported
3243             # on Windows, does enable remarks so disable them here.
3244             -Wall)                echo $flag -Qdiag-disable:remark ;;
3245             -std=c99)             echo -Qstd=c99 ;;
3246         esac
3247     done
3248 }
3249
3250 suncc_flags(){
3251     for flag; do
3252         case $flag in
3253             -march=*|-mcpu=*)
3254                 case "${flag#*=}" in
3255                     native)                   echo -xtarget=native       ;;
3256                     v9|niagara)               echo -xarch=sparc          ;;
3257                     ultrasparc)               echo -xarch=sparcvis       ;;
3258                     ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
3259                     i586|pentium)             echo -xchip=pentium        ;;
3260                     i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
3261                     pentium3*|c3-2)           echo -xtarget=pentium3     ;;
3262                     pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
3263                     pentium4*)          echo -xtarget=pentium4           ;;
3264                     prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
3265                     *-sse3)             echo -xarch=sse3                 ;;
3266                     core2)              echo -xarch=ssse3 -xchip=core2   ;;
3267                     corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
3268                     corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
3269                     amdfam10|barcelona|bdver*) echo -xarch=sse4_1        ;;
3270                     athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
3271                     k8|opteron|athlon64|athlon-fx)
3272                                                echo -xarch=sse2a         ;;
3273                     athlon*)                   echo -xarch=pentium_proa  ;;
3274                 esac
3275                 ;;
3276             -std=c99)             echo -xc99              ;;
3277             -fomit-frame-pointer) echo -xregs=frameptr    ;;
3278             -fPIC)                echo -KPIC -xcode=pic32 ;;
3279             -W*,*)                echo $flag              ;;
3280             -f*-*|-W*|-mimpure-text)                      ;;
3281             -shared)              echo -G                 ;;
3282             *)                    echo $flag              ;;
3283         esac
3284     done
3285 }
3286
3287 probe_cc(){
3288     pfx=$1
3289     _cc=$2
3290
3291     unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
3292     unset _ld_o _ldflags _ld_lib _ld_path
3293     unset _depflags _DEPCMD _DEPFLAGS
3294     _flags_filter=echo
3295
3296     if $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
3297         _type=llvm_gcc
3298         gcc_extra_ver=$(expr "$($_cc --version 2>/dev/null | head -n1)" : '.*\((.*)\)')
3299         _ident="llvm-gcc $($_cc -dumpversion 2>/dev/null) $gcc_extra_ver"
3300         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
3301         _cflags_speed='-O3'
3302         _cflags_size='-Os'
3303     elif $_cc -v 2>&1 | grep -qi ^gcc; then
3304         _type=gcc
3305         gcc_version=$($_cc --version | head -n1)
3306         gcc_basever=$($_cc -dumpversion)
3307         gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
3308         gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
3309         _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
3310         if ! $_cc -dumpversion | grep -q '^2\.'; then
3311             _depflags='-MMD -MF $(@:.o=.d) -MT $@'
3312         fi
3313         _cflags_speed='-O3'
3314         _cflags_size='-Os'
3315     elif $_cc --version 2>/dev/null | grep -q ^icc; then
3316         _type=icc
3317         _ident=$($_cc --version | head -n1)
3318         _depflags='-MMD'
3319         _cflags_speed='-O3'
3320         _cflags_size='-Os'
3321         _cflags_noopt='-O1'
3322     elif $_cc -v 2>&1 | grep -q xlc; then
3323         _type=xlc
3324         _ident=$($_cc -qversion 2>/dev/null | head -n1)
3325         _cflags_speed='-O5'
3326         _cflags_size='-O5 -qcompact'
3327     elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
3328         test -d "$sysroot" || die "No valid sysroot specified."
3329         _type=armcc
3330         _ident=$($_cc --vsn | grep -i build | head -n1 | sed 's/.*: //')
3331         armcc_conf="$PWD/armcc.conf"
3332         $_cc --arm_linux_configure                 \
3333              --arm_linux_config_file="$armcc_conf" \
3334              --configure_sysroot="$sysroot"        \
3335              --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
3336              die "Error creating armcc configuration file."
3337         $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
3338         _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
3339         as_default="${cross_prefix}gcc"
3340         _depflags='-MMD'
3341         _cflags_speed='-O3'
3342         _cflags_size='-Os'
3343     elif $_cc -v 2>&1 | grep -q clang; then
3344         _type=clang
3345         _ident=$($_cc --version 2>/dev/null | head -n1)
3346         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
3347         _cflags_speed='-O3'
3348         _cflags_size='-Os'
3349     elif $_cc -V 2>&1 | grep -q Sun; then
3350         _type=suncc
3351         _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
3352         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
3353         _DEPFLAGS='-xM1 -xc99'
3354         _ldflags='-std=c99'
3355         _cflags_speed='-O5'
3356         _cflags_size='-O5 -xspace'
3357         _flags_filter=suncc_flags
3358     elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
3359         _type=pathscale
3360         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
3361         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
3362         _cflags_speed='-O2'
3363         _cflags_size='-Os'
3364         _flags_filter='filter_out -Wdisabled-optimization'
3365     elif $_cc -v 2>&1 | grep -q Open64; then
3366         _type=open64
3367         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
3368         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
3369         _cflags_speed='-O2'
3370         _cflags_size='-Os'
3371         _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
3372     elif $_cc 2>&1 | grep -q 'Microsoft.*ARM.*Assembler'; then
3373         _type=armasm
3374         _ident=$($_cc | head -n1)
3375         # 4509: "This form of conditional instruction is deprecated"
3376         _flags="-nologo -ignore 4509"
3377         _flags_filter=armasm_flags
3378     elif $_cc -nologo- 2>&1 | grep -q Microsoft; then
3379         _type=msvc
3380         _ident=$($_cc 2>&1 | head -n1)
3381         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
3382         _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
3383         _cflags_speed="-O2"
3384         _cflags_size="-O1"
3385         _cflags_noopt="-O1"
3386         if $_cc -nologo- 2>&1 | grep -q Linker; then
3387             _ld_o='-out:$@'
3388         else
3389             _ld_o='-Fe$@'
3390         fi
3391         _cc_o='-Fo$@'
3392         _cc_e='-P -Fi$@'
3393         _flags_filter=msvc_flags
3394         _ld_lib='lib%.a'
3395         _ld_path='-libpath:'
3396         _flags='-nologo'
3397     elif $_cc 2>&1 | grep -q Intel; then
3398         _type=icl
3399         _ident=$($_cc 2>&1 | head -n1)
3400         _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
3401         # Not only is O3 broken on 13.x+ but it is slower on all previous
3402         # versions (tested) as well.
3403         _cflags_speed="-O2"
3404         _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
3405         if $_cc 2>&1 | grep -q Linker; then
3406             _ld_o='-out:$@'
3407         else
3408             _ld_o='-Fe$@'
3409         fi
3410         _cc_o='-Fo$@'
3411         _cc_e='-P'
3412         _flags_filter=icl_flags
3413         _ld_lib='lib%.a'
3414         _ld_path='-libpath:'
3415         # -Qdiag-error to make icl error when seeing certain unknown arguments
3416         _flags='-nologo -Qdiag-error:4044,10157'
3417         # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency
3418         # with MSVC which enables it by default.
3419         _cflags='-Qms0 -Qvec- -Qsimd- -GS'
3420     elif $_cc -? 2>/dev/null | grep -q 'LLVM.*Linker'; then
3421         # lld can emulate multiple different linkers; in ms link.exe mode,
3422         # the -? parameter gives the help output which contains an identifyable
3423         # string, while it gives an error in other modes.
3424         _type=lld-link
3425         # The link.exe mode doesn't have a switch for getting the version,
3426         # but we can force it back to gnu mode and get the version from there.
3427         _ident=$($_cc -flavor gnu --version 2>/dev/null)
3428         _ld_o='-out:$@'
3429         _flags_filter=msvc_flags
3430         _ld_lib='lib%.a'
3431         _ld_path='-libpath:'
3432     elif $_cc --version 2>/dev/null | grep -q ^cparser; then
3433         _type=cparser
3434         _ident=$($_cc --version | head -n1)
3435         _depflags='-MMD'
3436         _cflags_speed='-O4'
3437         _cflags_size='-O2'
3438         _flags_filter=cparser_flags
3439     fi
3440
3441     eval ${pfx}_type=\$_type
3442     eval ${pfx}_ident=\$_ident
3443 }
3444
3445 set_ccvars(){
3446     eval ${1}_C=\${_cc_c-\${${1}_C}}
3447     eval ${1}_E=\${_cc_e-\${${1}_E}}
3448     eval ${1}_O=\${_cc_o-\${${1}_O}}
3449
3450     if [ -n "$_depflags" ]; then
3451         eval ${1}_DEPFLAGS=\$_depflags
3452     else
3453         eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
3454         eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
3455         eval DEP${1}FLAGS=\$_flags
3456     fi
3457 }
3458
3459 probe_cc cc "$cc"
3460 cflags_filter=$_flags_filter
3461 cflags_speed=$_cflags_speed
3462 cflags_size=$_cflags_size
3463 cflags_noopt=$_cflags_noopt
3464 add_cflags $_flags $_cflags
3465 cc_ldflags=$_ldflags
3466 set_ccvars CC
3467
3468 probe_cc hostcc "$host_cc"
3469 host_cflags_filter=$_flags_filter
3470 host_cflags_speed=$_cflags_speed
3471 add_host_cflags  $_flags $_cflags
3472 set_ccvars HOSTCC
3473
3474 test -n "$cc_type" && enable $cc_type ||
3475     warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
3476
3477 : ${as_default:=$cc}
3478 : ${objcc_default:=$cc}
3479 : ${dep_cc_default:=$cc}
3480 : ${ld_default:=$cc}
3481 : ${host_ld_default:=$host_cc}
3482 set_default ar as objcc dep_cc ld host_ld
3483
3484 probe_cc as "$as"
3485 asflags_filter=$_flags_filter
3486 add_asflags $_flags $_cflags
3487 set_ccvars AS
3488
3489 probe_cc objcc "$objcc"
3490 objcflags_filter=$_flags_filter
3491 add_objcflags $_flags $_cflags
3492 set_ccvars OBJC
3493
3494 probe_cc ld "$ld"
3495 ldflags_filter=$_flags_filter
3496 add_ldflags $_flags $_ldflags
3497 test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
3498 LD_O=${_ld_o-$LD_O}
3499 LD_LIB=${_ld_lib-$LD_LIB}
3500 LD_PATH=${_ld_path-$LD_PATH}
3501
3502 probe_cc hostld "$host_ld"
3503 host_ldflags_filter=$_flags_filter
3504 add_host_ldflags $_flags $_ldflags
3505 HOSTLD_O=${_ld_o-$HOSTLD_O}
3506
3507 if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
3508     probe_cc depcc "$dep_cc"
3509     CCDEP=${_DEPCMD:-$DEPCMD}
3510     CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
3511     DEPCCFLAGS=$_flags
3512 fi
3513
3514 if $ar 2>&1 | grep -q Microsoft; then
3515     arflags="-nologo"
3516     ar_o='-out:$@'
3517 else
3518     arflags="rc"
3519     ar_o='$@'
3520 fi
3521
3522 add_cflags $extra_cflags
3523 add_objcflags $extra_objcflags
3524 add_asflags $extra_cflags
3525
3526 if test -n "$sysroot"; then
3527     case "$cc_type" in
3528         gcc|llvm_gcc|clang)
3529             add_cppflags --sysroot="$sysroot"
3530             add_ldflags --sysroot="$sysroot"
3531         ;;
3532     esac
3533 fi
3534
3535 if test "$cpu" = host; then
3536     enabled cross_compile &&
3537         die "--cpu=host makes no sense when cross-compiling."
3538
3539     case "$cc_type" in
3540         gcc|llvm_gcc)
3541             check_native(){
3542                 $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
3543                 sed -n "/cc1.*$1=/{
3544                             s/.*$1=\\([^ ]*\\).*/\\1/
3545                             p
3546                             q
3547                         }" $TMPE
3548             }
3549             cpu=$(check_native -march || check_native -mcpu)
3550         ;;
3551     esac
3552
3553     test "${cpu:-host}" = host &&
3554         die "--cpu=host not supported with compiler $cc"
3555 fi
3556
3557 # Deal with common $arch aliases
3558 case "$arch" in
3559     aarch64|arm64)
3560         arch="aarch64"
3561     ;;
3562     arm*)
3563         arch="arm"
3564     ;;
3565     mips*|IP*)
3566         case "$arch" in
3567         *el)
3568             add_cppflags -EL
3569             add_ldflags -EL
3570         ;;
3571         *eb)
3572             add_cppflags -EB
3573             add_ldflags -EB
3574         ;;
3575         esac
3576         arch="mips"
3577     ;;
3578     parisc*|hppa*)
3579         arch="parisc"
3580     ;;
3581     "Power Macintosh"|ppc*|powerpc*)
3582         arch="ppc"
3583     ;;
3584     s390|s390x)
3585         arch="s390"
3586     ;;
3587     sh4|sh)
3588         arch="sh4"
3589     ;;
3590     sun4u|sparc*)
3591         arch="sparc"
3592     ;;
3593     tilegx|tile-gx)
3594         arch="tilegx"
3595     ;;
3596     i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
3597         arch="x86"
3598     ;;
3599 esac
3600
3601 is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
3602 enable $arch
3603
3604 # Add processor-specific flags
3605 if enabled aarch64; then
3606
3607     case $cpu in
3608         armv*)
3609             cpuflags="-march=$cpu"
3610         ;;
3611         *)
3612             cpuflags="-mcpu=$cpu"
3613         ;;
3614     esac
3615
3616 elif enabled alpha; then
3617
3618     cpuflags="-mcpu=$cpu"
3619
3620 elif enabled arm; then
3621
3622     check_arm_arch() {
3623         test_cpp_condition stddef.h \
3624             "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
3625             $cpuflags
3626     }
3627
3628     probe_arm_arch() {
3629         if   check_arm_arch 4;        then echo armv4
3630         elif check_arm_arch 4T;       then echo armv4t
3631         elif check_arm_arch 5;        then echo armv5
3632         elif check_arm_arch 5E;       then echo armv5e
3633         elif check_arm_arch 5T;       then echo armv5t
3634         elif check_arm_arch 5TE;      then echo armv5te
3635         elif check_arm_arch 5TEJ;     then echo armv5te
3636         elif check_arm_arch 6;        then echo armv6
3637         elif check_arm_arch 6J;       then echo armv6j
3638         elif check_arm_arch 6K;       then echo armv6k
3639         elif check_arm_arch 6Z;       then echo armv6z
3640         elif check_arm_arch 6ZK;      then echo armv6zk
3641         elif check_arm_arch 6T2;      then echo armv6t2
3642         elif check_arm_arch 7;        then echo armv7
3643         elif check_arm_arch 7A  7_A;  then echo armv7-a
3644         elif check_arm_arch 7S;       then echo armv7-a
3645         elif check_arm_arch 7R  7_R;  then echo armv7-r
3646         elif check_arm_arch 7M  7_M;  then echo armv7-m
3647         elif check_arm_arch 7EM 7E_M; then echo armv7-m
3648         elif check_arm_arch 8A  8_A;  then echo armv8-a
3649         fi
3650     }
3651
3652     [ "$cpu" = generic ] && cpu=$(probe_arm_arch)
3653
3654     case $cpu in
3655         armv*)
3656             cpuflags="-march=$cpu"
3657             subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
3658         ;;
3659         *)
3660             cpuflags="-mcpu=$cpu"
3661             case $cpu in
3662                 cortex-a*)                               subarch=armv7a  ;;
3663                 cortex-r*)                               subarch=armv7r  ;;
3664                 cortex-m*)                 enable thumb; subarch=armv7m  ;;
3665                 arm11*)                                  subarch=armv6   ;;
3666                 arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
3667                 armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
3668                 *)                             subarch=$(probe_arm_arch) ;;
3669             esac
3670         ;;
3671     esac
3672
3673     case "$subarch" in
3674         armv5t*)    enable fast_clz                ;;
3675         armv[6-8]*) enable fast_clz fast_unaligned ;;
3676     esac
3677
3678 elif enabled avr32; then
3679
3680     case $cpu in
3681         ap7[02]0[0-2])
3682             subarch="avr32_ap"
3683             cpuflags="-mpart=$cpu"
3684         ;;
3685         ap)
3686             subarch="avr32_ap"
3687             cpuflags="-march=$cpu"
3688         ;;
3689         uc3[ab]*)
3690             subarch="avr32_uc"
3691             cpuflags="-mcpu=$cpu"
3692         ;;
3693         uc)
3694             subarch="avr32_uc"
3695             cpuflags="-march=$cpu"
3696         ;;
3697     esac
3698
3699 elif enabled bfin; then
3700
3701     cpuflags="-mcpu=$cpu"
3702
3703 elif enabled mips; then
3704
3705     cpuflags="-march=$cpu"
3706
3707 elif enabled ppc; then
3708
3709     disable ldbrx
3710
3711     case $(tolower $cpu) in
3712         601|ppc601|powerpc601)
3713             cpuflags="-mcpu=601"
3714             disable altivec
3715         ;;
3716         603*|ppc603*|powerpc603*)
3717             cpuflags="-mcpu=603"
3718             disable altivec
3719         ;;
3720         604*|ppc604*|powerpc604*)
3721             cpuflags="-mcpu=604"
3722             disable altivec
3723         ;;
3724         g3|75*|ppc75*|powerpc75*)
3725             cpuflags="-mcpu=750"
3726             disable altivec
3727         ;;
3728         g4|745*|ppc745*|powerpc745*)
3729             cpuflags="-mcpu=7450"
3730             disable vsx
3731         ;;
3732         74*|ppc74*|powerpc74*)
3733             cpuflags="-mcpu=7400"
3734             disable vsx
3735         ;;
3736         g5|970|ppc970|powerpc970)
3737             cpuflags="-mcpu=970"
3738             disable vsx
3739         ;;
3740         power[3-6]*)
3741             cpuflags="-mcpu=$cpu"
3742             disable vsx
3743         ;;
3744         power[7-8]*)
3745             cpuflags="-mcpu=$cpu"
3746             enable ldbrx
3747         ;;
3748         cell)
3749             cpuflags="-mcpu=cell"
3750             enable ldbrx
3751             disable vsx
3752         ;;
3753         e500mc)
3754             cpuflags="-mcpu=e500mc"
3755             disable altivec
3756         ;;
3757         e500v2)
3758             cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
3759             disable altivec
3760             disable dcbzl
3761         ;;
3762         e500)
3763             cpuflags="-mcpu=8540 -mhard-float"
3764             disable altivec
3765             disable dcbzl
3766         ;;
3767     esac
3768
3769 elif enabled sparc; then
3770
3771     case $cpu in
3772         cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
3773             cpuflags="-mcpu=$cpu"
3774         ;;
3775         ultrasparc*|niagara[234])
3776             cpuflags="-mcpu=$cpu"
3777         ;;
3778     esac
3779
3780 elif enabled x86; then
3781
3782     case $cpu in
3783         i[345]86|pentium)
3784             cpuflags="-march=$cpu"
3785             disable i686
3786             disable mmx
3787         ;;
3788         # targets that do NOT support nopl and conditional mov (cmov)
3789         pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
3790             cpuflags="-march=$cpu"
3791             disable i686
3792         ;;
3793         # targets that do support nopl and conditional mov (cmov)
3794         i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx|core2|corei7*|amdfam10|barcelona|atom|bdver*)
3795             cpuflags="-march=$cpu"
3796             enable i686
3797             enable fast_cmov
3798         ;;
3799         # targets that do support conditional mov but on which it's slow
3800         pentium4|pentium4m|prescott|nocona)
3801             cpuflags="-march=$cpu"
3802             enable i686
3803             disable fast_cmov
3804         ;;
3805     esac
3806
3807 fi
3808
3809 if [ "$cpu" != generic ]; then
3810     add_cflags  $cpuflags
3811     add_asflags $cpuflags
3812     test "$cc_type" = "$ld_type" && add_ldflags $cpuflags
3813 fi
3814
3815 # compiler sanity check
3816 test_exec <<EOF
3817 int main(void){ return 0; }
3818 EOF
3819 if test "$?" != 0; then
3820     echo "$cc is unable to create an executable file."
3821     if test -z "$cross_prefix" && ! enabled cross_compile ; then
3822         echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
3823         echo "Only do this if you know what cross compiling means."
3824     fi
3825     die "C compiler test failed."
3826 fi
3827
3828 add_cppflags -D_ISOC99_SOURCE
3829
3830 # some compilers silently accept -std=c11, so we also need to check that the
3831 # version macro is defined properly
3832 test_cpp_condition stdlib.h  "__STDC_VERSION__ >= 201112L" -std=c11 &&
3833     add_cflags -std=c11 ||
3834     check_cflags -std=c99
3835
3836 check_cppflags -D_FILE_OFFSET_BITS=64
3837 check_cppflags -D_LARGEFILE_SOURCE
3838
3839 add_host_cppflags -D_ISOC99_SOURCE
3840 check_host_cflags -std=c99
3841 check_host_cflags -Wall
3842 check_host_cflags $host_cflags_speed
3843
3844 check_64bit(){
3845     arch32=$1
3846     arch64=$2
3847     expr=${3:-'sizeof(void *) > 4'}
3848     test_code cc "" "int test[2*($expr) - 1]" &&
3849         subarch=$arch64 || subarch=$arch32
3850     enable $subarch
3851 }
3852
3853 case "$arch" in
3854     aarch64|alpha|ia64)
3855         enabled shared && enable_weak pic
3856     ;;
3857     mips)
3858         check_64bit mips mips64 '_MIPS_SIM > 1'
3859         enabled shared && enable_weak pic
3860     ;;
3861     parisc)
3862         check_64bit parisc parisc64
3863         enabled shared && enable_weak pic
3864     ;;
3865     ppc)
3866         check_64bit ppc ppc64
3867         enabled shared && enable_weak pic
3868     ;;
3869     s390)
3870         check_64bit s390 s390x
3871         enabled shared && enable_weak pic
3872     ;;
3873     sparc)
3874         check_64bit sparc sparc64
3875         enabled shared && enable_weak pic
3876     ;;
3877     x86)
3878         check_64bit x86_32 x86_64
3879         if enabled x86_64; then
3880             enabled shared && enable_weak pic
3881             objformat=elf64
3882         fi
3883     ;;
3884 esac
3885
3886 # OS specific
3887 case $target_os in
3888     aix)
3889         SHFLAGS=-shared
3890         add_cppflags '-I\$(SRC_PATH)/compat/aix'
3891         enabled shared && add_ldflags -Wl,-brtl
3892         arflags='-Xany -r -c'
3893         ;;
3894     android)
3895         disable symver
3896         enable section_data_rel_ro
3897         SLIB_INSTALL_NAME='$(SLIBNAME)'
3898         SLIB_INSTALL_LINKS=
3899         SHFLAGS='-shared -Wl,-soname,$(SLIBNAME)'
3900         ;;
3901     haiku)
3902         prefix_default="/boot/common"
3903         network_extralibs="-lnetwork"
3904         host_extralibs=
3905         ;;
3906     sunos)
3907         SHFLAGS='-shared -Wl,-h,$$(@F)'
3908         enabled x86 && append SHFLAGS -mimpure-text
3909         network_extralibs="-lsocket -lnsl"
3910         # When using suncc to build, the Solaris linker will mark
3911         # an executable with each instruction set encountered by
3912         # the Solaris assembler.  As our libraries contain their own
3913         # guards for processor-specific code, instead suppress
3914         # generation of the HWCAPS ELF section on Solaris x86 only.
3915         enabled_all suncc x86 &&
3916             echo "hwcap_1 = OVERRIDE;" > mapfile &&
3917             add_ldflags -Wl,-M,mapfile
3918         nm_default='nm -P -g'
3919         version_script='-M'
3920         VERSION_SCRIPT_POSTPROCESS_CMD='perl $(SRC_PATH)/compat/solaris/make_sunver.pl - $(OBJS)'
3921         ;;
3922     netbsd)
3923         disable symver
3924         oss_indev_extralibs="-lossaudio"
3925         ;;
3926     openbsd|bitrig)
3927         disable symver
3928         SHFLAGS='-shared'
3929         SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
3930         SLIB_INSTALL_LINKS=
3931         oss_indev_extralibs="-lossaudio"
3932         ;;
3933     dragonfly)
3934         disable symver
3935         ;;
3936     freebsd)
3937         ;;
3938     bsd/os)
3939         add_extralibs -lpoll -lgnugetopt
3940         ;;
3941     darwin)
3942         enabled ppc && add_asflags -force_cpusubtype_ALL
3943         SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
3944         enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
3945         add_ldflags -Wl,-dynamic,-search_paths_first
3946         check_cflags -Werror=partial-availability
3947         SLIBSUF=".dylib"
3948         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME).$(LIBVERSION)$(SLIBSUF)'
3949         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(NAME).$(LIBMAJOR)$(SLIBSUF)'
3950         enabled x86_64 && objformat="macho64" || objformat="macho32"
3951         enabled_any pic shared ||
3952             { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
3953         check_headers dispatch/dispatch.h &&
3954             add_cppflags '-I\$(SRC_PATH)/compat/dispatch_semaphore'
3955         if test -n "$sysroot"; then
3956             is_in -isysroot $cc $CPPFLAGS $CFLAGS || check_cppflags -isysroot $sysroot
3957             is_in -isysroot $ld $LDFLAGS          || check_ldflags  -isysroot $sysroot
3958         fi
3959         ;;
3960     msys*)
3961         die "Native MSYS builds are discouraged, please use the MINGW environment."
3962         ;;
3963     mingw32*|mingw64*)
3964         target_os=mingw32
3965         LIBTARGET=i386
3966         if enabled x86_64; then
3967             LIBTARGET="i386:x86-64"
3968         elif enabled arm; then
3969             LIBTARGET="arm"
3970         elif enabled aarch64; then
3971             LIBTARGET="arm64"
3972         fi
3973         if enabled shared; then
3974             # Cannot build both shared and static libs when using dllimport.
3975             disable static
3976         fi
3977         check_ldflags -Wl,--nxcompat
3978         check_ldflags -Wl,--dynamicbase
3979         shlibdir_default="$bindir_default"
3980         SLIBPREF=""
3981         SLIBSUF=".dll"
3982         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
3983         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(NAME)-$(LIBMAJOR)$(SLIBSUF)'
3984         SLIB_EXTRA_CMD=-'$(DLLTOOL) -m $(LIBTARGET) -d $$(@:$(SLIBSUF)=.def) -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D $(SLIBNAME_WITH_MAJOR)'
3985         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3986         SLIB_INSTALL_LINKS=
3987         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3988         SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3989         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)'
3990         SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--enable-auto-image-base $$(@:$(SLIBSUF)=.def)'
3991         enabled x86_64 && objformat="win64" || objformat="win32"
3992         dlltool="${cross_prefix}dlltool"
3993         ranlib=:
3994         enable dos_paths
3995         ;;
3996     win32|win64)
3997         disable symver
3998         if enabled shared; then
3999             # Link to the import library instead of the normal static library
4000             # for shared libs.
4001             LD_LIB='%.lib'
4002             # Cannot build both shared and static libs with MSVC or icl.
4003             disable static
4004         fi
4005         shlibdir_default="$bindir_default"
4006         SLIBPREF=""
4007         SLIBSUF=".dll"
4008         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
4009         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(NAME)-$(LIBMAJOR)$(SLIBSUF)'
4010         SLIB_CREATE_DEF_CMD='EXTERN_PREFIX="$(EXTERN_PREFIX)" $(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
4011         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
4012         SLIB_INSTALL_LINKS=
4013         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
4014         SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
4015         SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
4016         enabled x86_64 && objformat="win64" || objformat="win32"
4017         ranlib=:
4018         enable dos_paths
4019         ;;
4020     cygwin*)
4021         target_os=cygwin
4022         shlibdir_default="$bindir_default"
4023         SLIBPREF="cyg"
4024         SLIBSUF=".dll"
4025         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
4026         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(NAME)-$(LIBMAJOR)$(SLIBSUF)'
4027         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
4028         SLIB_INSTALL_LINKS=
4029         SLIB_INSTALL_EXTRA_LIB='lib$(NAME).dll.a'
4030         SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(NAME).dll.a'
4031         enabled x86_64 && objformat="win64" || objformat="win32"
4032         enable dos_paths
4033         ;;
4034     *-dos|freedos|opendos)
4035         network_extralibs="-lsocket"
4036         objformat="coff"
4037         enable dos_paths
4038         add_cppflags -U__STRICT_ANSI__
4039         ;;
4040     linux)
4041         enable section_data_rel_ro
4042         ;;
4043     irix*)
4044         target_os=irix
4045         ranlib="echo ignoring ranlib"
4046         ;;
4047     os/2*)
4048         ln_s="cp -f"
4049         objformat="aout"
4050         add_cppflags -D_GNU_SOURCE
4051         add_ldflags -Zomf -Zbin-files -Zargs-wild -Zhigh-mem -Zmap
4052         SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
4053         LIBSUF="_s.a"
4054         SLIBPREF=""
4055         SLIBSUF=".dll"
4056         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
4057         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
4058         SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
4059             echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
4060             echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
4061             echo EXPORTS >> $(SUBDIR)$(NAME).def; \
4062             emxexp $(OBJS) >> $(SUBDIR)$(NAME).def'
4063         SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
4064             emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
4065         SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
4066         enable dos_paths
4067         ;;
4068     gnu/kfreebsd)
4069         add_cppflags -D_BSD_SOURCE
4070         ;;
4071     gnu)
4072         ;;
4073     qnx)
4074         add_cppflags -D_QNX_SOURCE
4075         network_extralibs="-lsocket"
4076         ;;
4077     symbian)
4078         SLIBSUF=".dll"
4079         enable dos_paths
4080         add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default
4081         add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS
4082         add_ldflags -Wl,--target1-abs,--no-undefined \
4083                     -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \
4084                     -Wl,--entry=_E32Startup -Wl,-u,_E32Startup
4085         add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \
4086                       -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
4087                       -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
4088         ;;
4089     minix)
4090         ;;
4091     none)
4092         ;;
4093     *)
4094         die "Unknown OS '$target_os'."
4095         ;;
4096 esac
4097
4098 # determine libc flavour
4099
4100 probe_libc(){
4101     pfx=$1
4102     pfx_no_=${pfx%_}
4103     # uclibc defines __GLIBC__, so it needs to be checked before glibc.
4104     if test_${pfx}cpp_condition features.h "defined __UCLIBC__"; then
4105         eval ${pfx}libc_type=uclibc
4106         add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
4107     elif test_${pfx}cpp_condition features.h "defined __GLIBC__"; then
4108         eval ${pfx}libc_type=glibc
4109         add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
4110     # MinGW headers can be installed on Cygwin, so check for newlib first.
4111     elif test_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
4112         eval ${pfx}libc_type=newlib
4113         add_${pfx}cppflags -U__STRICT_ANSI__ -D_XOPEN_SOURCE=600
4114         test_${pfx}cpp_condition windows.h "!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600" &&
4115             add_${pfx}cppflags -D_WIN32_WINNT=0x0600
4116     # MinGW64 is backwards compatible with MinGW32, so check for it first.
4117     elif test_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then
4118         eval ${pfx}libc_type=mingw64
4119         add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
4120         eval test \$${pfx_no_}cc_type = "gcc" &&
4121             add_${pfx}cppflags -D__printf__=__gnu_printf__
4122         test_${pfx}cpp_condition windows.h "!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600" &&
4123             add_${pfx}cppflags -D_WIN32_WINNT=0x0600
4124     elif test_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
4125          test_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
4126         eval ${pfx}libc_type=mingw32
4127         test_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \
4128             (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
4129             die "ERROR: MinGW32 runtime version must be >= 3.15."
4130         add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
4131         test_${pfx}cpp_condition _mingw.h "__MSVCRT_VERSION__ < 0x0700" &&
4132             add_${pfx}cppflags -D__MSVCRT_VERSION__=0x0700
4133         test_${pfx}cpp_condition windows.h "!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600" &&
4134             add_${pfx}cppflags -D_WIN32_WINNT=0x0600
4135         eval test \$${pfx_no_}cc_type = "gcc" &&
4136             add_${pfx}cppflags -D__printf__=__gnu_printf__
4137     elif test_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
4138         eval ${pfx}libc_type=msvcrt
4139         if test_${pfx}cpp_condition crtversion.h "_VC_CRT_MAJOR_VERSION < 14"; then
4140             if [ "$pfx" = host_ ]; then
4141                 add_host_cppflags -Dsnprintf=_snprintf
4142             else
4143                 add_compat strtod.o strtod=avpriv_strtod
4144                 add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
4145                                              _snprintf=avpriv_snprintf  \
4146                                              vsnprintf=avpriv_vsnprintf
4147             fi
4148         fi
4149         add_${pfx}cppflags -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS
4150         # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to
4151         # 0x601 by default unless something else is set by the user.
4152         # This can easily lead to us detecting functions only present
4153         # in such new versions and producing binaries requiring windows 7.0.
4154         # Therefore explicitly set the default to Vista unless the user has
4155         # set something else on the command line.
4156         # Don't do this if WINAPI_FAMILY is set and is set to a non-desktop
4157         # family. For these cases, configure is free to use any functions
4158         # found in the SDK headers by default. (Alternatively, we could force
4159         # _WIN32_WINNT to 0x0602 in that case.)
4160         test_${pfx}cpp_condition stdlib.h "defined(_WIN32_WINNT)" ||
4161             { test_${pfx}cpp <<EOF && add_${pfx}cppflags -D_WIN32_WINNT=0x0600; }
4162 #ifdef WINAPI_FAMILY
4163 #include <winapifamily.h>
4164 #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
4165 #error not desktop
4166 #endif
4167 #endif
4168 EOF
4169         if [ "$pfx" = "" ]; then
4170             check_func strtoll || add_cflags -Dstrtoll=_strtoi64
4171         fi
4172     elif test_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then
4173         eval ${pfx}libc_type=klibc
4174     elif test_${pfx}cpp_condition sys/cdefs.h "defined __BIONIC__"; then
4175         eval ${pfx}libc_type=bionic
4176     elif test_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
4177         eval ${pfx}libc_type=solaris
4178         add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
4179     else
4180         eval ${pfx}libc_type=default
4181         add_${pfx}cppflags -D_DEFAULT_SOURCE
4182     fi
4183     eval test -n "\${${pfx}libc_type}" && enable ${pfx}libc_${libc_type}
4184 }
4185
4186 probe_libc
4187 probe_libc host_
4188
4189 # hacks for compiler/libc/os combinations
4190
4191 case $libc_type in
4192     bionic)
4193         add_compat strtod.o strtod=avpriv_strtod
4194         ;;
4195 esac
4196
4197 check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
4198     add_cppflags '-I\$(SRC_PATH)/compat/float'
4199
4200 test_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
4201
4202 set_default $PATHS_LIST
4203 set_default nm
4204
4205 disabled optimizations || check_cflags -fomit-frame-pointer
4206
4207 enable_weak_pic() {
4208     disabled pic && return
4209     enable pic
4210     add_cppflags -DPIC
4211     case "$target_os" in
4212     mingw*|cygwin*|win*)
4213         ;;
4214     *)
4215         add_cflags -fPIC
4216         add_asflags -fPIC
4217         ;;
4218     esac
4219 }
4220
4221 enabled pic && enable_weak_pic
4222
4223 test_cc <<EOF || die "Symbol mangling check failed."
4224 int ff_extern;
4225 EOF
4226 sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
4227 extern_prefix=${sym%%ff_extern*}
4228
4229 ! disabled inline_asm && check_inline_asm inline_asm '"" ::'
4230
4231 for restrict_keyword in restrict __restrict__ __restrict ""; do
4232     test_code cc "" "char * $restrict_keyword p" && break
4233 done
4234
4235 check_cc pragma_deprecated "" '_Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")'
4236
4237 # The global variable ensures the bits appear unchanged in the object file.
4238 test_cc <<EOF || die "endian test failed"
4239 unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
4240 EOF
4241 od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
4242
4243 check_gas() {
4244     log "check_gas using '$as' as AS"
4245     # :vararg is used on aarch64, arm and ppc altivec
4246     check_as vararg "
4247 .macro m n, y:vararg=0
4248 \n: .int \y
4249 .endm
4250 m x" || return 1
4251     # .altmacro is only used in arm asm
4252     ! enabled arm || check_as gnu_as ".altmacro"
4253 }
4254
4255 if enabled_any arm aarch64 || enabled_all ppc altivec && enabled asm; then
4256     nogas=:
4257     enabled_any arm aarch64 && nogas=die
4258     enabled_all ppc altivec && nogas=warn
4259     as_noop=-v
4260
4261     case $as_type in
4262         arm*) gaspp_as_type=armasm; as_noop=-h ;;
4263         gcc)  gaspp_as_type=gas ;;
4264         *)    gaspp_as_type=$as_type ;;
4265     esac
4266
4267     [ $target_os = "darwin" ] && gaspp_as_type="apple-$gaspp_as_type"
4268
4269     test_cmd gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- $as $as_noop &&
4270         gas="gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- $as"
4271
4272     if ! check_gas ; then
4273         as=${gas:=$as}
4274         check_gas || \
4275             $nogas "GNU assembler not found, install/update gas-preprocessor"
4276     fi
4277
4278     check_as as_func ".func test
4279                       .endfunc"
4280 fi
4281
4282 check_inline_asm inline_asm_labels '"1:\n"'
4283
4284 if enabled aarch64; then
4285     enabled armv8 && check_insn armv8 'prfm   pldl1strm, [x0]'
4286     # internal assembler in clang 3.3 does not support this instruction
4287     enabled neon && check_insn neon 'ext   v0.8B, v0.8B, v1.8B, #1'
4288     enabled vfp  && check_insn vfp  'fmadd d0,    d0,    d1,    d2'
4289
4290     map 'enabled_any ${v}_external ${v}_inline || disable $v' $ARCH_EXT_LIST_ARM
4291
4292 elif enabled alpha; then
4293
4294     check_cflags -mieee
4295
4296 elif enabled arm; then
4297
4298     enabled msvc && check_cpp_condition thumb stddef.h "defined _M_ARMT"
4299     test_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb
4300     enabled thumb && check_cflags -mthumb || check_cflags -marm
4301
4302     if check_cpp_condition vfp_args stddef.h "defined __ARM_PCS_VFP"; then
4303         :
4304     elif check_cpp_condition vfp_args stddef.h "defined _M_ARM_FP && _M_ARM_FP >= 30"; then
4305         :
4306     elif ! test_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__" && [ $target_os != darwin ]; then
4307         case "${cross_prefix:-$cc}" in
4308             *hardfloat*) enable vfp_args; fpabi=vfp ;;
4309             *) check_ld vfp_args <<EOF && fpabi=vfp || fpabi=soft ;;
4310 __asm__ (".eabi_attribute 28, 1");
4311 int main(void) { return 0; }
4312 EOF
4313         esac
4314         warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
4315     fi
4316
4317     enabled armv5te && check_insn armv5te 'qadd r0, r0, r0'
4318     enabled armv6   && check_insn armv6   'sadd16 r0, r0, r0'
4319     enabled armv6t2 && check_insn armv6t2 'movt r0, #0'
4320     enabled neon    && check_insn neon    'vadd.i16 q0, q0, q0'
4321     enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
4322     enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'
4323
4324     [ $target_os = linux ] || [ $target_os = android ] ||
4325         map 'enabled_any ${v}_external ${v}_inline || disable $v' \
4326             $ARCH_EXT_LIST_ARM
4327
4328     check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
4329
4330     check_as as_arch_directive ".arch armv7-a"
4331     check_as as_fpu_directive  ".fpu neon"
4332
4333     # llvm's integrated assembler supports .object_arch from llvm 3.5
4334     [ "$objformat" = elf32 ] || [ "$objformat" = elf64 ] &&
4335         check_as as_object_arch ".object_arch armv4"
4336
4337     # MS armasm fails to assemble our PIC constructs
4338     [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
4339
4340 elif enabled mips; then
4341
4342     # make sure that only one instruction set is enabled
4343     disable $ARCH_EXT_LIST_MIPS
4344
4345     check_inline_asm loongson '"dmult.g $1, $2, $3"'
4346
4347     if enabled mips64; then
4348         check_inline_asm mips64r6 '"dlsa $0, $0, $0, 1"' ||
4349             check_inline_asm mips64r2 '"dext $0, $0, 0, 1"' ||
4350                 check_inline_asm mips64r1 '"daddi $0, $0, 0"'
4351     else
4352         check_inline_asm mips32r6 '"aui $0, $0, 0"' ||
4353             check_inline_asm mips32r2 '"ext $0, $0, 0, 1"' ||
4354                 check_inline_asm mips32r1 '"addi $0, $0, 0"'
4355     fi
4356
4357 elif enabled parisc; then
4358
4359     if enabled gcc; then
4360         case $($cc -dumpversion) in
4361             4.[3-8].*) check_cflags -fno-optimize-sibling-calls ;;
4362         esac
4363     fi
4364
4365 elif enabled ppc; then
4366
4367     enable local_aligned_8 local_aligned_16 local_aligned_32
4368
4369     check_inline_asm dcbzl     '"dcbzl 0, %0" :: "r"(0)'
4370     check_inline_asm ibm_asm   '"add 0, 0, 0"'
4371     check_inline_asm ppc4xx    '"maclhw r10, r11, r12"'
4372     check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'
4373
4374     if enabled altivec; then
4375         check_cflags -maltivec -mabi=altivec
4376
4377         # check if our compiler supports Motorola AltiVec C API
4378         check_cc altivec altivec.h "vector signed int v1 = (vector signed int) { 0 };
4379                                     vector signed int v2 = (vector signed int) { 1 };
4380                                     v1 = vec_add(v1, v2);"
4381
4382         enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
4383     fi
4384
4385     if enabled vsx; then
4386         check_cflags -mvsx &&
4387         check_cc vsx altivec.h "int v[4] = { 0 };
4388                                 vector signed int v1 = vec_vsx_ld(0, v);"
4389     fi
4390
4391     if enabled power8; then
4392         check_cpp_condition power8 altivec.h "defined(_ARCH_PWR8)"
4393     fi
4394
4395 elif enabled x86; then
4396
4397     check_builtin rdtsc    intrin.h   "__rdtsc()"
4398     check_builtin mm_empty mmintrin.h "_mm_empty()"
4399
4400     enable local_aligned_8 local_aligned_16 local_aligned_32
4401
4402     # check whether EBP is available on x86
4403     # As 'i' is stored on the stack, this program will crash
4404     # if the base pointer is used to access it because the
4405     # base pointer is cleared in the inline assembly code.
4406     check_exec_crash <<EOF && enable ebp_available
4407 volatile int i=0;
4408 __asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
4409 return i;
4410 EOF
4411
4412     # check whether EBX is available on x86
4413     check_inline_asm ebx_available '""::"b"(0)' &&
4414         check_inline_asm ebx_available '"":::"%ebx"'
4415
4416     # check whether xmm clobbers are supported
4417     check_inline_asm xmm_clobbers '"":::"%xmm0"'
4418
4419     # check whether binutils is new enough to compile SSSE3/MMXEXT
4420     enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
4421     enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
4422
4423     probe_x86asm(){
4424         x86asmexe_probe=$1
4425         if test_cmd $x86asmexe_probe -v; then
4426             x86asmexe=$x86asmexe_probe
4427             x86asm_type=nasm
4428             x86asm_debug="-g -F dwarf"
4429             X86ASMDEP=
4430             X86ASM_DEPFLAGS='-MD $(@:.o=.d)'
4431         elif test_cmd $x86asmexe_probe --version; then
4432             x86asmexe=$x86asmexe_probe
4433             x86asm_type=yasm
4434             x86asm_debug="-g dwarf2"
4435             X86ASMDEP='$(DEPX86ASM) $(X86ASMFLAGS) -M $(X86ASM_O) $< > $(@:.o=.d)'
4436             X86ASM_DEPFLAGS=
4437         fi
4438         check_x86asm x86asm "movbe ecx, [5]"
4439     }
4440
4441     if ! disabled_any asm mmx x86asm; then
4442         disable x86asm
4443         for program in $x86asmexe nasm yasm; do
4444             probe_x86asm $program && break
4445         done
4446         disabled x86asm && die "nasm/yasm not found or too old. Use --disable-x86asm for a crippled build."
4447         X86ASMFLAGS="-f $objformat"
4448         enabled pic               && append X86ASMFLAGS "-DPIC"
4449         test -n "$extern_prefix"  && append X86ASMFLAGS "-DPREFIX"
4450         case "$objformat" in
4451             elf*) enabled debug && append X86ASMFLAGS $x86asm_debug ;;
4452         esac
4453
4454         check_x86asm avx2_external "vextracti128 xmm0, ymm0, 0"
4455         check_x86asm  xop_external "vpmacsdd xmm0, xmm1, xmm2, xmm3"
4456         check_x86asm fma3_external "vfmadd132ps ymm0, ymm1, ymm2"
4457         check_x86asm fma4_external "vfmaddps ymm0, ymm1, ymm2, ymm3"
4458         check_x86asm cpunop        "CPU amdnop"
4459     fi
4460
4461     case "$cpu" in
4462         athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
4463             disable fast_clz
4464         ;;
4465     esac
4466
4467 fi
4468
4469 check_cc intrinsics_neon arm_neon.h "int16x8_t test = vdupq_n_s16(0)"
4470
4471 check_ldflags -Wl,--as-needed
4472
4473 if ! disabled network; then
4474     check_func getaddrinfo $network_extralibs
4475     check_func inet_aton $network_extralibs
4476
4477     check_type netdb.h "struct addrinfo"
4478     check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
4479     check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
4480     check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
4481     check_type poll.h "struct pollfd"
4482     check_type netinet/sctp.h "struct sctp_event_subscribe"
4483     check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
4484     check_type netinet/in.h "struct sockaddr_in6"
4485     check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
4486     check_type "sys/types.h sys/socket.h" socklen_t
4487
4488     # Prefer arpa/inet.h over winsock2
4489     if check_headers arpa/inet.h ; then
4490         check_func closesocket
4491     elif check_headers winsock2.h ; then
4492         check_func_headers winsock2.h closesocket -lws2 &&
4493             network_extralibs="-lws2" ||
4494         { check_func_headers winsock2.h closesocket -lws2_32 &&
4495             network_extralibs="-lws2_32"; } || disable winsock2_h network
4496         check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
4497
4498         check_type ws2tcpip.h socklen_t
4499         check_type ws2tcpip.h "struct addrinfo"
4500         check_type ws2tcpip.h "struct group_source_req"
4501         check_type ws2tcpip.h "struct ip_mreq_source"
4502         check_type ws2tcpip.h "struct ipv6_mreq"
4503         check_type winsock2.h "struct pollfd"
4504         check_struct winsock2.h "struct sockaddr" sa_len
4505         check_type ws2tcpip.h "struct sockaddr_in6"
4506         check_type ws2tcpip.h "struct sockaddr_storage"
4507     else
4508         disable network
4509     fi
4510 fi
4511
4512 check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
4513 check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
4514 check_builtin MemoryBarrier windows.h "MemoryBarrier()"
4515 check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
4516
4517 case "$custom_allocator" in
4518     jemalloc)
4519         # jemalloc by default does not use a prefix
4520         require libjemalloc jemalloc/jemalloc.h malloc -ljemalloc
4521     ;;
4522     tcmalloc)
4523         require_pkg_config libtcmalloc libtcmalloc gperftools/tcmalloc.h tc_malloc
4524         malloc_prefix=tc_
4525     ;;
4526 esac
4527
4528 check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
4529 check_func  ${malloc_prefix}memalign            && enable memalign
4530 check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
4531
4532 test_cpp_condition unistd.h "defined(_POSIX_MONOTONIC_CLOCK)" &&
4533     { check_lib clock_gettime time.h clock_gettime ||
4534       check_lib clock_gettime time.h clock_gettime -lrt; }
4535
4536 check_func  fcntl
4537 check_func  gethrtime
4538 check_func  getopt
4539 check_func  getrusage
4540 check_func  gettimeofday
4541 check_func  gmtime_r
4542 check_func  isatty
4543 check_func  localtime_r
4544 check_func  mkstemp
4545 check_func  mmap
4546 check_func  mprotect
4547 # Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
4548 check_func_headers time.h nanosleep || check_lib nanosleep time.h nanosleep -lrt
4549 check_func  sched_getaffinity
4550 check_func  setrlimit
4551 check_func  strerror_r
4552 check_func  sysconf
4553 check_func  sysctl
4554 check_func  usleep
4555
4556 check_func_headers io.h setmode
4557 check_func_headers mach/mach_time.h mach_absolute_time
4558 check_func_headers stdlib.h getenv
4559
4560 check_func_headers windows.h GetProcessAffinityMask
4561 check_func_headers windows.h GetProcessTimes
4562 check_func_headers windows.h GetSystemTimeAsFileTime
4563 check_func_headers windows.h LoadLibrary
4564 check_func_headers windows.h MapViewOfFile
4565 check_func_headers windows.h SetConsoleTextAttribute
4566 check_func_headers windows.h Sleep
4567 check_func_headers windows.h VirtualAlloc
4568
4569 check_headers direct.h
4570 check_headers dxgidebug.h
4571 check_headers dxva.h
4572 check_headers dxva2api.h
4573 check_headers io.h
4574 check_headers malloc.h
4575 check_headers poll.h
4576 check_headers sys/param.h
4577 check_headers sys/resource.h
4578 check_headers sys/select.h
4579 check_headers sys/time.h
4580 check_headers sys/un.h
4581 check_headers unistd.h
4582 check_headers valgrind/valgrind.h
4583 check_headers VideoDecodeAcceleration/VDADecoder.h
4584 check_headers windows.h
4585
4586 # it seems there are versions of clang in some distros that try to use the
4587 # gcc headers, which explodes for stdatomic
4588 # so we also check that atomics actually work here
4589 check_builtin stdatomic stdatomic.h "atomic_int foo; atomic_store(&foo, 0)"
4590
4591 check_lib bcrypt   "windows.h bcrypt.h"   BCryptGenRandom      -lbcrypt &&
4592     check_cpp_condition bcrypt bcrypt.h "defined BCRYPT_RNG_ALGORITHM"
4593 check_lib ole32    "windows.h"            CoTaskMemFree        -lole32
4594 check_lib shell32  "windows.h shellapi.h" CommandLineToArgvW   -lshell32
4595 check_lib psapi    "windows.h psapi.h"    GetProcessMemoryInfo -lpsapi
4596
4597 check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
4598
4599 check_type "cuviddec.h" "CUVIDH264PICPARAMS"
4600 check_type "cuviddec.h" "CUVIDHEVCPICPARAMS"
4601 check_struct "cuviddec.h" "CUVIDDECODECREATEINFO" bitDepthMinus8
4602
4603 check_type "windows.h dxva.h" "DXVA_PicParams_HEVC" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0
4604 check_type "windows.h d3d11.h" "ID3D11VideoDecoder"
4605 check_type "d3d9.h dxva2api.h" DXVA2_ConfigPictureDecode -D_WIN32_WINNT=0x0602
4606
4607 check_type "va/va.h va/va_dec_hevc.h" "VAPictureParameterBufferHEVC"
4608 check_type "va/va.h va/va_dec_vp8.h" "VAPictureParameterBufferVP8"
4609 check_type "va/va.h va/va_vpp.h" "VAProcPipelineParameterBuffer"
4610 check_type "va/va.h va/va_enc_h264.h" "VAEncPictureParameterBufferH264"
4611 check_type "va/va.h va/va_enc_hevc.h" "VAEncPictureParameterBufferHEVC"
4612 check_type "va/va.h va/va_enc_jpeg.h" "VAEncPictureParameterBufferJPEG"
4613 check_type "va/va.h va/va_enc_mpeg2.h" "VAEncPictureParameterBufferMPEG2"
4614 check_type "va/va.h va/va_enc_vp8.h"  "VAEncPictureParameterBufferVP8"
4615 check_type "va/va.h va/va_enc_vp9.h"  "VAEncPictureParameterBufferVP9"
4616
4617 check_type "vdpau/vdpau.h" "VdpPictureInfoHEVC"
4618
4619 if ! disabled w32threads && ! enabled pthreads; then
4620     check_lib w32threads "windows.h process.h" _beginthreadex &&
4621         check_type "windows.h" CONDITION_VARIABLE
4622 fi
4623
4624 # check for some common methods of building with pthread support
4625 # do this before the optional library checks as some of them require pthreads
4626 if ! disabled pthreads && ! enabled w32threads; then
4627     if check_lib pthreads pthread.h pthread_join -pthread; then
4628         add_cflags -pthread
4629     elif check_lib pthreads pthread.h pthread_join -pthreads; then
4630         add_cflags -pthreads
4631     elif check_lib pthreads pthread.h pthread_join -lpthreadGC2; then
4632         :
4633     elif check_lib pthreads pthread.h pthread_join -lpthread; then
4634         :
4635     elif check_func pthread_join; then
4636         enable pthreads
4637     fi
4638     enabled pthreads &&
4639         check_builtin sem_timedwait semaphore.h "sem_t *s; sem_init(s,0,0); sem_timedwait(s,0); sem_destroy(s)" $pthreads_extralibs
4640 fi
4641
4642 disabled  zlib || check_lib  zlib  zlib.h      zlibVersion -lz
4643 disabled bzlib || check_lib bzlib bzlib.h BZ2_bzlibVersion -lbz2
4644
4645 # On some systems dynamic loading requires no extra linker flags
4646 check_lib libdl dlfcn.h dlopen || check_lib libdl dlfcn.h dlopen -ldl
4647
4648 check_lib libm math.h sin -lm
4649
4650 atan2f_args=2
4651 ldexpf_args=2
4652 powf_args=2
4653
4654 for func in $MATH_FUNCS; do
4655     eval check_mathfunc $func \${${func}_args:-1} $libm_extralibs
4656 done
4657
4658 # these are off by default, so fail if requested and not available
4659 enabled amf               && require_cpp_condition amf AMF/core/Version.h "(AMF_VERSION_MAJOR << 48 | AMF_VERSION_MINOR << 32 | AMF_VERSION_RELEASE << 16 | AMF_VERSION_BUILD_NUM) >= 0x0001000400040001"
4660 enabled avisynth          && require_headers avisynth/avisynth_c.h
4661 enabled avxsynth          && require_headers avxsynth/avxsynth_c.h
4662 enabled cuda              && require cuda cuda.h cuInit -lcuda
4663 enabled cuvid             && require cuvid cuviddec.h cuvidCreateDecoder -lnvcuvid
4664 enabled frei0r            && require_headers frei0r.h
4665 enabled gnutls            && require_pkg_config gnutls gnutls gnutls/gnutls.h gnutls_global_init &&
4666                              check_lib gmp gmp.h mpz_export -lgmp
4667 enabled libaom            && require_pkg_config libaom "aom >= 0.1.0" aom/aom_codec.h aom_codec_version
4668 enabled libbs2b           && require_pkg_config libbs2b libbs2b bs2b.h bs2b_open
4669 enabled libdc1394         && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
4670 enabled libdcadec         && require libdcadec libdcadec/dca_context.h dcadec_context_create -ldcadec
4671 enabled libfaac           && require libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
4672 enabled libfdk_aac        && require_pkg_config libfdk_aac fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen
4673 enabled libfontconfig     && require_pkg_config libfontconfig fontconfig "fontconfig/fontconfig.h" FcInit
4674 enabled libfreetype       && require_pkg_config libfreetype freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
4675 enabled libgsm            && require libgsm gsm.h gsm_create -lgsm
4676 enabled libhdcd           && require_pkg_config libhdcd libhdcd "hdcd/hdcd_simple.h" hdcd_new
4677 enabled libilbc           && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
4678 enabled libkvazaar        && require_pkg_config libkvazaar "kvazaar >= 0.8.1" kvazaar.h kvz_api_get
4679 enabled libmfx            && require_pkg_config libmfx libmfx "mfx/mfxvideo.h" MFXInit
4680 enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
4681 enabled libnpp            && require libnpp npp.h nppGetLibVersion -lnppi -lnppc
4682 enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
4683 enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
4684 enabled libopencv         && require_pkg_config libopencv opencv opencv/cv.h cvCreateImageHeader
4685 enabled libopenh264       && require_pkg_config libopenh264 openh264 wels/codec_api.h WelsGetCodecVersion
4686 enabled libopenjpeg       && { check_lib libopenjpeg openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
4687                                require_pkg_config libopenjpeg libopenjpeg1 openjpeg.h opj_version -DOPJ_STATIC; }
4688 enabled libopus           && require_pkg_config libopus opus opus_multistream.h opus_multistream_decoder_create
4689 enabled libpulse          && require_pkg_config libpulse libpulse-simple pulse/simple.h pa_simple_new
4690 enabled librtmp           && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket
4691 enabled libschroedinger   && require_pkg_config libschroedinger schroedinger-1.0 schroedinger/schro.h schro_init
4692 enabled libsnappy         && require libsnappy snappy-c.h snappy_compress -lsnappy
4693 enabled libspeex          && require_pkg_config libspeex speex speex/speex.h speex_decoder_init
4694 enabled libsrt            && require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket
4695 enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
4696 enabled libtwolame        && require libtwolame twolame.h twolame_init -ltwolame
4697 enabled libvo_aacenc      && require libvo_aacenc vo-aacenc/voAAC.h voGetAACEncAPI -lvo-aacenc
4698 enabled libvo_amrwbenc    && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
4699 enabled libvorbis         && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg
4700 enabled libvpx            && require_pkg_config libvpx "vpx >= 1.3.0" vpx/vpx_codec.h vpx_codec_version &&
4701                              { enabled libvpx_vp8_decoder &&
4702                                    check_pkg_config libvpx_vp8_decoder vpx "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp8_dx
4703                                enabled libvpx_vp8_encoder &&
4704                                    check_pkg_config libvpx_vp8_encoder vpx "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp8_cx
4705                                enabled libvpx_vp9_decoder &&
4706                                    check_pkg_config libvpx_vp9_decoder vpx "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp9_dx
4707                                enabled libvpx_vp9_encoder &&
4708                                    check_pkg_config libvpx_vp9_encoder vpx "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp9_cx
4709                                disabled_all libvpx_vp8_decoder libvpx_vp9_decoder libvpx_vp8_encoder libvpx_vp9_encoder &&
4710                                    die "libvpx enabled but no supported decoders/encoders found"
4711                              }
4712 enabled libwavpack        && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput  -lwavpack
4713 enabled libwebp           && require_pkg_config libwebp libwebp webp/encode.h WebPGetEncoderVersion
4714 enabled libx264           && require_pkg_config libx264 x264 "stdint.h x264.h" x264_encoder_encode &&
4715                              require_cpp_condition libx264 x264.h "X264_BUILD >= 118" &&
4716                              check_cpp_condition libx262 x264.h "X264_MPEG2"
4717 enabled libx265           && require_pkg_config libx265 x265 x265.h x265_api_get &&
4718                              require_cpp_condition libx265 x265.h "X265_BUILD >= 57"
4719 enabled libxavs           && require libxavs "stdint.h xavs.h" xavs_encoder_encode -lxavs
4720 enabled libxvid           && require libxvid xvid.h xvid_global -lxvidcore
4721 enabled mbedtls           && require mbedtls mbedtls/ssl.h mbedtls_ssl_init -lmbedtls -lmbedcrypto -lmbedx509
4722 enabled mmal              && { check_lib mmal interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host ||
4723                                { ! enabled cross_compile &&
4724                                  add_cflags -isystem/opt/vc/include/ -isystem/opt/vc/include/interface/vmcs_host/linux -isystem/opt/vc/include/interface/vcos/pthreads -fgnu89-inline &&
4725                                  add_ldflags -L/opt/vc/lib/ &&
4726                                  check_lib mmal interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host; } ||
4727                                die "ERROR: mmal not found" &&
4728                                check_func_headers interface/mmal/mmal.h "MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS"; }
4729 enabled nvenc             && require_cpp_condition nvenc nvEncodeAPI.h "NVENCAPI_MAJOR_VERSION >= 6"
4730 enabled omx               && require_headers OMX_Core.h
4731 enabled omx_rpi           && { check_headers OMX_Core.h ||
4732                                { ! enabled cross_compile && add_cflags -isystem/opt/vc/include/IL && check_headers OMX_Core.h ; } ||
4733                                die "ERROR: OpenMAX IL headers not found"; } && enable omx
4734 enabled openssl           && { { check_pkg_config openssl openssl openssl/ssl.h OPENSSL_init_ssl ||
4735                                  check_pkg_config openssl openssl openssl/ssl.h SSL_library_init; } ||
4736                                check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto ||
4737                                check_lib openssl openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
4738                                check_lib openssl openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
4739                                die "ERROR: openssl not found"; }
4740
4741 # SDL adds some CFLAGS that should not be part of the general CFLAGS.
4742 enabled avplay &&
4743     test_pkg_config sdl "sdl >= 1.2.1 sdl < 1.3.0" SDL_events.h SDL_PollEvent
4744
4745 check_headers linux/fb.h
4746 check_headers linux/videodev2.h
4747 check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete
4748
4749 check_headers AVFoundation/AVFoundation.h
4750
4751 check_headers sys/videoio.h
4752
4753 check_lib user32 "windows.h winuser.h" GetShellWindow -luser32
4754 check_lib vfw32 "windows.h vfw.h" capCreateCaptureWindow -lvfw32
4755 # check that WM_CAP_DRIVER_CONNECT is defined to the proper value
4756 # w32api 3.12 had it defined wrong
4757 check_cpp_condition vfwcap_defines vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER"
4758
4759 # check for ioctl_meteor.h, ioctl_bt848.h and alternatives
4760 check_headers "dev/bktr/ioctl_meteor.h dev/bktr/ioctl_bt848.h"                   ||
4761     check_headers "machine/ioctl_meteor.h machine/ioctl_bt848.h"                 ||
4762     check_headers "dev/video/meteor/ioctl_meteor.h dev/video/bktr/ioctl_bt848.h" ||
4763     check_headers "dev/ic/bt8xx.h"
4764
4765 check_headers sys/soundcard.h
4766
4767 enabled alsa_indev &&
4768     check_lib alsa alsa/asoundlib.h snd_pcm_htimestamp -lasound
4769
4770 enabled libjack &&
4771     require_pkg_config libjack jack jack/jack.h jack_port_get_latency_range
4772
4773 enabled sndio_indev && check_lib sndio sndio.h sio_open -lsndio
4774
4775 if enabled libcdio; then
4776     check_lib libcdio "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
4777     check_lib libcdio "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
4778     die "ERROR: No usable libcdio/cdparanoia found"
4779 fi
4780
4781 if enabled libxcb; then
4782     require_pkg_config libxcb xcb xcb/xcb.h xcb_connect
4783     require_pkg_config libxcb_shape xcb-shape xcb/shape.h xcb_shape_rectangles
4784     disabled libxcb_shm ||
4785         check_pkg_config libxcb_shm xcb-shm xcb/shm.h xcb_shm_attach
4786     disabled libxcb_xfixes ||
4787         check_pkg_config libxcb_xfixes xcb-xfixes xcb/xfixes.h xcb_xfixes_get_cursor_image
4788 fi
4789
4790 # d3d11va requires linking directly to dxgi and d3d11 if not building for
4791 # the desktop api partition
4792 test_cpp <<EOF && enable uwp && d3d11va_extralibs="-ldxgi -ld3d11"
4793 #ifdef WINAPI_FAMILY
4794 #include <winapifamily.h>
4795 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
4796 #error desktop, not uwp
4797 #else
4798 // WINAPI_FAMILY_APP, WINAPI_FAMILY_PHONE_APP => UWP
4799 #endif
4800 #else
4801 #error no family set
4802 #endif
4803 EOF
4804
4805 enabled vaapi && require vaapi va/va.h vaInitialize -lva
4806
4807 if enabled vaapi; then
4808      require_cc vaapi "va/va.h" "vaCreateSurfaces(0, 0, 0, 0, 0, 0, 0, 0)"
4809      check_lib vaapi_drm "va/va.h va/va_drm.h" vaGetDisplayDRM -lva -lva-drm
4810      check_lib vaapi_x11 "va/va.h va/va_x11.h" vaGetDisplay -lva -lva-x11 -lX11
4811 fi
4812
4813 enabled vaapi &&
4814     test_cpp_condition "va/va.h" "VA_CHECK_VERSION(1, 0, 0)" &&
4815     enable vaapi_1
4816
4817 enabled vdpau &&
4818     check_cpp_condition vdpau vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP"
4819
4820 enabled vdpau &&
4821     check_lib vdpau_x11 "vdpau/vdpau.h vdpau/vdpau_x11.h" vdp_device_create_x11 -lvdpau -lX11
4822
4823 enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
4824
4825 # add some useful compiler flags if supported
4826 check_cflags -Wdeclaration-after-statement
4827 check_cflags -Wall
4828 check_cflags -Wdisabled-optimization
4829 check_cflags -Wpointer-arith
4830 check_cflags -Wredundant-decls
4831 check_cflags -Wwrite-strings
4832 check_cflags -Wtype-limits
4833 check_cflags -Wundef
4834 check_cflags -Wmissing-prototypes
4835 check_cflags -Wstrict-prototypes
4836
4837 if enabled extra_warnings; then
4838     check_cflags -Wcast-qual
4839     check_cflags -Wextra
4840     check_cflags -Wpedantic
4841 fi
4842
4843 check_disable_warning(){
4844     warning_flag=-W${1#-Wno-}
4845     test_cflags $warning_flag && add_cflags $1
4846 }
4847
4848 check_disable_warning -Wno-parentheses
4849 check_disable_warning -Wno-switch
4850 check_disable_warning -Wno-format-zero-length
4851 check_disable_warning -Wno-pointer-sign
4852
4853 check_disable_warning_headers(){
4854     warning_flag=-W${1#-Wno-}
4855     test_cflags $warning_flag && add_cflags_headers $1
4856 }
4857
4858 check_disable_warning_headers -Wno-deprecated-declarations
4859 check_disable_warning_headers -Wno-unused-variable
4860
4861 check_objcflags -fobjc-arc && enable objc_arc
4862
4863 test_cc <<EOF && enable blocks_extension
4864 void (^block)(void);
4865 EOF
4866
4867 # add some linker flags
4868 check_ldflags -Wl,--warn-common
4869 check_ldflags -Wl,-rpath-link=libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
4870 enabled rpath && add_ldexeflags -Wl,-rpath,$libdir && add_ldsoflags -Wl,-rpath,$libdir
4871 test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
4872
4873 # add some strip flags
4874 # -wN '..@*' is more selective than -x, but not available everywhere.
4875 check_stripflags -wN \'..@*\' || check_stripflags -x || strip='true'
4876
4877 enabled neon_clobber_test &&
4878     check_ldflags -Wl,--wrap,avcodec_open2              \
4879                   -Wl,--wrap,avcodec_decode_audio4      \
4880                   -Wl,--wrap,avcodec_decode_video2      \
4881                   -Wl,--wrap,avcodec_decode_subtitle2   \
4882                   -Wl,--wrap,avcodec_encode_audio2      \
4883                   -Wl,--wrap,avcodec_encode_video2      \
4884                   -Wl,--wrap,avcodec_encode_subtitle    \
4885                   -Wl,--wrap,avcodec_send_packet        \
4886                   -Wl,--wrap,avcodec_receive_packet     \
4887                   -Wl,--wrap,avcodec_send_frame         \
4888                   -Wl,--wrap,avcodec_receive_frame      \
4889                   -Wl,--wrap,avresample_convert ||
4890     disable neon_clobber_test
4891
4892 enabled xmm_clobber_test &&
4893     check_ldflags -Wl,--wrap,avcodec_open2              \
4894                   -Wl,--wrap,avcodec_decode_audio4      \
4895                   -Wl,--wrap,avcodec_decode_video2      \
4896                   -Wl,--wrap,avcodec_decode_subtitle2   \
4897                   -Wl,--wrap,avcodec_encode_audio2      \
4898                   -Wl,--wrap,avcodec_encode_video2      \
4899                   -Wl,--wrap,avcodec_encode_subtitle    \
4900                   -Wl,--wrap,avcodec_send_packet        \
4901                   -Wl,--wrap,avcodec_receive_packet     \
4902                   -Wl,--wrap,avcodec_send_frame         \
4903                   -Wl,--wrap,avcodec_receive_frame      \
4904                   -Wl,--wrap,avresample_convert         \
4905                   -Wl,--wrap,sws_scale ||
4906     disable xmm_clobber_test
4907
4908 check_ld proper_dce <<EOF
4909 extern const int array[512];
4910 static inline int func(void) { return array[0]; }
4911 int main(void) { return 0; }
4912 EOF
4913
4914 if enabled proper_dce; then
4915     echo "X { local: *; };" > $TMPV
4916     if test_ldflags -Wl,${version_script},$TMPV; then
4917         append SHFLAGS '-Wl,${version_script},\$(SUBDIR)lib\$(NAME).ver'
4918         quotes='""'
4919         test_cc <<EOF && enable symver_asm_label
4920 void ff_foo(void) __asm__ ("av_foo@VERSION");
4921 void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
4922 EOF
4923         test_cc <<EOF && enable symver_gnu_asm
4924 __asm__(".symver ff_foo,av_foo@VERSION");
4925 void ff_foo(void) {}
4926 EOF
4927     fi
4928 fi
4929
4930 if [ -z "$optflags" ]; then
4931     if enabled small; then
4932         optflags=$cflags_size
4933     elif enabled optimizations; then
4934         optflags=$cflags_speed
4935     else
4936         optflags=$cflags_noopt
4937     fi
4938 fi
4939
4940 check_optflags(){
4941     check_cflags "$@"
4942     enabled lto && check_ldflags "$@"
4943 }
4944
4945 check_optflags $optflags
4946 check_optflags -fno-math-errno
4947 check_optflags -fno-signed-zeros
4948
4949 if enabled lto; then
4950     test "$cc_type" != "$ld_type" && die "LTO requires same compiler and linker"
4951     check_cflags  -flto
4952     check_ldflags -flto $cpuflags
4953 fi
4954
4955 if enabled icc; then
4956     # Just warnings, no remarks
4957     check_cflags -w1
4958     # -wd: Disable following warnings
4959     # 144, 167, 556: -Wno-pointer-sign
4960     # 1292: attribute "foo" ignored
4961     # 1419: external declaration in primary source file
4962     # 10006: ignoring unknown option -fno-signed-zeros
4963     # 10148: ignoring unknown option -Wno-parentheses
4964     # 10156: ignoring option '-W'; no argument required
4965     check_cflags -wd144,167,556,1292,1419,10006,10148,10156
4966     # 11030: Warning unknown option --as-needed
4967     # 10156: ignoring option '-export'; no argument required
4968     check_ldflags -wd10156,11030
4969     # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
4970     enable ebp_available
4971     if enabled x86_32; then
4972         icc_version=$($cc -dumpversion)
4973         test ${icc_version%%.*} -ge 11 &&
4974             check_cflags -falign-stack=maintain-16-byte ||
4975             disable aligned_stack
4976     fi
4977 elif enabled gcc; then
4978     check_optflags -fno-tree-vectorize
4979     check_cflags -Werror=implicit-function-declaration
4980     check_cflags -Werror=missing-prototypes
4981     check_cflags -Werror=return-type
4982     check_cflags -Werror=declaration-after-statement
4983     check_cflags -Werror=vla
4984     check_cflags -Werror=format-security
4985     check_cflags -fdiagnostics-color=auto
4986     enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
4987     if enabled x86_32; then
4988         case $target_os in
4989         *bsd*)
4990             # BSDs don't guarantee a 16 byte aligned stack, but we can
4991             # request GCC to try to maintain 16 byte alignment throughout
4992             # function calls. Library entry points that might call assembly
4993             # functions align the stack. (The parameter means 2^4 bytes.)
4994             check_cflags -mpreferred-stack-boundary=4
4995             ;;
4996         esac
4997     fi
4998 elif enabled llvm_gcc; then
4999     check_cflags -mllvm -stack-alignment=16
5000 elif enabled clang; then
5001     if enabled x86_32; then
5002         # Clang doesn't support maintaining alignment without assuming the
5003         # same alignment in every function. If 16 byte alignment would be
5004         # enabled, one would also have to either add attribute_align_arg on
5005         # every single entry point into the libraries or enable -mstackrealign
5006         # (doing stack realignment in every single function).
5007         case $target_os in
5008         mingw32|win32|*bsd*)
5009             disable aligned_stack
5010             ;;
5011         *)
5012             check_cflags -mllvm -stack-alignment=16
5013             ;;
5014         esac
5015     else
5016         check_cflags -mllvm -stack-alignment=16
5017     fi
5018     check_cflags -Qunused-arguments
5019     check_cflags -Werror=implicit-function-declaration
5020     check_cflags -Werror=missing-prototypes
5021     check_cflags -Werror=return-type
5022 elif enabled cparser; then
5023     add_cflags -Wno-missing-variable-declarations
5024     add_cflags -Wno-empty-statement
5025 elif enabled armcc; then
5026     add_cflags -W${armcc_opt},--diag_suppress=4343 # hardfp compat
5027     add_cflags -W${armcc_opt},--diag_suppress=3036 # using . as system include dir
5028     # 2523: use of inline assembly is deprecated
5029     add_cflags -W${armcc_opt},--diag_suppress=2523
5030     add_cflags -W${armcc_opt},--diag_suppress=1207
5031     add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
5032     add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
5033     add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
5034     add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
5035 elif enabled pathscale; then
5036     add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
5037     disable inline_asm
5038 elif enabled_any msvc icl; then
5039     enabled x86_32 && disable aligned_stack
5040     enabled_all x86_32 debug && add_cflags -Oy-
5041     enabled debug && add_ldflags -debug
5042     enable pragma_deprecated
5043     if enabled icl; then
5044         # -Qansi-alias is basically -fstrict-aliasing, but does not work
5045         # (correctly) on icl 13.x.
5046         test_cpp_condition "windows.h" "__ICL < 1300 || __ICL >= 1400" &&
5047             add_cflags -Qansi-alias
5048         # icl will pass the inline asm tests but inline asm is currently
5049         # not supported (build will fail)
5050         disable inline_asm
5051     fi
5052     # msvcrt10 x64 incorrectly enables log2, only msvcrt12 (MSVC 2013) onwards actually has log2.
5053     check_cpp_condition log2 crtversion.h "_VC_CRT_MAJOR_VERSION >= 12"
5054     # The CRT headers contain __declspec(restrict) in a few places, but if redefining
5055     # restrict, this might break. MSVC 2010 and 2012 fail with __declspec(__restrict)
5056     # (as it ends up if the restrict redefine is done before including stdlib.h), while
5057     # MSVC 2013 and newer can handle it fine.
5058     # If this declspec fails, force including stdlib.h before the restrict redefinition
5059     # happens in config.h.
5060     if [ $restrict_keyword != restrict ]; then
5061         test_cc <<EOF || add_cflags -FIstdlib.h
5062 __declspec($restrict_keyword) void *foo(int);
5063 EOF
5064     fi
5065 fi
5066
5067 for pfx in "" host_; do
5068     varname=${pfx%_}cc_type
5069     eval "type=\$$varname"
5070     if [ "$type" = "msvc" ]; then
5071         test_${pfx}cc <<EOF || add_${pfx}cflags -Dinline=__inline
5072 static inline int foo(int a) { return a; }
5073 EOF
5074     fi
5075 done
5076
5077 case $as_type in
5078     clang)
5079         add_asflags -Qunused-arguments
5080     ;;
5081 esac
5082
5083 case $ld_type in
5084     clang)
5085         check_ldflags -Qunused-arguments
5086     ;;
5087 esac
5088
5089 enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
5090
5091 check_cmd pod2man --help
5092 check_cmd texi2html -version
5093
5094 check_deps $CONFIG_LIST       \
5095            $CONFIG_EXTRA      \
5096            $HAVE_LIST         \
5097            $ALL_COMPONENTS    \
5098
5099 flatten_extralibs(){
5100     unset nested_entries
5101     list_name=$1
5102     eval list=\$${1}
5103     for entry in $list; do
5104         entry_copy=$entry
5105         resolve entry_copy
5106         append nested_entries $(filter '*_extralibs' $entry_copy)
5107         flat_entries=$(filter_out '*_extralibs' $entry_copy)
5108         eval $entry="\$flat_entries"
5109     done
5110     append $list_name "$nested_entries"
5111
5112     resolve nested_entries
5113     if test -n "$(filter '*_extralibs' $nested_entries)"; then
5114         flatten_extralibs $list_name
5115     fi
5116 }
5117
5118 for linkunit in $LIBRARY_LIST; do
5119     unset current_extralibs
5120     eval components=\$$(toupper ${linkunit})_COMPONENTS_LIST
5121     for comp in ${components}; do
5122         enabled $comp || continue
5123         comp_extralibs="${comp}_extralibs"
5124         append current_extralibs $comp_extralibs
5125     done
5126     eval prepend ${linkunit}_extralibs $current_extralibs
5127 done
5128
5129 for linkunit in $LIBRARY_LIST $PROGRAM_LIST $EXTRALIBS_LIST; do
5130     flatten_extralibs ${linkunit}_extralibs
5131     unique  ${linkunit}_extralibs
5132     resolve ${linkunit}_extralibs
5133     eval ${linkunit}_extralibs=\$\(\$ldflags_filter \$${linkunit}_extralibs\)
5134 done
5135
5136 map 'enabled $v && intrinsics=${v#intrinsics_}' $INTRINSICS_LIST
5137
5138 for thread in $THREADS_LIST; do
5139     if enabled $thread; then
5140         test -n "$thread_type" &&
5141             die "ERROR: Only one thread type must be selected." ||
5142             thread_type="$thread"
5143     fi
5144 done
5145
5146 if disabled stdatomic; then
5147     if enabled atomics_gcc; then
5148         add_cppflags '-I\$(SRC_PATH)/compat/atomics/gcc'
5149     elif enabled atomics_win32; then
5150         add_cppflags '-I\$(SRC_PATH)/compat/atomics/win32'
5151     elif enabled atomics_suncc; then
5152         add_cppflags '-I\$(SRC_PATH)/compat/atomics/suncc'
5153     elif enabled pthreads; then
5154         add_compat atomics/pthread/stdatomic.o
5155         add_cppflags '-I\$(SRC_PATH)/compat/atomics/pthread'
5156     else
5157         enabled threads && die "Threading is enabled, but no atomics are available"
5158         add_cppflags '-I\$(SRC_PATH)/compat/atomics/dummy'
5159     fi
5160 fi
5161
5162 enabled zlib && add_cppflags -DZLIB_CONST
5163
5164 # conditional library dependencies, in linking order
5165 enabled movie_filter    && prepend avfilter_deps "avformat avcodec"
5166 enabled_any asyncts_filter resample_filter &&
5167                            prepend avfilter_deps "avresample"
5168 enabled scale_filter    && prepend avfilter_deps "swscale"
5169
5170 enabled opus_decoder    && prepend avcodec_deps "avresample"
5171
5172 expand_deps(){
5173     lib_deps=${1}_deps
5174     eval "deps=\$$lib_deps"
5175     append $lib_deps $(map 'eval echo \$${v}_deps' $deps)
5176     unique $lib_deps
5177 }
5178
5179 map 'expand_deps $v' $LIBRARY_LIST
5180
5181 if test "$quiet" != "yes"; then
5182
5183 echo "install prefix            $prefix"
5184 echo "source path               $source_path"
5185 echo "C compiler                $cc"
5186 echo "C library                 $libc_type"
5187 if test "$host_cc" != "$cc"; then
5188     echo "host C compiler           $host_cc"
5189     echo "host C library            $host_libc_type"
5190 fi
5191 echo "ARCH                      $arch ($cpu)"
5192 if test "$extra_version" != ""; then
5193     echo "version string suffix     $extra_version"
5194 fi
5195 echo "big-endian                ${bigendian-no}"
5196 echo "runtime cpu detection     ${runtime_cpudetect-no}"
5197 if enabled x86; then
5198     echo "standalone assembly       ${x86asm-no}"
5199     echo "x86 assembler             ${x86asmexe}"
5200     echo "MMX enabled               ${mmx-no}"
5201     echo "MMXEXT enabled            ${mmxext-no}"
5202     echo "3DNow! enabled            ${amd3dnow-no}"
5203     echo "3DNow! extended enabled   ${amd3dnowext-no}"
5204     echo "SSE enabled               ${sse-no}"
5205     echo "SSSE3 enabled             ${ssse3-no}"
5206     echo "AVX enabled               ${avx-no}"
5207     echo "XOP enabled               ${xop-no}"
5208     echo "FMA3 enabled              ${fma3-no}"
5209     echo "FMA4 enabled              ${fma4-no}"
5210     echo "i686 features enabled     ${i686-no}"
5211     echo "CMOV is fast              ${fast_cmov-no}"
5212     echo "EBX available             ${ebx_available-no}"
5213     echo "EBP available             ${ebp_available-no}"
5214 fi
5215 if enabled aarch64; then
5216     echo "NEON enabled              ${neon-no}"
5217     echo "VFP enabled               ${vfp-no}"
5218 fi
5219 if enabled arm; then
5220     echo "ARMv5TE enabled           ${armv5te-no}"
5221     echo "ARMv6 enabled             ${armv6-no}"
5222     echo "ARMv6T2 enabled           ${armv6t2-no}"
5223     echo "VFP enabled               ${vfp-no}"
5224     echo "NEON enabled              ${neon-no}"
5225 fi
5226 if enabled ppc; then
5227     echo "AltiVec enabled           ${altivec-no}"
5228     echo "VSX enabled               ${vsx-no}"
5229     echo "POWER8 enabled            ${power8-no}"
5230     echo "PPC 4xx optimizations     ${ppc4xx-no}"
5231     echo "dcbzl available           ${dcbzl-no}"
5232 fi
5233 echo "debug symbols             ${debug-no}"
5234 echo "optimize for size         ${small-no}"
5235 echo "optimizations             ${optimizations-no}"
5236 echo "static                    ${static-no}"
5237 echo "shared                    ${shared-no}"
5238 echo "network support           ${network-no}"
5239 echo "threading support         ${thread_type-no}"
5240 echo "safe bitstream reader     ${safe_bitstream_reader-no}"
5241
5242 echo "External libraries:"
5243 print_enabled '' $EXTERNAL_LIBRARY_LIST | print_3_columns
5244 echo
5245 echo "External libraries providing hardware acceleration:"
5246 print_enabled '' $HWACCEL_LIBRARY_LIST | print_3_columns
5247 echo
5248
5249 echo "Libraries:"
5250 print_enabled '' $LIBRARY_LIST | print_3_columns
5251 echo
5252
5253 echo "Programs:"
5254 print_enabled '' $PROGRAM_LIST | print_3_columns
5255 echo
5256
5257 for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev; do
5258     echo "Enabled ${type}s:"
5259     eval list=\$$(toupper $type)_LIST
5260     print_enabled '_*' $list | print_3_columns
5261     echo
5262 done
5263
5264 if test -n "$ignore_tests"; then
5265     ignore_tests=$(echo $ignore_tests | tr ',' ' ')
5266     echo "Ignored FATE tests:"
5267     echo $ignore_tests | print_3_columns
5268     echo
5269 fi
5270
5271 echo "License: $license"
5272
5273 fi # test "$quiet" != "yes"
5274
5275 test -n "$WARNINGS" && printf "\n$WARNINGS"
5276
5277 test -e Makefile || echo "include $source_path/Makefile" > Makefile
5278
5279 esc(){
5280     echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
5281 }
5282
5283 echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $LIBAV_CONFIGURATION)" > avbuild/config.fate
5284
5285 config_files="$TMPH avbuild/config.mak"
5286
5287 cat > avbuild/config.mak <<EOF
5288 # Automatically generated by configure - do not modify!
5289 LIBAV_CONFIGURATION=$LIBAV_CONFIGURATION
5290 prefix=$prefix
5291 LIBDIR=\$(DESTDIR)$libdir
5292 SHLIBDIR=\$(DESTDIR)$shlibdir
5293 INCDIR=\$(DESTDIR)$incdir
5294 BINDIR=\$(DESTDIR)$bindir
5295 DATADIR=\$(DESTDIR)$datadir
5296 DOCDIR=\$(DESTDIR)$docdir
5297 MANDIR=\$(DESTDIR)$mandir
5298 SRC_PATH=$source_path
5299 CC_IDENT=$cc_ident
5300 ARCH=$arch
5301 INTRINSICS=$intrinsics
5302 EXTERN_PREFIX=$extern_prefix
5303 CC=$cc
5304 AS=$as
5305 OBJCC=$objcc
5306 LD=$ld
5307 DEPCC=$dep_cc
5308 DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
5309 DEPAS=$as
5310 DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
5311 X86ASM=$x86asmexe
5312 DEPX86ASM=$x86asmexe
5313 DEPX86ASMFLAGS=\$(X86ASMFLAGS)
5314 AR=$ar
5315 ARFLAGS=$arflags
5316 AR_O=$ar_o
5317 AR_CMD=$ar
5318 NM_CMD=$nm
5319 RANLIB=$ranlib
5320 STRIP=$strip
5321 LN_S=$ln_s
5322 CPPFLAGS=$CPPFLAGS
5323 CFLAGS=$CFLAGS
5324 OBJCFLAGS=$OBJCFLAGS
5325 ASFLAGS=$ASFLAGS
5326 AS_C=$AS_C
5327 AS_O=$AS_O
5328 OBJCC_C=$OBJCC_C
5329 OBJCC_E=$OBJCC_E
5330 OBJCC_O=$OBJCC_O
5331 CC_C=$CC_C
5332 CC_E=$CC_E
5333 CC_O=$CC_O
5334 X86ASM_O=$X86ASM_O
5335 LD_O=$LD_O
5336 LD_LIB=$LD_LIB
5337 LD_PATH=$LD_PATH
5338 DLLTOOL=$dlltool
5339 LDFLAGS=$LDFLAGS
5340 LDEXEFLAGS=$LDEXEFLAGS
5341 LDSOFLAGS=$LDSOFLAGS
5342 SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
5343 STRIPFLAGS=$STRIPFLAGS
5344 X86ASMFLAGS=$X86ASMFLAGS
5345 LIBPREF=$LIBPREF
5346 LIBSUF=$LIBSUF
5347 LIBNAME=$LIBNAME
5348 SLIBPREF=$SLIBPREF
5349 SLIBSUF=$SLIBSUF
5350 EXESUF=$EXESUF
5351 EXTRA_VERSION=$extra_version
5352 CCDEP=$CCDEP
5353 CCDEP_FLAGS=$CCDEP_FLAGS
5354 ASDEP=$ASDEP
5355 ASDEP_FLAGS=$ASDEP_FLAGS
5356 X86ASMDEP=$X86ASMDEP
5357 X86ASMDEP_FLAGS=$X86ASMDEP_FLAGS
5358 CC_DEPFLAGS=$CC_DEPFLAGS
5359 AS_DEPFLAGS=$AS_DEPFLAGS
5360 X86ASM_DEPFLAGS=$X86ASM_DEPFLAGS
5361 HOSTCC=$host_cc
5362 HOSTLD=$host_ld
5363 HOSTCFLAGS=$host_cflags
5364 HOSTCPPFLAGS=$host_cppflags
5365 HOSTEXESUF=$HOSTEXESUF
5366 HOSTLDFLAGS=$host_ldflags
5367 HOSTEXTRALIBS=$host_extralibs
5368 DEPHOSTCC=$host_cc
5369 DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
5370 HOSTCCDEP=$HOSTCCDEP
5371 HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
5372 HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
5373 HOSTCC_C=$HOSTCC_C
5374 HOSTCC_O=$HOSTCC_O
5375 HOSTLD_O=$HOSTLD_O
5376 TARGET_EXEC=$target_exec $target_exec_args
5377 TARGET_PATH=$target_path
5378 TARGET_SAMPLES=${target_samples:-\$(SAMPLES)}
5379 CFLAGS-avplay=$sdl_cflags
5380 CFLAGS_HEADERS=$CFLAGS_HEADERS
5381 LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
5382 EXTRALIBS=$extralibs
5383 COMPAT_OBJS=$compat_objs
5384 INSTALL=install
5385 LIBTARGET=${LIBTARGET}
5386 SLIBNAME=${SLIBNAME}
5387 SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
5388 SLIBNAME_WITH_MAJOR=${SLIBNAME_WITH_MAJOR}
5389 SLIB_CREATE_DEF_CMD=${SLIB_CREATE_DEF_CMD}
5390 SLIB_EXTRA_CMD=${SLIB_EXTRA_CMD}
5391 SLIB_INSTALL_NAME=${SLIB_INSTALL_NAME}
5392 SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS}
5393 SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
5394 SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
5395 VERSION_SCRIPT_POSTPROCESS_CMD=${VERSION_SCRIPT_POSTPROCESS_CMD}
5396 SAMPLES:=${samples:-\$(LIBAV_SAMPLES)}
5397 IGNORE_TESTS=$ignore_tests
5398 EOF
5399
5400 map 'eval echo "${v}_FFLIBS=\$${v}_deps" >> avbuild/config.mak' $LIBRARY_LIST
5401
5402 for entry in $LIBRARY_LIST $PROGRAM_LIST $EXTRALIBS_LIST; do
5403     eval echo "EXTRALIBS-${entry}=\$${entry}_extralibs" >> avbuild/config.mak
5404 done
5405
5406 cat > $TMPH <<EOF
5407 /* Automatically generated by configure - do not modify! */
5408 #ifndef LIBAV_CONFIG_H
5409 #define LIBAV_CONFIG_H
5410 #define LIBAV_CONFIGURATION "$(c_escape $LIBAV_CONFIGURATION)"
5411 #define LIBAV_LICENSE "$(c_escape $license)"
5412 #define AVCONV_DATADIR "$(eval c_escape $datadir)"
5413 #define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
5414 #define EXTERN_PREFIX "${extern_prefix}"
5415 #define EXTERN_ASM ${extern_prefix}
5416 #define SLIBSUF "$SLIBSUF"
5417 EOF
5418
5419 test $restrict_keyword != restrict &&
5420     echo "#define restrict $restrict_keyword" >> $TMPH
5421
5422 test -n "$malloc_prefix" &&
5423     echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH
5424
5425 if enabled x86asm; then
5426     append config_files $TMPASM
5427     cat > $TMPASM <<EOF
5428 ; Automatically generated by configure - do not modify!
5429 EOF
5430 fi
5431
5432 enabled getenv || echo "#define getenv(x) NULL" >> $TMPH
5433
5434 print_config ARCH_   "$config_files" $ARCH_LIST
5435 print_config HAVE_   "$config_files" $HAVE_LIST
5436 print_config CONFIG_ "$config_files" $CONFIG_LIST       \
5437                                      $CONFIG_EXTRA      \
5438                                      $ALL_COMPONENTS    \
5439
5440 echo "#endif /* LIBAV_CONFIG_H */" >> $TMPH
5441
5442 # Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
5443 cp_if_changed $TMPH config.h
5444 touch avbuild/.config
5445
5446 enabled x86asm && cp_if_changed $TMPASM config.asm
5447
5448 cat > $TMPH <<EOF
5449 /* Generated by libav configure */
5450 #ifndef AVUTIL_AVCONFIG_H
5451 #define AVUTIL_AVCONFIG_H
5452 EOF
5453
5454 print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
5455
5456 echo "#endif /* AVUTIL_AVCONFIG_H */" >> $TMPH
5457
5458 cp_if_changed $TMPH libavutil/avconfig.h
5459
5460 # generate the lists of enabled components
5461 print_enabled_components(){
5462     file=$1
5463     struct_name=$2
5464     name=$3
5465     shift 3
5466     echo "static const $struct_name * const $name[] = {" > $TMPH
5467     for c in $*; do
5468         enabled $c && printf "    &ff_%s,\n" $c >> $TMPH
5469     done
5470     echo "    NULL };" >> $TMPH
5471     cp_if_changed $TMPH $file
5472 }
5473
5474 print_enabled_components libavcodec/bsf_list.c AVBitStreamFilter bitstream_filters $BSF_LIST
5475 print_enabled_components libavformat/protocol_list.c URLProtocol url_protocols $PROTOCOL_LIST
5476
5477 # Settings for pkg-config files
5478
5479 cat > $TMPH <<EOF
5480 # Automatically generated by configure - do not modify!
5481 shared=$shared
5482 prefix=$prefix
5483 libdir=$libdir
5484 incdir=$incdir
5485 source_path=${source_path}
5486 LIBPREF=${LIBPREF}
5487 LIBSUF=${LIBSUF}
5488 extralibs_avutil="$avutil_extralibs"
5489 extralibs_avcodec="$avcodec_extralibs"
5490 extralibs_avformat="$avformat_extralibs"
5491 extralibs_avdevice="$avdevice_extralibs"
5492 extralibs_avfilter="$avfilter_extralibs"
5493 extralibs_avresample="$avresample_extralibs"
5494 extralibs_swscale="$swscale_extralibs"
5495 EOF
5496
5497 for lib in $LIBRARY_LIST; do
5498     lib_deps="$(eval echo \$${lib}_deps)"
5499     echo ${lib}_deps=\"$lib_deps\" >> $TMPH
5500 done
5501
5502 cp_if_changed $TMPH avbuild/config.sh