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