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