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