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