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