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