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