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