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