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