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