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