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