configure: add --enable-rpath
[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     closesocket
1436     CommandLineToArgvW
1437     CoTaskMemFree
1438     CryptGenRandom
1439     dlopen
1440     fcntl
1441     flt_lim
1442     fork
1443     getaddrinfo
1444     gethrtime
1445     getopt
1446     GetProcessAffinityMask
1447     GetProcessMemoryInfo
1448     GetProcessTimes
1449     getrusage
1450     getservbyport
1451     GetSystemTimeAsFileTime
1452     gettimeofday
1453     inet_aton
1454     isatty
1455     jack_port_get_latency_range
1456     localtime_r
1457     mach_absolute_time
1458     MapViewOfFile
1459     memalign
1460     mkstemp
1461     mmap
1462     mprotect
1463     nanosleep
1464     posix_memalign
1465     sched_getaffinity
1466     SetConsoleTextAttribute
1467     setmode
1468     setrlimit
1469     Sleep
1470     strerror_r
1471     strptime
1472     sysconf
1473     sysctl
1474     usleep
1475     VirtualAlloc
1476 "
1477
1478 TOOLCHAIN_FEATURES="
1479     as_dn_directive
1480     as_func
1481     asm_mod_q
1482     attribute_may_alias
1483     attribute_packed
1484     ebp_available
1485     ebx_available
1486     gnu_as
1487     ibm_asm
1488     inline_asm_labels
1489     pragma_deprecated
1490     symver_asm_label
1491     symver_gnu_asm
1492     vfp_args
1493     xform_asm
1494     xmm_clobbers
1495 "
1496
1497 TYPES_LIST="
1498     socklen_t
1499     struct_addrinfo
1500     struct_group_source_req
1501     struct_ip_mreq_source
1502     struct_ipv6_mreq
1503     struct_pollfd
1504     struct_rusage_ru_maxrss
1505     struct_sockaddr_in6
1506     struct_sockaddr_sa_len
1507     struct_sockaddr_storage
1508     struct_v4l2_frmivalenum_discrete
1509 "
1510
1511 HAVE_LIST="
1512     $ARCH_EXT_LIST
1513     $(add_suffix _external $ARCH_EXT_LIST)
1514     $(add_suffix _inline   $ARCH_EXT_LIST)
1515     $ARCH_FEATURES
1516     $ATOMICS_LIST
1517     $BUILTIN_LIST
1518     $HAVE_LIST_CMDLINE
1519     $HAVE_LIST_PUB
1520     $HEADERS_LIST
1521     $INTRINSICS_LIST
1522     $MATH_FUNCS
1523     $SYSTEM_FUNCS
1524     $THREADS_LIST
1525     $TOOLCHAIN_FEATURES
1526     $TYPES_LIST
1527     atomics_native
1528     dos_paths
1529     dxva2_lib
1530     libc_msvcrt
1531     libdc1394_1
1532     libdc1394_2
1533     sdl
1534     threads
1535     vdpau_x11
1536     xlib
1537 "
1538
1539 # options emitted with CONFIG_ prefix but not available on the command line
1540 CONFIG_EXTRA="
1541     aandcttables
1542     ac3dsp
1543     audio_frame_queue
1544     audiodsp
1545     blockdsp
1546     bswapdsp
1547     cabac
1548     dvprofile
1549     fdctdsp
1550     gcrypt
1551     golomb
1552     gplv3
1553     h263dsp
1554     h264chroma
1555     h264dsp
1556     h264pred
1557     h264qpel
1558     hpeldsp
1559     huffman
1560     huffyuvdsp
1561     huffyuvencdsp
1562     idctdsp
1563     iirfilter
1564     intrax8
1565     lgplv3
1566     lpc
1567     me_cmp
1568     mpeg_er
1569     mpegaudio
1570     mpegaudiodsp
1571     mpegvideo
1572     mpegvideoenc
1573     nettle
1574     pixblockdsp
1575     qpeldsp
1576     rangecoder
1577     riffdec
1578     riffenc
1579     rtpdec
1580     rtpenc_chain
1581     sinewin
1582     startcode
1583     tpeldsp
1584     videodsp
1585     vp3dsp
1586 "
1587
1588 CMDLINE_SELECT="
1589     $ARCH_EXT_LIST
1590     $CONFIG_LIST
1591     $HAVE_LIST_CMDLINE
1592     $THREADS_LIST
1593     asm
1594     cross_compile
1595     debug
1596     extra_warnings
1597     logging
1598     lto
1599     optimizations
1600     rpath
1601 "
1602
1603 PATHS_LIST="
1604     bindir
1605     datadir
1606     docdir
1607     incdir
1608     libdir
1609     mandir
1610     prefix
1611     shlibdir
1612 "
1613
1614 CMDLINE_SET="
1615     $PATHS_LIST
1616     ar
1617     arch
1618     as
1619     build_suffix
1620     cc
1621     cpu
1622     cross_prefix
1623     dep_cc
1624     extra_version
1625     host_cc
1626     host_cflags
1627     host_ld
1628     host_ldflags
1629     host_libs
1630     host_os
1631     ld
1632     logfile
1633     malloc_prefix
1634     nm
1635     optflags
1636     pkg_config
1637     pkg_config_flags
1638     random_seed
1639     samples
1640     sysinclude
1641     sysroot
1642     target_exec
1643     target_os
1644     target_path
1645     target_samples
1646     toolchain
1647 "
1648
1649 CMDLINE_APPEND="
1650     extra_cflags
1651     host_cppflags
1652 "
1653
1654 # code dependency declarations
1655
1656 # architecture extensions
1657
1658 armv5te_deps="arm"
1659 armv6_deps="arm"
1660 armv6t2_deps="arm"
1661 armv8_deps="aarch64"
1662 neon_deps_any="aarch64 arm"
1663 intrinsics_neon_deps="neon"
1664 vfp_deps_any="aarch64 arm"
1665 vfpv3_deps="vfp"
1666
1667 map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM
1668
1669 altivec_deps="ppc"
1670 ppc4xx_deps="ppc"
1671
1672 cpunop_deps="i686"
1673 x86_64_select="i686"
1674 x86_64_suggest="fast_cmov"
1675
1676 amd3dnow_deps="mmx"
1677 amd3dnowext_deps="amd3dnow"
1678 i686_deps="x86"
1679 mmx_deps="x86"
1680 mmxext_deps="mmx"
1681 sse_deps="mmxext"
1682 sse2_deps="sse"
1683 sse3_deps="sse2"
1684 ssse3_deps="sse3"
1685 sse4_deps="ssse3"
1686 sse42_deps="sse4"
1687 avx_deps="sse42"
1688 xop_deps="avx"
1689 fma3_deps="avx"
1690 fma4_deps="avx"
1691 avx2_deps="avx"
1692
1693 mmx_external_deps="yasm"
1694 mmx_inline_deps="inline_asm"
1695 mmx_suggest="mmx_external mmx_inline"
1696
1697 for ext in $(filter_out mmx $ARCH_EXT_LIST_X86_SIMD); do
1698     eval dep=\$${ext}_deps
1699     eval ${ext}_external_deps='"${dep}_external"'
1700     eval ${ext}_inline_deps='"${dep}_inline"'
1701     eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
1702 done
1703
1704 aligned_stack_if_any="aarch64 ppc x86"
1705 fast_64bit_if_any="aarch64 alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
1706 fast_clz_if_any="aarch64 alpha avr32 mips ppc x86"
1707 fast_unaligned_if_any="aarch64 ppc x86"
1708 simd_align_16_if_any="altivec neon sse"
1709
1710 # system capabilities
1711 log2_deps="!libc_msvcrt"
1712
1713 symver_if_any="symver_asm_label symver_gnu_asm"
1714
1715 # threading support
1716 atomics_gcc_if="sync_val_compare_and_swap"
1717 atomics_suncc_if="atomic_cas_ptr machine_rw_barrier"
1718 atomics_win32_if="MemoryBarrier"
1719 atomics_native_if_any="$ATOMICS_LIST"
1720 w32threads_deps="atomics_native"
1721 threads_if_any="$THREADS_LIST"
1722
1723 # subsystems
1724 dct_select="rdft"
1725 error_resilience_select="me_cmp"
1726 intrax8_select="error_resilience"
1727 mdct_select="fft"
1728 rdft_select="fft"
1729 me_cmp_select="fdctdsp idctdsp pixblockdsp"
1730 mpeg_er_select="error_resilience"
1731 mpegaudio_select="mpegaudiodsp"
1732 mpegaudiodsp_select="dct"
1733 mpegvideo_select="blockdsp hpeldsp idctdsp me_cmp videodsp"
1734 mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
1735
1736 # decoders / encoders
1737 aac_decoder_select="mdct sinewin"
1738 aac_encoder_select="audio_frame_queue iirfilter mdct sinewin"
1739 aac_latm_decoder_select="aac_decoder aac_latm_parser"
1740 ac3_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
1741 ac3_encoder_select="ac3dsp audiodsp mdct me_cmp"
1742 ac3_fixed_encoder_select="ac3dsp audiodsp mdct me_cmp"
1743 aic_decoder_select="golomb idctdsp"
1744 alac_encoder_select="lpc"
1745 als_decoder_select="bswapdsp"
1746 amrnb_decoder_select="lsp"
1747 amrwb_decoder_select="lsp"
1748 amv_decoder_select="sp5x_decoder"
1749 ape_decoder_select="bswapdsp"
1750 asv1_decoder_select="blockdsp bswapdsp idctdsp"
1751 asv1_encoder_select="bswapdsp fdctdsp pixblockdsp"
1752 asv2_decoder_select="blockdsp bswapdsp idctdsp"
1753 asv2_encoder_select="bswapdsp fdctdsp pixblockdsp"
1754 atrac1_decoder_select="mdct sinewin"
1755 atrac3_decoder_select="mdct"
1756 atrac3p_decoder_select="mdct sinewin"
1757 bink_decoder_select="blockdsp hpeldsp"
1758 binkaudio_dct_decoder_select="mdct rdft dct sinewin"
1759 binkaudio_rdft_decoder_select="mdct rdft sinewin"
1760 cavs_decoder_select="blockdsp golomb h264chroma idctdsp qpeldsp videodsp"
1761 cllc_decoder_select="bswapdsp"
1762 comfortnoise_encoder_select="lpc"
1763 cook_decoder_select="audiodsp mdct sinewin"
1764 cscd_decoder_select="lzo"
1765 cscd_decoder_suggest="zlib"
1766 dca_decoder_select="mdct"
1767 dnxhd_decoder_select="blockdsp idctdsp"
1768 dnxhd_encoder_select="aandcttables blockdsp fdctdsp idctdsp mpegvideoenc pixblockdsp"
1769 dvvideo_decoder_select="dvprofile idctdsp"
1770 dvvideo_encoder_select="dvprofile fdctdsp me_cmp pixblockdsp"
1771 dxa_decoder_deps="zlib"
1772 eac3_decoder_select="ac3_decoder"
1773 eac3_encoder_select="ac3_encoder"
1774 eamad_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpegvideo"
1775 eatgq_decoder_select="aandcttables idctdsp"
1776 eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpeg1video_decoder"
1777 exr_decoder_deps="zlib"
1778 ffv1_decoder_select="golomb rangecoder"
1779 ffv1_encoder_select="rangecoder"
1780 ffvhuff_decoder_select="huffyuv_decoder"
1781 ffvhuff_encoder_select="huffyuv_encoder"
1782 fic_decoder_select="golomb"
1783 flac_decoder_select="golomb"
1784 flac_encoder_select="bswapdsp golomb lpc"
1785 flashsv_decoder_deps="zlib"
1786 flashsv_encoder_deps="zlib"
1787 flashsv2_decoder_deps="zlib"
1788 flv_decoder_select="h263_decoder"
1789 flv_encoder_select="h263_encoder"
1790 fourxm_decoder_select="blockdsp bswapdsp"
1791 fraps_decoder_select="bswapdsp huffman"
1792 g2m_decoder_deps="zlib"
1793 g2m_decoder_select="blockdsp idctdsp"
1794 h261_decoder_select="mpeg_er mpegvideo"
1795 h261_encoder_select="aandcttables mpegvideoenc"
1796 h263_decoder_select="error_resilience h263_parser h263dsp mpeg_er mpegvideo qpeldsp"
1797 h263_encoder_select="aandcttables h263dsp mpegvideoenc"
1798 h263i_decoder_select="h263_decoder"
1799 h263p_encoder_select="h263_encoder"
1800 h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel startcode videodsp"
1801 h264_decoder_suggest="error_resilience"
1802 hevc_decoder_select="bswapdsp cabac golomb videodsp"
1803 huffyuv_decoder_select="bswapdsp huffyuvdsp"
1804 huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp"
1805 iac_decoder_select="imc_decoder"
1806 imc_decoder_select="bswapdsp fft mdct sinewin"
1807 indeo3_decoder_select="hpeldsp"
1808 interplay_video_decoder_select="hpeldsp"
1809 jpegls_decoder_select="golomb mjpeg_decoder"
1810 jpegls_encoder_select="golomb"
1811 jv_decoder_select="blockdsp"
1812 lagarith_decoder_select="huffyuvdsp"
1813 ljpeg_encoder_select="aandcttables idctdsp"
1814 loco_decoder_select="golomb"
1815 mdec_decoder_select="blockdsp idctdsp mpegvideo"
1816 metasound_decoder_select="lsp mdct sinewin"
1817 mimic_decoder_select="blockdsp bswapdsp hpeldsp idctdsp"
1818 mjpeg_decoder_select="blockdsp hpeldsp idctdsp"
1819 mjpeg_encoder_select="aandcttables mpegvideoenc"
1820 mjpegb_decoder_select="mjpeg_decoder"
1821 mlp_decoder_select="mlp_parser"
1822 motionpixels_decoder_select="bswapdsp"
1823 mp1_decoder_select="mpegaudio"
1824 mp1float_decoder_select="mpegaudio"
1825 mp2_decoder_select="mpegaudio"
1826 mp2float_decoder_select="mpegaudio"
1827 mp3_decoder_select="mpegaudio"
1828 mp3adu_decoder_select="mpegaudio"
1829 mp3adufloat_decoder_select="mpegaudio"
1830 mp3float_decoder_select="mpegaudio"
1831 mp3on4_decoder_select="mpegaudio"
1832 mp3on4float_decoder_select="mpegaudio"
1833 mpc7_decoder_select="bswapdsp mpegaudiodsp"
1834 mpc8_decoder_select="mpegaudiodsp"
1835 mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
1836 mpeg_xvmc_decoder_select="mpeg2video_decoder"
1837 mpeg1video_decoder_select="error_resilience mpeg_er mpegvideo"
1838 mpeg1video_encoder_select="aandcttables mpegvideoenc"
1839 mpeg2video_decoder_select="error_resilience mpeg_er mpegvideo"
1840 mpeg2video_encoder_select="aandcttables mpegvideoenc"
1841 mpeg4_decoder_select="h263_decoder mpeg4video_parser"
1842 mpeg4_encoder_select="h263_encoder"
1843 msmpeg4v1_decoder_select="h263_decoder"
1844 msmpeg4v2_decoder_select="h263_decoder"
1845 msmpeg4v2_encoder_select="h263_encoder"
1846 msmpeg4v3_decoder_select="h263_decoder"
1847 msmpeg4v3_encoder_select="h263_encoder"
1848 mss2_decoder_select="error_resilience mpeg_er qpeldsp vc1_decoder"
1849 mxpeg_decoder_select="mjpeg_decoder"
1850 nellymoser_decoder_select="mdct sinewin"
1851 nellymoser_encoder_select="audio_frame_queue mdct sinewin"
1852 nuv_decoder_select="idctdsp lzo"
1853 on2avc_decoder_select="mdct"
1854 opus_decoder_deps="avresample"
1855 png_decoder_deps="zlib"
1856 png_encoder_deps="zlib"
1857 png_encoder_select="huffyuvencdsp"
1858 prores_decoder_select="idctdsp"
1859 prores_encoder_select="fdctdsp"
1860 qcelp_decoder_select="lsp"
1861 qdm2_decoder_select="mdct rdft mpegaudiodsp"
1862 ra_144_encoder_select="audio_frame_queue lpc"
1863 ralf_decoder_select="golomb"
1864 rv10_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
1865 rv10_encoder_select="h263_encoder"
1866 rv20_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
1867 rv20_encoder_select="h263_encoder"
1868 rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo videodsp"
1869 rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo videodsp"
1870 shorten_decoder_select="golomb"
1871 sipr_decoder_select="lsp"
1872 sp5x_decoder_select="mjpeg_decoder"
1873 svq1_decoder_select="hpeldsp"
1874 svq1_encoder_select="aandcttables hpeldsp me_cmp mpegvideoenc"
1875 svq3_decoder_select="h264_decoder hpeldsp tpeldsp"
1876 svq3_decoder_suggest="zlib"
1877 tak_decoder_select="audiodsp"
1878 theora_decoder_select="vp3_decoder"
1879 thp_decoder_select="mjpeg_decoder"
1880 tiff_decoder_suggest="zlib"
1881 tiff_encoder_suggest="zlib"
1882 truehd_decoder_select="mlp_decoder"
1883 truemotion2_decoder_select="bswapdsp"
1884 truespeech_decoder_select="bswapdsp"
1885 tscc_decoder_deps="zlib"
1886 twinvq_decoder_select="mdct lsp sinewin"
1887 utvideo_decoder_select="bswapdsp"
1888 utvideo_encoder_select="bswapdsp huffman huffyuvencdsp"
1889 vble_decoder_select="huffyuvdsp"
1890 vc1_decoder_select="blockdsp error_resilience h263_decoder h264chroma h264qpel intrax8 mpeg_er qpeldsp startcode"
1891 vc1image_decoder_select="vc1_decoder"
1892 vorbis_decoder_select="mdct"
1893 vorbis_encoder_select="mdct"
1894 vp3_decoder_select="hpeldsp vp3dsp videodsp"
1895 vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp"
1896 vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp"
1897 vp6a_decoder_select="vp6_decoder"
1898 vp6f_decoder_select="vp6_decoder"
1899 vp7_decoder_select="h264pred videodsp"
1900 vp8_decoder_select="h264pred videodsp"
1901 vp9_decoder_select="videodsp"
1902 webp_decoder_select="vp8_decoder"
1903 wmapro_decoder_select="mdct sinewin"
1904 wmav1_decoder_select="mdct sinewin"
1905 wmav1_encoder_select="mdct sinewin"
1906 wmav2_decoder_select="mdct sinewin"
1907 wmav2_encoder_select="mdct sinewin"
1908 wmavoice_decoder_select="lsp rdft dct mdct sinewin"
1909 wmv1_decoder_select="h263_decoder"
1910 wmv1_encoder_select="h263_encoder"
1911 wmv2_decoder_select="blockdsp h263_decoder idctdsp intrax8 videodsp"
1912 wmv2_encoder_select="h263_encoder"
1913 wmv3_decoder_select="vc1_decoder"
1914 wmv3image_decoder_select="wmv3_decoder"
1915 zerocodec_decoder_deps="zlib"
1916 zlib_decoder_deps="zlib"
1917 zlib_encoder_deps="zlib"
1918 zmbv_decoder_deps="zlib"
1919 zmbv_encoder_deps="zlib"
1920
1921 # hardware accelerators
1922 dxva2_deps="dxva2api_h"
1923 vaapi_deps="va_va_h"
1924 vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
1925 vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore"
1926 vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"
1927
1928 h263_vaapi_hwaccel_deps="vaapi"
1929 h263_vaapi_hwaccel_select="h263_decoder"
1930 h263_vdpau_hwaccel_deps="vdpau"
1931 h263_vdpau_hwaccel_select="h263_decoder"
1932 h264_dxva2_hwaccel_deps="dxva2"
1933 h264_dxva2_hwaccel_select="h264_decoder"
1934 h264_vaapi_hwaccel_deps="vaapi"
1935 h264_vaapi_hwaccel_select="h264_decoder"
1936 h264_vda_hwaccel_deps="vda"
1937 h264_vda_hwaccel_select="h264_decoder"
1938 h264_vda_old_hwaccel_deps="vda"
1939 h264_vda_old_hwaccel_select="h264_decoder"
1940 h264_vdpau_hwaccel_deps="vdpau"
1941 h264_vdpau_hwaccel_select="h264_decoder"
1942 mpeg1_vdpau_hwaccel_deps="vdpau"
1943 mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
1944 mpeg2_dxva2_hwaccel_deps="dxva2"
1945 mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
1946 mpeg2_vaapi_hwaccel_deps="vaapi"
1947 mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
1948 mpeg2_vdpau_hwaccel_deps="vdpau"
1949 mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
1950 mpeg4_vaapi_hwaccel_deps="vaapi"
1951 mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
1952 mpeg4_vdpau_hwaccel_deps="vdpau"
1953 mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
1954 vc1_dxva2_hwaccel_deps="dxva2"
1955 vc1_dxva2_hwaccel_select="vc1_decoder"
1956 vc1_vaapi_hwaccel_deps="vaapi"
1957 vc1_vaapi_hwaccel_select="vc1_decoder"
1958 vc1_vdpau_hwaccel_deps="vdpau"
1959 vc1_vdpau_hwaccel_select="vc1_decoder"
1960 wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
1961 wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
1962 wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
1963
1964 # parsers
1965 h264_parser_select="h264_decoder"
1966 mpegvideo_parser_select="mpegvideo"
1967 mpeg4video_parser_select="error_resilience h263dsp mpeg_er mpegvideo qpeldsp"
1968 vc1_parser_select="mpegvideo startcode"
1969
1970 # external libraries
1971 libfaac_encoder_deps="libfaac"
1972 libfaac_encoder_select="audio_frame_queue"
1973 libfdk_aac_decoder_deps="libfdk_aac"
1974 libfdk_aac_encoder_deps="libfdk_aac"
1975 libfdk_aac_encoder_select="audio_frame_queue"
1976 libgsm_decoder_deps="libgsm"
1977 libgsm_encoder_deps="libgsm"
1978 libgsm_ms_decoder_deps="libgsm"
1979 libgsm_ms_encoder_deps="libgsm"
1980 libilbc_decoder_deps="libilbc"
1981 libilbc_encoder_deps="libilbc"
1982 libmp3lame_encoder_deps="libmp3lame"
1983 libmp3lame_encoder_select="audio_frame_queue"
1984 libopencore_amrnb_decoder_deps="libopencore_amrnb"
1985 libopencore_amrnb_encoder_deps="libopencore_amrnb"
1986 libopencore_amrnb_encoder_select="audio_frame_queue"
1987 libopencore_amrwb_decoder_deps="libopencore_amrwb"
1988 libopenjpeg_decoder_deps="libopenjpeg"
1989 libopenjpeg_encoder_deps="libopenjpeg"
1990 libopus_decoder_deps="libopus"
1991 libopus_encoder_deps="libopus"
1992 libopus_encoder_select="audio_frame_queue"
1993 libschroedinger_decoder_deps="libschroedinger"
1994 libschroedinger_encoder_deps="libschroedinger"
1995 libspeex_decoder_deps="libspeex"
1996 libspeex_encoder_deps="libspeex"
1997 libspeex_encoder_select="audio_frame_queue"
1998 libtheora_encoder_deps="libtheora"
1999 libtwolame_encoder_deps="libtwolame"
2000 libvo_aacenc_encoder_deps="libvo_aacenc"
2001 libvo_aacenc_encoder_select="audio_frame_queue"
2002 libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
2003 libvorbis_encoder_deps="libvorbis"
2004 libvorbis_encoder_select="audio_frame_queue"
2005 libvpx_vp8_decoder_deps="libvpx"
2006 libvpx_vp8_encoder_deps="libvpx"
2007 libvpx_vp9_decoder_deps="libvpx"
2008 libvpx_vp9_encoder_deps="libvpx"
2009 libwavpack_encoder_deps="libwavpack"
2010 libwebp_encoder_deps="libwebp"
2011 libx264_encoder_deps="libx264"
2012 libx265_encoder_deps="libx265"
2013 libxavs_encoder_deps="libxavs"
2014 libxvid_encoder_deps="libxvid"
2015
2016 # demuxers / muxers
2017 ac3_demuxer_select="ac3_parser"
2018 asf_demuxer_select="riffdec"
2019 asf_muxer_select="riffenc"
2020 asf_stream_muxer_select="asf_muxer"
2021 avi_demuxer_select="riffdec"
2022 avi_muxer_select="riffenc"
2023 avisynth_demuxer_deps="avisynth"
2024 avisynth_demuxer_select="riffdec"
2025 caf_demuxer_select="riffdec"
2026 dirac_demuxer_select="dirac_parser"
2027 dv_demuxer_select="dvprofile"
2028 dv_muxer_select="dvprofile"
2029 dxa_demuxer_select="riffdec"
2030 eac3_demuxer_select="ac3_parser"
2031 f4v_muxer_select="mov_muxer"
2032 flac_demuxer_select="flac_parser"
2033 hds_muxer_select="flv_muxer"
2034 hls_muxer_select="mpegts_muxer"
2035 ipod_muxer_select="mov_muxer"
2036 ismv_muxer_select="mov_muxer"
2037 matroska_audio_muxer_select="matroska_muxer"
2038 matroska_demuxer_select="riffdec"
2039 matroska_demuxer_suggest="bzlib lzo zlib"
2040 matroska_muxer_select="riffenc"
2041 mmf_muxer_select="riffenc"
2042 mov_demuxer_select="riffdec"
2043 mov_demuxer_suggest="zlib"
2044 mov_muxer_select="riffenc rtpenc_chain"
2045 mp3_demuxer_select="mpegaudio_parser"
2046 mp4_muxer_select="mov_muxer"
2047 mpegts_muxer_select="adts_muxer latm_muxer"
2048 mpegtsraw_demuxer_select="mpegts_demuxer"
2049 mxf_d10_muxer_select="mxf_muxer"
2050 nut_muxer_select="riffenc"
2051 nuv_demuxer_select="riffdec"
2052 oga_muxer_select="ogg_muxer"
2053 ogg_demuxer_select="golomb"
2054 opus_muxer_select="ogg_muxer"
2055 psp_muxer_select="mov_muxer"
2056 rtp_demuxer_select="sdp_demuxer"
2057 rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
2058 rtsp_demuxer_select="http_protocol rtpdec"
2059 rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
2060 sap_demuxer_select="sdp_demuxer"
2061 sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
2062 sdp_demuxer_select="rtpdec"
2063 smoothstreaming_muxer_select="ismv_muxer"
2064 spdif_muxer_select="aac_parser"
2065 spx_muxer_select="ogg_muxer"
2066 tak_demuxer_select="tak_parser"
2067 tg2_muxer_select="mov_muxer"
2068 tgp_muxer_select="mov_muxer"
2069 w64_demuxer_select="wav_demuxer"
2070 wav_demuxer_select="riffdec"
2071 wav_muxer_select="riffenc"
2072 webm_muxer_select="riffenc"
2073 wtv_demuxer_select="riffdec"
2074 xmv_demuxer_select="riffdec"
2075 xwma_demuxer_select="riffdec"
2076
2077 # indevs / outdevs
2078 alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
2079 alsa_outdev_deps="alsa_asoundlib_h"
2080 bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
2081 dv1394_indev_deps="dv1394"
2082 dv1394_indev_select="dv_demuxer"
2083 fbdev_indev_deps="linux_fb_h"
2084 jack_indev_deps="jack_jack_h pthreads"
2085 libcdio_indev_deps="libcdio"
2086 libdc1394_indev_deps="libdc1394"
2087 oss_indev_deps_any="soundcard_h sys_soundcard_h"
2088 oss_outdev_deps_any="soundcard_h sys_soundcard_h"
2089 pulse_indev_deps="libpulse"
2090 sndio_indev_deps="sndio_h"
2091 sndio_outdev_deps="sndio_h"
2092 v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
2093 vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
2094 vfwcap_indev_extralibs="-lavicap32"
2095 x11grab_indev_deps="x11grab XShmCreateImage"
2096
2097 # protocols
2098 ffrtmpcrypt_protocol_deps="!librtmp_protocol"
2099 ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
2100 ffrtmpcrypt_protocol_select="tcp_protocol"
2101 ffrtmphttp_protocol_deps="!librtmp_protocol"
2102 ffrtmphttp_protocol_select="http_protocol"
2103 gopher_protocol_select="network"
2104 http_protocol_select="tcp_protocol"
2105 httpproxy_protocol_select="tcp_protocol"
2106 https_protocol_select="tls_protocol"
2107 icecast_protocol_select="http_protocol"
2108 librtmp_protocol_deps="librtmp"
2109 librtmpe_protocol_deps="librtmp"
2110 librtmps_protocol_deps="librtmp"
2111 librtmpt_protocol_deps="librtmp"
2112 librtmpte_protocol_deps="librtmp"
2113 mmsh_protocol_select="http_protocol"
2114 mmst_protocol_select="network"
2115 rtmp_protocol_deps="!librtmp_protocol"
2116 rtmp_protocol_select="tcp_protocol"
2117 rtmpe_protocol_select="ffrtmpcrypt_protocol"
2118 rtmps_protocol_deps="!librtmp_protocol"
2119 rtmps_protocol_select="tls_protocol"
2120 rtmpt_protocol_select="ffrtmphttp_protocol"
2121 rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2122 rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2123 rtp_protocol_select="udp_protocol"
2124 sctp_protocol_deps="struct_sctp_event_subscribe"
2125 sctp_protocol_select="network"
2126 srtp_protocol_select="rtp_protocol"
2127 tcp_protocol_select="network"
2128 tls_protocol_deps_any="openssl gnutls"
2129 tls_protocol_select="tcp_protocol"
2130 udp_protocol_select="network"
2131 unix_protocol_deps="sys_un_h"
2132 unix_protocol_select="network"
2133
2134 # filters
2135 blackframe_filter_deps="gpl"
2136 boxblur_filter_deps="gpl"
2137 bs2b_filter_deps="libbs2b"
2138 cropdetect_filter_deps="gpl"
2139 delogo_filter_deps="gpl"
2140 drawtext_filter_deps="libfreetype"
2141 frei0r_filter_deps="frei0r dlopen"
2142 frei0r_filter_extralibs='$ldl'
2143 frei0r_src_filter_deps="frei0r dlopen"
2144 frei0r_src_filter_extralibs='$ldl'
2145 hqdn3d_filter_deps="gpl"
2146 interlace_filter_deps="gpl"
2147 ocv_filter_deps="libopencv"
2148 resample_filter_deps="avresample"
2149 scale_filter_deps="swscale"
2150
2151 # examples
2152 avcodec_example_deps="avcodec avutil"
2153 filter_audio_example_deps="avfilter avutil"
2154 metadata_example_deps="avformat avutil"
2155 output_example_deps="avcodec avformat avutil swscale"
2156 transcode_aac_example_deps="avcodec avformat avresample"
2157
2158 # libraries, in linking order
2159 avcodec_deps="avutil"
2160 avdevice_deps="avformat avcodec avutil"
2161 avfilter_deps="avutil"
2162 avformat_deps="avcodec avutil"
2163 avresample_deps="avutil"
2164 swscale_deps="avutil"
2165
2166 # programs
2167 avconv_deps="avcodec avfilter avformat avresample swscale"
2168 avconv_select="aformat_filter anull_filter asyncts_filter atrim_filter format_filter
2169                fps_filter null_filter resample_filter scale_filter
2170                setpts_filter trim_filter"
2171 avplay_deps="avcodec avformat avresample swscale sdl"
2172 avplay_libs='$sdl_libs'
2173 avplay_select="rdft"
2174 avprobe_deps="avcodec avformat"
2175
2176 # documentation
2177 pod2man_deps="doc"
2178 texi2html_deps="doc"
2179
2180 # default parameters
2181
2182 logfile="config.log"
2183
2184 # installation paths
2185 prefix_default="/usr/local"
2186 bindir_default='${prefix}/bin'
2187 datadir_default='${prefix}/share/avconv'
2188 docdir_default='${prefix}/share/doc/libav'
2189 incdir_default='${prefix}/include'
2190 libdir_default='${prefix}/lib'
2191 mandir_default='${prefix}/share/man'
2192 shlibdir_default="$libdir_default"
2193
2194 # toolchain
2195 ar_default="ar"
2196 cc_default="gcc"
2197 host_cc_default="gcc"
2198 cp_f="cp -f"
2199 ln_s="ln -s -f"
2200 nm_default="nm -g"
2201 objformat="elf"
2202 pkg_config_default=pkg-config
2203 ranlib="ranlib"
2204 strip="strip"
2205 yasmexe="yasm"
2206
2207 # machine
2208 arch_default=$(uname -m)
2209 cpu="generic"
2210 intrinsics="none"
2211
2212 # OS
2213 target_os_default=$(tolower $(uname -s))
2214 host_os=$target_os_default
2215
2216 # configurable options
2217 enable $EXAMPLE_LIST $LIBRARY_LIST $PROGRAM_LIST
2218
2219 enable asm
2220 enable debug
2221 enable doc
2222 enable optimizations
2223 enable safe_bitstream_reader
2224 enable static
2225 enable swscale_alpha
2226
2227 # By default, enable only those hwaccels that have no external dependencies.
2228 enable dxva2 vdpau
2229
2230 # build settings
2231 SHFLAGS='-shared -Wl,-soname,$$(@F)'
2232 LIBPREF="lib"
2233 LIBSUF=".a"
2234 FULLNAME='$(NAME)$(BUILDSUF)'
2235 LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
2236 SLIBPREF="lib"
2237 SLIBSUF=".so"
2238 SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
2239 SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
2240 SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
2241 LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2242 SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
2243 SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2244
2245 asflags_filter=echo
2246 cflags_filter=echo
2247 ldflags_filter=echo
2248
2249 AS_C='-c'
2250 AS_O='-o $@'
2251 CC_C='-c'
2252 CC_E='-E -o $@'
2253 CC_O='-o $@'
2254 LD_O='-o $@'
2255 LD_LIB='-l%'
2256 LD_PATH='-L'
2257 HOSTCC_C='-c'
2258 HOSTCC_E='-E -o $@'
2259 HOSTCC_O='-o $@'
2260 HOSTLD_O='-o $@'
2261
2262 host_libs='-lm'
2263 host_cflags_filter=echo
2264 host_ldflags_filter=echo
2265
2266 target_path='$(CURDIR)'
2267
2268 # since the object filename is not given with the -MM flag, the compiler
2269 # is only able to print the basename, and we must add the path ourselves
2270 DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
2271 DEPFLAGS='-MM'
2272
2273 # find source path
2274 if test -f configure; then
2275     source_path=.
2276 else
2277     source_path=$(cd $(dirname "$0"); pwd)
2278     echo "$source_path" | grep -q '[[:blank:]]' &&
2279         die "Out of tree builds are impossible with whitespace in source path."
2280     test -e "$source_path/config.h" &&
2281         die "Out of tree builds are impossible with config.h in source dir."
2282 fi
2283
2284 for v in "$@"; do
2285     r=${v#*=}
2286     l=${v%"$r"}
2287     r=$(sh_quote "$r")
2288     LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
2289 done
2290
2291 find_things(){
2292     thing=$1
2293     pattern=$2
2294     file=$source_path/$3
2295     sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2296 }
2297
2298 ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
2299 DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2300 HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
2301 PARSER_LIST=$(find_things   parser   PARSER   libavcodec/allcodecs.c)
2302 BSF_LIST=$(find_things      bsf      BSF      libavcodec/allcodecs.c)
2303 MUXER_LIST=$(find_things    muxer    _MUX     libavformat/allformats.c)
2304 DEMUXER_LIST=$(find_things  demuxer  DEMUX    libavformat/allformats.c)
2305 OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
2306 INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2307 PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
2308 FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2309
2310 ALL_COMPONENTS="
2311     $BSF_LIST
2312     $DECODER_LIST
2313     $DEMUXER_LIST
2314     $ENCODER_LIST
2315     $FILTER_LIST
2316     $HWACCEL_LIST
2317     $INDEV_LIST
2318     $MUXER_LIST
2319     $OUTDEV_LIST
2320     $PARSER_LIST
2321     $PROTOCOL_LIST
2322 "
2323
2324 for n in $COMPONENT_LIST; do
2325     v=$(toupper ${n%s})_LIST
2326     eval enable \$$v
2327     eval ${n}_if_any="\$$v"
2328 done
2329
2330 enable $ARCH_EXT_LIST
2331
2332 die_unknown(){
2333     echo "Unknown option \"$1\"."
2334     echo "See $0 --help for available options."
2335     exit 1
2336 }
2337
2338 print_3_columns() {
2339     cat | tr ' ' '\n' | sort | pr -r -3 -t
2340 }
2341
2342 show_list() {
2343     suffix=_$1
2344     shift
2345     echo $* | sed s/$suffix//g | print_3_columns
2346     exit 0
2347 }
2348
2349 rand_list(){
2350     IFS=', '
2351     set -- $*
2352     unset IFS
2353     for thing; do
2354         comp=${thing%:*}
2355         prob=${thing#$comp}
2356         prob=${prob#:}
2357         is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
2358         echo "prob ${prob:-0.5}"
2359         printf '%s\n' $comp
2360     done
2361 }
2362
2363 do_random(){
2364     action=$1
2365     shift
2366     random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
2367     $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
2368 }
2369
2370 for opt do
2371     optval="${opt#*=}"
2372     case "$opt" in
2373         --extra-ldflags=*)
2374             add_ldflags $optval
2375         ;;
2376         --extra-ldexeflags=*)
2377             add_ldexeflags $optval
2378         ;;
2379         --extra-libs=*)
2380             add_extralibs $optval
2381         ;;
2382         --disable-devices)
2383             disable $INDEV_LIST $OUTDEV_LIST
2384         ;;
2385         --enable-debug=*)
2386             debuglevel="$optval"
2387         ;;
2388         --disable-programs)
2389             disable $PROGRAM_LIST
2390         ;;
2391         --disable-everything)
2392             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2393         ;;
2394         --disable-all)
2395             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2396             disable $LIBRARY_LIST $PROGRAM_LIST doc
2397         ;;
2398         --enable-random|--disable-random)
2399             action=${opt%%-random}
2400             do_random ${action#--} $COMPONENT_LIST
2401         ;;
2402         --enable-random=*|--disable-random=*)
2403             action=${opt%%-random=*}
2404             do_random ${action#--} $optval
2405         ;;
2406         --enable-*=*|--disable-*=*)
2407             eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
2408             is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
2409             eval list=\$$(toupper $thing)_LIST
2410             name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
2411             $action $(filter "$name" $list)
2412         ;;
2413         --enable-avserver|--disable-avserver*)
2414             warn "avserver has been removed, the ${opt} option is only"\
2415                  "provided for compatibility and will be removed in the future"
2416         ;;
2417         --enable-?*|--disable-?*)
2418             eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
2419             if is_in $option $COMPONENT_LIST; then
2420                 test $action = disable && action=unset
2421                 eval $action \$$(toupper ${option%s})_LIST
2422             elif is_in $option $CMDLINE_SELECT; then
2423                 $action $option
2424             else
2425                 die_unknown $opt
2426             fi
2427         ;;
2428         --list-*)
2429             NAME="${opt#--list-}"
2430             is_in $NAME $COMPONENT_LIST || die_unknown $opt
2431             NAME=${NAME%s}
2432             eval show_list $NAME \$$(toupper $NAME)_LIST
2433         ;;
2434         --help|-h) show_help
2435         ;;
2436         *)
2437             optname="${opt%%=*}"
2438             optname="${optname#--}"
2439             optname=$(echo "$optname" | sed 's/-/_/g')
2440             if is_in $optname $CMDLINE_SET; then
2441                 eval $optname='$optval'
2442             elif is_in $optname $CMDLINE_APPEND; then
2443                 append $optname "$optval"
2444             else
2445                 die_unknown $opt
2446             fi
2447         ;;
2448     esac
2449 done
2450
2451 disabled logging && logfile=/dev/null
2452
2453 echo "# $0 $LIBAV_CONFIGURATION" > $logfile
2454 set >> $logfile
2455
2456 test -n "$cross_prefix" && enable cross_compile
2457
2458 if enabled cross_compile; then
2459     test -n "$arch" && test -n "$target_os" ||
2460         die "Must specify target arch and OS when cross-compiling"
2461 fi
2462
2463 ar_default="${cross_prefix}${ar_default}"
2464 cc_default="${cross_prefix}${cc_default}"
2465 nm_default="${cross_prefix}${nm_default}"
2466 pkg_config_default="${cross_prefix}${pkg_config_default}"
2467 ranlib="${cross_prefix}${ranlib}"
2468 strip="${cross_prefix}${strip}"
2469
2470 sysinclude_default="${sysroot}/usr/include"
2471
2472 case "$toolchain" in
2473     clang-asan)
2474         cc_default="clang"
2475         add_cflags  -fsanitize=address
2476         add_ldflags -fsanitize=address
2477     ;;
2478     clang-tsan)
2479         cc_default="clang"
2480         add_cflags  -fsanitize=thread -pie
2481         add_ldflags -fsanitize=thread -pie
2482     ;;
2483     clang-usan)
2484         cc_default="clang"
2485         add_cflags  -fsanitize=undefined -O1
2486         add_ldflags -fsanitize=undefined
2487     ;;
2488     gcc-asan)
2489         cc_default="gcc"
2490         add_cflags  -fsanitize=address
2491         add_ldflags -fsanitize=address
2492     ;;
2493     gcc-tsan)
2494         cc_default="gcc"
2495         add_cflags  -fsanitize=thread -pie -fPIC
2496         add_ldflags -fsanitize=thread -pie -fPIC
2497     ;;
2498     gcc-usan)
2499         cc_default="gcc"
2500         add_cflags  -fsanitize=undefined
2501         add_ldflags -fsanitize=undefined
2502     ;;
2503     valgrind-massif)
2504         target_exec_default="valgrind"
2505         target_exec_args="--alloc-fn=av_malloc --alloc-fn=av_mallocz"
2506     ;;
2507     valgrind-memcheck)
2508         target_exec_default="valgrind"
2509         target_exec_args="--track-origins=yes --leak-check=full"
2510     ;;
2511     msvc)
2512         # Check whether the current MSVC version needs the C99 converter.
2513         # From MSVC 2013 (compiler major version 18) onwards, it does actually
2514         # support enough of C99 to build libav. Default to the new
2515         # behaviour if the regexp was unable to match anything, since this
2516         # successfully parses the version number of existing supported
2517         # versions that require the converter (MSVC 2010 and 2012).
2518         cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
2519         if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
2520             cc_default="cl"
2521         else
2522             cc_default="c99wrap cl"
2523         fi
2524         ld_default="link"
2525         nm_default="dumpbin -symbols"
2526         ar_default="lib"
2527         target_os_default="win32"
2528         # Use a relative path for TMPDIR. This makes sure all the
2529         # ffconf temp files are written with a relative path, avoiding
2530         # issues with msys/win32 path conversion for MSVC parameters
2531         # such as -Fo<file> or -out:<file>.
2532         TMPDIR=.
2533     ;;
2534     icl)
2535         cc_default="icl"
2536         ld_default="xilink"
2537         nm_default="dumpbin -symbols"
2538         ar_default="xilib"
2539         target_os_default="win32"
2540         TMPDIR=.
2541     ;;
2542     gcov)
2543         add_cflags  -fprofile-arcs -ftest-coverage
2544         add_ldflags -fprofile-arcs -ftest-coverage
2545     ;;
2546     hardened)
2547         add_cflags  -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all
2548         add_ldflags -Wl,-z,relro -Wl,-z,now
2549     ;;
2550     ?*)
2551         die "Unknown toolchain $toolchain"
2552     ;;
2553 esac
2554
2555 set_default arch cc pkg_config sysinclude target_exec target_os
2556 enabled cross_compile || host_cc_default=$cc
2557 set_default host_cc
2558
2559 if ! $pkg_config --version >/dev/null 2>&1; then
2560     warn "$pkg_config not found, library detection may fail."
2561     pkg_config=false
2562 fi
2563
2564 exesuf() {
2565     case $1 in
2566         mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
2567     esac
2568 }
2569
2570 EXESUF=$(exesuf $target_os)
2571 HOSTEXESUF=$(exesuf $host_os)
2572
2573 # set temporary file name
2574 : ${TMPDIR:=$TEMPDIR}
2575 : ${TMPDIR:=$TMP}
2576 : ${TMPDIR:=/tmp}
2577
2578 if ! check_cmd mktemp -u XXXXXX; then
2579     # simple replacement for missing mktemp
2580     # NOT SAFE FOR GENERAL USE
2581     mktemp(){
2582         echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
2583     }
2584 fi
2585
2586 tmpfile(){
2587     tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
2588         (set -C; exec > $tmp) 2>/dev/null ||
2589         die "Unable to create temporary file in $TMPDIR."
2590     append TMPFILES $tmp
2591     eval $1=$tmp
2592 }
2593
2594 trap 'rm -f -- $TMPFILES' EXIT
2595
2596 tmpfile TMPASM .asm
2597 tmpfile TMPC   .c
2598 tmpfile TMPE   $EXESUF
2599 tmpfile TMPH   .h
2600 tmpfile TMPO   .o
2601 tmpfile TMPS   .S
2602 tmpfile TMPSH  .sh
2603 tmpfile TMPV   .ver
2604
2605 unset -f mktemp
2606
2607 chmod +x $TMPE
2608
2609 # make sure we can execute files in $TMPDIR
2610 cat > $TMPSH 2>> $logfile <<EOF
2611 #! /bin/sh
2612 EOF
2613 chmod +x $TMPSH >> $logfile 2>&1
2614 if ! $TMPSH >> $logfile 2>&1; then
2615     cat <<EOF
2616 Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
2617 variable to another directory and make sure that it is not mounted noexec.
2618 EOF
2619     die "Sanity test failed."
2620 fi
2621
2622 armasm_flags(){
2623     for flag; do
2624         case $flag in
2625             # Filter out MSVC cl.exe options from cflags that shouldn't
2626             # be passed to gas-preprocessor
2627             -M[TD]*)                                            ;;
2628             *)                  echo $flag                      ;;
2629         esac
2630    done
2631 }
2632
2633 ccc_flags(){
2634     for flag; do
2635         case $flag in
2636             -std=c99)           echo -c99                       ;;
2637             -mcpu=*)            echo -arch ${flag#*=}           ;;
2638             -mieee)             echo -ieee                      ;;
2639             -O*|-fast)          echo $flag                      ;;
2640             -fno-math-errno)    echo -assume nomath_errno       ;;
2641             -g)                 echo -g3                        ;;
2642             -Wall)              echo -msg_enable level2         ;;
2643             -Wno-pointer-sign)  echo -msg_disable ptrmismatch1  ;;
2644             -Wl,*)              echo $flag                      ;;
2645             -f*|-W*)                                            ;;
2646             *)                  echo $flag                      ;;
2647         esac
2648    done
2649 }
2650
2651 cparser_flags(){
2652     for flag; do
2653         case $flag in
2654             -Wno-switch)             echo -Wno-switch-enum ;;
2655             -Wno-format-zero-length) ;;
2656             -Wdisabled-optimization) ;;
2657             -Wno-pointer-sign)       echo -Wno-other ;;
2658             *)                       echo $flag ;;
2659         esac
2660     done
2661 }
2662
2663 msvc_common_flags(){
2664     for flag; do
2665         case $flag in
2666             # In addition to specifying certain flags under the compiler
2667             # specific filters, they must be specified here as well or else the
2668             # generic catch all at the bottom will print the original flag.
2669             -Wall)                ;;
2670             -std=c99)             ;;
2671             # Common flags
2672             -fomit-frame-pointer) ;;
2673             -g)                   echo -Z7 ;;
2674             -fno-math-errno)      ;;
2675             -fno-common)          ;;
2676             -fno-signed-zeros)    ;;
2677             -fPIC)                ;;
2678             -mthumb)              ;;
2679             -march=*)             ;;
2680             -lz)                  echo zlib.lib ;;
2681             -lavifil32)           echo vfw32.lib ;;
2682             -lavicap32)           echo vfw32.lib user32.lib ;;
2683             -l*)                  echo ${flag#-l}.lib ;;
2684             *)                    echo $flag ;;
2685         esac
2686     done
2687 }
2688
2689 msvc_flags(){
2690     msvc_common_flags "$@"
2691     for flag; do
2692         case $flag in
2693             -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
2694                                        -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
2695                                        -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
2696                                        -wd4273 -wd4701 ;;
2697         esac
2698     done
2699 }
2700
2701 icl_flags(){
2702     msvc_common_flags "$@"
2703     for flag; do
2704         case $flag in
2705             # Despite what Intel's documentation says -Wall, which is supported
2706             # on Windows, does enable remarks so disable them here.
2707             -Wall)                echo $flag -Qdiag-disable:remark ;;
2708             -std=c99)             echo -Qstd=c99 ;;
2709         esac
2710     done
2711 }
2712
2713 pgi_flags(){
2714     for flag; do
2715         case $flag in
2716             -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
2717             -fomit-frame-pointer) echo -Mnoframe ;;
2718             -g)                   echo -gopt ;;
2719             *)                    echo $flag ;;
2720         esac
2721     done
2722 }
2723
2724 suncc_flags(){
2725     for flag; do
2726         case $flag in
2727             -march=*|-mcpu=*)
2728                 case "${flag#*=}" in
2729                     native)                   echo -xtarget=native       ;;
2730                     v9|niagara)               echo -xarch=sparc          ;;
2731                     ultrasparc)               echo -xarch=sparcvis       ;;
2732                     ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
2733                     i586|pentium)             echo -xchip=pentium        ;;
2734                     i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
2735                     pentium3*|c3-2)           echo -xtarget=pentium3     ;;
2736                     pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
2737                     pentium4*)          echo -xtarget=pentium4           ;;
2738                     prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
2739                     *-sse3)             echo -xarch=sse3                 ;;
2740                     core2)              echo -xarch=ssse3 -xchip=core2   ;;
2741                     corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
2742                     corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
2743                     amdfam10|barcelona|bdver*) echo -xarch=sse4_1        ;;
2744                     athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
2745                     k8|opteron|athlon64|athlon-fx)
2746                                                echo -xarch=sse2a         ;;
2747                     athlon*)                   echo -xarch=pentium_proa  ;;
2748                 esac
2749                 ;;
2750             -std=c99)             echo -xc99              ;;
2751             -fomit-frame-pointer) echo -xregs=frameptr    ;;
2752             -fPIC)                echo -KPIC -xcode=pic32 ;;
2753             -W*,*)                echo $flag              ;;
2754             -f*-*|-W*|-mimpure-text)                      ;;
2755             -shared)              echo -G                 ;;
2756             *)                    echo $flag              ;;
2757         esac
2758     done
2759 }
2760
2761 tms470_flags(){
2762     for flag; do
2763         case $flag in
2764             -march=*|-mcpu=*)
2765                 case "${flag#*=}" in
2766                     armv7-a|cortex-a*)      echo -mv=7a8 ;;
2767                     armv7-r|cortex-r*)      echo -mv=7r4 ;;
2768                     armv7-m|cortex-m*)      echo -mv=7m3 ;;
2769                     armv6*|arm11*)          echo -mv=6   ;;
2770                     armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26])
2771                                             echo -mv=5e  ;;
2772                     armv4*|arm7*|arm9[24]*) echo -mv=4   ;;
2773                 esac
2774                 ;;
2775             -mfpu=neon)     echo --float_support=vfpv3 --neon ;;
2776             -mfpu=vfp)      echo --float_support=vfpv2        ;;
2777             -mfpu=vfpv3)    echo --float_support=vfpv3        ;;
2778             -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
2779             -msoft-float)   echo --float_support=vfplib       ;;
2780             -O[0-3]|-mf=*)  echo $flag                        ;;
2781             -g)             echo -g -mn                       ;;
2782             -pds=*)         echo $flag                        ;;
2783             -D*|-I*)        echo $flag                        ;;
2784             --gcc|--abi=*)  echo $flag                        ;;
2785             -me)            echo $flag                        ;;
2786         esac
2787     done
2788 }
2789
2790 probe_cc(){
2791     pfx=$1
2792     _cc=$2
2793
2794     unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
2795     unset _ld_o _ldflags _ld_lib _ld_path
2796     unset _depflags _DEPCMD _DEPFLAGS
2797     _flags_filter=echo
2798
2799     if $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
2800         _type=llvm_gcc
2801         gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)')
2802         _ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver"
2803         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2804         _cflags_speed='-O3'
2805         _cflags_size='-Os'
2806     elif $_cc -v 2>&1 | grep -qi ^gcc; then
2807         _type=gcc
2808         gcc_version=$($_cc --version | head -n1)
2809         gcc_basever=$($_cc -dumpversion)
2810         gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
2811         gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
2812         _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
2813         if ! $_cc -dumpversion | grep -q '^2\.'; then
2814             _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2815         fi
2816         _cflags_speed='-O3'
2817         _cflags_size='-Os'
2818     elif $_cc --version 2>/dev/null | grep -q ^icc; then
2819         _type=icc
2820         _ident=$($_cc --version | head -n1)
2821         _depflags='-MMD'
2822         _cflags_speed='-O3'
2823         _cflags_size='-Os'
2824         _cflags_noopt='-O1'
2825     elif $_cc -v 2>&1 | grep -q xlc; then
2826         _type=xlc
2827         _ident=$($_cc -qversion 2>/dev/null | head -n1)
2828         _cflags_speed='-O5'
2829         _cflags_size='-O5 -qcompact'
2830     elif $_cc -V 2>/dev/null | grep -q Compaq; then
2831         _type=ccc
2832         _ident=$($_cc -V | head -n1 | cut -d' ' -f1-3)
2833         _DEPFLAGS='-M'
2834         _cflags_speed='-fast'
2835         _cflags_size='-O1'
2836         _flags_filter=ccc_flags
2837     elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
2838         test -d "$sysroot" || die "No valid sysroot specified."
2839         _type=armcc
2840         _ident=$($_cc --vsn | grep -i build | head -n1 | sed 's/.*: //')
2841         armcc_conf="$PWD/armcc.conf"
2842         $_cc --arm_linux_configure                 \
2843              --arm_linux_config_file="$armcc_conf" \
2844              --configure_sysroot="$sysroot"        \
2845              --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
2846              die "Error creating armcc configuration file."
2847         $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
2848         _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
2849         as_default="${cross_prefix}gcc"
2850         _depflags='-MMD'
2851         _cflags_speed='-O3'
2852         _cflags_size='-Os'
2853     elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
2854         _type=tms470
2855         _ident=$($_cc -version | head -n1 | tr -s ' ')
2856         _flags='--gcc --abi=eabi -me'
2857         _cc_e='-ppl -fe=$@'
2858         _cc_o='-fe=$@'
2859         _depflags='-ppa -ppd=$(@:.o=.d)'
2860         _cflags_speed='-O3 -mf=5'
2861         _cflags_size='-O3 -mf=2'
2862         _flags_filter=tms470_flags
2863     elif $_cc -v 2>&1 | grep -q clang; then
2864         _type=clang
2865         _ident=$($_cc --version | head -n1)
2866         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2867         _cflags_speed='-O3'
2868         _cflags_size='-Os'
2869     elif $_cc -V 2>&1 | grep -q Sun; then
2870         _type=suncc
2871         _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
2872         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
2873         _DEPFLAGS='-xM1 -xc99'
2874         _ldflags='-std=c99'
2875         _cflags_speed='-O5'
2876         _cflags_size='-O5 -xspace'
2877         _flags_filter=suncc_flags
2878     elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
2879         _type=pathscale
2880         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
2881         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2882         _cflags_speed='-O2'
2883         _cflags_size='-Os'
2884         _flags_filter='filter_out -Wdisabled-optimization'
2885     elif $_cc -v 2>&1 | grep -q Open64; then
2886         _type=open64
2887         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
2888         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2889         _cflags_speed='-O2'
2890         _cflags_size='-Os'
2891         _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
2892     elif $_cc -V 2>&1 | grep -q Portland; then
2893         _type=pgi
2894         _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')"
2895         opt_common='-alias=ansi -Mdse -Mlre -Mpre'
2896         _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
2897         _cflags_size="-O2 -Munroll=c:1 $opt_common"
2898         _cflags_noopt="-O1"
2899         _flags_filter=pgi_flags
2900     elif $_cc 2>&1 | grep -q 'Microsoft.*ARM.*Assembler'; then
2901         _type=armasm
2902         _ident=$($_cc | head -n1)
2903         # 4509: "This form of conditional instruction is deprecated"
2904         _flags="-nologo -ignore 4509"
2905         _flags_filter=armasm_flags
2906     elif $_cc 2>&1 | grep -q Microsoft; then
2907         _type=msvc
2908         _ident=$($cc 2>&1 | head -n1)
2909         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
2910         _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
2911         _cflags_speed="-O2"
2912         _cflags_size="-O1"
2913         if $_cc 2>&1 | grep -q Linker; then
2914             _ld_o='-out:$@'
2915         else
2916             _ld_o='-Fe$@'
2917         fi
2918         _cc_o='-Fo$@'
2919         _cc_e='-P -Fi$@'
2920         _flags_filter=msvc_flags
2921         _ld_lib='lib%.a'
2922         _ld_path='-libpath:'
2923         _flags='-nologo'
2924         _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
2925         if [ $pfx = hostcc ]; then
2926             append _cflags -Dsnprintf=_snprintf
2927         fi
2928     elif $_cc 2>&1 | grep -q Intel; then
2929         _type=icl
2930         _ident=$($cc 2>&1 | head -n1)
2931         _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
2932         # Not only is O3 broken on 13.x+ but it is slower on all previous
2933         # versions (tested) as well.
2934         _cflags_speed="-O2"
2935         _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
2936         if $_cc 2>&1 | grep -q Linker; then
2937             _ld_o='-out:$@'
2938         else
2939             _ld_o='-Fe$@'
2940         fi
2941         _cc_o='-Fo$@'
2942         _cc_e='-P'
2943         _flags_filter=icl_flags
2944         _ld_lib='lib%.a'
2945         _ld_path='-libpath:'
2946         # -Qdiag-error to make icl error when seeing certain unknown arguments
2947         _flags='-nologo -Qdiag-error:4044,10157'
2948         # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency
2949         # with MSVC which enables it by default.
2950         _cflags='-D_USE_MATH_DEFINES -FIstdlib.h -Dstrtoll=_strtoi64 -Qms0 -Qvec- -Qsimd- -GS'
2951         if [ $pfx = hostcc ]; then
2952             append _cflags -Dsnprintf=_snprintf
2953         fi
2954     elif $_cc --version 2>/dev/null | grep -q ^cparser; then
2955         _type=cparser
2956         _ident=$($_cc --version | head -n1)
2957         _depflags='-MMD'
2958         _cflags_speed='-O4'
2959         _cflags_size='-O2'
2960         _flags_filter=cparser_flags
2961     fi
2962
2963     eval ${pfx}_type=\$_type
2964     eval ${pfx}_ident=\$_ident
2965 }
2966
2967 set_ccvars(){
2968     eval ${1}_C=\${_cc_c-\${${1}_C}}
2969     eval ${1}_E=\${_cc_e-\${${1}_E}}
2970     eval ${1}_O=\${_cc_o-\${${1}_O}}
2971
2972     if [ -n "$_depflags" ]; then
2973         eval ${1}_DEPFLAGS=\$_depflags
2974     else
2975         eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
2976         eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
2977         eval DEP${1}FLAGS=\$_flags
2978     fi
2979 }
2980
2981 probe_cc cc "$cc"
2982 cflags_filter=$_flags_filter
2983 cflags_speed=$_cflags_speed
2984 cflags_size=$_cflags_size
2985 cflags_noopt=$_cflags_noopt
2986 add_cflags $_flags $_cflags
2987 cc_ldflags=$_ldflags
2988 set_ccvars CC
2989
2990 probe_cc hostcc "$host_cc"
2991 host_cflags_filter=$_flags_filter
2992 add_host_cflags  $_flags $_cflags
2993 set_ccvars HOSTCC
2994
2995 test -n "$cc_type" && enable $cc_type ||
2996     warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
2997
2998 : ${as_default:=$cc}
2999 : ${dep_cc_default:=$cc}
3000 : ${ld_default:=$cc}
3001 : ${host_ld_default:=$host_cc}
3002 set_default ar as dep_cc ld host_ld
3003
3004 probe_cc as "$as"
3005 asflags_filter=$_flags_filter
3006 add_asflags $_flags $_cflags
3007 set_ccvars AS
3008
3009 probe_cc ld "$ld"
3010 ldflags_filter=$_flags_filter
3011 add_ldflags $_flags $_ldflags
3012 test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
3013 LD_O=${_ld_o-$LD_O}
3014 LD_LIB=${_ld_lib-$LD_LIB}
3015 LD_PATH=${_ld_path-$LD_PATH}
3016
3017 probe_cc hostld "$host_ld"
3018 host_ldflags_filter=$_flags_filter
3019 add_host_ldflags $_flags $_ldflags
3020 HOSTLD_O=${_ld_o-$HOSTLD_O}
3021
3022 if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
3023     probe_cc depcc "$dep_cc"
3024     CCDEP=${_DEPCMD:-$DEPCMD}
3025     CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
3026     DEPCCFLAGS=$_flags
3027 fi
3028
3029 if $ar 2>&1 | grep -q Microsoft; then
3030     arflags="-nologo"
3031     ar_o='-out:$@'
3032 elif $ar 2>&1 | grep -q 'Texas Instruments'; then
3033     arflags="rq"
3034     ar_o='$@'
3035 elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then
3036     arflags='-Xany -r -c'
3037     ar_o='$@'
3038 else
3039     arflags="rc"
3040     ar_o='$@'
3041 fi
3042
3043 add_cflags $extra_cflags
3044 add_asflags $extra_cflags
3045
3046 if test -n "$sysroot"; then
3047     case "$cc_type" in
3048         gcc|llvm_gcc|clang)
3049             add_cppflags --sysroot="$sysroot"
3050             add_ldflags --sysroot="$sysroot"
3051         ;;
3052         tms470)
3053             add_cppflags -I"$sysinclude"
3054             add_ldflags  --sysroot="$sysroot"
3055         ;;
3056     esac
3057 fi
3058
3059 if test "$cpu" = host; then
3060     enabled cross_compile &&
3061         die "--cpu=host makes no sense when cross-compiling."
3062
3063     case "$cc_type" in
3064         gcc|llvm_gcc)
3065             check_native(){
3066                 $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
3067                 sed -n "/cc1.*$1=/{
3068                             s/.*$1=\\([^ ]*\\).*/\\1/
3069                             p
3070                             q
3071                         }" $TMPE
3072             }
3073             cpu=$(check_native -march || check_native -mcpu)
3074         ;;
3075     esac
3076
3077     test "${cpu:-host}" = host &&
3078         die "--cpu=host not supported with compiler $cc"
3079 fi
3080
3081 # Deal with common $arch aliases
3082 case "$arch" in
3083     aarch64|arm64)
3084         arch="aarch64"
3085     ;;
3086     arm*)
3087         arch="arm"
3088     ;;
3089     mips*|IP*)
3090         arch="mips"
3091     ;;
3092     parisc*|hppa*)
3093         arch="parisc"
3094     ;;
3095     "Power Macintosh"|ppc*|powerpc*)
3096         arch="ppc"
3097     ;;
3098     s390|s390x)
3099         arch="s390"
3100     ;;
3101     sh4|sh)
3102         arch="sh4"
3103     ;;
3104     sun4u|sparc*)
3105         arch="sparc"
3106     ;;
3107     tilegx|tile-gx)
3108         arch="tilegx"
3109     ;;
3110     i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
3111         arch="x86"
3112     ;;
3113 esac
3114
3115 is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
3116 enable $arch
3117
3118 # Add processor-specific flags
3119 if enabled aarch64; then
3120
3121     case $cpu in
3122         armv*)
3123             cpuflags="-march=$cpu"
3124         ;;
3125         *)
3126             cpuflags="-mcpu=$cpu"
3127         ;;
3128     esac
3129
3130 elif enabled alpha; then
3131
3132     cpuflags="-mcpu=$cpu"
3133
3134 elif enabled arm; then
3135
3136     check_arm_arch() {
3137         check_cpp_condition stddef.h \
3138             "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
3139             $cpuflags
3140     }
3141
3142     probe_arm_arch() {
3143         if   check_arm_arch 4;        then echo armv4;
3144         elif check_arm_arch 4T;       then echo armv4t;
3145         elif check_arm_arch 5;        then echo armv5;
3146         elif check_arm_arch 5E;       then echo armv5e;
3147         elif check_arm_arch 5T;       then echo armv5t;
3148         elif check_arm_arch 5TE;      then echo armv5te;
3149         elif check_arm_arch 5TEJ;     then echo armv5te;
3150         elif check_arm_arch 6;        then echo armv6;
3151         elif check_arm_arch 6J;       then echo armv6j;
3152         elif check_arm_arch 6K;       then echo armv6k;
3153         elif check_arm_arch 6Z;       then echo armv6z;
3154         elif check_arm_arch 6ZK;      then echo armv6zk;
3155         elif check_arm_arch 6T2;      then echo armv6t2;
3156         elif check_arm_arch 7;        then echo armv7;
3157         elif check_arm_arch 7A  7_A;  then echo armv7-a;
3158         elif check_arm_arch 7R  7_R;  then echo armv7-r;
3159         elif check_arm_arch 7M  7_M;  then echo armv7-m;
3160         elif check_arm_arch 7EM 7E_M; then echo armv7-m;
3161         elif check_arm_arch 8A  8_A;  then echo armv8-a;
3162         fi
3163     }
3164
3165     [ "$cpu" = generic ] && cpu=$(probe_arm_arch)
3166
3167     case $cpu in
3168         armv*)
3169             cpuflags="-march=$cpu"
3170             subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
3171         ;;
3172         *)
3173             cpuflags="-mcpu=$cpu"
3174             case $cpu in
3175                 cortex-a*)                               subarch=armv7a  ;;
3176                 cortex-r*)                               subarch=armv7r  ;;
3177                 cortex-m*)                 enable thumb; subarch=armv7m  ;;
3178                 arm11*)                                  subarch=armv6   ;;
3179                 arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
3180                 armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
3181                 *)                             subarch=$(probe_arm_arch) ;;
3182             esac
3183         ;;
3184     esac
3185
3186     case "$subarch" in
3187         armv5t*)    enable fast_clz                ;;
3188         armv[6-8]*) enable fast_clz fast_unaligned ;;
3189     esac
3190
3191 elif enabled avr32; then
3192
3193     case $cpu in
3194         ap7[02]0[0-2])
3195             subarch="avr32_ap"
3196             cpuflags="-mpart=$cpu"
3197         ;;
3198         ap)
3199             subarch="avr32_ap"
3200             cpuflags="-march=$cpu"
3201         ;;
3202         uc3[ab]*)
3203             subarch="avr32_uc"
3204             cpuflags="-mcpu=$cpu"
3205         ;;
3206         uc)
3207             subarch="avr32_uc"
3208             cpuflags="-march=$cpu"
3209         ;;
3210     esac
3211
3212 elif enabled bfin; then
3213
3214     cpuflags="-mcpu=$cpu"
3215
3216 elif enabled mips; then
3217
3218     cpuflags="-march=$cpu"
3219
3220 elif enabled ppc; then
3221
3222     disable ldbrx
3223
3224     case $(tolower $cpu) in
3225         601|ppc601|powerpc601)
3226             cpuflags="-mcpu=601"
3227             disable altivec
3228         ;;
3229         603*|ppc603*|powerpc603*)
3230             cpuflags="-mcpu=603"
3231             disable altivec
3232         ;;
3233         604*|ppc604*|powerpc604*)
3234             cpuflags="-mcpu=604"
3235             disable altivec
3236         ;;
3237         g3|75*|ppc75*|powerpc75*)
3238             cpuflags="-mcpu=750"
3239             disable altivec
3240         ;;
3241         g4|745*|ppc745*|powerpc745*)
3242             cpuflags="-mcpu=7450"
3243         ;;
3244         74*|ppc74*|powerpc74*)
3245             cpuflags="-mcpu=7400"
3246         ;;
3247         g5|970|ppc970|powerpc970)
3248             cpuflags="-mcpu=970"
3249         ;;
3250         power[3-7]*)
3251             cpuflags="-mcpu=$cpu"
3252         ;;
3253         cell)
3254             cpuflags="-mcpu=cell"
3255             enable ldbrx
3256         ;;
3257         e500mc)
3258             cpuflags="-mcpu=e500mc"
3259             disable altivec
3260         ;;
3261         e500v2)
3262             cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
3263             disable altivec
3264             disable dcbzl
3265         ;;
3266         e500)
3267             cpuflags="-mcpu=8540 -mhard-float"
3268             disable altivec
3269             disable dcbzl
3270         ;;
3271     esac
3272
3273 elif enabled sparc; then
3274
3275     case $cpu in
3276         cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
3277             cpuflags="-mcpu=$cpu"
3278         ;;
3279         ultrasparc*|niagara[234])
3280             cpuflags="-mcpu=$cpu"
3281         ;;
3282     esac
3283
3284 elif enabled x86; then
3285
3286     case $cpu in
3287         i[345]86|pentium)
3288             cpuflags="-march=$cpu"
3289             disable mmx
3290         ;;
3291         # targets that do NOT support nopl and conditional mov (cmov)
3292         pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
3293             cpuflags="-march=$cpu"
3294             disable i686
3295         ;;
3296         # targets that do support nopl and conditional mov (cmov)
3297         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*)
3298             cpuflags="-march=$cpu"
3299             enable i686
3300             enable fast_cmov
3301         ;;
3302         # targets that do support conditional mov but on which it's slow
3303         pentium4|pentium4m|prescott|nocona)
3304             cpuflags="-march=$cpu"
3305             enable i686
3306             disable fast_cmov
3307         ;;
3308     esac
3309
3310 fi
3311
3312 if [ "$cpu" != generic ]; then
3313     add_cflags  $cpuflags
3314     add_asflags $cpuflags
3315 fi
3316
3317 # compiler sanity check
3318 check_exec <<EOF
3319 int main(void){ return 0; }
3320 EOF
3321 if test "$?" != 0; then
3322     echo "$cc is unable to create an executable file."
3323     if test -z "$cross_prefix" && ! enabled cross_compile ; then
3324         echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
3325         echo "Only do this if you know what cross compiling means."
3326     fi
3327     die "C compiler test failed."
3328 fi
3329
3330 add_cppflags -D_ISOC99_SOURCE
3331 check_cflags -std=c99
3332 check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
3333 #include <stdlib.h>
3334 EOF
3335 check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
3336 #include <stdlib.h>
3337 EOF
3338
3339 add_host_cppflags -D_ISOC99_SOURCE
3340 check_host_cflags -std=c99
3341 check_host_cflags -Wall
3342 check_host_cflags -O3
3343
3344 check_64bit(){
3345     arch32=$1
3346     arch64=$2
3347     expr=$3
3348     check_code cc "" "int test[2*($expr) - 1]" &&
3349         subarch=$arch64 || subarch=$arch32
3350 }
3351
3352 case "$arch" in
3353     aarch64|alpha|ia64)
3354         spic=$shared
3355     ;;
3356     mips)
3357         check_64bit mips mips64 '_MIPS_SIM > 1'
3358         spic=$shared
3359     ;;
3360     parisc)
3361         check_64bit parisc parisc64 'sizeof(void *) > 4'
3362         spic=$shared
3363     ;;
3364     ppc)
3365         check_64bit ppc ppc64 'sizeof(void *) > 4'
3366         spic=$shared
3367     ;;
3368     s390)
3369         check_64bit s390 s390x 'sizeof(void *) > 4'
3370         spic=$shared
3371     ;;
3372     sparc)
3373         check_64bit sparc sparc64 'sizeof(void *) > 4'
3374         spic=$shared
3375     ;;
3376     x86)
3377         check_64bit x86_32 x86_64 'sizeof(void *) > 4'
3378         if test "$subarch" = "x86_64"; then
3379             spic=$shared
3380         fi
3381     ;;
3382 esac
3383
3384 enable $subarch
3385 enabled spic && enable_weak pic
3386
3387 # OS specific
3388 case $target_os in
3389     aix)
3390         SHFLAGS=-shared
3391         add_cppflags '-I\$(SRC_PATH)/compat/aix'
3392         enabled shared && add_ldflags -Wl,-brtl
3393         ;;
3394     android)
3395         disable symver
3396         SLIB_INSTALL_NAME='$(SLIBNAME)'
3397         SLIB_INSTALL_LINKS=
3398         # soname not set on purpose
3399         SHFLAGS=-shared
3400         ;;
3401     haiku)
3402         prefix_default="/boot/common"
3403         network_extralibs="-lnetwork"
3404         host_libs=
3405         ;;
3406     sunos)
3407         SHFLAGS='-shared -Wl,-h,$$(@F)'
3408         enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
3409         network_extralibs="-lsocket -lnsl"
3410         # When using suncc to build, the Solaris linker will mark
3411         # an executable with each instruction set encountered by
3412         # the Solaris assembler.  As our libraries contain their own
3413         # guards for processor-specific code, instead suppress
3414         # generation of the HWCAPS ELF section on Solaris x86 only.
3415         enabled_all suncc x86 &&
3416             echo "hwcap_1 = OVERRIDE;" > mapfile &&
3417             add_ldflags -Wl,-M,mapfile
3418         nm_default='nm -P -g'
3419         ;;
3420     netbsd)
3421         disable symver
3422         oss_indev_extralibs="-lossaudio"
3423         oss_outdev_extralibs="-lossaudio"
3424         ;;
3425     openbsd|bitrig)
3426         disable symver
3427         SHFLAGS='-shared'
3428         SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
3429         SLIB_INSTALL_LINKS=
3430         oss_indev_extralibs="-lossaudio"
3431         oss_outdev_extralibs="-lossaudio"
3432         ;;
3433     dragonfly)
3434         disable symver
3435         ;;
3436     freebsd)
3437         ;;
3438     bsd/os)
3439         add_extralibs -lpoll -lgnugetopt
3440         ;;
3441     darwin)
3442         enabled ppc && add_asflags -force_cpusubtype_ALL
3443         SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
3444         enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
3445         add_ldflags -Wl,-dynamic,-search_paths_first
3446         SLIBSUF=".dylib"
3447         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
3448         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
3449         objformat="macho"
3450         enabled x86_64 && objformat="macho64"
3451         enabled_any pic shared ||
3452             { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
3453         ;;
3454     mingw32*)
3455         if test $target_os = "mingw32ce"; then
3456             disable network
3457         else
3458             target_os=mingw32
3459         fi
3460         LIBTARGET=i386
3461         if enabled x86_64; then
3462             LIBTARGET="i386:x86-64"
3463         elif enabled arm; then
3464             LIBTARGET=arm-wince
3465         fi
3466         check_ldflags -Wl,--nxcompat
3467         check_ldflags -Wl,--dynamicbase
3468         shlibdir_default="$bindir_default"
3469         SLIBPREF=""
3470         SLIBSUF=".dll"
3471         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3472         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3473         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)'
3474         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3475         SLIB_INSTALL_LINKS=
3476         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3477         SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3478         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'
3479         objformat="win32"
3480         dlltool="${cross_prefix}dlltool"
3481         ranlib=:
3482         enable dos_paths
3483         ;;
3484     win32|win64)
3485         disable symver
3486         if enabled shared; then
3487             # Link to the import library instead of the normal static library
3488             # for shared libs.
3489             LD_LIB='%.lib'
3490             # Cannot build both shared and static libs with MSVC or icl.
3491             disable static
3492         fi
3493         shlibdir_default="$bindir_default"
3494         SLIBPREF=""
3495         SLIBSUF=".dll"
3496         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3497         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3498         SLIB_CREATE_DEF_CMD='$(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
3499         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3500         SLIB_INSTALL_LINKS=
3501         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3502         SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3503         SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
3504         objformat="win32"
3505         ranlib=:
3506         enable dos_paths
3507         ;;
3508     cygwin*)
3509         target_os=cygwin
3510         shlibdir_default="$bindir_default"
3511         SLIBPREF="cyg"
3512         SLIBSUF=".dll"
3513         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3514         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3515         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3516         SLIB_INSTALL_LINKS=
3517         SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a'
3518         SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a'
3519         objformat="win32"
3520         enable dos_paths
3521         ;;
3522     *-dos|freedos|opendos)
3523         network_extralibs="-lsocket"
3524         objformat="coff"
3525         enable dos_paths
3526         add_cppflags -U__STRICT_ANSI__
3527         ;;
3528     linux)
3529         enable dv1394
3530         ;;
3531     irix*)
3532         target_os=irix
3533         ranlib="echo ignoring ranlib"
3534         ;;
3535     os/2*)
3536         ln_s="cp -f"
3537         objformat="aout"
3538         add_cppflags -D_GNU_SOURCE
3539         add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
3540         SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
3541         LIBSUF="_s.a"
3542         SLIBPREF=""
3543         SLIBSUF=".dll"
3544         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
3545         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
3546         SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
3547             echo PROTMODE >> $(SUBDIR)$(NAME).def; \
3548             echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
3549             echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
3550             echo EXPORTS >> $(SUBDIR)$(NAME).def; \
3551             emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def'
3552         SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
3553             emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
3554         SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
3555         enable dos_paths
3556         ;;
3557     gnu/kfreebsd)
3558         add_cppflags -D_BSD_SOURCE
3559         ;;
3560     gnu)
3561         ;;
3562     qnx)
3563         add_cppflags -D_QNX_SOURCE
3564         network_extralibs="-lsocket"
3565         ;;
3566     symbian)
3567         SLIBSUF=".dll"
3568         enable dos_paths
3569         add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default
3570         add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS
3571         add_ldflags -Wl,--target1-abs,--no-undefined \
3572                     -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \
3573                     -Wl,--entry=_E32Startup -Wl,-u,_E32Startup
3574         add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \
3575                       -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
3576                       -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
3577         ;;
3578     osf1)
3579         add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
3580         ;;
3581     minix)
3582         ;;
3583     plan9)
3584         add_cppflags -D_C99_SNPRINTF_EXTENSION  \
3585                      -D_REENTRANT_SOURCE        \
3586                      -D_RESEARCH_SOURCE         \
3587                      -DFD_SETSIZE=96            \
3588                      -DHAVE_SOCK_OPTS
3589         add_compat strtod.o strtod=avpriv_strtod
3590         network_extralibs='-lbsd'
3591         exeobjs=compat/plan9/main.o
3592         cp_f='cp'
3593         ;;
3594     none)
3595         ;;
3596     *)
3597         die "Unknown OS '$target_os'."
3598         ;;
3599 esac
3600
3601 # determine libc flavour
3602
3603 probe_libc(){
3604     pfx=$1
3605     pfx_no_=${pfx%_}
3606     # uclibc defines __GLIBC__, so it needs to be checked before glibc.
3607     if check_${pfx}cpp_condition features.h "defined __UCLIBC__"; then
3608         eval ${pfx}libc_type=uclibc
3609         add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3610     elif check_${pfx}cpp_condition features.h "defined __GLIBC__"; then
3611         eval ${pfx}libc_type=glibc
3612         add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3613     # MinGW headers can be installed on Cygwin, so check for newlib first.
3614     elif check_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
3615         eval ${pfx}libc_type=newlib
3616         add_${pfx}cppflags -U__STRICT_ANSI__
3617     # MinGW64 is backwards compatible with MinGW32, so check for it first.
3618     elif check_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then
3619         eval ${pfx}libc_type=mingw64
3620         add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3621         eval test \$${pfx_no_}cc_type = "gcc" &&
3622             add_${pfx}cppflags -D__printf__=__gnu_printf__
3623     elif check_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
3624          check_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
3625         eval ${pfx}libc_type=mingw32
3626         check_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \
3627             (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
3628             die "ERROR: MinGW32 runtime version must be >= 3.15."
3629         add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3630         eval test \$${pfx_no_}cc_type = "gcc" &&
3631             add_${pfx}cppflags -D__printf__=__gnu_printf__
3632     elif check_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
3633         eval ${pfx}libc_type=msvcrt
3634         # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to
3635         # 0x601 by default unless something else is set by the user.
3636         # This can easily lead to us detecting functions only present
3637         # in such new versions and producing binaries requiring windows 7.0.
3638         # Therefore explicitly set the default to XP unless the user has
3639         # set something else on the command line.
3640         check_${pfx}cpp_condition stdlib.h "defined(_WIN32_WINNT)" ||
3641             add_${pfx}cppflags -D_WIN32_WINNT=0x0502
3642     elif check_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then
3643         eval ${pfx}libc_type=klibc
3644     elif check_${pfx}cpp_condition sys/cdefs.h "defined __BIONIC__"; then
3645         eval ${pfx}libc_type=bionic
3646     elif check_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
3647         eval ${pfx}libc_type=solaris
3648         add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
3649     fi
3650 }
3651
3652 probe_libc
3653 test -n "$libc_type" && enable libc_$libc_type
3654 probe_libc host_
3655 test -n "$host_libc_type" && enable host_libc_$host_libc_type
3656
3657 case $libc_type in
3658     bionic)
3659         add_compat strtod.o strtod=avpriv_strtod
3660         ;;
3661     msvcrt)
3662         add_compat strtod.o strtod=avpriv_strtod
3663         add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
3664                                      _snprintf=avpriv_snprintf  \
3665                                      vsnprintf=avpriv_vsnprintf
3666         ;;
3667 esac
3668
3669 # hacks for compiler/libc/os combinations
3670
3671 if enabled_all tms470 libc_glibc; then
3672     CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
3673     add_cppflags -D__USER_LABEL_PREFIX__=
3674     add_cppflags -D__builtin_memset=memset
3675     add_cppflags -D__gnuc_va_list=va_list -D_VA_LIST_DEFINED
3676     add_cflags   -pds=48    # incompatible redefinition of macro
3677 fi
3678
3679 if enabled_all ccc libc_glibc; then
3680     add_ldflags -Wl,-z,now  # calls to libots crash without this
3681 fi
3682
3683 check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
3684     add_cppflags '-I\$(SRC_PATH)/compat/float'
3685
3686 esc(){
3687     echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
3688 }
3689
3690 echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $LIBAV_CONFIGURATION)" >config.fate
3691
3692 check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
3693
3694 set_default $PATHS_LIST
3695 set_default nm
3696
3697 # we need to build at least one lib type
3698 if ! enabled_any static shared; then
3699     cat <<EOF
3700 At least one library type must be built.
3701 Specify --enable-static to build the static libraries or --enable-shared to
3702 build the shared libraries as well. To only build the shared libraries specify
3703 --disable-static in addition to --enable-shared.
3704 EOF
3705     exit 1;
3706 fi
3707
3708 die_license_disabled() {
3709     enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
3710 }
3711
3712 die_license_disabled gpl libcdio
3713 die_license_disabled gpl libx264
3714 die_license_disabled gpl libx265
3715 die_license_disabled gpl libxavs
3716 die_license_disabled gpl libxvid
3717 die_license_disabled gpl x11grab
3718
3719 die_license_disabled nonfree libfaac
3720 die_license_disabled nonfree libfdk_aac
3721 die_license_disabled nonfree openssl
3722
3723 die_license_disabled version3 libopencore_amrnb
3724 die_license_disabled version3 libopencore_amrwb
3725 die_license_disabled version3 libvo_aacenc
3726 die_license_disabled version3 libvo_amrwbenc
3727
3728 enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
3729
3730 disabled optimizations || check_cflags -fomit-frame-pointer
3731
3732 enable_weak_pic() {
3733     disabled pic && return
3734     enable pic
3735     add_cppflags -DPIC
3736     case "$target_os" in
3737     mingw*|cygwin*)
3738         ;;
3739     *)
3740         add_cflags -fPIC
3741         ;;
3742     esac
3743     add_asflags  -fPIC
3744 }
3745
3746 enabled pic && enable_weak_pic
3747
3748 check_cc <<EOF || die "Symbol mangling check failed."
3749 int ff_extern;
3750 EOF
3751 sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
3752 extern_prefix=${sym%%ff_extern*}
3753
3754 check_cc <<EOF && enable_weak inline_asm
3755 void foo(void) { __asm__ volatile ("" ::); }
3756 EOF
3757
3758 _restrict=
3759 for restrict_keyword in restrict __restrict__ __restrict; do
3760     check_cc <<EOF && _restrict=$restrict_keyword && break
3761 void foo(char * $restrict_keyword p);
3762 EOF
3763 done
3764
3765 check_cc <<EOF && enable pragma_deprecated
3766 void foo(void) { _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") }
3767 EOF
3768
3769 check_cc <<EOF && enable attribute_packed
3770 struct { int x; } __attribute__((packed)) x;
3771 EOF
3772
3773 check_cc <<EOF && enable attribute_may_alias
3774 union { int x; } __attribute__((may_alias)) x;
3775 EOF
3776
3777 check_cc <<EOF || die "endian test failed"
3778 unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
3779 EOF
3780 od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
3781
3782 check_gas() {
3783     log "check_gas using '$as' as AS"
3784     # :vararg is used on aarch64, arm and ppc altivec
3785     check_as <<EOF || return 1
3786 .macro m n, y:vararg=0
3787 \n: .int \y
3788 .endm
3789 m x
3790 EOF
3791     # .altmacro is only used in arm asm
3792     ! enabled arm || check_as <<EOF || return 1
3793 .altmacro
3794 EOF
3795     enable gnu_as
3796     return 0
3797 }
3798
3799 if enabled_any arm aarch64 || enabled_all ppc altivec && enabled asm; then
3800     nogas=:
3801     enabled_any arm aarch64 && nogas=die
3802     enabled_all ppc altivec && nogas=warn
3803     as_noop=-v
3804
3805     case $as_type in
3806         arm*) gaspp_as_type=armasm; as_noop=-h ;;
3807         gcc)  gaspp_as_type=gas ;;
3808         *)    gaspp_as_type=$as_type ;;
3809     esac
3810
3811     [ $target_os = "darwin" ] && gaspp_as_type="apple-$gaspp_as_type"
3812
3813     check_cmd gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- $as $as_noop &&
3814         gas="gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- $as"
3815
3816     if ! check_gas ; then
3817         as=${gas:=$as}
3818         check_gas || \
3819             $nogas "GNU assembler not found, install/update gas-preprocessor"
3820     fi
3821
3822     check_as <<EOF && enable as_func
3823 .func test
3824 .endfunc
3825 EOF
3826 fi
3827
3828 check_inline_asm inline_asm_labels '"1:\n"'
3829
3830 if enabled aarch64; then
3831     enabled armv8 && check_insn armv8 'prfm   pldl1strm, [x0]'
3832     # internal assembler in clang 3.3 does not support this instruction
3833     enabled neon && check_insn neon 'ext   v0.8B, v0.8B, v1.8B, #1'
3834     enabled vfp  && check_insn vfp  'fmadd d0,    d0,    d1,    d2'
3835
3836     map 'enabled_any ${v}_external ${v}_inline || disable $v' $ARCH_EXT_LIST_ARM
3837
3838 elif enabled alpha; then
3839
3840     check_cflags -mieee
3841
3842 elif enabled arm; then
3843
3844     check_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb
3845     enabled thumb && check_cflags -mthumb || check_cflags -marm
3846
3847     if     check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then
3848         enable vfp_args
3849     elif ! check_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__"; then
3850         case "${cross_prefix:-$cc}" in
3851             *hardfloat*)         enable vfp_args;   fpabi=vfp ;;
3852             *) check_ld <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
3853 __asm__ (".eabi_attribute 28, 1");
3854 int main(void) { return 0; }
3855 EOF
3856         esac
3857         warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
3858     fi
3859
3860     enabled armv5te && check_insn armv5te 'qadd r0, r0, r0'
3861     enabled armv6   && check_insn armv6   'sadd16 r0, r0, r0'
3862     enabled armv6t2 && check_insn armv6t2 'movt r0, #0'
3863     enabled neon    && check_insn neon    'vadd.i16 q0, q0, q0'
3864     enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
3865     enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'
3866
3867     [ $target_os = linux ] || [ $target_os = android ] ||
3868         map 'enabled_any ${v}_external ${v}_inline || disable $v' \
3869             $ARCH_EXT_LIST_ARM
3870
3871     check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
3872
3873     check_as <<EOF && enable as_dn_directive
3874 ra .dn d0.i16
3875 .unreq ra
3876 EOF
3877
3878     [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
3879
3880 elif enabled mips; then
3881
3882     check_inline_asm loongson '"dmult.g $1, $2, $3"'
3883
3884 elif enabled parisc; then
3885
3886     if enabled gcc; then
3887         case $($cc -dumpversion) in
3888             4.[3-8].*) check_cflags -fno-optimize-sibling-calls ;;
3889         esac
3890     fi
3891
3892 elif enabled ppc; then
3893
3894     enable local_aligned_8 local_aligned_16
3895
3896     check_inline_asm dcbzl     '"dcbzl 0, %0" :: "r"(0)'
3897     check_inline_asm ibm_asm   '"add 0, 0, 0"'
3898     check_inline_asm ppc4xx    '"maclhw r10, r11, r12"'
3899     check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'
3900
3901     # AltiVec flags: The FSF version of GCC differs from the Apple version
3902     if enabled altivec; then
3903         check_cflags -maltivec -mabi=altivec &&
3904         { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } ||
3905         check_cflags -faltivec
3906
3907         # check if our compiler supports Motorola AltiVec C API
3908         check_cc <<EOF || disable altivec
3909 $inc_altivec_h
3910 int main(void) {
3911     vector signed int v1 = (vector signed int) { 0 };
3912     vector signed int v2 = (vector signed int) { 1 };
3913     v1 = vec_add(v1, v2);
3914     return 0;
3915 }
3916 EOF
3917
3918         enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
3919     fi
3920
3921 elif enabled x86; then
3922
3923     check_builtin rdtsc    intrin.h   "__rdtsc()"
3924     check_builtin mm_empty mmintrin.h "_mm_empty()"
3925
3926     enable local_aligned_8 local_aligned_16
3927
3928     # check whether EBP is available on x86
3929     # As 'i' is stored on the stack, this program will crash
3930     # if the base pointer is used to access it because the
3931     # base pointer is cleared in the inline assembly code.
3932     check_exec_crash <<EOF && enable ebp_available
3933 volatile int i=0;
3934 __asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
3935 return i;
3936 EOF
3937
3938     # check whether EBX is available on x86
3939     check_inline_asm ebx_available '""::"b"(0)' &&
3940         check_inline_asm ebx_available '"":::"%ebx"'
3941
3942     # check whether xmm clobbers are supported
3943     check_inline_asm xmm_clobbers '"":::"%xmm0"'
3944
3945     # check whether binutils is new enough to compile SSSE3/MMXEXT
3946     enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
3947     enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
3948
3949     if ! disabled_any asm mmx yasm; then
3950         if check_cmd $yasmexe --version; then
3951             enabled x86_64 && yasm_extra="-m amd64"
3952             yasm_debug="-g dwarf2"
3953         elif check_cmd nasm -v; then
3954             yasmexe=nasm
3955             yasm_debug="-g -F dwarf"
3956             enabled x86_64 && test "$objformat" = elf && objformat=elf64
3957         fi
3958
3959         YASMFLAGS="-f $objformat $yasm_extra"
3960         enabled pic               && append YASMFLAGS "-DPIC"
3961         test -n "$extern_prefix"  && append YASMFLAGS "-DPREFIX"
3962         case "$objformat" in
3963             elf*) enabled debug && append YASMFLAGS $yasm_debug ;;
3964         esac
3965
3966         check_yasm "movbe ecx, [5]" && enable yasm ||
3967             die "yasm/nasm not found or too old. Use --disable-yasm for a crippled build."
3968         check_yasm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
3969         check_yasm "vfmadd132ps ymm0, ymm1, ymm2"    || disable fma3_external
3970         check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
3971         check_yasm "CPU amdnop" || disable cpunop
3972     fi
3973
3974     case "$cpu" in
3975         athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
3976             disable fast_clz
3977         ;;
3978     esac
3979
3980 fi
3981
3982 check_code cc arm_neon.h "int16x8_t test = vdupq_n_s16(0)" && enable intrinsics_neon
3983
3984 check_ldflags -Wl,--as-needed
3985
3986 if check_func dlopen; then
3987     ldl=
3988 elif check_func dlopen -ldl; then
3989     ldl=-ldl
3990 fi
3991
3992 if ! disabled network; then
3993     check_func getaddrinfo $network_extralibs
3994     check_func getservbyport $network_extralibs
3995     check_func inet_aton $network_extralibs
3996
3997     check_type netdb.h "struct addrinfo"
3998     check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
3999     check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
4000     check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
4001     check_type poll.h "struct pollfd"
4002     check_type netinet/sctp.h "struct sctp_event_subscribe"
4003     check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
4004     check_type netinet/in.h "struct sockaddr_in6"
4005     check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
4006     check_type "sys/types.h sys/socket.h" socklen_t
4007
4008     # Prefer arpa/inet.h over winsock2
4009     if check_header arpa/inet.h ; then
4010         check_func closesocket
4011     elif check_header winsock2.h ; then
4012         check_func_headers winsock2.h closesocket -lws2 &&
4013             network_extralibs="-lws2" ||
4014         { check_func_headers winsock2.h closesocket -lws2_32 &&
4015             network_extralibs="-lws2_32"; } || disable winsock2_h network
4016         check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
4017
4018         check_type ws2tcpip.h socklen_t
4019         check_type ws2tcpip.h "struct addrinfo"
4020         check_type ws2tcpip.h "struct group_source_req"
4021         check_type ws2tcpip.h "struct ip_mreq_source"
4022         check_type ws2tcpip.h "struct ipv6_mreq"
4023         check_type winsock2.h "struct pollfd"
4024         check_struct winsock2.h "struct sockaddr" sa_len
4025         check_type ws2tcpip.h "struct sockaddr_in6"
4026         check_type ws2tcpip.h "struct sockaddr_storage"
4027     else
4028         disable network
4029     fi
4030 fi
4031
4032 check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
4033 check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
4034 check_builtin MemoryBarrier windows.h "MemoryBarrier()"
4035 check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
4036
4037 check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
4038 check_func  ${malloc_prefix}memalign            && enable memalign
4039 check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
4040
4041 check_func  fcntl
4042 check_func  fork
4043 check_func  gethrtime
4044 check_func  getopt
4045 check_func  getrusage
4046 check_func  gettimeofday
4047 check_func  isatty
4048 check_func  localtime_r
4049 check_func  mach_absolute_time
4050 check_func  mkstemp