avpacket: Replace av_free_packet with av_packet_unref
[ffmpeg.git] / configure
1 #!/bin/sh
2 #
3 # Libav configure script
4 #
5 # Copyright (c) 2000-2002 Fabrice Bellard
6 # Copyright (c) 2005-2008 Diego Biurrun
7 # Copyright (c) 2005-2008 Mans Rullgard
8 #
9
10 # Prevent locale nonsense from breaking basic text processing.
11 LC_ALL=C
12 export LC_ALL
13
14 # make sure we are running under a compatible shell
15 # try to make this part work with most shells
16
17 try_exec(){
18     echo "Trying shell $1"
19     type "$1" > /dev/null 2>&1 && exec "$@"
20 }
21
22 unset foo
23 (: ${foo%%bar}) 2> /dev/null
24 E1="$?"
25
26 (: ${foo?}) 2> /dev/null
27 E2="$?"
28
29 if test "$E1" != 0 || test "$E2" = 0; then
30     echo "Broken shell detected.  Trying alternatives."
31     export FF_CONF_EXEC
32     if test "0$FF_CONF_EXEC" -lt 1; then
33         FF_CONF_EXEC=1
34         try_exec bash "$0" "$@"
35     fi
36     if test "0$FF_CONF_EXEC" -lt 2; then
37         FF_CONF_EXEC=2
38         try_exec ksh "$0" "$@"
39     fi
40     if test "0$FF_CONF_EXEC" -lt 3; then
41         FF_CONF_EXEC=3
42         try_exec /usr/xpg4/bin/sh "$0" "$@"
43     fi
44     echo "No compatible shell script interpreter found."
45     echo "This configure script requires a POSIX-compatible shell"
46     echo "such as bash or ksh."
47     echo "THIS IS NOT A BUG IN LIBAV, DO NOT REPORT IT AS SUCH."
48     echo "Instead, install a working POSIX-compatible shell."
49     echo "Disabling this configure test will create a broken Libav."
50     if test "$BASH_VERSION" = '2.04.0(1)-release'; then
51         echo "This bash version ($BASH_VERSION) is broken on your platform."
52         echo "Upgrade to a later version if available."
53     fi
54     exit 1
55 fi
56
57 test -d /usr/xpg4/bin && PATH=/usr/xpg4/bin:$PATH
58
59 show_help(){
60     cat <<EOF
61 Usage: configure [options]
62 Options: [defaults in brackets after descriptions]
63
64 Help options:
65   --help                   print this message
66   --list-decoders          show all available decoders
67   --list-encoders          show all available encoders
68   --list-hwaccels          show all available hardware accelerators
69   --list-demuxers          show all available demuxers
70   --list-muxers            show all available muxers
71   --list-parsers           show all available parsers
72   --list-protocols         show all available protocols
73   --list-bsfs              show all available bitstream filters
74   --list-indevs            show all available input devices
75   --list-outdevs           show all available output devices
76   --list-filters           show all available filters
77
78 Standard options:
79   --logfile=FILE           log tests and output to FILE [config.log]
80   --disable-logging        do not log configure debug information
81   --prefix=PREFIX          install in PREFIX [$prefix]
82   --bindir=DIR             install binaries in DIR [PREFIX/bin]
83   --datadir=DIR            install data files in DIR [PREFIX/share/avconv]
84   --docdir=DIR             install documentation in DIR [PREFIX/share/doc/libav]
85   --libdir=DIR             install libs in DIR [PREFIX/lib]
86   --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
87   --incdir=DIR             install includes in DIR [PREFIX/include]
88   --mandir=DIR             install man page in DIR [PREFIX/share/man]
89   --enable-rpath           use rpath when linking programs [USE WITH CARE]
90
91 Licensing options:
92   --enable-gpl             allow use of GPL code, the resulting libs
93                            and binaries will be under GPL [no]
94   --enable-version3        upgrade (L)GPL to version 3 [no]
95   --enable-nonfree         allow use of nonfree code, the resulting libs
96                            and binaries will be unredistributable [no]
97
98 Configuration options:
99   --disable-static         do not build static libraries [no]
100   --enable-shared          build shared libraries [no]
101   --enable-small           optimize for size instead of speed
102   --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary)
103   --enable-gray            enable full grayscale support (slower color)
104   --disable-swscale-alpha  disable alpha channel support in swscale
105   --disable-all            disable building components, libraries and programs
106
107 Program options:
108   --disable-programs       do not build command line programs
109   --disable-avconv         disable avconv build
110   --disable-avplay         disable avplay build
111   --disable-avprobe        disable avprobe build
112   --disable-avserver       deprecated, does nothing
113
114 Component options:
115   --disable-doc            do not build documentation
116   --disable-avdevice       disable libavdevice build
117   --disable-avcodec        disable libavcodec build
118   --disable-avformat       disable libavformat build
119   --disable-avutil         disable libavutil build
120   --disable-swscale        disable libswscale build
121   --disable-avfilter       disable video filter support [no]
122   --disable-avresample     disable libavresample build [no]
123   --disable-pthreads       disable pthreads [auto]
124   --disable-w32threads     disable Win32 threads [auto]
125   --disable-network        disable network support [no]
126   --disable-dct            disable DCT code
127   --disable-error-resilience disable error resilience code
128   --disable-lsp            disable LSP code
129   --disable-lzo            disable LZO decoder code
130   --disable-mdct           disable MDCT code
131   --disable-rdft           disable RDFT code
132   --disable-fft            disable FFT code
133   --disable-faan           disable floating point AAN (I)DCT code
134
135 Hardware accelerators:
136   --enable-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