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