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