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