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