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