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