lavc: do not compile fmtconvert unconditionally
[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     fmtconvert
1571     gcrypt
1572     golomb
1573     gplv3
1574     h263dsp
1575     h264chroma
1576     h264dsp
1577     h264pred
1578     h264qpel
1579     hpeldsp
1580     huffman
1581     huffyuvdsp
1582     huffyuvencdsp
1583     idctdsp
1584     iirfilter
1585     imdct15
1586     intrax8
1587     lgplv3
1588     lpc
1589     me_cmp
1590     mpeg_er
1591     mpegaudio
1592     mpegaudiodsp
1593     mpegvideo
1594     mpegvideoenc
1595     nettle
1596     pixblockdsp
1597     qpeldsp
1598     rangecoder
1599     riffdec
1600     riffenc
1601     rtpdec
1602     rtpenc_chain
1603     sinewin
1604     startcode
1605     tpeldsp
1606     videodsp
1607     vp3dsp
1608     wma_freqs
1609 "
1610
1611 CMDLINE_SELECT="
1612     $ARCH_EXT_LIST
1613     $CONFIG_LIST
1614     $HAVE_LIST_CMDLINE
1615     $THREADS_LIST
1616     asm
1617     cross_compile
1618     debug
1619     extra_warnings
1620     logging
1621     lto
1622     optimizations
1623     rpath
1624 "
1625
1626 PATHS_LIST="
1627     bindir
1628     datadir
1629     docdir
1630     incdir
1631     libdir
1632     mandir
1633     prefix
1634     shlibdir
1635 "
1636
1637 CMDLINE_SET="
1638     $PATHS_LIST
1639     ar
1640     arch
1641     as
1642     build_suffix
1643     cc
1644     cpu
1645     cross_prefix
1646     dep_cc
1647     extra_version
1648     host_cc
1649     host_cflags
1650     host_ld
1651     host_ldflags
1652     host_libs
1653     host_os
1654     ld
1655     logfile
1656     malloc_prefix
1657     nm
1658     optflags
1659     pkg_config
1660     pkg_config_flags
1661     random_seed
1662     samples
1663     sysinclude
1664     sysroot
1665     target_exec
1666     target_os
1667     target_path
1668     target_samples
1669     toolchain
1670 "
1671
1672 CMDLINE_APPEND="
1673     extra_cflags
1674     host_cppflags
1675 "
1676
1677 # code dependency declarations
1678
1679 # architecture extensions
1680
1681 armv5te_deps="arm"
1682 armv6_deps="arm"
1683 armv6t2_deps="arm"
1684 armv8_deps="aarch64"
1685 neon_deps_any="aarch64 arm"
1686 intrinsics_neon_deps="neon"
1687 vfp_deps_any="aarch64 arm"
1688 vfpv3_deps="vfp"
1689
1690 map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM
1691
1692 altivec_deps="ppc"
1693 ppc4xx_deps="ppc"
1694
1695 cpunop_deps="i686"
1696 x86_64_select="i686"
1697 x86_64_suggest="fast_cmov"
1698
1699 amd3dnow_deps="mmx"
1700 amd3dnowext_deps="amd3dnow"
1701 i686_deps="x86"
1702 mmx_deps="x86"
1703 mmxext_deps="mmx"
1704 sse_deps="mmxext"
1705 sse2_deps="sse"
1706 sse3_deps="sse2"
1707 ssse3_deps="sse3"
1708 sse4_deps="ssse3"
1709 sse42_deps="sse4"
1710 avx_deps="sse42"
1711 xop_deps="avx"
1712 fma3_deps="avx"
1713 fma4_deps="avx"
1714 avx2_deps="avx"
1715
1716 mmx_external_deps="yasm"
1717 mmx_inline_deps="inline_asm"
1718 mmx_suggest="mmx_external mmx_inline"
1719
1720 for ext in $(filter_out mmx $ARCH_EXT_LIST_X86_SIMD); do
1721     eval dep=\$${ext}_deps
1722     eval ${ext}_external_deps='"${dep}_external"'
1723     eval ${ext}_inline_deps='"${dep}_inline"'
1724     eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
1725 done
1726
1727 aligned_stack_if_any="aarch64 ppc x86"
1728 fast_64bit_if_any="aarch64 alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
1729 fast_clz_if_any="aarch64 alpha avr32 mips ppc x86"
1730 fast_unaligned_if_any="aarch64 ppc x86"
1731 simd_align_16_if_any="altivec neon sse"
1732
1733 # system capabilities
1734 log2_deps="!libc_msvcrt"
1735
1736 symver_if_any="symver_asm_label symver_gnu_asm"
1737
1738 # threading support
1739 atomics_gcc_if="sync_val_compare_and_swap"
1740 atomics_suncc_if="atomic_cas_ptr machine_rw_barrier"
1741 atomics_win32_if="MemoryBarrier"
1742 atomics_native_if_any="$ATOMICS_LIST"
1743 w32threads_deps="atomics_native"
1744 threads_if_any="$THREADS_LIST"
1745
1746 # subsystems
1747 dct_select="rdft"
1748 error_resilience_select="me_cmp"
1749 faandct_deps="faan fdctdsp"
1750 faanidct_deps="faan idctdsp"
1751 intrax8_select="error_resilience"
1752 mdct_select="fft"
1753 rdft_select="fft"
1754 me_cmp_select="fdctdsp idctdsp pixblockdsp"
1755 mpeg_er_select="error_resilience"
1756 mpegaudio_select="mpegaudiodsp"
1757 mpegaudiodsp_select="dct"
1758 mpegvideo_select="blockdsp hpeldsp idctdsp me_cmp videodsp"
1759 mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
1760
1761 # decoders / encoders
1762 aac_decoder_select="imdct15 mdct sinewin"
1763 aac_encoder_select="audio_frame_queue iirfilter mdct sinewin"
1764 aac_latm_decoder_select="aac_decoder aac_latm_parser"
1765 ac3_decoder_select="ac3_parser ac3dsp bswapdsp fmtconvert mdct"
1766 ac3_encoder_select="ac3dsp audiodsp mdct me_cmp"
1767 ac3_fixed_encoder_select="ac3dsp audiodsp mdct me_cmp"
1768 aic_decoder_select="golomb idctdsp"
1769 alac_encoder_select="lpc"
1770 als_decoder_select="bswapdsp"
1771 amrnb_decoder_select="lsp"
1772 amrwb_decoder_select="lsp"
1773 amv_decoder_select="sp5x_decoder"
1774 ape_decoder_select="bswapdsp"
1775 asv1_decoder_select="blockdsp bswapdsp idctdsp"
1776 asv1_encoder_select="bswapdsp fdctdsp pixblockdsp"
1777 asv2_decoder_select="blockdsp bswapdsp idctdsp"
1778 asv2_encoder_select="bswapdsp fdctdsp pixblockdsp"
1779 atrac1_decoder_select="mdct sinewin"
1780 atrac3_decoder_select="mdct"
1781 atrac3p_decoder_select="mdct sinewin"
1782 bink_decoder_select="blockdsp hpeldsp"
1783 binkaudio_dct_decoder_select="mdct rdft dct sinewin wma_freqs"
1784 binkaudio_rdft_decoder_select="mdct rdft sinewin wma_freqs"
1785 cavs_decoder_select="blockdsp golomb h264chroma idctdsp qpeldsp videodsp"
1786 cllc_decoder_select="bswapdsp"
1787 comfortnoise_encoder_select="lpc"
1788 cook_decoder_select="audiodsp mdct sinewin"
1789 cscd_decoder_select="lzo"
1790 cscd_decoder_suggest="zlib"
1791 dca_decoder_select="fmtconvert mdct"
1792 dnxhd_decoder_select="blockdsp idctdsp"
1793 dnxhd_encoder_select="aandcttables blockdsp fdctdsp idctdsp mpegvideoenc pixblockdsp"
1794 dvvideo_decoder_select="dvprofile idctdsp"
1795 dvvideo_encoder_select="dvprofile fdctdsp me_cmp pixblockdsp"
1796 dxa_decoder_deps="zlib"
1797 eac3_decoder_select="ac3_decoder"
1798 eac3_encoder_select="ac3_encoder"
1799 eamad_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpegvideo"
1800 eatgq_decoder_select="aandcttables idctdsp"
1801 eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpeg1video_decoder"
1802 exr_decoder_deps="zlib"
1803 ffv1_decoder_select="golomb rangecoder"
1804 ffv1_encoder_select="rangecoder"
1805 ffvhuff_decoder_select="huffyuv_decoder"
1806 ffvhuff_encoder_select="huffyuv_encoder"
1807 fic_decoder_select="golomb"
1808 flac_decoder_select="golomb"
1809 flac_encoder_select="bswapdsp golomb lpc"
1810 flashsv_decoder_deps="zlib"
1811 flashsv_encoder_deps="zlib"
1812 flashsv2_decoder_deps="zlib"
1813 flv_decoder_select="h263_decoder"
1814 flv_encoder_select="h263_encoder"
1815 fourxm_decoder_select="blockdsp bswapdsp"
1816 fraps_decoder_select="bswapdsp huffman"
1817 g2m_decoder_deps="zlib"
1818 g2m_decoder_select="blockdsp idctdsp"
1819 h261_decoder_select="mpeg_er mpegvideo"
1820 h261_encoder_select="aandcttables mpegvideoenc"
1821 h263_decoder_select="error_resilience h263_parser h263dsp mpeg_er mpegvideo qpeldsp"
1822 h263_encoder_select="aandcttables h263dsp mpegvideoenc"
1823 h263i_decoder_select="h263_decoder"
1824 h263p_encoder_select="h263_encoder"
1825 h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel startcode videodsp"
1826 h264_decoder_suggest="error_resilience"
1827 h264_qsv_decoder_deps="libmfx"
1828 h264_qsv_decoder_select="h264_mp4toannexb_bsf h264_parser qsv h264_qsv_hwaccel"
1829 hevc_decoder_select="bswapdsp cabac golomb videodsp"
1830 huffyuv_decoder_select="bswapdsp huffyuvdsp"
1831 huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp"
1832 iac_decoder_select="imc_decoder"
1833 imc_decoder_select="bswapdsp fft mdct sinewin"
1834 indeo3_decoder_select="hpeldsp"
1835 interplay_video_decoder_select="hpeldsp"
1836 jpegls_decoder_select="golomb mjpeg_decoder"
1837 jpegls_encoder_select="golomb"
1838 jv_decoder_select="blockdsp"
1839 lagarith_decoder_select="huffyuvdsp"
1840 ljpeg_encoder_select="aandcttables idctdsp"
1841 loco_decoder_select="golomb"
1842 mdec_decoder_select="blockdsp idctdsp mpegvideo"
1843 metasound_decoder_select="lsp mdct sinewin"
1844 mimic_decoder_select="blockdsp bswapdsp hpeldsp idctdsp"
1845 mjpeg_decoder_select="blockdsp hpeldsp idctdsp"
1846 mjpeg_encoder_select="aandcttables mpegvideoenc"
1847 mjpegb_decoder_select="mjpeg_decoder"
1848 mlp_decoder_select="mlp_parser"
1849 motionpixels_decoder_select="bswapdsp"
1850 mp1_decoder_select="mpegaudio"
1851 mp1float_decoder_select="mpegaudio"
1852 mp2_decoder_select="mpegaudio"
1853 mp2float_decoder_select="mpegaudio"
1854 mp3_decoder_select="mpegaudio"
1855 mp3adu_decoder_select="mpegaudio"
1856 mp3adufloat_decoder_select="mpegaudio"
1857 mp3float_decoder_select="mpegaudio"
1858 mp3on4_decoder_select="mpegaudio"
1859 mp3on4float_decoder_select="mpegaudio"
1860 mpc7_decoder_select="bswapdsp mpegaudiodsp"
1861 mpc8_decoder_select="mpegaudiodsp"
1862 mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
1863 mpeg_xvmc_decoder_select="mpeg2video_decoder"
1864 mpeg1video_decoder_select="error_resilience mpeg_er mpegvideo"
1865 mpeg1video_encoder_select="aandcttables mpegvideoenc"
1866 mpeg2video_decoder_select="error_resilience mpeg_er mpegvideo"
1867 mpeg2video_encoder_select="aandcttables mpegvideoenc"
1868 mpeg4_decoder_select="h263_decoder mpeg4video_parser"
1869 mpeg4_encoder_select="h263_encoder"
1870 msmpeg4v1_decoder_select="h263_decoder"
1871 msmpeg4v2_decoder_select="h263_decoder"
1872 msmpeg4v2_encoder_select="h263_encoder"
1873 msmpeg4v3_decoder_select="h263_decoder"
1874 msmpeg4v3_encoder_select="h263_encoder"
1875 mss2_decoder_select="error_resilience mpeg_er qpeldsp vc1_decoder"
1876 mxpeg_decoder_select="mjpeg_decoder"
1877 nellymoser_decoder_select="mdct sinewin"
1878 nellymoser_encoder_select="audio_frame_queue mdct sinewin"
1879 nuv_decoder_select="idctdsp lzo"
1880 on2avc_decoder_select="mdct"
1881 opus_decoder_deps="avresample"
1882 opus_decoder_select="imdct15"
1883 png_decoder_deps="zlib"
1884 png_encoder_deps="zlib"
1885 png_encoder_select="huffyuvencdsp"
1886 prores_decoder_select="idctdsp"
1887 prores_encoder_select="fdctdsp"
1888 qcelp_decoder_select="lsp"
1889 qdm2_decoder_select="mdct rdft mpegaudiodsp"
1890 ra_144_encoder_select="audio_frame_queue lpc"
1891 ralf_decoder_select="golomb"
1892 rv10_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
1893 rv10_encoder_select="h263_encoder"
1894 rv20_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
1895 rv20_encoder_select="h263_encoder"
1896 rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo videodsp"
1897 rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo videodsp"
1898 shorten_decoder_select="golomb"
1899 sipr_decoder_select="lsp"
1900 sp5x_decoder_select="mjpeg_decoder"
1901 svq1_decoder_select="hpeldsp"
1902 svq1_encoder_select="aandcttables hpeldsp me_cmp mpegvideoenc"
1903 svq3_decoder_select="h264_decoder hpeldsp tpeldsp"
1904 svq3_decoder_suggest="zlib"
1905 tak_decoder_select="audiodsp"
1906 theora_decoder_select="vp3_decoder"
1907 thp_decoder_select="mjpeg_decoder"
1908 tiff_decoder_suggest="zlib"
1909 tiff_encoder_suggest="zlib"
1910 truehd_decoder_select="mlp_decoder"
1911 truemotion2_decoder_select="bswapdsp"
1912 truespeech_decoder_select="bswapdsp"
1913 tscc_decoder_deps="zlib"
1914 twinvq_decoder_select="mdct lsp sinewin"
1915 utvideo_decoder_select="bswapdsp"
1916 utvideo_encoder_select="bswapdsp huffman huffyuvencdsp"
1917 vble_decoder_select="huffyuvdsp"
1918 vc1_decoder_select="blockdsp error_resilience h263_decoder h264chroma h264qpel intrax8 mpeg_er qpeldsp startcode"
1919 vc1image_decoder_select="vc1_decoder"
1920 vorbis_decoder_select="mdct"
1921 vorbis_encoder_select="mdct"
1922 vp3_decoder_select="hpeldsp vp3dsp videodsp"
1923 vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp"
1924 vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp"
1925 vp6a_decoder_select="vp6_decoder"
1926 vp6f_decoder_select="vp6_decoder"
1927 vp7_decoder_select="h264pred videodsp"
1928 vp8_decoder_select="h264pred videodsp"
1929 vp9_decoder_select="videodsp"
1930 webp_decoder_select="vp8_decoder"
1931 wmapro_decoder_select="mdct sinewin wma_freqs"
1932 wmav1_decoder_select="mdct sinewin wma_freqs"
1933 wmav1_encoder_select="mdct sinewin wma_freqs"
1934 wmav2_decoder_select="mdct sinewin wma_freqs"
1935 wmav2_encoder_select="mdct sinewin wma_freqs"
1936 wmavoice_decoder_select="lsp rdft dct mdct sinewin"
1937 wmv1_decoder_select="h263_decoder"
1938 wmv1_encoder_select="h263_encoder"
1939 wmv2_decoder_select="blockdsp h263_decoder idctdsp intrax8 videodsp"
1940 wmv2_encoder_select="h263_encoder"
1941 wmv3_decoder_select="vc1_decoder"
1942 wmv3image_decoder_select="wmv3_decoder"
1943 zerocodec_decoder_deps="zlib"
1944 zlib_decoder_deps="zlib"
1945 zlib_encoder_deps="zlib"
1946 zmbv_decoder_deps="zlib"
1947 zmbv_encoder_deps="zlib"
1948
1949 # hardware accelerators
1950 dxva2_deps="dxva2api_h"
1951 vaapi_deps="va_va_h"
1952 vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
1953 vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore"
1954 vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"
1955
1956 h263_vaapi_hwaccel_deps="vaapi"
1957 h263_vaapi_hwaccel_select="h263_decoder"
1958 h263_vdpau_hwaccel_deps="vdpau"
1959 h263_vdpau_hwaccel_select="h263_decoder"
1960 h264_dxva2_hwaccel_deps="dxva2"
1961 h264_dxva2_hwaccel_select="h264_decoder"
1962 h264_qsv_hwaccel_deps="libmfx"
1963 h264_vaapi_hwaccel_deps="vaapi"
1964 h264_vaapi_hwaccel_select="h264_decoder"
1965 h264_vda_hwaccel_deps="vda"
1966 h264_vda_hwaccel_select="h264_decoder"
1967 h264_vda_old_hwaccel_deps="vda"
1968 h264_vda_old_hwaccel_select="h264_decoder"
1969 h264_vdpau_hwaccel_deps="vdpau"
1970 h264_vdpau_hwaccel_select="h264_decoder"
1971 hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC"
1972 hevc_dxva2_hwaccel_select="hevc_decoder"
1973 mpeg1_vdpau_hwaccel_deps="vdpau"
1974 mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
1975 mpeg2_dxva2_hwaccel_deps="dxva2"
1976 mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
1977 mpeg2_vaapi_hwaccel_deps="vaapi"
1978 mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
1979 mpeg2_vdpau_hwaccel_deps="vdpau"
1980 mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
1981 mpeg4_vaapi_hwaccel_deps="vaapi"
1982 mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
1983 mpeg4_vdpau_hwaccel_deps="vdpau"
1984 mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
1985 vc1_dxva2_hwaccel_deps="dxva2"
1986 vc1_dxva2_hwaccel_select="vc1_decoder"
1987 vc1_vaapi_hwaccel_deps="vaapi"
1988 vc1_vaapi_hwaccel_select="vc1_decoder"
1989 vc1_vdpau_hwaccel_deps="vdpau"
1990 vc1_vdpau_hwaccel_select="vc1_decoder"
1991 wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
1992 wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
1993 wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
1994
1995 # parsers
1996 h264_parser_select="h264_decoder"
1997 mpegvideo_parser_select="mpegvideo"
1998 mpeg4video_parser_select="error_resilience h263dsp mpeg_er mpegvideo qpeldsp"
1999 vc1_parser_select="mpegvideo startcode vc1_decoder"
2000
2001 # external libraries
2002 libfaac_encoder_deps="libfaac"
2003 libfaac_encoder_select="audio_frame_queue"
2004 libfdk_aac_decoder_deps="libfdk_aac"
2005 libfdk_aac_encoder_deps="libfdk_aac"
2006 libfdk_aac_encoder_select="audio_frame_queue"
2007 libgsm_decoder_deps="libgsm"
2008 libgsm_encoder_deps="libgsm"
2009 libgsm_ms_decoder_deps="libgsm"
2010 libgsm_ms_encoder_deps="libgsm"
2011 libilbc_decoder_deps="libilbc"
2012 libilbc_encoder_deps="libilbc"
2013 libmp3lame_encoder_deps="libmp3lame"
2014 libmp3lame_encoder_select="audio_frame_queue"
2015 libopencore_amrnb_decoder_deps="libopencore_amrnb"
2016 libopencore_amrnb_encoder_deps="libopencore_amrnb"
2017 libopencore_amrnb_encoder_select="audio_frame_queue"
2018 libopencore_amrwb_decoder_deps="libopencore_amrwb"
2019 libopenh264_encoder_deps="libopenh264"
2020 libopenjpeg_decoder_deps="libopenjpeg"
2021 libopenjpeg_encoder_deps="libopenjpeg"
2022 libopus_decoder_deps="libopus"
2023 libopus_encoder_deps="libopus"
2024 libopus_encoder_select="audio_frame_queue"
2025 libschroedinger_decoder_deps="libschroedinger"
2026 libschroedinger_encoder_deps="libschroedinger"
2027 libspeex_decoder_deps="libspeex"
2028 libspeex_encoder_deps="libspeex"
2029 libspeex_encoder_select="audio_frame_queue"
2030 libtheora_encoder_deps="libtheora"
2031 libtwolame_encoder_deps="libtwolame"
2032 libvo_aacenc_encoder_deps="libvo_aacenc"
2033 libvo_aacenc_encoder_select="audio_frame_queue"
2034 libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
2035 libvorbis_encoder_deps="libvorbis"
2036 libvorbis_encoder_select="audio_frame_queue"
2037 libvpx_vp8_decoder_deps="libvpx"
2038 libvpx_vp8_encoder_deps="libvpx"
2039 libvpx_vp9_decoder_deps="libvpx"
2040 libvpx_vp9_encoder_deps="libvpx"
2041 libwavpack_encoder_deps="libwavpack"
2042 libwebp_encoder_deps="libwebp"
2043 libx264_encoder_deps="libx264"
2044 libx265_encoder_deps="libx265"
2045 libxavs_encoder_deps="libxavs"
2046 libxvid_encoder_deps="libxvid"
2047
2048 # demuxers / muxers
2049 ac3_demuxer_select="ac3_parser"
2050 asf_demuxer_select="riffdec"
2051 asf_muxer_select="riffenc"
2052 asf_stream_muxer_select="asf_muxer"
2053 avi_demuxer_select="riffdec"
2054 avi_muxer_select="riffenc"
2055 avisynth_demuxer_deps="avisynth"
2056 avisynth_demuxer_select="riffdec"
2057 caf_demuxer_select="riffdec"
2058 dash_muxer_select="mp4_muxer"
2059 dirac_demuxer_select="dirac_parser"
2060 dv_demuxer_select="dvprofile"
2061 dv_muxer_select="dvprofile"
2062 dxa_demuxer_select="riffdec"
2063 eac3_demuxer_select="ac3_parser"
2064 f4v_muxer_select="mov_muxer"
2065 flac_demuxer_select="flac_parser"
2066 hds_muxer_select="flv_muxer"
2067 hls_muxer_select="mpegts_muxer"
2068 ipod_muxer_select="mov_muxer"
2069 ismv_muxer_select="mov_muxer"
2070 matroska_audio_muxer_select="matroska_muxer"
2071 matroska_demuxer_select="riffdec"
2072 matroska_demuxer_suggest="bzlib lzo zlib"
2073 matroska_muxer_select="riffenc"
2074 mmf_muxer_select="riffenc"
2075 mov_demuxer_select="riffdec"
2076 mov_demuxer_suggest="zlib"
2077 mov_muxer_select="riffenc rtpenc_chain"
2078 mp3_demuxer_select="mpegaudio_parser"
2079 mp4_muxer_select="mov_muxer"
2080 mpegts_muxer_select="adts_muxer latm_muxer"
2081 mpegtsraw_demuxer_select="mpegts_demuxer"
2082 mxf_d10_muxer_select="mxf_muxer"
2083 nut_muxer_select="riffenc"
2084 nuv_demuxer_select="riffdec"
2085 oga_muxer_select="ogg_muxer"
2086 ogg_demuxer_select="golomb"
2087 opus_muxer_select="ogg_muxer"
2088 psp_muxer_select="mov_muxer"
2089 rtp_demuxer_select="sdp_demuxer"
2090 rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
2091 rtsp_demuxer_select="http_protocol rtpdec"
2092 rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
2093 sap_demuxer_select="sdp_demuxer"
2094 sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
2095 sdp_demuxer_select="rtpdec"
2096 smoothstreaming_muxer_select="ismv_muxer"
2097 spdif_muxer_select="aac_parser"
2098 spx_muxer_select="ogg_muxer"
2099 tak_demuxer_select="tak_parser"
2100 tg2_muxer_select="mov_muxer"
2101 tgp_muxer_select="mov_muxer"
2102 w64_demuxer_select="wav_demuxer"
2103 wav_demuxer_select="riffdec"
2104 wav_muxer_select="riffenc"
2105 webm_muxer_select="riffenc"
2106 wtv_demuxer_select="riffdec"
2107 xmv_demuxer_select="riffdec"
2108 xwma_demuxer_select="riffdec"
2109
2110 # indevs / outdevs
2111 alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
2112 alsa_outdev_deps="alsa_asoundlib_h"
2113 bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
2114 dv1394_indev_deps="dv1394"
2115 dv1394_indev_select="dv_demuxer"
2116 fbdev_indev_deps="linux_fb_h"
2117 jack_indev_deps="jack_jack_h pthreads"
2118 libcdio_indev_deps="libcdio"
2119 libdc1394_indev_deps="libdc1394"
2120 oss_indev_deps_any="soundcard_h sys_soundcard_h"
2121 oss_outdev_deps_any="soundcard_h sys_soundcard_h"
2122 pulse_indev_deps="libpulse"
2123 sndio_indev_deps="sndio_h"
2124 sndio_outdev_deps="sndio_h"
2125 v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
2126 vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
2127 vfwcap_indev_extralibs="-lavicap32"
2128 x11grab_indev_deps="x11grab"
2129 x11grab_xcb_indev_deps="libxcb"
2130
2131 # protocols
2132 ffrtmpcrypt_protocol_deps="!librtmp_protocol"
2133 ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
2134 ffrtmpcrypt_protocol_select="tcp_protocol"
2135 ffrtmphttp_protocol_deps="!librtmp_protocol"
2136 ffrtmphttp_protocol_select="http_protocol"
2137 gopher_protocol_select="network"
2138 http_protocol_select="tcp_protocol"
2139 httpproxy_protocol_select="tcp_protocol"
2140 https_protocol_select="tls_protocol"
2141 icecast_protocol_select="http_protocol"
2142 librtmp_protocol_deps="librtmp"
2143 librtmpe_protocol_deps="librtmp"
2144 librtmps_protocol_deps="librtmp"
2145 librtmpt_protocol_deps="librtmp"
2146 librtmpte_protocol_deps="librtmp"
2147 mmsh_protocol_select="http_protocol"
2148 mmst_protocol_select="network"
2149 rtmp_protocol_deps="!librtmp_protocol"
2150 rtmp_protocol_select="tcp_protocol"
2151 rtmpe_protocol_select="ffrtmpcrypt_protocol"
2152 rtmps_protocol_deps="!librtmp_protocol"
2153 rtmps_protocol_select="tls_protocol"
2154 rtmpt_protocol_select="ffrtmphttp_protocol"
2155 rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2156 rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2157 rtp_protocol_select="udp_protocol"
2158 sctp_protocol_deps="struct_sctp_event_subscribe"
2159 sctp_protocol_select="network"
2160 srtp_protocol_select="rtp_protocol"
2161 tcp_protocol_select="network"
2162 tls_protocol_deps_any="openssl gnutls"
2163 tls_protocol_select="tcp_protocol"
2164 udp_protocol_select="network"
2165 unix_protocol_deps="sys_un_h"
2166 unix_protocol_select="network"
2167
2168 # filters
2169 blackframe_filter_deps="gpl"
2170 boxblur_filter_deps="gpl"
2171 bs2b_filter_deps="libbs2b"
2172 cropdetect_filter_deps="gpl"
2173 delogo_filter_deps="gpl"
2174 drawtext_filter_deps="libfreetype"
2175 frei0r_filter_deps="frei0r dlopen"
2176 frei0r_filter_extralibs='$ldl'
2177 frei0r_src_filter_deps="frei0r dlopen"
2178 frei0r_src_filter_extralibs='$ldl'
2179 hqdn3d_filter_deps="gpl"
2180 interlace_filter_deps="gpl"
2181 ocv_filter_deps="libopencv"
2182 resample_filter_deps="avresample"
2183 scale_filter_deps="swscale"
2184
2185 # examples
2186 avcodec_example_deps="avcodec avutil"
2187 filter_audio_example_deps="avfilter avutil"
2188 metadata_example_deps="avformat avutil"
2189 output_example_deps="avcodec avformat avutil swscale"
2190 transcode_aac_example_deps="avcodec avformat avresample"
2191
2192 # libraries, in linking order
2193 avcodec_deps="avutil"
2194 avdevice_deps="avformat avcodec avutil"
2195 avfilter_deps="avutil"
2196 avformat_deps="avcodec avutil"
2197 avresample_deps="avutil"
2198 swscale_deps="avutil"
2199
2200 # programs
2201 avconv_deps="avcodec avfilter avformat avresample swscale"
2202 avconv_select="aformat_filter anull_filter asyncts_filter atrim_filter format_filter
2203                fps_filter null_filter resample_filter scale_filter
2204                setpts_filter trim_filter"
2205 avplay_deps="avcodec avformat avresample swscale sdl"
2206 avplay_libs='$sdl_libs'
2207 avplay_select="rdft"
2208 avprobe_deps="avcodec avformat"
2209
2210 # documentation
2211 pod2man_deps="doc"
2212 texi2html_deps="doc"
2213
2214 # default parameters
2215
2216 logfile="config.log"
2217
2218 # installation paths
2219 prefix_default="/usr/local"
2220 bindir_default='${prefix}/bin'
2221 datadir_default='${prefix}/share/avconv'
2222 docdir_default='${prefix}/share/doc/libav'
2223 incdir_default='${prefix}/include'
2224 libdir_default='${prefix}/lib'
2225 mandir_default='${prefix}/share/man'
2226 shlibdir_default="$libdir_default"
2227
2228 # toolchain
2229 ar_default="ar"
2230 cc_default="gcc"
2231 host_cc_default="gcc"
2232 cp_f="cp -f"
2233 ln_s="ln -s -f"
2234 nm_default="nm -g"
2235 objformat="elf"
2236 pkg_config_default=pkg-config
2237 ranlib="ranlib"
2238 strip="strip"
2239 yasmexe="yasm"
2240
2241 # machine
2242 arch_default=$(uname -m)
2243 cpu="generic"
2244 intrinsics="none"
2245
2246 # OS
2247 target_os_default=$(tolower $(uname -s))
2248 host_os=$target_os_default
2249
2250 # configurable options
2251 enable $EXAMPLE_LIST $LIBRARY_LIST $PROGRAM_LIST
2252
2253 enable asm
2254 enable debug
2255 enable doc
2256 enable faan faandct faanidct
2257 enable optimizations
2258 enable safe_bitstream_reader
2259 enable static
2260 enable swscale_alpha
2261
2262 # By default, enable only those hwaccels that have no external dependencies.
2263 enable dxva2 vda vdpau
2264
2265 # build settings
2266 SHFLAGS='-shared -Wl,-soname,$$(@F)'
2267 LIBPREF="lib"
2268 LIBSUF=".a"
2269 FULLNAME='$(NAME)$(BUILDSUF)'
2270 LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
2271 SLIBPREF="lib"
2272 SLIBSUF=".so"
2273 SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
2274 SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
2275 SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
2276 LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2277 SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
2278 SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2279
2280 asflags_filter=echo
2281 cflags_filter=echo
2282 ldflags_filter=echo
2283
2284 AS_C='-c'
2285 AS_O='-o $@'
2286 CC_C='-c'
2287 CC_E='-E -o $@'
2288 CC_O='-o $@'
2289 LD_O='-o $@'
2290 LD_LIB='-l%'
2291 LD_PATH='-L'
2292 HOSTCC_C='-c'
2293 HOSTCC_E='-E -o $@'
2294 HOSTCC_O='-o $@'
2295 HOSTLD_O='-o $@'
2296
2297 host_libs='-lm'
2298 host_cflags_filter=echo
2299 host_ldflags_filter=echo
2300
2301 target_path='$(CURDIR)'
2302
2303 # since the object filename is not given with the -MM flag, the compiler
2304 # is only able to print the basename, and we must add the path ourselves
2305 DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
2306 DEPFLAGS='-MM'
2307
2308 # find source path
2309 if test -f configure; then
2310     source_path=.
2311 else
2312     source_path=$(cd $(dirname "$0"); pwd)
2313     echo "$source_path" | grep -q '[[:blank:]]' &&
2314         die "Out of tree builds are impossible with whitespace in source path."
2315     test -e "$source_path/config.h" &&
2316         die "Out of tree builds are impossible with config.h in source dir."
2317 fi
2318
2319 for v in "$@"; do
2320     r=${v#*=}
2321     l=${v%"$r"}
2322     r=$(sh_quote "$r")
2323     LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
2324 done
2325
2326 find_things(){
2327     thing=$1
2328     pattern=$2
2329     file=$source_path/$3
2330     sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2331 }
2332
2333 ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
2334 DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2335 HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
2336 PARSER_LIST=$(find_things   parser   PARSER   libavcodec/allcodecs.c)
2337 BSF_LIST=$(find_things      bsf      BSF      libavcodec/allcodecs.c)
2338 MUXER_LIST=$(find_things    muxer    _MUX     libavformat/allformats.c)
2339 DEMUXER_LIST=$(find_things  demuxer  DEMUX    libavformat/allformats.c)
2340 OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
2341 INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2342 PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
2343 FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2344
2345 ALL_COMPONENTS="
2346     $BSF_LIST
2347     $DECODER_LIST
2348     $DEMUXER_LIST
2349     $ENCODER_LIST
2350     $FILTER_LIST
2351     $HWACCEL_LIST
2352     $INDEV_LIST
2353     $MUXER_LIST
2354     $OUTDEV_LIST
2355     $PARSER_LIST
2356     $PROTOCOL_LIST
2357 "
2358
2359 for n in $COMPONENT_LIST; do
2360     v=$(toupper ${n%s})_LIST
2361     eval enable \$$v
2362     eval ${n}_if_any="\$$v"
2363 done
2364
2365 enable $ARCH_EXT_LIST
2366
2367 die_unknown(){
2368     echo "Unknown option \"$1\"."
2369     echo "See $0 --help for available options."
2370     exit 1
2371 }
2372
2373 print_3_columns() {
2374     cat | tr ' ' '\n' | sort | pr -r -3 -t
2375 }
2376
2377 show_list() {
2378     suffix=_$1
2379     shift
2380     echo $* | sed s/$suffix//g | print_3_columns
2381     exit 0
2382 }
2383
2384 rand_list(){
2385     IFS=', '
2386     set -- $*
2387     unset IFS
2388     for thing; do
2389         comp=${thing%:*}
2390         prob=${thing#$comp}
2391         prob=${prob#:}
2392         is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
2393         echo "prob ${prob:-0.5}"
2394         printf '%s\n' $comp
2395     done
2396 }
2397
2398 do_random(){
2399     action=$1
2400     shift
2401     random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
2402     $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
2403 }
2404
2405 for opt do
2406     optval="${opt#*=}"
2407     case "$opt" in
2408         --extra-ldflags=*)
2409             add_ldflags $optval
2410         ;;
2411         --extra-ldexeflags=*)
2412             add_ldexeflags $optval
2413         ;;
2414         --extra-libs=*)
2415             add_extralibs $optval
2416         ;;
2417         --disable-devices)
2418             disable $INDEV_LIST $OUTDEV_LIST
2419         ;;
2420         --enable-debug=*)
2421             debuglevel="$optval"
2422         ;;
2423         --disable-programs)
2424             disable $PROGRAM_LIST
2425         ;;
2426         --disable-everything)
2427             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2428         ;;
2429         --disable-all)
2430             map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
2431             disable $LIBRARY_LIST $PROGRAM_LIST doc
2432         ;;
2433         --enable-random|--disable-random)
2434             action=${opt%%-random}
2435             do_random ${action#--} $COMPONENT_LIST
2436         ;;
2437         --enable-random=*|--disable-random=*)
2438             action=${opt%%-random=*}
2439             do_random ${action#--} $optval
2440         ;;
2441         --enable-*=*|--disable-*=*)
2442             eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
2443             is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
2444             eval list=\$$(toupper $thing)_LIST
2445             name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
2446             $action $(filter "$name" $list)
2447         ;;
2448         --enable-avserver|--disable-avserver*)
2449             warn "avserver has been removed, the ${opt} option is only"\
2450                  "provided for compatibility and will be removed in the future"
2451         ;;
2452         --enable-?*|--disable-?*)
2453             eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
2454             if is_in $option $COMPONENT_LIST; then
2455                 test $action = disable && action=unset
2456                 eval $action \$$(toupper ${option%s})_LIST
2457             elif is_in $option $CMDLINE_SELECT; then
2458                 $action $option
2459             else
2460                 die_unknown $opt
2461             fi
2462         ;;
2463         --list-*)
2464             NAME="${opt#--list-}"
2465             is_in $NAME $COMPONENT_LIST || die_unknown $opt
2466             NAME=${NAME%s}
2467             eval show_list $NAME \$$(toupper $NAME)_LIST
2468         ;;
2469         --help|-h) show_help
2470         ;;
2471         *)
2472             optname="${opt%%=*}"
2473             optname="${optname#--}"
2474             optname=$(echo "$optname" | sed 's/-/_/g')
2475             if is_in $optname $CMDLINE_SET; then
2476                 eval $optname='$optval'
2477             elif is_in $optname $CMDLINE_APPEND; then
2478                 append $optname "$optval"
2479             else
2480                 die_unknown $opt
2481             fi
2482         ;;
2483     esac
2484 done
2485
2486 disabled logging && logfile=/dev/null
2487
2488 echo "# $0 $LIBAV_CONFIGURATION" > $logfile
2489 set >> $logfile
2490
2491 test -n "$cross_prefix" && enable cross_compile
2492
2493 if enabled cross_compile; then
2494     test -n "$arch" && test -n "$target_os" ||
2495         die "Must specify target arch and OS when cross-compiling"
2496 fi
2497
2498 case "$toolchain" in
2499     clang-asan)
2500         cc_default="clang"
2501         add_cflags  -fsanitize=address
2502         add_ldflags -fsanitize=address
2503     ;;
2504     clang-tsan)
2505         cc_default="clang"
2506         add_cflags  -fsanitize=thread -pie
2507         add_ldflags -fsanitize=thread -pie
2508     ;;
2509     clang-usan)
2510         cc_default="clang"
2511         add_cflags  -fsanitize=undefined -O1
2512         add_ldflags -fsanitize=undefined
2513     ;;
2514     gcc-asan)
2515         cc_default="gcc"
2516         add_cflags  -fsanitize=address
2517         add_ldflags -fsanitize=address
2518     ;;
2519     gcc-tsan)
2520         cc_default="gcc"
2521         add_cflags  -fsanitize=thread -pie -fPIC
2522         add_ldflags -fsanitize=thread -pie -fPIC
2523     ;;
2524     gcc-usan)
2525         cc_default="gcc"
2526         add_cflags  -fsanitize=undefined
2527         add_ldflags -fsanitize=undefined
2528     ;;
2529     valgrind-massif)
2530         target_exec_default="valgrind"
2531         target_exec_args="--alloc-fn=av_malloc --alloc-fn=av_mallocz"
2532     ;;
2533     valgrind-memcheck)
2534         target_exec_default="valgrind"
2535         target_exec_args="--track-origins=yes --leak-check=full"
2536     ;;
2537     msvc)
2538         # Check whether the current MSVC version needs the C99 converter.
2539         # From MSVC 2013 (compiler major version 18) onwards, it does actually
2540         # support enough of C99 to build libav. Default to the new
2541         # behaviour if the regexp was unable to match anything, since this
2542         # successfully parses the version number of existing supported
2543         # versions that require the converter (MSVC 2010 and 2012).
2544         cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
2545         if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
2546             cc_default="cl"
2547         else
2548             cc_default="c99wrap cl"
2549         fi
2550         ld_default="link"
2551         nm_default="dumpbin -symbols"
2552         ar_default="lib"
2553         target_os_default="win32"
2554         # Use a relative path for TMPDIR. This makes sure all the
2555         # ffconf temp files are written with a relative path, avoiding
2556         # issues with msys/win32 path conversion for MSVC parameters
2557         # such as -Fo<file> or -out:<file>.
2558         TMPDIR=.
2559     ;;
2560     icl)
2561         cc_default="icl"
2562         ld_default="xilink"
2563         nm_default="dumpbin -symbols"
2564         ar_default="xilib"
2565         target_os_default="win32"
2566         TMPDIR=.
2567     ;;
2568     gcov)
2569         add_cflags  -fprofile-arcs -ftest-coverage
2570         add_ldflags -fprofile-arcs -ftest-coverage
2571     ;;
2572     hardened)
2573         add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
2574         add_cflags   -fno-strict-overflow -fstack-protector-all
2575         add_ldflags  -Wl,-z,relro -Wl,-z,now
2576     ;;
2577     ?*)
2578         die "Unknown toolchain $toolchain"
2579     ;;
2580 esac
2581
2582 ar_default="${cross_prefix}${ar_default}"
2583 cc_default="${cross_prefix}${cc_default}"
2584 nm_default="${cross_prefix}${nm_default}"
2585 pkg_config_default="${cross_prefix}${pkg_config_default}"
2586 ranlib="${cross_prefix}${ranlib}"
2587 strip="${cross_prefix}${strip}"
2588
2589 sysinclude_default="${sysroot}/usr/include"
2590
2591 set_default arch cc pkg_config sysinclude target_exec target_os
2592 enabled cross_compile || host_cc_default=$cc
2593 set_default host_cc
2594
2595 if ! $pkg_config --version >/dev/null 2>&1; then
2596     warn "$pkg_config not found, library detection may fail."
2597     pkg_config=false
2598 fi
2599
2600 exesuf() {
2601     case $1 in
2602         mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
2603     esac
2604 }
2605
2606 EXESUF=$(exesuf $target_os)
2607 HOSTEXESUF=$(exesuf $host_os)
2608
2609 # set temporary file name
2610 : ${TMPDIR:=$TEMPDIR}
2611 : ${TMPDIR:=$TMP}
2612 : ${TMPDIR:=/tmp}
2613
2614 if ! check_cmd mktemp -u XXXXXX; then
2615     # simple replacement for missing mktemp
2616     # NOT SAFE FOR GENERAL USE
2617     mktemp(){
2618         echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
2619     }
2620 fi
2621
2622 tmpfile(){
2623     tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
2624         (set -C; exec > $tmp) 2>/dev/null ||
2625         die "Unable to create temporary file in $TMPDIR."
2626     append TMPFILES $tmp
2627     eval $1=$tmp
2628 }
2629
2630 trap 'rm -f -- $TMPFILES' EXIT
2631
2632 tmpfile TMPASM .asm
2633 tmpfile TMPC   .c
2634 tmpfile TMPE   $EXESUF
2635 tmpfile TMPH   .h
2636 tmpfile TMPO   .o
2637 tmpfile TMPS   .S
2638 tmpfile TMPSH  .sh
2639 tmpfile TMPV   .ver
2640
2641 unset -f mktemp
2642
2643 chmod +x $TMPE
2644
2645 # make sure we can execute files in $TMPDIR
2646 cat > $TMPSH 2>> $logfile <<EOF
2647 #! /bin/sh
2648 EOF
2649 chmod +x $TMPSH >> $logfile 2>&1
2650 if ! $TMPSH >> $logfile 2>&1; then
2651     cat <<EOF
2652 Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
2653 variable to another directory and make sure that it is not mounted noexec.
2654 EOF
2655     die "Sanity test failed."
2656 fi
2657
2658 armasm_flags(){
2659     for flag; do
2660         case $flag in
2661             # Filter out MSVC cl.exe options from cflags that shouldn't
2662             # be passed to gas-preprocessor
2663             -M[TD]*)                                            ;;
2664             *)                  echo $flag                      ;;
2665         esac
2666    done
2667 }
2668
2669 ccc_flags(){
2670     for flag; do
2671         case $flag in
2672             -std=c99)           echo -c99                       ;;
2673             -mcpu=*)            echo -arch ${flag#*=}           ;;
2674             -mieee)             echo -ieee                      ;;
2675             -O*|-fast)          echo $flag                      ;;
2676             -fno-math-errno)    echo -assume nomath_errno       ;;
2677             -g)                 echo -g3                        ;;
2678             -Wall)              echo -msg_enable level2         ;;
2679             -Wno-pointer-sign)  echo -msg_disable ptrmismatch1  ;;
2680             -Wl,*)              echo $flag                      ;;
2681             -f*|-W*)                                            ;;
2682             *)                  echo $flag                      ;;
2683         esac
2684    done
2685 }
2686
2687 cparser_flags(){
2688     for flag; do
2689         case $flag in
2690             -Wno-switch)             echo -Wno-switch-enum ;;
2691             -Wno-format-zero-length) ;;
2692             -Wdisabled-optimization) ;;
2693             -Wno-pointer-sign)       echo -Wno-other ;;
2694             *)                       echo $flag ;;
2695         esac
2696     done
2697 }
2698
2699 msvc_common_flags(){
2700     for flag; do
2701         case $flag in
2702             # In addition to specifying certain flags under the compiler
2703             # specific filters, they must be specified here as well or else the
2704             # generic catch all at the bottom will print the original flag.
2705             -Wall)                ;;
2706             -std=c99)             ;;
2707             # Common flags
2708             -fomit-frame-pointer) ;;
2709             -g)                   echo -Z7 ;;
2710             -fno-math-errno)      ;;
2711             -fno-common)          ;;
2712             -fno-signed-zeros)    ;;
2713             -fPIC)                ;;
2714             -mthumb)              ;;
2715             -march=*)             ;;
2716             -lz)                  echo zlib.lib ;;
2717             -lavifil32)           echo vfw32.lib ;;
2718             -lavicap32)           echo vfw32.lib user32.lib ;;
2719             -l*)                  echo ${flag#-l}.lib ;;
2720             -L*)                  echo -libpath:${flag#-L} ;;
2721             *)                    echo $flag ;;
2722         esac
2723     done
2724 }
2725
2726 msvc_flags(){
2727     msvc_common_flags "$@"
2728     for flag; do
2729         case $flag in
2730             -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
2731                                        -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
2732                                        -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
2733                                        -wd4273 -wd4701 ;;
2734         esac
2735     done
2736 }
2737
2738 icl_flags(){
2739     msvc_common_flags "$@"
2740     for flag; do
2741         case $flag in
2742             # Despite what Intel's documentation says -Wall, which is supported
2743             # on Windows, does enable remarks so disable them here.
2744             -Wall)                echo $flag -Qdiag-disable:remark ;;
2745             -std=c99)             echo -Qstd=c99 ;;
2746         esac
2747     done
2748 }
2749
2750 pgi_flags(){
2751     for flag; do
2752         case $flag in
2753             -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
2754             -fomit-frame-pointer) echo -Mnoframe ;;
2755             -g)                   echo -gopt ;;
2756             *)                    echo $flag ;;
2757         esac
2758     done
2759 }
2760
2761 suncc_flags(){
2762     for flag; do
2763         case $flag in
2764             -march=*|-mcpu=*)
2765                 case "${flag#*=}" in
2766                     native)                   echo -xtarget=native       ;;
2767                     v9|niagara)               echo -xarch=sparc          ;;
2768                     ultrasparc)               echo -xarch=sparcvis       ;;
2769                     ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
2770                     i586|pentium)             echo -xchip=pentium        ;;
2771                     i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
2772                     pentium3*|c3-2)           echo -xtarget=pentium3     ;;
2773                     pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
2774                     pentium4*)          echo -xtarget=pentium4           ;;
2775                     prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
2776                     *-sse3)             echo -xarch=sse3                 ;;
2777                     core2)              echo -xarch=ssse3 -xchip=core2   ;;
2778                     corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
2779                     corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
2780                     amdfam10|barcelona|bdver*) echo -xarch=sse4_1        ;;
2781                     athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
2782                     k8|opteron|athlon64|athlon-fx)
2783                                                echo -xarch=sse2a         ;;
2784                     athlon*)                   echo -xarch=pentium_proa  ;;
2785                 esac
2786                 ;;
2787             -std=c99)             echo -xc99              ;;
2788             -fomit-frame-pointer) echo -xregs=frameptr    ;;
2789             -fPIC)                echo -KPIC -xcode=pic32 ;;
2790             -W*,*)                echo $flag              ;;
2791             -f*-*|-W*|-mimpure-text)                      ;;
2792             -shared)              echo -G                 ;;
2793             *)                    echo $flag              ;;
2794         esac
2795     done
2796 }
2797
2798 tms470_flags(){
2799     for flag; do
2800         case $flag in
2801             -march=*|-mcpu=*)
2802                 case "${flag#*=}" in
2803                     armv7-a|cortex-a*)      echo -mv=7a8 ;;
2804                     armv7-r|cortex-r*)      echo -mv=7r4 ;;
2805                     armv7-m|cortex-m*)      echo -mv=7m3 ;;
2806                     armv6*|arm11*)          echo -mv=6   ;;
2807                     armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26])
2808                                             echo -mv=5e  ;;
2809                     armv4*|arm7*|arm9[24]*) echo -mv=4   ;;
2810                 esac
2811                 ;;
2812             -mfpu=neon)     echo --float_support=vfpv3 --neon ;;
2813             -mfpu=vfp)      echo --float_support=vfpv2        ;;
2814             -mfpu=vfpv3)    echo --float_support=vfpv3        ;;
2815             -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
2816             -msoft-float)   echo --float_support=vfplib       ;;
2817             -O[0-3]|-mf=*)  echo $flag                        ;;
2818             -g)             echo -g -mn                       ;;
2819             -pds=*)         echo $flag                        ;;
2820             -D*|-I*)        echo $flag                        ;;
2821             --gcc|--abi=*)  echo $flag                        ;;
2822             -me)            echo $flag                        ;;
2823         esac
2824     done
2825 }
2826
2827 probe_cc(){
2828     pfx=$1
2829     _cc=$2
2830
2831     unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
2832     unset _ld_o _ldflags _ld_lib _ld_path
2833     unset _depflags _DEPCMD _DEPFLAGS
2834     _flags_filter=echo
2835
2836     if $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
2837         _type=llvm_gcc
2838         gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)')
2839         _ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver"
2840         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2841         _cflags_speed='-O3'
2842         _cflags_size='-Os'
2843     elif $_cc -v 2>&1 | grep -qi ^gcc; then
2844         _type=gcc
2845         gcc_version=$($_cc --version | head -n1)
2846         gcc_basever=$($_cc -dumpversion)
2847         gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
2848         gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
2849         _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
2850         if ! $_cc -dumpversion | grep -q '^2\.'; then
2851             _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2852         fi
2853         _cflags_speed='-O3'
2854         _cflags_size='-Os'
2855     elif $_cc --version 2>/dev/null | grep -q ^icc; then
2856         _type=icc
2857         _ident=$($_cc --version | head -n1)
2858         _depflags='-MMD'
2859         _cflags_speed='-O3'
2860         _cflags_size='-Os'
2861         _cflags_noopt='-O1'
2862     elif $_cc -v 2>&1 | grep -q xlc; then
2863         _type=xlc
2864         _ident=$($_cc -qversion 2>/dev/null | head -n1)
2865         _cflags_speed='-O5'
2866         _cflags_size='-O5 -qcompact'
2867     elif $_cc -V 2>/dev/null | grep -q Compaq; then
2868         _type=ccc
2869         _ident=$($_cc -V | head -n1 | cut -d' ' -f1-3)
2870         _DEPFLAGS='-M'
2871         _cflags_speed='-fast'
2872         _cflags_size='-O1'
2873         _flags_filter=ccc_flags
2874     elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
2875         test -d "$sysroot" || die "No valid sysroot specified."
2876         _type=armcc
2877         _ident=$($_cc --vsn | grep -i build | head -n1 | sed 's/.*: //')
2878         armcc_conf="$PWD/armcc.conf"
2879         $_cc --arm_linux_configure                 \
2880              --arm_linux_config_file="$armcc_conf" \
2881              --configure_sysroot="$sysroot"        \
2882              --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
2883              die "Error creating armcc configuration file."
2884         $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
2885         _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
2886         as_default="${cross_prefix}gcc"
2887         _depflags='-MMD'
2888         _cflags_speed='-O3'
2889         _cflags_size='-Os'
2890     elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
2891         _type=tms470
2892         _ident=$($_cc -version | head -n1 | tr -s ' ')
2893         _flags='--gcc --abi=eabi -me'
2894         _cc_e='-ppl -fe=$@'
2895         _cc_o='-fe=$@'
2896         _depflags='-ppa -ppd=$(@:.o=.d)'
2897         _cflags_speed='-O3 -mf=5'
2898         _cflags_size='-O3 -mf=2'
2899         _flags_filter=tms470_flags
2900     elif $_cc -v 2>&1 | grep -q clang; then
2901         _type=clang
2902         _ident=$($_cc --version | head -n1)
2903         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2904         _cflags_speed='-O3'
2905         _cflags_size='-Os'
2906     elif $_cc -V 2>&1 | grep -q Sun; then
2907         _type=suncc
2908         _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
2909         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
2910         _DEPFLAGS='-xM1 -xc99'
2911         _ldflags='-std=c99'
2912         _cflags_speed='-O5'
2913         _cflags_size='-O5 -xspace'
2914         _flags_filter=suncc_flags
2915     elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
2916         _type=pathscale
2917         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
2918         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2919         _cflags_speed='-O2'
2920         _cflags_size='-Os'
2921         _flags_filter='filter_out -Wdisabled-optimization'
2922     elif $_cc -v 2>&1 | grep -q Open64; then
2923         _type=open64
2924         _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
2925         _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2926         _cflags_speed='-O2'
2927         _cflags_size='-Os'
2928         _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
2929     elif $_cc -V 2>&1 | grep -q Portland; then
2930         _type=pgi
2931         _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')"
2932         opt_common='-alias=ansi -Mdse -Mlre -Mpre'
2933         _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
2934         _cflags_size="-O2 -Munroll=c:1 $opt_common"
2935         _cflags_noopt="-O1"
2936         _flags_filter=pgi_flags
2937     elif $_cc 2>&1 | grep -q 'Microsoft.*ARM.*Assembler'; then
2938         _type=armasm
2939         _ident=$($_cc | head -n1)
2940         # 4509: "This form of conditional instruction is deprecated"
2941         _flags="-nologo -ignore 4509"
2942         _flags_filter=armasm_flags
2943     elif $_cc 2>&1 | grep -q Microsoft; then
2944         _type=msvc
2945         _ident=$($cc 2>&1 | head -n1)
2946         _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
2947         _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
2948         _cflags_speed="-O2"
2949         _cflags_size="-O1"
2950         if $_cc 2>&1 | grep -q Linker; then
2951             _ld_o='-out:$@'
2952         else
2953             _ld_o='-Fe$@'
2954         fi
2955         _cc_o='-Fo$@'
2956         _cc_e='-P -Fi$@'
2957         _flags_filter=msvc_flags
2958         _ld_lib='lib%.a'
2959         _ld_path='-libpath:'
2960         _flags='-nologo'
2961         _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
2962         if [ $pfx = hostcc ]; then
2963             append _cflags -Dsnprintf=_snprintf
2964         fi
2965     elif $_cc 2>&1 | grep -q Intel; then
2966         _type=icl
2967         _ident=$($cc 2>&1 | head -n1)
2968         _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
2969         # Not only is O3 broken on 13.x+ but it is slower on all previous
2970         # versions (tested) as well.
2971         _cflags_speed="-O2"
2972         _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
2973         if $_cc 2>&1 | grep -q Linker; then
2974             _ld_o='-out:$@'
2975         else
2976             _ld_o='-Fe$@'
2977         fi
2978         _cc_o='-Fo$@'
2979         _cc_e='-P'
2980         _flags_filter=icl_flags
2981         _ld_lib='lib%.a'
2982         _ld_path='-libpath:'
2983         # -Qdiag-error to make icl error when seeing certain unknown arguments
2984         _flags='-nologo -Qdiag-error:4044,10157'
2985         # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency
2986         # with MSVC which enables it by default.
2987         _cflags='-D_USE_MATH_DEFINES -FIstdlib.h -Dstrtoll=_strtoi64 -Qms0 -Qvec- -Qsimd- -GS'
2988         if [ $pfx = hostcc ]; then
2989             append _cflags -Dsnprintf=_snprintf
2990         fi
2991     elif $_cc --version 2>/dev/null | grep -q ^cparser; then
2992         _type=cparser
2993         _ident=$($_cc --version | head -n1)
2994         _depflags='-MMD'
2995         _cflags_speed='-O4'
2996         _cflags_size='-O2'
2997         _flags_filter=cparser_flags
2998     fi
2999
3000     eval ${pfx}_type=\$_type
3001     eval ${pfx}_ident=\$_ident
3002 }
3003
3004 set_ccvars(){
3005     eval ${1}_C=\${_cc_c-\${${1}_C}}
3006     eval ${1}_E=\${_cc_e-\${${1}_E}}
3007     eval ${1}_O=\${_cc_o-\${${1}_O}}
3008
3009     if [ -n "$_depflags" ]; then
3010         eval ${1}_DEPFLAGS=\$_depflags
3011     else
3012         eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
3013         eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
3014         eval DEP${1}FLAGS=\$_flags
3015     fi
3016 }
3017
3018 probe_cc cc "$cc"
3019 cflags_filter=$_flags_filter
3020 cflags_speed=$_cflags_speed
3021 cflags_size=$_cflags_size
3022 cflags_noopt=$_cflags_noopt
3023 add_cflags $_flags $_cflags
3024 cc_ldflags=$_ldflags
3025 set_ccvars CC
3026
3027 probe_cc hostcc "$host_cc"
3028 host_cflags_filter=$_flags_filter
3029 add_host_cflags  $_flags $_cflags
3030 set_ccvars HOSTCC
3031
3032 test -n "$cc_type" && enable $cc_type ||
3033     warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
3034
3035 : ${as_default:=$cc}
3036 : ${dep_cc_default:=$cc}
3037 : ${ld_default:=$cc}
3038 : ${host_ld_default:=$host_cc}
3039 set_default ar as dep_cc ld host_ld
3040
3041 probe_cc as "$as"
3042 asflags_filter=$_flags_filter
3043 add_asflags $_flags $_cflags
3044 set_ccvars AS
3045
3046 probe_cc ld "$ld"
3047 ldflags_filter=$_flags_filter
3048 add_ldflags $_flags $_ldflags
3049 test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
3050 LD_O=${_ld_o-$LD_O}
3051 LD_LIB=${_ld_lib-$LD_LIB}
3052 LD_PATH=${_ld_path-$LD_PATH}
3053
3054 probe_cc hostld "$host_ld"
3055 host_ldflags_filter=$_flags_filter
3056 add_host_ldflags $_flags $_ldflags
3057 HOSTLD_O=${_ld_o-$HOSTLD_O}
3058
3059 if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
3060     probe_cc depcc "$dep_cc"
3061     CCDEP=${_DEPCMD:-$DEPCMD}
3062     CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
3063     DEPCCFLAGS=$_flags
3064 fi
3065
3066 if $ar 2>&1 | grep -q Microsoft; then
3067     arflags="-nologo"
3068     ar_o='-out:$@'
3069 elif $ar 2>&1 | grep -q 'Texas Instruments'; then
3070     arflags="rq"
3071     ar_o='$@'
3072 elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then
3073     arflags='-Xany -r -c'
3074     ar_o='$@'
3075 else
3076     arflags="rc"
3077     ar_o='$@'
3078 fi
3079
3080 add_cflags $extra_cflags
3081 add_asflags $extra_cflags
3082
3083 if test -n "$sysroot"; then
3084     case "$cc_type" in
3085         gcc|llvm_gcc|clang)
3086             add_cppflags --sysroot="$sysroot"
3087             add_ldflags --sysroot="$sysroot"
3088         ;;
3089         tms470)
3090             add_cppflags -I"$sysinclude"
3091             add_ldflags  --sysroot="$sysroot"
3092         ;;
3093     esac
3094 fi
3095
3096 if test "$cpu" = host; then
3097     enabled cross_compile &&
3098         die "--cpu=host makes no sense when cross-compiling."
3099
3100     case "$cc_type" in
3101         gcc|llvm_gcc)
3102             check_native(){
3103                 $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
3104                 sed -n "/cc1.*$1=/{
3105                             s/.*$1=\\([^ ]*\\).*/\\1/
3106                             p
3107                             q
3108                         }" $TMPE
3109             }
3110             cpu=$(check_native -march || check_native -mcpu)
3111         ;;
3112     esac
3113
3114     test "${cpu:-host}" = host &&
3115         die "--cpu=host not supported with compiler $cc"
3116 fi
3117
3118 # Deal with common $arch aliases
3119 case "$arch" in
3120     aarch64|arm64)
3121         arch="aarch64"
3122     ;;
3123     arm*)
3124         arch="arm"
3125     ;;
3126     mips*|IP*)
3127         arch="mips"
3128     ;;
3129     parisc*|hppa*)
3130         arch="parisc"
3131     ;;
3132     "Power Macintosh"|ppc*|powerpc*)
3133         arch="ppc"
3134     ;;
3135     s390|s390x)
3136         arch="s390"
3137     ;;
3138     sh4|sh)
3139         arch="sh4"
3140     ;;
3141     sun4u|sparc*)
3142         arch="sparc"
3143     ;;
3144     tilegx|tile-gx)
3145         arch="tilegx"
3146     ;;
3147     i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
3148         arch="x86"
3149     ;;
3150 esac
3151
3152 is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
3153 enable $arch
3154
3155 # Add processor-specific flags
3156 if enabled aarch64; then
3157
3158     case $cpu in
3159         armv*)
3160             cpuflags="-march=$cpu"
3161         ;;
3162         *)
3163             cpuflags="-mcpu=$cpu"
3164         ;;
3165     esac
3166
3167 elif enabled alpha; then
3168
3169     cpuflags="-mcpu=$cpu"
3170
3171 elif enabled arm; then
3172
3173     check_arm_arch() {
3174         check_cpp_condition stddef.h \
3175             "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
3176             $cpuflags
3177     }
3178
3179     probe_arm_arch() {
3180         if   check_arm_arch 4;        then echo armv4;
3181         elif check_arm_arch 4T;       then echo armv4t;
3182         elif check_arm_arch 5;        then echo armv5;
3183         elif check_arm_arch 5E;       then echo armv5e;
3184         elif check_arm_arch 5T;       then echo armv5t;
3185         elif check_arm_arch 5TE;      then echo armv5te;
3186         elif check_arm_arch 5TEJ;     then echo armv5te;
3187         elif check_arm_arch 6;        then echo armv6;
3188         elif check_arm_arch 6J;       then echo armv6j;
3189         elif check_arm_arch 6K;       then echo armv6k;
3190         elif check_arm_arch 6Z;       then echo armv6z;
3191         elif check_arm_arch 6ZK;      then echo armv6zk;
3192         elif check_arm_arch 6T2;      then echo armv6t2;
3193         elif check_arm_arch 7;        then echo armv7;
3194         elif check_arm_arch 7A  7_A;  then echo armv7-a;
3195         elif check_arm_arch 7R  7_R;  then echo armv7-r;
3196         elif check_arm_arch 7M  7_M;  then echo armv7-m;
3197         elif check_arm_arch 7EM 7E_M; then echo armv7-m;
3198         elif check_arm_arch 8A  8_A;  then echo armv8-a;
3199         fi
3200     }
3201
3202     [ "$cpu" = generic ] && cpu=$(probe_arm_arch)
3203
3204     case $cpu in
3205         armv*)
3206             cpuflags="-march=$cpu"
3207             subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
3208         ;;
3209         *)
3210             cpuflags="-mcpu=$cpu"
3211             case $cpu in
3212                 cortex-a*)                               subarch=armv7a  ;;
3213                 cortex-r*)                               subarch=armv7r  ;;
3214                 cortex-m*)                 enable thumb; subarch=armv7m  ;;
3215                 arm11*)                                  subarch=armv6   ;;
3216                 arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
3217                 armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
3218                 *)                             subarch=$(probe_arm_arch) ;;
3219             esac
3220         ;;
3221     esac
3222
3223     case "$subarch" in
3224         armv5t*)    enable fast_clz                ;;
3225         armv[6-8]*) enable fast_clz fast_unaligned ;;
3226     esac
3227
3228 elif enabled avr32; then
3229
3230     case $cpu in
3231         ap7[02]0[0-2])
3232             subarch="avr32_ap"
3233             cpuflags="-mpart=$cpu"
3234         ;;
3235         ap)
3236             subarch="avr32_ap"
3237             cpuflags="-march=$cpu"
3238         ;;
3239         uc3[ab]*)
3240             subarch="avr32_uc"
3241             cpuflags="-mcpu=$cpu"
3242         ;;
3243         uc)
3244             subarch="avr32_uc"
3245             cpuflags="-march=$cpu"
3246         ;;
3247     esac
3248
3249 elif enabled bfin; then
3250
3251     cpuflags="-mcpu=$cpu"
3252
3253 elif enabled mips; then
3254
3255     cpuflags="-march=$cpu"
3256
3257 elif enabled ppc; then
3258
3259     disable ldbrx
3260
3261     case $(tolower $cpu) in
3262         601|ppc601|powerpc601)
3263             cpuflags="-mcpu=601"
3264             disable altivec
3265         ;;
3266         603*|ppc603*|powerpc603*)
3267             cpuflags="-mcpu=603"
3268             disable altivec
3269         ;;
3270         604*|ppc604*|powerpc604*)
3271             cpuflags="-mcpu=604"
3272             disable altivec
3273         ;;
3274         g3|75*|ppc75*|powerpc75*)
3275             cpuflags="-mcpu=750"
3276             disable altivec
3277         ;;
3278         g4|745*|ppc745*|powerpc745*)
3279             cpuflags="-mcpu=7450"
3280         ;;
3281         74*|ppc74*|powerpc74*)
3282             cpuflags="-mcpu=7400"
3283         ;;
3284         g5|970|ppc970|powerpc970)
3285             cpuflags="-mcpu=970"
3286         ;;
3287         power[3-7]*)
3288             cpuflags="-mcpu=$cpu"
3289         ;;
3290         cell)
3291             cpuflags="-mcpu=cell"
3292             enable ldbrx
3293         ;;
3294         e500mc)
3295             cpuflags="-mcpu=e500mc"
3296             disable altivec
3297         ;;
3298         e500v2)
3299             cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
3300             disable altivec
3301             disable dcbzl
3302         ;;
3303         e500)
3304             cpuflags="-mcpu=8540 -mhard-float"
3305             disable altivec
3306             disable dcbzl
3307         ;;
3308     esac
3309
3310 elif enabled sparc; then
3311
3312     case $cpu in
3313         cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
3314             cpuflags="-mcpu=$cpu"
3315         ;;
3316         ultrasparc*|niagara[234])
3317             cpuflags="-mcpu=$cpu"
3318         ;;
3319     esac
3320
3321 elif enabled x86; then
3322
3323     case $cpu in
3324         i[345]86|pentium)
3325             cpuflags="-march=$cpu"
3326             disable i686
3327             disable mmx
3328         ;;
3329         # targets that do NOT support nopl and conditional mov (cmov)
3330         pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
3331             cpuflags="-march=$cpu"
3332             disable i686
3333         ;;
3334         # targets that do support nopl and conditional mov (cmov)
3335         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*)
3336             cpuflags="-march=$cpu"
3337             enable i686
3338             enable fast_cmov
3339         ;;
3340         # targets that do support conditional mov but on which it's slow
3341         pentium4|pentium4m|prescott|nocona)
3342             cpuflags="-march=$cpu"
3343             enable i686
3344             disable fast_cmov
3345         ;;
3346     esac
3347
3348 fi
3349
3350 if [ "$cpu" != generic ]; then
3351     add_cflags  $cpuflags
3352     add_asflags $cpuflags
3353 fi
3354
3355 # compiler sanity check
3356 check_exec <<EOF
3357 int main(void){ return 0; }
3358 EOF
3359 if test "$?" != 0; then
3360     echo "$cc is unable to create an executable file."
3361     if test -z "$cross_prefix" && ! enabled cross_compile ; then
3362         echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
3363         echo "Only do this if you know what cross compiling means."
3364     fi
3365     die "C compiler test failed."
3366 fi
3367
3368 add_cppflags -D_ISOC99_SOURCE
3369 check_cflags -std=c99
3370 check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
3371 #include <stdlib.h>
3372 EOF
3373 check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
3374 #include <stdlib.h>
3375 EOF
3376
3377 add_host_cppflags -D_ISOC99_SOURCE
3378 check_host_cflags -std=c99
3379 check_host_cflags -Wall
3380 check_host_cflags -O3
3381
3382 check_64bit(){
3383     arch32=$1
3384     arch64=$2
3385     expr=$3
3386     check_code cc "" "int test[2*($expr) - 1]" &&
3387         subarch=$arch64 || subarch=$arch32
3388 }
3389
3390 case "$arch" in
3391     aarch64|alpha|ia64)
3392         spic=$shared
3393     ;;
3394     mips)
3395         check_64bit mips mips64 '_MIPS_SIM > 1'
3396         spic=$shared
3397     ;;
3398     parisc)
3399         check_64bit parisc parisc64 'sizeof(void *) > 4'
3400         spic=$shared
3401     ;;
3402     ppc)
3403         check_64bit ppc ppc64 'sizeof(void *) > 4'
3404         spic=$shared
3405     ;;
3406     s390)
3407         check_64bit s390 s390x 'sizeof(void *) > 4'
3408         spic=$shared
3409     ;;
3410     sparc)
3411         check_64bit sparc sparc64 'sizeof(void *) > 4'
3412         spic=$shared
3413     ;;
3414     x86)
3415         check_64bit x86_32 x86_64 'sizeof(void *) > 4'
3416         if test "$subarch" = "x86_64"; then
3417             spic=$shared
3418         fi
3419     ;;
3420 esac
3421
3422 enable $subarch
3423 enabled spic && enable_weak pic
3424
3425 # OS specific
3426 case $target_os in
3427     aix)
3428         SHFLAGS=-shared
3429         add_cppflags '-I\$(SRC_PATH)/compat/aix'
3430         enabled shared && add_ldflags -Wl,-brtl
3431         ;;
3432     android)
3433         disable symver
3434         enable section_data_rel_ro
3435         SLIB_INSTALL_NAME='$(SLIBNAME)'
3436         SLIB_INSTALL_LINKS=
3437         # soname not set on purpose
3438         SHFLAGS=-shared
3439         ;;
3440     haiku)
3441         prefix_default="/boot/common"
3442         network_extralibs="-lnetwork"
3443         host_libs=
3444         ;;
3445     sunos)
3446         SHFLAGS='-shared -Wl,-h,$$(@F)'
3447         enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
3448         network_extralibs="-lsocket -lnsl"
3449         # When using suncc to build, the Solaris linker will mark
3450         # an executable with each instruction set encountered by
3451         # the Solaris assembler.  As our libraries contain their own
3452         # guards for processor-specific code, instead suppress
3453         # generation of the HWCAPS ELF section on Solaris x86 only.
3454         enabled_all suncc x86 &&
3455             echo "hwcap_1 = OVERRIDE;" > mapfile &&
3456             add_ldflags -Wl,-M,mapfile
3457         nm_default='nm -P -g'
3458         ;;
3459     netbsd)
3460         disable symver
3461         oss_indev_extralibs="-lossaudio"
3462         oss_outdev_extralibs="-lossaudio"
3463         ;;
3464     openbsd|bitrig)
3465         disable symver
3466         SHFLAGS='-shared'
3467         SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
3468         SLIB_INSTALL_LINKS=
3469         oss_indev_extralibs="-lossaudio"
3470         oss_outdev_extralibs="-lossaudio"
3471         ;;
3472     dragonfly)
3473         disable symver
3474         ;;
3475     freebsd)
3476         ;;
3477     bsd/os)
3478         add_extralibs -lpoll -lgnugetopt
3479         ;;
3480     darwin)
3481         enabled ppc && add_asflags -force_cpusubtype_ALL
3482         SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
3483         enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
3484         add_ldflags -Wl,-dynamic,-search_paths_first
3485         SLIBSUF=".dylib"
3486         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
3487         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
3488         objformat="macho"
3489         enabled x86_64 && objformat="macho64"
3490         enabled_any pic shared ||
3491             { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
3492         ;;
3493     mingw32*)
3494         if test $target_os = "mingw32ce"; then
3495             disable network
3496         else
3497             target_os=mingw32
3498         fi
3499         LIBTARGET=i386
3500         if enabled x86_64; then
3501             LIBTARGET="i386:x86-64"
3502         elif enabled arm; then
3503             LIBTARGET=arm-wince
3504         fi
3505         check_ldflags -Wl,--nxcompat
3506         check_ldflags -Wl,--dynamicbase
3507         shlibdir_default="$bindir_default"
3508         SLIBPREF=""
3509         SLIBSUF=".dll"
3510         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3511         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3512         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)'
3513         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3514         SLIB_INSTALL_LINKS=
3515         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3516         SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3517         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'
3518         objformat="win32"
3519         dlltool="${cross_prefix}dlltool"
3520         ranlib=:
3521         enable dos_paths
3522         ;;
3523     win32|win64)
3524         disable symver
3525         if enabled shared; then
3526             # Link to the import library instead of the normal static library
3527             # for shared libs.
3528             LD_LIB='%.lib'
3529             # Cannot build both shared and static libs with MSVC or icl.
3530             disable static
3531         fi
3532         shlibdir_default="$bindir_default"
3533         SLIBPREF=""
3534         SLIBSUF=".dll"
3535         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3536         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3537         SLIB_CREATE_DEF_CMD='$(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
3538         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3539         SLIB_INSTALL_LINKS=
3540         SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
3541         SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3542         SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
3543         objformat="win32"
3544         ranlib=:
3545         enable dos_paths
3546         ;;
3547     cygwin*)
3548         target_os=cygwin
3549         shlibdir_default="$bindir_default"
3550         SLIBPREF="cyg"
3551         SLIBSUF=".dll"
3552         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
3553         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3554         SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
3555         SLIB_INSTALL_LINKS=
3556         SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a'
3557         SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a'
3558         objformat="win32"
3559         enable dos_paths
3560         ;;
3561     *-dos|freedos|opendos)
3562         network_extralibs="-lsocket"
3563         objformat="coff"
3564         enable dos_paths
3565         add_cppflags -U__STRICT_ANSI__
3566         ;;
3567     linux)
3568         enable dv1394
3569         enable section_data_rel_ro
3570         ;;
3571     irix*)
3572         target_os=irix
3573         ranlib="echo ignoring ranlib"
3574         ;;
3575     os/2*)
3576         ln_s="cp -f"
3577         objformat="aout"
3578         add_cppflags -D_GNU_SOURCE
3579         add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
3580         SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
3581         LIBSUF="_s.a"
3582         SLIBPREF=""
3583         SLIBSUF=".dll"
3584         SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
3585         SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
3586         SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
3587             echo PROTMODE >> $(SUBDIR)$(NAME).def; \
3588             echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
3589             echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
3590             echo EXPORTS >> $(SUBDIR)$(NAME).def; \
3591             emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def'
3592         SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
3593             emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
3594         SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
3595         enable dos_paths
3596         ;;
3597     gnu/kfreebsd)
3598         add_cppflags -D_BSD_SOURCE
3599         ;;
3600     gnu)
3601         ;;
3602     qnx)
3603         add_cppflags -D_QNX_SOURCE
3604         network_extralibs="-lsocket"
3605         ;;
3606     symbian)
3607         SLIBSUF=".dll"
3608         enable dos_paths
3609         add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default
3610         add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS
3611         add_ldflags -Wl,--target1-abs,--no-undefined \
3612                     -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \
3613                     -Wl,--entry=_E32Startup -Wl,-u,_E32Startup
3614         add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \
3615                       -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
3616                       -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
3617         ;;
3618     osf1)
3619         add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
3620         ;;
3621     minix)
3622         ;;
3623     plan9)
3624         add_cppflags -D_C99_SNPRINTF_EXTENSION  \
3625                      -D_REENTRANT_SOURCE        \
3626                      -D_RESEARCH_SOURCE         \
3627                      -DFD_SETSIZE=96            \
3628                      -DHAVE_SOCK_OPTS
3629         add_compat strtod.o strtod=avpriv_strtod
3630         network_extralibs='-lbsd'
3631         exeobjs=compat/plan9/main.o
3632         cp_f='cp'
3633         ;;
3634     none)
3635         ;;
3636     *)
3637         die "Unknown OS '$target_os'."
3638         ;;
3639 esac
3640
3641 # determine libc flavour
3642
3643 probe_libc(){
3644     pfx=$1
3645     pfx_no_=${pfx%_}
3646     # uclibc defines __GLIBC__, so it needs to be checked before glibc.
3647     if check_${pfx}cpp_condition features.h "defined __UCLIBC__"; then
3648         eval ${pfx}libc_type=uclibc
3649         add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3650     elif check_${pfx}cpp_condition features.h "defined __GLIBC__"; then
3651         eval ${pfx}libc_type=glibc
3652         add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3653     # MinGW headers can be installed on Cygwin, so check for newlib first.
3654     elif check_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
3655         eval ${pfx}libc_type=newlib
3656         add_${pfx}cppflags -U__STRICT_ANSI__
3657     # MinGW64 is backwards compatible with MinGW32, so check for it first.
3658     elif check_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then
3659         eval ${pfx}libc_type=mingw64
3660         add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3661         eval test \$${pfx_no_}cc_type = "gcc" &&
3662             add_${pfx}cppflags -D__printf__=__gnu_printf__
3663     elif check_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
3664          check_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
3665         eval ${pfx}libc_type=mingw32
3666         check_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \
3667             (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
3668             die "ERROR: MinGW32 runtime version must be >= 3.15."
3669         add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3670         eval test \$${pfx_no_}cc_type = "gcc" &&
3671             add_${pfx}cppflags -D__printf__=__gnu_printf__
3672     elif check_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
3673         eval ${pfx}libc_type=msvcrt
3674         # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to
3675         # 0x601 by default unless something else is set by the user.
3676         # This can easily lead to us detecting functions only present
3677         # in such new versions and producing binaries requiring windows 7.0.
3678         # Therefore explicitly set the default to XP unless the user has
3679         # set something else on the command line.
3680         check_${pfx}cpp_condition stdlib.h "defined(_WIN32_WINNT)" ||
3681             add_${pfx}cppflags -D_WIN32_WINNT=0x0502
3682     elif check_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then
3683         eval ${pfx}libc_type=klibc
3684     elif check_${pfx}cpp_condition sys/cdefs.h "defined __BIONIC__"; then
3685         eval ${pfx}libc_type=bionic
3686     elif check_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
3687         eval ${pfx}libc_type=solaris
3688         add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
3689     else
3690         eval ${pfx}libc_type=default
3691         add_${pfx}cppflags -D_DEFAULT_SOURCE
3692     fi
3693 }
3694
3695 probe_libc
3696 test -n "$libc_type" && enable libc_$libc_type
3697 probe_libc host_
3698 test -n "$host_libc_type" && enable host_libc_$host_libc_type
3699
3700 case $libc_type in
3701     bionic)
3702         add_compat strtod.o strtod=avpriv_strtod
3703         ;;
3704     msvcrt)
3705         add_compat strtod.o strtod=avpriv_strtod
3706         add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
3707                                      _snprintf=avpriv_snprintf  \
3708                                      vsnprintf=avpriv_vsnprintf
3709         ;;
3710 esac
3711
3712 # hacks for compiler/libc/os combinations
3713
3714 if enabled_all tms470 libc_glibc; then
3715     CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
3716     add_cppflags -D__USER_LABEL_PREFIX__=
3717     add_cppflags -D__builtin_memset=memset
3718     add_cppflags -D__gnuc_va_list=va_list -D_VA_LIST_DEFINED
3719     add_cflags   -pds=48    # incompatible redefinition of macro
3720 fi
3721
3722 if enabled_all ccc libc_glibc; then
3723     add_ldflags -Wl,-z,now  # calls to libots crash without this
3724 fi
3725
3726 check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
3727     add_cppflags '-I\$(SRC_PATH)/compat/float'
3728
3729 esc(){
3730     echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
3731 }
3732
3733 echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $LIBAV_CONFIGURATION)" >config.fate
3734
3735 check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
3736
3737 set_default $PATHS_LIST
3738 set_default nm
3739
3740 # we need to build at least one lib type
3741 if ! enabled_any static shared; then
3742     cat <<EOF
3743 At least one library type must be built.
3744 Specify --enable-static to build the static libraries or --enable-shared to
3745 build the shared libraries as well. To only build the shared libraries specify
3746 --disable-static in addition to --enable-shared.
3747 EOF
3748     exit 1;
3749 fi
3750
3751 die_license_disabled() {
3752     enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
3753 }
3754
3755 die_license_disabled gpl libcdio
3756 die_license_disabled gpl libx264
3757 die_license_disabled gpl libx265
3758 die_license_disabled gpl libxavs
3759 die_license_disabled gpl libxvid
3760 die_license_disabled gpl x11grab
3761
3762 die_license_disabled nonfree libfaac
3763 die_license_disabled nonfree libfdk_aac
3764 die_license_disabled nonfree openssl
3765
3766 die_license_disabled version3 libopencore_amrnb
3767 die_license_disabled version3 libopencore_amrwb
3768 die_license_disabled version3 libvo_aacenc
3769 die_license_disabled version3 libvo_amrwbenc
3770
3771 enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
3772
3773 disabled optimizations || check_cflags -fomit-frame-pointer
3774
3775 enable_weak_pic() {
3776     disabled pic && return
3777     enable pic
3778     add_cppflags -DPIC
3779     case "$target_os" in
3780     mingw*|cygwin*)
3781         ;;
3782     *)
3783         add_cflags -fPIC
3784         ;;
3785     esac
3786     add_asflags  -fPIC
3787 }
3788
3789 enabled pic && enable_weak_pic
3790
3791 check_cc <<EOF || die "Symbol mangling check failed."
3792 int ff_extern;
3793 EOF
3794 sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
3795 extern_prefix=${sym%%ff_extern*}
3796
3797 check_cc <<EOF && enable_weak inline_asm
3798 void foo(void) { __asm__ volatile ("" ::); }
3799 EOF
3800
3801 _restrict=
3802 for restrict_keyword in restrict __restrict__ __restrict; do
3803     check_cc <<EOF && _restrict=$restrict_keyword && break
3804 void foo(char * $restrict_keyword p);
3805 EOF
3806 done
3807
3808 check_cc <<EOF && enable pragma_deprecated
3809 void foo(void) { _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") }
3810 EOF
3811
3812 check_cc <<EOF && enable attribute_packed
3813 struct { int x; } __attribute__((packed)) x;
3814 EOF
3815
3816 check_cc <<EOF && enable attribute_may_alias
3817 union { int x; } __attribute__((may_alias)) x;
3818 EOF
3819
3820 check_cc <<EOF || die "endian test failed"
3821 unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
3822 EOF
3823 od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
3824
3825 check_gas() {
3826     log "check_gas using '$as' as AS"
3827     # :vararg is used on aarch64, arm and ppc altivec
3828     check_as <<EOF || return 1
3829 .macro m n, y:vararg=0
3830 \n: .int \y
3831 .endm
3832 m x
3833 EOF
3834     # .altmacro is only used in arm asm
3835     ! enabled arm || check_as <<EOF || return 1
3836 .altmacro
3837 EOF
3838     enable gnu_as
3839     return 0
3840 }
3841
3842 if enabled_any arm aarch64 || enabled_all ppc altivec && enabled asm; then
3843     nogas=:
3844     enabled_any arm aarch64 && nogas=die
3845     enabled_all ppc altivec && nogas=warn
3846     as_noop=-v
3847
3848     case $as_type in
3849         arm*) gaspp_as_type=armasm; as_noop=-h ;;
3850         gcc)  gaspp_as_type=gas ;;
3851         *)    gaspp_as_type=$as_type ;;
3852     esac
3853
3854     [ $target_os = "darwin" ] && gaspp_as_type="apple-$gaspp_as_type"
3855
3856     check_cmd gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- $as $as_noop &&
3857         gas="gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- $as"
3858
3859     if ! check_gas ; then
3860         as=${gas:=$as}
3861         check_gas || \
3862             $nogas "GNU assembler not found, install/update gas-preprocessor"
3863     fi
3864
3865     check_as <<EOF && enable as_func
3866 .func test
3867 .endfunc
3868 EOF
3869 fi
3870
3871 check_inline_asm inline_asm_labels '"1:\n"'
3872
3873 if enabled aarch64; then
3874     enabled armv8 && check_insn armv8 'prfm   pldl1strm, [x0]'
3875     # internal assembler in clang 3.3 does not support this instruction
3876     enabled neon && check_insn neon 'ext   v0.8B, v0.8B, v1.8B, #1'
3877     enabled vfp  && check_insn vfp  'fmadd d0,    d0,    d1,    d2'
3878
3879     map 'enabled_any ${v}_external ${v}_inline || disable $v' $ARCH_EXT_LIST_ARM
3880
3881 elif enabled alpha; then
3882
3883     check_cflags -mieee
3884
3885 elif enabled arm; then
3886
3887     check_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb
3888     enabled thumb && check_cflags -mthumb || check_cflags -marm
3889
3890     if     check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then
3891         enable vfp_args
3892     elif ! check_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__"; then
3893         case "${cross_prefix:-$cc}" in
3894             *hardfloat*)         enable vfp_args;   fpabi=vfp ;;
3895             *) check_ld <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
3896 __asm__ (".eabi_attribute 28, 1");
3897 int main(void) { return 0; }
3898 EOF
3899         esac
3900         warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
3901     fi
3902
3903     enabled armv5te && check_insn armv5te 'qadd r0, r0, r0'
3904     enabled armv6   && check_insn armv6   'sadd16 r0, r0, r0'
3905     enabled armv6t2 && check_insn armv6t2 'movt r0, #0'
3906     enabled neon    && check_insn neon    'vadd.i16 q0, q0, q0'
3907     enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
3908     enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'
3909
3910     [ $target_os = linux ] || [ $target_os = android ] ||
3911         map 'enabled_any ${v}_external ${v}_inline || disable $v' \
3912             $ARCH_EXT_LIST_ARM
3913
3914     check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
3915
3916     check_as <<EOF && enable as_dn_directive
3917 ra .dn d0.i16
3918 .unreq ra
3919 EOF
3920
3921     [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
3922
3923 elif enabled mips; then
3924
3925     check_inline_asm loongson '"dmult.g $1, $2, $3"'
3926
3927 elif enabled parisc; then
3928
3929     if enabled gcc; then
3930         case $($cc -dumpversion) in
3931             4.[3-8].*) check_cflags -fno-optimize-sibling-calls ;;
3932         esac
3933     fi
3934
3935 elif enabled ppc; then
3936
3937     enable local_aligned_8 local_aligned_16
3938
3939     check_inline_asm dcbzl     '"dcbzl 0, %0" :: "r"(0)'
3940     check_inline_asm ibm_asm   '"add 0, 0, 0"'
3941     check_inline_asm ppc4xx    '"maclhw r10, r11, r12"'
3942     check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'
3943
3944     # AltiVec flags: The FSF version of GCC differs from the Apple version
3945     if enabled altivec; then
3946         check_cflags -maltivec -mabi=altivec &&
3947         { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } ||
3948         check_cflags -faltivec
3949
3950         # check if our compiler supports Motorola AltiVec C API
3951         check_cc <<EOF || disable altivec
3952 $inc_altivec_h
3953 int main(void) {
3954     vector signed int v1 = (vector signed int) { 0 };
3955     vector signed int v2 = (vector signed int) { 1 };
3956     v1 = vec_add(v1, v2);
3957     return 0;
3958 }
3959 EOF
3960
3961         enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
3962     fi
3963
3964 elif enabled x86; then
3965
3966     check_builtin rdtsc    intrin.h   "__rdtsc()"
3967     check_builtin mm_empty mmintrin.h "_mm_empty()"
3968
3969     enable local_aligned_8 local_aligned_16
3970
3971     # check whether EBP is available on x86
3972     # As 'i' is stored on the stack, this program will crash
3973     # if the base pointer is used to access it because the
3974     # base pointer is cleared in the inline assembly code.
3975     check_exec_crash <<EOF && enable ebp_available
3976 volatile int i=0;
3977 __asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
3978 return i;
3979 EOF
3980
3981     # check whether EBX is available on x86
3982     check_inline_asm ebx_available '""::"b"(0)' &&
3983         check_inline_asm ebx_available '"":::"%ebx"'
3984
3985     # check whether xmm clobbers are supported
3986     check_inline_asm xmm_clobbers '"":::"%xmm0"'
3987
3988     # check whether binutils is new enough to compile SSSE3/MMXEXT
3989     enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
3990     enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
3991
3992     if ! disabled_any asm mmx yasm; then
3993         if check_cmd $yasmexe --version; then
3994             enabled x86_64 && yasm_extra="-m amd64"
3995             yasm_debug="-g dwarf2"
3996         elif check_cmd nasm -v; then
3997             yasmexe=nasm
3998             yasm_debug="-g -F dwarf"
3999             enabled x86_64 && test "$objformat" = elf && objformat=elf64
4000         fi
4001
4002         YASMFLAGS="-f $objformat $yasm_extra"
4003         enabled pic               && append YASMFLAGS "-DPIC"
4004         test -n "$extern_prefix"  && append YASMFLAGS "-DPREFIX"
4005         case "$objformat" in
4006             elf*) enabled debug && append YASMFLAGS $yasm_debug ;;
4007         esac
4008
4009         check_yasm "movbe ecx, [5]" && enable yasm ||
4010             die "yasm/nasm not found or too old. Use --disable-yasm for a crippled build."
4011         check_yasm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
4012         check_yasm "vfmadd132ps ymm0, ymm1, ymm2"    || disable fma3_external
4013         check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
4014         check_yasm "CPU amdnop" || disable cpunop
4015     fi
4016
4017     case "$cpu" in
4018         athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
4019             disable fast_clz
4020         ;;
4021     esac
4022
4023 fi
4024
4025 check_code cc arm_neon.h "int16x8_t test = vdupq_n_s16(0)" && enable intrinsics_neon
4026
4027 check_ldflags -Wl,--as-needed
4028
4029 if check_func dlopen; then
4030     ldl=
4031 elif check_func dlopen -ldl; then
4032     ldl=-ldl
4033 fi
4034
4035 if ! disabled network; then
4036     check_func getaddrinfo $network_extralibs
4037     check_func getservbyport $network_extralibs
4038     check_func inet_aton $network_extralibs
4039
4040     check_type netdb.h "struct addrinfo"
4041     check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
4042     check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
4043     check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
4044     check_type poll.h "struct pollfd"
4045     check_type netinet/sctp.h "struct sctp_event_subscribe"
4046     check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
4047     check_type netinet/in.h "struct sockaddr_in6"
4048     check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
4049     check_type "sys/types.h sys/socket.h" socklen_t
4050
4051     # Prefer arpa/inet.h over winsock2
4052     if check_header arpa/inet.h ; then
4053         check_func closesocket
4054     elif check_header winsock2.h ; then
4055         check_func_headers winsock2.h closesocket -lws2 &&
4056             network_extralibs="-lws2" ||
4057         { check_func_headers winsock2.h closesocket -lws2_32 &&
4058             network_extralibs="-lws2_32"; } || disable winsock2_h network
4059         check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
4060
4061         check_type ws2tcpip.h socklen_t
4062         check_type ws2tcpip.h "struct addrinfo"
4063         check_type ws2tcpip.h "struct group_source_req"
4064         check_type ws2tcpip.h "struct ip_mreq_source"
4065         check_type ws2tcpip.h "struct ipv6_mreq"
4066         check_type winsock2.h "struct pollfd"
4067         check_struct winsock2.h "struct sockaddr" sa_len
4068         check_type ws2tcpip.h "struct sockaddr_in6"
4069         check_type ws2tcpip.h "struct sockaddr_storage"
4070     else
4071         disable network
4072     fi
4073 fi
4074
4075 check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
4076 check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
4077 check_builtin MemoryBarrier windows.h "MemoryBarrier()"
4078 check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
4079
4080 check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
4081 check_func  ${malloc_prefix}memalign            && enable memalign
4082 check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
4083
4084 check_cpp_condition unistd.h "defined(_POSIX_MONOTONIC_CLOCK)" &&
4085     check_func_headers time.h clock_gettime || { check_func_headers time.h clock_gettime -lrt && add_extralibs -lrt && LIBRT="-lrt"; }
4086
4087 check_func  fcntl
4088 check_func  fork
4089 check_func  gethrtime
4090 check_func  getopt
4091 check_func  getrusage
4092 check_func  gettimeofday
4093 check_func  gmtime_r
4094 check_func  isatty
4095 check_func  localtime_r
4096 check_func  mach_absolute_time
4097 check_func  mkstemp
4098 check_func  mmap
4099 check_func  mprotect
4100 # Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
4101 check_func_headers time.h nanosleep || { check_func_headers time.h nanosleep -lrt && add_extralibs -lrt; }
4102 check_func  sched_getaffinity
4103 check_func  setrlimit
4104 check_func  strerror_r
4105 check_func  strptime
4106 check_func  sysconf
4107 check_func  sysctl
4108 check_func  usleep
4109
4110 check_func_headers io.h setmode
4111 check_func_headers stdlib.h getenv
4112
4113 check_func_headers windows.h CoTaskMemFree -lole32
4114 check_func_headers windows.h GetProcessAffinityMask
4115 check_func_headers windows.h GetProcessTimes
4116 check_func_headers windows.h GetSystemTimeAsFileTime
4117 check_func_headers windows.h MapViewOfFile
4118 check_func_headers windows.h SetConsoleTextAttribute
4119 check_func_headers windows.h Sleep
4120 check_func_headers windows.h VirtualAlloc
4121 check_struct windows.h "CONDITION_VARIABLE" Ptr
4122
4123 check_header direct.h
4124 check_header dlfcn.h
4125 check_header dxva.h
4126 check_header dxva2api.h
4127 check_header io.h
4128 check_header mach/mach_time.h
4129 check_header malloc.h
4130 check_header poll.h
4131 check_header sys/mman.h
4132 check_header sys/param.h
4133 check_header sys/resource.h
4134 check_header sys/select.h
4135 check_header sys/time.h
4136 check_header sys/un.h
4137 check_header unistd.h
4138 check_header vdpau/vdpau.h
4139 check_header vdpau/vdpau_x11.h
4140 check_header VideoDecodeAcceleration/VDADecoder.h
4141 check_header windows.h
4142 check_header X11/extensions/XvMClib.h
4143
4144 check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
4145 check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
4146 check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
4147
4148 check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
4149
4150 check_type "windows.h dxva.h" "DXVA_PicParams_HEVC"
4151
4152 if ! disabled w32threads && ! enabled pthreads; then
4153     check_func_headers "windows.h process.h" _beginthreadex &&
4154         enable w32threads || disable w32threads
4155 fi
4156
4157 # check for some common methods of building with pthread support
4158 # do this before the optional library checks as some of them require pthreads
4159 if ! disabled pthreads && ! enabled w32threads; then
4160     enable pthreads
4161     if check_func pthread_join -pthread; then
4162         add_cflags -pthread
4163         add_extralibs -pthread
4164     elif check_func pthread_join -pthreads; then
4165         add_cflags -pthreads
4166         add_extralibs -pthreads
4167     elif check_func pthread_join -lpthreadGC2; then
4168         add_extralibs -lpthreadGC2
4169     elif check_lib pthread.h pthread_join -lpthread; then
4170         :
4171     elif ! check_func pthread_join; then
4172         disable pthreads
4173     fi
4174 fi
4175
4176 disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
4177 disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
4178
4179 check_lib math.h sin -lm && LIBM="-lm"
4180 enabled vaapi && require vaapi va/va.h vaInitialize -lva
4181
4182 atan2f_args=2
4183 ldexpf_args=2
4184 powf_args=2
4185
4186 for func in $MATH_FUNCS; do
4187     eval check_mathfunc $func \${${func}_args:-1}
4188 done
4189
4190 # these are off by default, so fail if requested and not available
4191 enabled avisynth          && { { check_header "avisynth/avisynth_c.h" && check_lib2 "windows.h" LoadLibrary; } ||
4192                                { check_header "avxsynth/avxsynth_c.h" && check_lib2 "dlfcn.h" dlopen -ldl; } ||
4193                                die "ERROR: LoadLibrary/dlopen not found, or avisynth header not found"; }
4194 enabled frei0r            && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; }
4195 enabled gnutls            && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
4196 enabled libbs2b           && require_pkg_config libbs2b bs2b.h bs2b_open
4197 enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
4198 enabled libfdk_aac        && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
4199 enabled libfontconfig     && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
4200 enabled libfreetype       && require_pkg_config freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
4201 enabled libgsm            && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
4202                                    check_lib "${gsm_hdr}" gsm_create -lgsm && break;
4203                                done || die "ERROR: libgsm not found"; }
4204 enabled libilbc           && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
4205 enabled libmfx            && require_pkg_config libmfx "mfx/mfxvideo.h" MFXInit
4206 enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
4207 enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
4208 enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
4209 enabled libopencv         && require_pkg_config opencv opencv/cv.h cvCreateImageHeader
4210 enabled libopenh264       && require_pkg_config openh264 wels/codec_api.h WelsGetCodecVersion
4211 enabled libopenjpeg       && { { check_header openjpeg.h && check_lib2 openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC; } ||
4212                                { require_pkg_config libopenjpeg1 openjpeg.h opj_version -DOPJ_STATIC; } }
4213 enabled libopus           && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
4214 enabled libpulse          && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
4215 enabled librtmp           && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
4216 enabled libschroedinger   && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
4217 enabled libspeex          && require_pkg_config speex speex/speex.h speex_decoder_init -lspeex
4218 enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
4219 enabled libtwolame        && require libtwolame twolame.h twolame_init -ltwolame
4220 enabled libvo_aacenc      && require libvo_aacenc vo-aacenc/voAAC.h voGetAACEncAPI -lvo-aacenc
4221 enabled libvo_amrwbenc    && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
4222 enabled libvorbis         && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg
4223 enabled libvpx            && {
4224     enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
4225                                     die "ERROR: libvpx decoder version must be >=0.9.1"; }
4226     enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VPX_CQ" -lvpx ||
4227                                     die "ERROR: libvpx encoder version must be >=0.9.6"; }
4228     enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder; }
4229     enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } }
4230 enabled libwavpack        && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput  -lwavpack
4231 enabled libwebp           && require_pkg_config libwebp webp/encode.h WebPGetEncoderVersion
4232 enabled libx264           && require_pkg_config x264 "stdint.h x264.h" x264_encoder_encode &&
4233                              { check_cpp_condition x264.h "X264_BUILD >= 118" ||
4234                                die "ERROR: libx264 version must be >= 0.118."; }
4235 enabled libx265           && require_pkg_config x265 x265.h x265_encoder_encode &&
4236                              { check_cpp_condition x265.h "X265_BUILD >= 17" ||
4237                                die "ERROR: libx265 version must be >= 17."; }
4238 enabled libxavs           && require libxavs xavs.h xavs_encoder_encode -lxavs
4239 enabled libxvid           && require libxvid xvid.h xvid_global -lxvidcore
4240 enabled openssl           && { check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto ||
4241                                check_lib openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
4242                                check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
4243                                die "ERROR: openssl not found"; }
4244
4245 if enabled gnutls; then
4246     { check_lib nettle/bignum.h nettle_mpz_get_str_256 -lnettle -lhogweed -lgmp && enable nettle; } ||
4247     { check_lib gcrypt.h gcry_mpi_new -lgcrypt && enable gcrypt; }
4248 fi
4249
4250 # libdc1394 check
4251 if enabled libdc1394; then
4252     { require_pkg_config libdc1394-2 dc1394/dc1394.h dc1394_new &&
4253         enable libdc1394_2; } ||
4254     { check_lib libdc1394/dc1394_control.h dc1394_create_handle -ldc1394_control -lraw1394 &&
4255         enable libdc1394_1; } ||
4256     die "ERROR: No version of libdc1394 found "
4257 fi
4258
4259 if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
4260     check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
4261     check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
4262     enable sdl
4263 fi
4264
4265 pod2man --help     > /dev/null 2>&1 && enable pod2man   || disable pod2man
4266 texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html
4267
4268 check_header linux/fb.h
4269 check_header linux/videodev2.h
4270 check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete
4271
4272 check_header sys/videoio.h
4273
4274 check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
4275 # check that WM_CAP_DRIVER_CONNECT is defined to the proper value
4276 # w32api 3.12 had it defined wrong
4277 check_cpp_condition vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER" && enable vfwcap_defines
4278
4279 # check for ioctl_meteor.h, ioctl_bt848.h and alternatives
4280 { check_header dev/bktr/ioctl_meteor.h &&
4281   check_header dev/bktr/ioctl_bt848.h; } ||
4282 { check_header machine/ioctl_meteor.h &&
4283   check_header machine/ioctl_bt848.h; } ||
4284 { check_header dev/video/meteor/ioctl_meteor.h &&
4285   check_header dev/video/bktr/ioctl_bt848.h; } ||
4286 check_header dev/ic/bt8xx.h
4287
4288 check_header sndio.h
4289 check_header sys/soundcard.h
4290 check_header soundcard.h
4291
4292 enabled_any alsa_indev alsa_outdev &&
4293     check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound
4294
4295 enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack &&
4296     check_func jack_port_get_latency_range -ljack
4297
4298 enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio
4299
4300 if enabled libcdio; then
4301     check_lib2 "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
4302     check_lib2 "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
4303     die "ERROR: No usable libcdio/cdparanoia found"
4304 fi
4305
4306 check_lib X11/Xlib.h XOpenDisplay -lX11 && enable xlib
4307
4308 if enabled libxcb || enabled x11grab && ! disabled libxcb; then
4309     check_pkg_config xcb-shape xcb/shape.h xcb_shape_rectangles || {
4310         enabled libxcb && die "ERROR: libxcb not found";
4311     } && disable x11grab && enable libxcb
4312
4313     disabled libxcb_shm ||
4314         check_pkg_config xcb-shm xcb/shm.h xcb_shm_attach || {
4315             enabled libxcb_shm && die "ERROR: libxcb_shm not found";
4316         } && check_header sys/shm.h && enable libxcb_shm
4317
4318     disabled libxcb_xfixes ||
4319         check_pkg_config xcb-xfixes xcb/xfixes.h xcb_xfixes_get_cursor_image || {
4320             enabled libxcb_xfixes && die "ERROR: libxcb_xfixes not found";
4321         } && enable libxcb_xfixes
4322
4323     add_cflags "$xcb_event_cflags $xcb_shm_cflags $xcb_xfixes_cflags"
4324     add_extralibs "$xcb_event_libs $xcb_shm_libs $xcb_xfixes_libs"
4325 fi
4326
4327 if enabled x11grab; then
4328     enabled xlib || die "ERROR: Xlib not found"
4329     require Xext X11/extensions/XShm.h XShmCreateImage -lXext
4330     require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes
4331 fi
4332
4333 enabled vdpau &&
4334     check_cpp_condition vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" ||
4335     disable vdpau
4336
4337 enabled vdpau && enabled xlib &&
4338     check_func_headers "vdpau/vdpau.h vdpau/vdpau_x11.h" vdp_device_create_x11 -lvdpau &&
4339     prepend avconv_libs $($ldflags_filter "-lvdpau") &&
4340     enable vdpau_x11
4341
4342 enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
4343
4344 # add some useful compiler flags if supported
4345 check_cflags -Wdeclaration-after-statement
4346 check_cflags -Wall
4347 check_cflags -Wdisabled-optimization
4348 check_cflags -Wpointer-arith
4349 check_cflags -Wredundant-decls
4350 check_cflags -Wcast-qual
4351 check_cflags -Wwrite-strings
4352 check_cflags -Wtype-limits
4353 check_cflags -Wundef
4354 check_cflags -Wmissing-prototypes
4355 check_cflags -Wstrict-prototypes
4356 enabled extra_warnings && check_cflags -Winline
4357
4358 check_disable_warning(){
4359     warning_flag=-W${1#-Wno-}
4360     test_cflags $warning_flag && add_cflags $1
4361 }
4362
4363 check_disable_warning -Wno-parentheses
4364 check_disable_warning -Wno-switch
4365 check_disable_warning -Wno-format-zero-length
4366 check_disable_warning -Wno-pointer-sign
4367
4368 # add some linker flags
4369 check_ldflags -Wl,--warn-common
4370 check_ldflags -Wl,-rpath-link=libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
4371 enabled rpath && add_ldexeflags -Wl,-rpath,$libdir
4372 test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
4373
4374 # add some strip flags
4375 # -wN '..@*' is more selective than -x, but not available everywhere.
4376 check_stripflags -wN \'..@*\' || check_stripflags -x || strip='true'
4377
4378 enabled neon_clobber_test &&
4379     check_ldflags -Wl,--wrap,avcodec_open2              \
4380                   -Wl,--wrap,avcodec_decode_audio4      \
4381                   -Wl,--wrap,avcodec_decode_video2      \
4382                   -Wl,--wrap,avcodec_decode_subtitle2   \
4383                   -Wl,--wrap,avcodec_encode_audio2      \
4384                   -Wl,--wrap,avcodec_encode_video2      \
4385                   -Wl,--wrap,avcodec_encode_subtitle    \
4386                   -Wl,--wrap,avresample_convert ||
4387     disable neon_clobber_test
4388
4389 enabled xmm_clobber_test &&
4390     check_ldflags -Wl,--wrap,avcodec_open2              \
4391                   -Wl,--wrap,avcodec_decode_audio4      \
4392                   -Wl,--wrap,avcodec_decode_video2      \
4393                   -Wl,--wrap,avcodec_decode_subtitle2   \
4394                   -Wl,--wrap,avcodec_encode_audio2      \
4395                   -Wl,--wrap,avcodec_encode_video2      \
4396                   -Wl,--wrap,avcodec_encode_subtitle    \
4397                   -Wl,--wrap,avresample_convert         \
4398                   -Wl,--wrap,sws_scale ||
4399     disable xmm_clobber_test
4400
4401 echo "X{};" > $TMPV
4402 if test_ldflags -Wl,--version-script,$TMPV; then
4403     append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
4404     check_cc <<EOF && enable symver_asm_label
4405 void ff_foo(void) __asm__ ("av_foo@VERSION");
4406 void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
4407 EOF
4408     check_cc <<EOF && enable symver_gnu_asm
4409 __asm__(".symver ff_foo,av_foo@VERSION");
4410 void ff_foo(void) {}
4411 EOF
4412 fi
4413
4414 if [ -z "$optflags" ]; then
4415     if enabled small; then
4416         optflags=$cflags_size
4417     elif enabled optimizations; then
4418         optflags=$cflags_speed
4419     else
4420         optflags=$cflags_noopt
4421     fi
4422 fi
4423
4424 check_optflags(){
4425     check_cflags "$@"
4426     enabled lto && check_ldflags "$@"
4427 }
4428
4429
4430 if enabled lto; then
4431     test "$cc_type" != "$ld_type" && die "LTO requires same compiler and linker"
4432     check_cflags  -flto
4433     check_ldflags -flto $cpuflags
4434 fi
4435
4436 check_optflags $optflags
4437 check_optflags -fno-math-errno
4438 check_optflags -fno-signed-zeros
4439
4440 if enabled icc; then
4441     # Just warnings, no remarks
4442     check_cflags -w1
4443     # -wd: Disable following warnings
4444     # 144, 167, 556: -Wno-pointer-sign
4445     # 1292: attribute "foo" ignored
4446     # 1419: external declaration in primary source file
4447     # 10006: ignoring unknown option -fno-signed-zeros
4448     # 10148: ignoring unknown option -Wno-parentheses
4449     # 10156: ignoring option '-W'; no argument required
4450     check_cflags -wd144,167,556,1292,1419,10006,10148,10156
4451     # 11030: Warning unknown option --as-needed
4452     # 10156: ignoring option '-export'; no argument required
4453     check_ldflags -wd10156,11030
4454     # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
4455     enable ebp_available
4456     if enabled x86_32; then
4457         icc_version=$($cc -dumpversion)
4458         test ${icc_version%%.*} -ge 11 &&
4459             check_cflags -falign-stack=maintain-16-byte ||
4460             disable aligned_stack
4461     fi
4462 elif enabled ccc; then
4463     # disable some annoying warnings
4464     add_cflags -msg_disable bitnotint
4465     add_cflags -msg_disable mixfuncvoid
4466     add_cflags -msg_disable nonstandcast
4467     add_cflags -msg_disable unsupieee
4468 elif enabled gcc; then
4469     check_optflags -fno-tree-vectorize
4470     check_cflags -Werror=implicit-function-declaration
4471     check_cflags -Werror=missing-prototypes
4472     check_cflags -Werror=return-type
4473     check_cflags -Werror=declaration-after-statement
4474     check_cflags -Werror=vla
4475     check_cflags -Werror=format-security
4476     enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
4477 elif enabled llvm_gcc; then
4478     check_cflags -mllvm -stack-alignment=16
4479 elif enabled clang; then
4480     check_cflags -mllvm -stack-alignment=16
4481     check_cflags -Qunused-arguments
4482     check_cflags -Werror=implicit-function-declaration
4483     check_cflags -Werror=missing-prototypes
4484     check_cflags -Werror=return-type
4485 elif enabled cparser; then
4486     add_cflags -Wno-missing-variable-declarations
4487     add_cflags -Wno-empty-statement
4488 elif enabled armcc; then
4489     add_cflags -W${armcc_opt},--diag_suppress=4343 # hardfp compat
4490     add_cflags -W${armcc_opt},--diag_suppress=3036 # using . as system include dir
4491     # 2523: use of inline assembly is deprecated
4492     add_cflags -W${armcc_opt},--diag_suppress=2523
4493     add_cflags -W${armcc_opt},--diag_suppress=1207
4494     add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
4495     add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
4496     add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
4497     add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
4498 elif enabled tms470; then
4499     add_cflags -pds=824 -pds=837
4500     disable inline_asm
4501 elif enabled pathscale; then
4502     add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
4503 elif enabled_any msvc icl; then
4504     enabled x86_32 && disable aligned_stack
4505     enabled_all x86_32 debug && add_cflags -Oy-
4506     enabled debug && add_ldflags -debug
4507     enable pragma_deprecated
4508     if enabled icl; then
4509         # -Qansi-alias is basically -fstrict-aliasing, but does not work
4510         # (correctly) on icl 13.x.
4511         check_cpp_condition "windows.h" "__ICL < 1300 || __ICL >= 1400" &&
4512             add_cflags -Qansi-alias
4513         # icl will pass the inline asm tests but inline asm is currently
4514         # not supported (build will fail)
4515         disable inline_asm
4516     fi
4517 fi
4518
4519 case $as_type in
4520     clang)
4521         add_asflags -Qunused-arguments
4522     ;;
4523 esac
4524
4525 case $ld_type in
4526     clang)
4527         check_ldflags -Qunused-arguments
4528     ;;
4529 esac
4530
4531 case $target_os in
4532     osf1)
4533         enabled ccc && add_ldflags '-Wl,-expect_unresolved,*'
4534     ;;
4535     plan9)
4536         add_cppflags -Dmain=plan9_main
4537     ;;
4538 esac
4539
4540 enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
4541
4542 check_deps $CONFIG_LIST       \
4543            $CONFIG_EXTRA      \
4544            $HAVE_LIST         \
4545            $ALL_COMPONENTS    \
4546
4547 enabled_all dxva2 CoTaskMemFree &&
4548     prepend avconv_libs $($ldflags_filter "-lole32") &&
4549     enable dxva2_lib
4550
4551 ! enabled_any memalign posix_memalign aligned_malloc &&
4552     enabled simd_align_16 && enable memalign_hack
4553
4554 map 'enabled $v && intrinsics=${v#intrinsics_}' $INTRINSICS_LIST
4555
4556 for thread in $THREADS_LIST; do
4557     if enabled $thread; then
4558         test -n "$thread_type" &&
4559             die "ERROR: Only one thread type must be selected." ||
4560             thread_type="$thread"
4561     fi
4562 done
4563
4564 enabled zlib && add_cppflags -DZLIB_CONST
4565
4566 # conditional library dependencies, in linking order
4567 enabled movie_filter    && prepend avfilter_deps "avformat avcodec"
4568 enabled resample_filter && prepend avfilter_deps "avresample"
4569 enabled scale_filter    && prepend avfilter_deps "swscale"
4570
4571 enabled opus_decoder    && prepend avcodec_deps "avresample"
4572
4573 expand_deps(){
4574     lib_deps=${1}_deps
4575     eval "deps=\$$lib_deps"
4576     append $lib_deps $(map 'eval echo \$${v}_deps' $deps)
4577     unique $lib_deps
4578 }
4579
4580 map 'expand_deps $v' $LIBRARY_LIST
4581
4582 echo "install prefix            $prefix"
4583 echo "source path               $source_path"
4584 echo "C compiler                $cc"
4585 echo "C library                 $libc_type"
4586 if test "$host_cc" != "$cc"; then
4587     echo "host C compiler           $host_cc"
4588     echo "host C library            $host_libc_type"
4589 fi
4590 echo "ARCH                      $arch ($cpu)"
4591 if test "$build_suffix" != ""; then
4592     echo "build suffix              $build_suffix"
4593 fi
4594 if test "$extra_version" != ""; then
4595     echo "version string suffix     $extra_version"
4596 fi
4597 echo "big-endian                ${bigendian-no}"
4598 echo "runtime cpu detection     ${runtime_cpudetect-no}"
4599 if enabled x86; then
4600     echo "${yasmexe}                      ${yasm-no}"
4601     echo "MMX enabled               ${mmx-no}"
4602     echo "MMXEXT enabled            ${mmxext-no}"
4603     echo "3DNow! enabled            ${amd3dnow-no}"
4604     echo "3DNow! extended enabled   ${amd3dnowext-no}"
4605     echo "SSE enabled               ${sse-no}"
4606     echo "SSSE3 enabled             ${ssse3-no}"
4607     echo "AVX enabled               ${avx-no}"
4608     echo "XOP enabled               ${xop-no}"
4609     echo "FMA3 enabled              ${fma3-no}"
4610     echo "FMA4 enabled              ${fma4-no}"
4611     echo "i686 features enabled     ${i686-no}"
4612     echo "CMOV is fast              ${fast_cmov-no}"
4613     echo "EBX available             ${ebx_available-no}"
4614     echo "EBP available             ${ebp_available-no}"
4615 fi
4616 if enabled aarch64; then
4617     echo "NEON enabled              ${neon-no}"
4618     echo "VFP enabled               ${vfp-no}"
4619 fi
4620 if enabled arm; then
4621     echo "ARMv5TE enabled           ${armv5te-no}"
4622     echo "ARMv6 enabled             ${armv6-no}"
4623     echo "ARMv6T2 enabled           ${armv6t2-no}"
4624     echo "VFP enabled               ${vfp-no}"
4625     echo "NEON enabled              ${neon-no}"
4626 fi
4627 if enabled ppc; then
4628     echo "AltiVec enabled           ${altivec-no}"
4629     echo "PPC 4xx optimizations     ${ppc4xx-no}"
4630     echo "dcbzl available           ${dcbzl-no}"
4631 fi
4632 echo "debug symbols             ${debug-no}"
4633 echo "optimize for size         ${small-no}"
4634 echo "optimizations             ${optimizations-no}"
4635 echo "static                    ${static-no}"
4636 echo "shared                    ${shared-no}"
4637 echo "new filter support        ${avfilter-no}"
4638 echo "network support           ${network-no}"
4639 echo "threading support         ${thread_type-no}"
4640 echo "safe bitstream reader     ${safe_bitstream_reader-no}"
4641 echo "SDL support               ${sdl-no}"
4642 test -n "$random_seed" &&
4643     echo "random seed               ${random_seed}"
4644 echo
4645
4646 echo "External libraries:"
4647 print_enabled '' $EXTERNAL_LIBRARY_LIST | print_3_columns
4648 echo
4649
4650 for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
4651     echo "Enabled ${type}s:"
4652     eval list=\$$(toupper $type)_LIST
4653     print_enabled '_*' $list | print_3_columns
4654     echo
4655 done
4656
4657 license="LGPL version 2.1 or later"
4658 if enabled nonfree; then
4659     license="nonfree and unredistributable"
4660 elif enabled gplv3; then
4661     license="GPL version 3 or later"
4662 elif enabled lgplv3; then
4663     license="LGPL version 3 or later"
4664 elif enabled gpl; then
4665     license="GPL version 2 or later"
4666 fi
4667
4668 echo "License: $license"
4669
4670 echo "Creating config.mak and config.h..."
4671
4672 test -e Makefile || echo "include $source_path/Makefile" > Makefile
4673
4674 config_files="$TMPH config.mak"
4675
4676 cat > config.mak <<EOF
4677 # Automatically generated by configure - do not modify!
4678 LIBAV_CONFIGURATION=$LIBAV_CONFIGURATION
4679 prefix=$prefix
4680 LIBDIR=\$(DESTDIR)$libdir
4681 SHLIBDIR=\$(DESTDIR)$shlibdir
4682 INCDIR=\$(DESTDIR)$incdir
4683 BINDIR=\$(DESTDIR)$bindir
4684 DATADIR=\$(DESTDIR)$datadir
4685 DOCDIR=\$(DESTDIR)$docdir
4686 MANDIR=\$(DESTDIR)$mandir
4687 SRC_PATH=$source_path
4688 CC_IDENT=$cc_ident
4689 ARCH=$arch
4690 INTRINSICS=$intrinsics
4691 CC=$cc
4692 AS=$as
4693 LD=$ld
4694 DEPCC=$dep_cc
4695 DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
4696 DEPAS=$as
4697 DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
4698 YASM=$yasmexe
4699 DEPYASM=$yasmexe
4700 AR=$ar
4701 ARFLAGS=$arflags
4702 AR_O=$ar_o
4703 RANLIB=$ranlib
4704 STRIP=$strip
4705 LN_S=$ln_s
4706 CPPFLAGS=$CPPFLAGS
4707 CFLAGS=$CFLAGS
4708 ASFLAGS=$ASFLAGS
4709 AS_C=$AS_C
4710 AS_O=$AS_O
4711 CC_C=$CC_C
4712 CC_E=$CC_E
4713 CC_O=$CC_O
4714 LD_O=$LD_O
4715 LD_LIB=$LD_LIB
4716 LD_PATH=$LD_PATH
4717 DLLTOOL=$dlltool
4718 LDFLAGS=$LDFLAGS
4719 LDEXEFLAGS=$LDEXEFLAGS
4720 SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
4721 STRIPFLAGS=$STRIPFLAGS
4722 YASMFLAGS=$YASMFLAGS
4723 BUILDSUF=$build_suffix
4724 FULLNAME=$FULLNAME
4725 LIBPREF=$LIBPREF
4726 LIBSUF=$LIBSUF
4727 LIBNAME=$LIBNAME
4728 SLIBPREF=$SLIBPREF
4729 SLIBSUF=$SLIBSUF
4730 EXESUF=$EXESUF
4731 EXTRA_VERSION=$extra_version
4732 CCDEP=$CCDEP
4733 CCDEP_FLAGS=$CCDEP_FLAGS
4734 ASDEP=$ASDEP
4735 ASDEP_FLAGS=$ASDEP_FLAGS
4736 CC_DEPFLAGS=$CC_DEPFLAGS
4737 AS_DEPFLAGS=$AS_DEPFLAGS
4738 HOSTCC=$host_cc
4739 HOSTLD=$host_ld
4740 HOSTCFLAGS=$host_cflags
4741 HOSTCPPFLAGS=$host_cppflags
4742 HOSTEXESUF=$HOSTEXESUF
4743 HOSTLDFLAGS=$host_ldflags
4744 HOSTLIBS=$host_libs
4745 DEPHOSTCC=$host_cc
4746 DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
4747 HOSTCCDEP=$HOSTCCDEP
4748 HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
4749 HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
4750 HOSTCC_C=$HOSTCC_C
4751 HOSTCC_O=$HOSTCC_O
4752 HOSTLD_O=$HOSTLD_O
4753 TARGET_EXEC=$target_exec $target_exec_args
4754 TARGET_PATH=$target_path
4755 TARGET_SAMPLES=${target_samples:-\$(SAMPLES)}
4756 CFLAGS-avplay=$sdl_cflags
4757 ZLIB=$($ldflags_filter -lz)
4758 LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
4759 EXTRALIBS=$extralibs
4760 COMPAT_OBJS=$compat_objs
4761 EXEOBJS=$exeobjs
4762 INSTALL=install
4763 LIBTARGET=${LIBTARGET}
4764 SLIBNAME=${SLIBNAME}
4765 SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
4766 SLIBNAME_WITH_MAJOR=${SLIBNAME_WITH_MAJOR}
4767 SLIB_CREATE_DEF_CMD=${SLIB_CREATE_DEF_CMD}
4768 SLIB_EXTRA_CMD=${SLIB_EXTRA_CMD}
4769 SLIB_INSTALL_NAME=${SLIB_INSTALL_NAME}
4770 SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS}
4771 SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
4772 SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
4773 SAMPLES:=${samples:-\$(LIBAV_SAMPLES)}
4774 EOF
4775
4776 get_version(){
4777     lcname=lib${1}
4778     name=$(toupper $lcname)
4779     file=$source_path/$lcname/version.h
4780     eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file")
4781     eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
4782     eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
4783     eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
4784     eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> config.mak
4785 }
4786
4787 map 'get_version $v' $LIBRARY_LIST
4788
4789 map 'eval echo "${v}_FFLIBS=\$${v}_deps" >> config.mak' $LIBRARY_LIST
4790
4791 print_program_libs(){
4792     eval "program_libs=\$${1}_libs"
4793     eval echo "LIBS-${1}=${program_libs}" >> config.mak
4794 }
4795
4796 map 'print_program_libs $v' $PROGRAM_LIST
4797
4798 cat > $TMPH <<EOF
4799 /* Automatically generated by configure - do not modify! */
4800 #ifndef LIBAV_CONFIG_H
4801 #define LIBAV_CONFIG_H
4802 #define LIBAV_CONFIGURATION "$(c_escape $LIBAV_CONFIGURATION)"
4803 #define LIBAV_LICENSE "$(c_escape $license)"
4804 #define AVCONV_DATADIR "$(eval c_escape $datadir)"
4805 #define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
4806 #define restrict $_restrict
4807 #define EXTERN_PREFIX "${extern_prefix}"
4808 #define EXTERN_ASM ${extern_prefix}
4809 #define SLIBSUF "$SLIBSUF"
4810 EOF
4811
4812 test -n "$malloc_prefix" &&
4813     echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH
4814
4815 if enabled yasm; then
4816     append config_files $TMPASM
4817     printf '' >$TMPASM
4818 fi
4819
4820 enabled getenv || echo "#define getenv(x) NULL" >> $TMPH
4821
4822 print_config ARCH_   "$config_files" $ARCH_LIST
4823 print_config HAVE_   "$config_files" $HAVE_LIST
4824 print_config CONFIG_ "$config_files" $CONFIG_LIST       \
4825