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