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