configure 137 KB
Newer Older
1
#!/bin/sh
2
#
3
# Libav configure script
4
#
Diego Biurrun's avatar
Diego Biurrun committed
5 6 7
# Copyright (c) 2000-2002 Fabrice Bellard
# Copyright (c) 2005-2008 Diego Biurrun
# Copyright (c) 2005-2008 Mans Rullgard
8
#
9

10
# Prevent locale nonsense from breaking basic text processing.
11 12
LC_ALL=C
export LC_ALL
13

14
# make sure we are running under a compatible shell
15 16 17
# try to make this part work with most shells

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 25
E1="$?"

26
(: ${foo?}) 2> /dev/null
27 28 29 30
E2="$?"

if test "$E1" != 0 || test "$E2" = 0; then
    echo "Broken shell detected.  Trying alternatives."
31 32 33 34 35 36 37 38 39 40 41 42
    export FF_CONF_EXEC
    if test "0$FF_CONF_EXEC" -lt 1; then
        FF_CONF_EXEC=1
        try_exec bash "$0" "$@"
    fi
    if test "0$FF_CONF_EXEC" -lt 2; then
        FF_CONF_EXEC=2
        try_exec ksh "$0" "$@"
    fi
    if test "0$FF_CONF_EXEC" -lt 3; then
        FF_CONF_EXEC=3
        try_exec /usr/xpg4/bin/sh "$0" "$@"
43 44
    fi
    echo "No compatible shell script interpreter found."
Diego Biurrun's avatar
Diego Biurrun committed
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 51 52 53
    if test "$BASH_VERSION" = '2.04.0(1)-release'; then
        echo "This bash version ($BASH_VERSION) is broken on your platform."
        echo "Upgrade to a later version if available."
    fi
54 55 56
    exit 1
fi

57 58
test -d /usr/xpg4/bin && PATH=/usr/xpg4/bin:$PATH

59
show_help(){
60
    cat <<EOF
61 62 63
Usage: configure [options]
Options: [defaults in brackets after descriptions]

64
Help options:
65
  --help                   print this message
66 67 68 69 70 71 72 73 74 75 76 77 78
  --list-decoders          show all available decoders
  --list-encoders          show all available encoders
  --list-hwaccels          show all available hardware accelerators
  --list-demuxers          show all available demuxers
  --list-muxers            show all available muxers
  --list-parsers           show all available parsers
  --list-protocols         show all available protocols
  --list-bsfs              show all available bitstream filters
  --list-indevs            show all available input devices
  --list-outdevs           show all available output devices
  --list-filters           show all available filters

Standard options:
79
  --logfile=FILE           log tests and output to FILE [config.log]
80 81 82
  --disable-logging        do not log configure debug information
  --prefix=PREFIX          install in PREFIX [$prefix]
  --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 86 87 88 89
  --libdir=DIR             install libs in DIR [PREFIX/lib]
  --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
  --incdir=DIR             install includes in DIR [PREFIX/include]
  --mandir=DIR             install man page in DIR [PREFIX/share/man]

90
Licensing options:
91 92 93 94 95
  --enable-gpl             allow use of GPL code, the resulting libs
                           and binaries will be under GPL [no]
  --enable-version3        upgrade (L)GPL to version 3 [no]
  --enable-nonfree         allow use of nonfree code, the resulting libs
                           and binaries will be unredistributable [no]
96 97 98 99 100 101 102 103

Configuration options:
  --disable-static         do not build static libraries [no]
  --enable-shared          build shared libraries [no]
  --enable-small           optimize for size instead of speed
  --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary)
  --enable-gray            enable full grayscale support (slower color)
  --disable-swscale-alpha  disable alpha channel support in swscale
104
  --disable-all            disable building components, libraries and programs
105

106 107
Program options:
  --disable-programs       do not build command line programs
108
  --disable-avconv         disable avconv build
Anton Khirnov's avatar
Anton Khirnov committed
109
  --disable-avplay         disable avplay build
110
  --disable-avprobe        disable avprobe build
111
  --disable-avserver       disable avserver build
112 113 114

Component options:
  --disable-doc            do not build documentation
115 116 117
  --disable-avdevice       disable libavdevice build
  --disable-avcodec        disable libavcodec build
  --disable-avformat       disable libavformat build
118
  --disable-avutil         disable libavutil build
119
  --disable-swscale        disable libswscale build
120
  --disable-avfilter       disable video filter support [no]
Justin Ruggles's avatar
Justin Ruggles committed
121
  --disable-avresample     disable libavresample build [no]
122
  --disable-pthreads       disable pthreads [auto]
123
  --disable-w32threads     disable Win32 threads [auto]
124
  --disable-network        disable network support [no]
125
  --disable-dct            disable DCT code
126
  --disable-error-resilience disable error resilience code
127
  --disable-lsp            disable LSP code
128
  --disable-lzo            disable LZO decoder code
129 130
  --disable-mdct           disable MDCT code
  --disable-rdft           disable RDFT code
131
  --disable-fft            disable FFT code
132 133

Hardware accelerators:
134
  --enable-dxva2           enable DXVA2 code
135
  --enable-vaapi           enable VAAPI code
136
  --enable-vda             enable VDA code
137
  --enable-vdpau           enable VDPAU code
138 139

Individual component options:
140
  --disable-everything     disable all components listed below
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
  --disable-encoder=NAME   disable encoder NAME
  --enable-encoder=NAME    enable encoder NAME
  --disable-encoders       disable all encoders
  --disable-decoder=NAME   disable decoder NAME
  --enable-decoder=NAME    enable decoder NAME
  --disable-decoders       disable all decoders
  --disable-hwaccel=NAME   disable hwaccel NAME
  --enable-hwaccel=NAME    enable hwaccel NAME
  --disable-hwaccels       disable all hwaccels
  --disable-muxer=NAME     disable muxer NAME
  --enable-muxer=NAME      enable muxer NAME
  --disable-muxers         disable all muxers
  --disable-demuxer=NAME   disable demuxer NAME
  --enable-demuxer=NAME    enable demuxer NAME
  --disable-demuxers       disable all demuxers
  --enable-parser=NAME     enable parser NAME
  --disable-parser=NAME    disable parser NAME
  --disable-parsers        disable all parsers
  --enable-bsf=NAME        enable bitstream filter NAME
  --disable-bsf=NAME       disable bitstream filter NAME
  --disable-bsfs           disable all bitstream filters
  --enable-protocol=NAME   enable protocol NAME
  --disable-protocol=NAME  disable protocol NAME
  --disable-protocols      disable all protocols
165
  --enable-indev=NAME      enable input device NAME
166 167
  --disable-indev=NAME     disable input device NAME
  --disable-indevs         disable input devices
168 169
  --enable-outdev=NAME     enable output device NAME
  --disable-outdev=NAME    disable output device NAME
170 171 172 173 174 175 176
  --disable-outdevs        disable output devices
  --disable-devices        disable all devices
  --enable-filter=NAME     enable filter NAME
  --disable-filter=NAME    disable filter NAME
  --disable-filters        disable all filters

External library support:
Diego Biurrun's avatar
Diego Biurrun committed
177
  --enable-avisynth        enable reading of AviSynth script files [no]
178
  --enable-bzlib           enable bzlib [autodetect]
Stefano Sabatini's avatar
Stefano Sabatini committed
179
  --enable-frei0r          enable frei0r video filtering
180
  --enable-gnutls          enable gnutls [no]
181
  --enable-libcdio         enable audio CD grabbing with libcdio
182 183
  --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                           and libraw1394 [no]
184
  --enable-libfaac         enable AAC encoding via libfaac [no]
185
  --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
186
  --enable-libfreetype     enable libfreetype [no]
187
  --enable-libgsm          enable GSM de/encoding via libgsm [no]
188
  --enable-libilbc         enable iLBC de/encoding via libilbc [no]
189
  --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
190 191 192
  --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
  --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
  --enable-libopencv       enable video filtering via libopencv [no]
193
  --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
194
  --enable-libopus         enable Opus decoding via libopus [no]
195
  --enable-libpulse        enable Pulseaudio input via libpulse [no]
196
  --enable-librtmp         enable RTMP[E] support via librtmp [no]
197 198
  --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
  --enable-libspeex        enable Speex de/encoding via libspeex [no]
199
  --enable-libtheora       enable Theora encoding via libtheora [no]
200
  --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
201
  --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
202
  --enable-libvorbis       enable Vorbis encoding via libvorbis [no]
203
  --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
204
  --enable-libwavpack      enable wavpack encoding via libwavpack [no]
Justin Ruggles's avatar
Justin Ruggles committed
205
  --enable-libwebp         enable WebP encoding via libwebp [no]
206
  --enable-libx264         enable H.264 encoding via x264 [no]
Derek Buitenhuis's avatar
Derek Buitenhuis committed
207
  --enable-libx265         enable HEVC encoding via x265 [no]
208
  --enable-libxavs         enable AVS encoding via xavs [no]
209 210
  --enable-libxvid         enable Xvid encoding via xvidcore,
                           native MPEG-4/Xvid encoder exists [no]
211
  --enable-openssl         enable openssl [no]
212
  --enable-x11grab         enable X11 grabbing [no]
213 214
  --enable-zlib            enable zlib [autodetect]

215 216 217 218
Toolchain options:
  --arch=ARCH              select architecture [$arch]
  --cpu=CPU                select the minimum required CPU (affects
                           instruction selection, may crash on older CPUs)
219 220 221 222 223 224 225
  --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
  --enable-cross-compile   assume a cross-compiler is used
  --sysroot=PATH           root of cross-build tree
  --sysinclude=PATH        location of cross-build system headers
  --target-os=OS           compiler targets OS [$target_os]
  --target-exec=CMD        command to run executables on target
  --target-path=DIR        path to view of build directory on target
226
  --target-samples=DIR     path to samples directory on target
227
  --toolchain=NAME         set tool defaults according to NAME
228
  --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [$pkg_config_default]
229
  --nm=NM                  use nm tool
230
  --ar=AR                  use archive tool AR [$ar_default]
231 232
  --as=AS                  use assembler AS [$as_default]
  --cc=CC                  use C compiler CC [$cc_default]
233
  --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
234
  --ld=LD                  use linker LD
235 236
  --pkg-config=PKGCONF     use pkg-config PKGCONF [$pkg_config_default]
  --pkg-config-flags=FLAGS pass additional flags to pkgconf []
237 238
  --host-cc=HOSTCC         use host C compiler HOSTCC
  --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
239
  --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
240
  --host-ld=HOSTLD         use host linker HOSTLD
241 242
  --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
  --host-libs=HLIBS        use libs HLIBS when linking for host
243
  --host-os=OS             compiler host OS [$target_os]
244 245 246 247
  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
  --extra-libs=ELIBS       add ELIBS [$ELIBS]
  --extra-version=STRING   version string suffix []
248
  --optflags=OPTFLAGS      override optimization-related compiler flags
249
  --build-suffix=SUFFIX    library name suffix []
250
  --enable-pic             build position-independent code
251
  --enable-thumb           compile for Thumb instruction set
252 253 254 255
  --enable-lto             use link-time optimization

Advanced options (experts only):
  --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
256 257 258 259 260 261
  --disable-symver         disable symbol versioning
  --enable-hardcoded-tables use hardcoded tables instead of runtime generation
  --disable-safe-bitstream-reader
                           disable buffer boundary checking in bitreaders
                           (faster, but may crash)
  --enable-memalign-hack   emulate memalign, interferes with memory debuggers
262
  --enable-sram            allow use of on-chip SRAM
263 264

Optimization options (experts only):
265
  --disable-asm            disable all assembler optimizations
266 267 268 269
  --disable-altivec        disable AltiVec optimizations
  --disable-amd3dnow       disable 3DNow! optimizations
  --disable-amd3dnowext    disable 3DNow! extended optimizations
  --disable-mmx            disable MMX optimizations
270
  --disable-mmxext         disable MMXEXT optimizations
271
  --disable-sse            disable SSE optimizations
272 273
  --disable-sse2           disable SSE2 optimizations
  --disable-sse3           disable SSE3 optimizations
274
  --disable-ssse3          disable SSSE3 optimizations
275 276
  --disable-sse4           disable SSE4 optimizations
  --disable-sse42          disable SSE4.2 optimizations
277
  --disable-avx            disable AVX optimizations
278
  --disable-xop            disable XOP optimizations
279
  --disable-fma3           disable FMA3 optimizations
280
  --disable-fma4           disable FMA4 optimizations
281
  --disable-avx2           disable AVX2 optimizations
282 283 284
  --disable-armv5te        disable armv5te optimizations
  --disable-armv6          disable armv6 optimizations
  --disable-armv6t2        disable armv6t2 optimizations
285
  --disable-vfp            disable VFP optimizations
286
  --disable-neon           disable NEON optimizations
287
  --disable-vis            disable VIS optimizations
288
  --disable-inline-asm     disable use of inline assembler
289 290
  --disable-yasm           disable use of yasm assembler

291
Developer options (useful when working on Libav itself):
292 293 294 295
  --disable-debug          disable debugging symbols
  --enable-debug=LEVEL     set the debug level [$debuglevel]
  --disable-optimizations  disable compiler optimizations
  --enable-extra-warnings  enable more compiler warnings
296
  --samples=PATH           location of test samples for FATE, if not set use
297
                           \$LIBAV_SAMPLES at make invocation time.
298 299
  --enable-neon-clobber-test check NEON registers for clobbering (should be
                           used only for debugging purposes)
300 301
  --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
                           should be used only for debugging purposes)
302 303 304 305 306 307 308 309
  --enable-random          randomly enable/disable components
  --disable-random
  --enable-random=LIST     randomly enable/disable specific components or
  --disable-random=LIST    component groups. LIST is a comma-separated list
                           of NAME[:PROB] entries where NAME is a component
                           (group) and PROB the probability associated with
                           NAME (default 0.5).
  --random-seed=VALUE      seed value for --enable/disable-random
310 311 312

NOTE: Object files are built at the place where configure is launched.
EOF
313
  exit 0
314
}
315

316 317
quotes='""'

318
log(){
319
    echo "$@" >> $logfile
320 321
}

322
log_file(){
Måns Rullgård's avatar
Måns Rullgård committed
323
    log BEGIN $1
324
    pr -n -t $1 >> $logfile
Måns Rullgård's avatar
Måns Rullgård committed
325 326 327
    log END $1
}

328
echolog(){
Måns Rullgård's avatar
Måns Rullgård committed
329
    log "$@"
330
    echo "$@"
331 332
}

333 334 335 336 337
warn(){
    log "WARNING: $*"
    WARNINGS="${WARNINGS}WARNING: $*\n"
}

338 339 340
die(){
    echolog "$@"
    cat <<EOF
341

342
If you think configure made a mistake, make sure you are using the latest
343
version from Git.  If the latest version fails, report the problem to the
344
libav-tools@libav.org mailing list or IRC #libav on irc.freenode.net.
345
EOF
346
    if disabled logging; then
347
        cat <<EOF
348 349
Rerun configure with logging enabled (do not use --disable-logging), and
include the log this produces with your report.
350 351
EOF
    else
352
        cat <<EOF
353 354
Include the log file "$logfile" produced by configure as this will help
solving the problem.
355 356
EOF
    fi
357 358 359
    exit 1
}

360
# Avoid locale weirdness, besides we really just want to translate ASCII.
361
toupper(){
362
    echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
363 364
}

365
tolower(){
366
    echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
367 368
}

369 370 371 372
c_escape(){
    echo "$*" | sed 's/["\\]/\\\0/g'
}

373 374
sh_quote(){
    v=$(echo "$1" | sed "s/'/'\\\\''/g")
375
    test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
376 377 378
    echo "$v"
}

379 380 381 382
cleanws(){
    echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//'
}

383 384 385 386
filter(){
    pat=$1
    shift
    for v; do
387
        eval "case $v in $pat) echo $v ;; esac"
388 389 390
    done
}

391 392 393 394 395 396 397 398
filter_out(){
    pat=$1
    shift
    for v; do
        eval "case $v in $pat) ;; *) echo $v ;; esac"
    done
}

399 400 401
map(){
    m=$1
    shift
402
    for v; do eval $m; done
403 404
}

405 406 407 408 409 410
add_suffix(){
    suffix=$1
    shift
    for v; do echo ${v}${suffix}; done
}

411 412 413 414 415 416 417 418
set_all(){
    value=$1
    shift
    for var in $*; do
        eval $var=$value
    done
}

419 420 421 422 423 424 425 426
set_weak(){
    value=$1
    shift
    for var; do
        eval : \${$var:=$value}
    done
}

427 428 429 430
sanitize_var_name(){
    echo $@ | sed 's/[^A-Za-z0-9_]/_/g'
}

431 432 433
set_safe(){
    var=$1
    shift
434
    eval $(sanitize_var_name "$var")='$*'
435 436 437
}

get_safe(){
438
    eval echo \$$(sanitize_var_name "$1")
439 440
}

441
pushvar(){
442 443 444 445
    for pvar in $*; do
        eval level=\${${pvar}_level:=0}
        eval ${pvar}_${level}="\$$pvar"
        eval ${pvar}_level=$(($level+1))
446 447 448 449
    done
}

popvar(){
450 451
    for pvar in $*; do
        eval level=\${${pvar}_level:-0}
452 453
        test $level = 0 && continue
        eval level=$(($level-1))
454 455 456
        eval $pvar="\${${pvar}_${level}}"
        eval ${pvar}_level=$level
        eval unset ${pvar}_${level}
457 458 459
    done
}

460 461 462 463 464 465 466 467
enable(){
    set_all yes $*
}

disable(){
    set_all no $*
}

468 469 470 471 472 473 474 475
enable_weak(){
    set_weak yes $*
}

disable_weak(){
    set_weak no $*
}

476
enable_safe(){
477 478 479
    for var; do
        enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
480 481 482
}

disable_safe(){
483 484 485
    for var; do
        disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
486 487
}

488 489 490 491
do_enable_deep(){
    for var; do
        enabled $var && continue
        eval sel="\$${var}_select"
492 493
        eval sgs="\$${var}_suggest"
        pushvar var sgs
494
        enable_deep $sel
495 496
        popvar sgs
        enable_deep_weak $sgs
497 498 499 500 501 502 503 504 505
        popvar var
    done
}

enable_deep(){
    do_enable_deep $*
    enable $*
}

506
enable_deep_weak(){
507 508 509 510 511 512 513
    for var; do
        disabled $var && continue
        pushvar var
        do_enable_deep $var
        popvar var
        enable_weak $var
    done
514 515
}

516
enabled(){
517 518
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xyes"
519 520
}

521
disabled(){
522 523
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xno"
524 525
}

526 527 528 529 530 531
enabled_all(){
    for opt; do
        enabled $opt || return 1
    done
}

532 533 534 535 536 537
disabled_all(){
    for opt; do
        disabled $opt || return 1
    done
}

538 539 540 541 542 543
enabled_any(){
    for opt; do
        enabled $opt && return 0
    done
}

544 545 546 547
disabled_any(){
    for opt; do
        disabled $opt && return 0
    done
548
    return 1
549 550
}

551 552
set_default(){
    for opt; do
553
        eval : \${$opt:=\$${opt}_default}
554 555 556
    done
}

557 558 559 560 561 562 563 564 565
is_in(){
    value=$1
    shift
    for var in $*; do
        [ $var = $value ] && return 0
    done
    return 1
}

566
do_check_deps(){
567
    for cfg; do
568
        cfg="${cfg#!}"
569 570 571
        enabled ${cfg}_checking && die "Circular dependency for $cfg."
        disabled ${cfg}_checking && continue
        enable ${cfg}_checking
572
        append allopts $cfg
573

574 575
        eval dep_all="\$${cfg}_deps"
        eval dep_any="\$${cfg}_deps_any"
576
        eval dep_sel="\$${cfg}_select"
577
        eval dep_sgs="\$${cfg}_suggest"
578 579
        eval dep_ifa="\$${cfg}_if"
        eval dep_ifn="\$${cfg}_if_any"
580

581
        pushvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
582
        do_check_deps $dep_all $dep_any $dep_sel $dep_sgs $dep_ifa $dep_ifn
583
        popvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
584

585 586
        [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
        [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
Måns Rullgård's avatar
Måns Rullgård committed
587 588
        enabled_all  $dep_all || disable $cfg
        enabled_any  $dep_any || disable $cfg
589
        disabled_any $dep_sel && disable $cfg
590

591
        if enabled $cfg; then
592
            enable_deep $dep_sel
593
            enable_deep_weak $dep_sgs
594 595
        fi

596
        disable ${cfg}_checking
597 598 599
    done
}

600 601 602 603 604 605 606 607 608 609 610 611
check_deps(){
    unset allopts

    do_check_deps "$@"

    for cfg in $allopts; do
        enabled $cfg || continue
        eval dep_extralibs="\$${cfg}_extralibs"
        test -n "$dep_extralibs" && add_extralibs $dep_extralibs
    done
}

612 613
print_config(){
    pfx=$1
614 615
    files=$2
    shift 2
616 617 618 619 620 621 622 623 624 625 626 627 628 629
    map 'eval echo "$v \${$v:-no}"' "$@" |
    awk "BEGIN { split(\"$files\", files) }
        {
            c = \"$pfx\" toupper(\$1);
            v = \$2;
            sub(/yes/, 1, v);
            sub(/no/,  0, v);
            for (f in files) {
                file = files[f];
                if (file ~ /\\.h\$/) {
                    printf(\"#define %s %d\\n\", c, v) >>file;
                } else if (file ~ /\\.asm\$/) {
                    printf(\"%%define %s %d\\n\", c, v) >>file;
                } else if (file ~ /\\.mak\$/) {
630
                    n = -v ? \"\" : \"!\";
631 632 633 634
                    printf(\"%s%s=yes\\n\", n, c) >>file;
                }
            }
        }"
635 636
}

637 638 639 640
print_enabled(){
    suf=$1
    shift
    for v; do
641
        enabled $v && printf "%s\n" ${v%$suf};
642 643 644
    done
}

645 646 647 648 649 650
append(){
    var=$1
    shift
    eval "$var=\"\$$var $*\""
}

651 652 653 654 655 656
prepend(){
    var=$1
    shift
    eval "$var=\"$* \$$var\""
}

657
add_cppflags(){
658
    append CPPFLAGS "$@"
659 660
}

661
add_cflags(){
662
    append CFLAGS $($cflags_filter "$@")
663 664
}

665
add_asflags(){
666
    append ASFLAGS $($asflags_filter "$@")
667 668
}

669
add_ldflags(){
670
    append LDFLAGS $($ldflags_filter "$@")
671 672
}

673 674 675 676
add_stripflags(){
    append STRIPFLAGS "$@"
}

677
add_extralibs(){
678
    prepend extralibs $($ldflags_filter "$@")
679 680
}

681 682 683 684
add_host_cppflags(){
    append host_cppflags "$@"
}

685 686 687 688 689 690 691 692
add_host_cflags(){
    append host_cflags $($host_cflags_filter "$@")
}

add_host_ldflags(){
    append host_ldflags $($host_ldflags_filter "$@")
}

693 694 695 696 697 698
add_compat(){
    append compat_objs $1
    shift
    map 'add_cppflags -D$v' "$@"
}

699
check_cmd(){
700
    log "$@"
701
    "$@" >> $logfile 2>&1
702 703
}

704 705 706 707
cc_o(){
    eval printf '%s\\n' $CC_O
}

708 709 710 711
cc_e(){
    eval printf '%s\\n' $CC_E
}

712
check_cc(){
713
    log check_cc "$@"
714
    cat > $TMPC
715
    log_file $TMPC
716
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
717 718 719 720
}

check_cpp(){
    log check_cpp "$@"
721
    cat > $TMPC
722
    log_file $TMPC
723
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
724 725
}

726 727 728 729
as_o(){
    eval printf '%s\\n' $AS_O
}

730 731
check_as(){
    log check_as "$@"
732 733 734
    cat > $TMPS
    log_file $TMPS
    check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
735 736
}

737 738
check_inline_asm(){
    log check_inline_asm "$@"
739
    name="$1"
740
    code="$2"
741
    shift 2
742
    disable $name
743
    check_cc "$@" <<EOF && enable $name
744
void foo(void){ __asm__ volatile($code); }
745 746 747
EOF
}

748 749 750 751 752 753
check_insn(){
    log check_insn "$@"
    check_inline_asm ${1}_inline "\"$2\""
    echo "$2" | check_as && enable ${1}_external || disable ${1}_external
}

Loren Merritt's avatar
Loren Merritt committed
754 755 756 757 758 759 760 761
check_yasm(){
    log check_yasm "$@"
    echo "$1" > $TMPS
    log_file $TMPS
    shift 1
    check_cmd $yasmexe $YASMFLAGS "$@" -o $TMPO $TMPS
}

762 763 764 765
ld_o(){
    eval printf '%s\\n' $LD_O
}

766
check_ld(){
767
    log check_ld "$@"
768 769
    flags=$(filter_out '-l*' "$@")
    libs=$(filter '-l*' "$@")
770
    check_cc $($cflags_filter $flags) || return
771 772
    flags=$($ldflags_filter $flags)
    libs=$($ldflags_filter $libs)
773
    check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
774 775
}

776 777 778 779 780 781 782
print_include(){
    hdr=$1
    test "${hdr%.h}" = "${hdr}" &&
        echo "#include $hdr"    ||
        echo "#include <$hdr>"
}

783 784 785 786 787 788 789 790
check_code(){
    log check_code "$@"
    check=$1
    headers=$2
    code=$3
    shift 3
    {
        for hdr in $headers; do
791
            print_include $hdr
792 793 794 795 796
        done
        echo "int main(void) { $code; return 0; }"
    } | check_$check "$@"
}

797 798
check_cppflags(){
    log check_cppflags "$@"
799
    check_cc "$@" <<EOF && append CPPFLAGS "$@"
800 801 802 803
int x;
EOF
}

804 805
test_cflags(){
    log test_cflags "$@"
806
    set -- $($cflags_filter "$@")
807
    check_cc "$@" <<EOF
808 809 810 811
int x;
EOF
}

812 813 814 815 816
check_cflags(){
    log check_cflags "$@"
    test_cflags "$@" && add_cflags "$@"
}

817 818 819
test_ldflags(){
    log test_ldflags "$@"
    check_ld "$@" <<EOF
820
int main(void){ return 0; }
821 822 823
EOF
}

824 825 826 827 828
check_ldflags(){
    log check_ldflags "$@"
    test_ldflags "$@" && add_ldflags "$@"
}

829 830 831 832 833 834 835 836 837 838 839 840 841 842
test_stripflags(){
    log test_stripflags "$@"
    # call check_cc to get a fresh TMPO
    check_cc <<EOF
int main(void) { return 0; }
EOF
    check_cmd $strip $STRIPFLAGS "$@" $TMPO
}

check_stripflags(){
    log check_stripflags "$@"
    test_stripflags "$@" && add_stripflags "$@"
}

843
check_header(){
844
    log check_header "$@"
845 846
    header=$1
    shift
847 848
    disable_safe $header
    check_cpp "$@" <<EOF && enable_safe $header
849 850 851 852 853 854
#include <$header>
int x;
EOF
}

check_func(){
855
    log check_func "$@"
856 857
    func=$1
    shift
Måns Rullgård's avatar
Måns Rullgård committed
858 859
    disable $func
    check_ld "$@" <<EOF && enable $func
860
extern int $func();
861
int main(void){ $func(); }
862 863 864
EOF
}

865
check_mathfunc(){
866
    log check_mathfunc "$@"
867
    func=$1
868 869 870
    narg=$2
    shift 2
    test $narg = 2 && args="f, g" || args="f"
871 872 873
    disable $func
    check_ld "$@" <<EOF && enable $func
#include <math.h>
874
float foo(float f, float g) { return $func($args); }
875
int main(void){ return 0; }
876 877 878
EOF
}

879 880
check_func_headers(){
    log check_func_headers "$@"
881
    headers=$1
882
    funcs=$2
883
    shift 2
884 885
    {
        for hdr in $headers; do
886
            print_include $hdr
887 888 889 890 891 892
        done
        for func in $funcs; do
            echo "long check_$func(void) { return (long) $func; }"
        done
        echo "int main(void) { return 0; }"
    } | check_ld "$@" && enable $funcs && enable_safe $headers
893 894
}

895 896 897 898
check_cpp_condition(){
    log check_cpp_condition "$@"
    header=$1
    condition=$2
899
    shift 2
900
    check_cpp "$@" <<EOF
901 902 903 904 905 906 907
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

908 909 910 911 912
check_lib(){
    log check_lib "$@"
    header="$1"
    func="$2"
    shift 2
913
    check_header $header && check_func $func "$@" && add_extralibs "$@"
914 915
}

916 917 918
check_lib2(){
    log check_lib2 "$@"
    headers="$1"
919
    funcs="$2"
920
    shift 2
921
    check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
922 923
}

924 925 926 927 928 929
check_pkg_config(){
    log check_pkg_config "$@"
    pkg="$1"
    headers="$2"
    funcs="$3"
    shift 3
930
    check_cmd $pkg_config --exists --print-errors $pkg || return
931 932
    pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
    pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
933 934 935 936 937
    check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
        set_safe ${pkg}_cflags $pkg_cflags   &&
        set_safe ${pkg}_libs   $pkg_libs
}

938
check_exec(){
939
    check_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
940 941
}

942
check_exec_crash(){
943
    code=$(cat)
944 945 946 947 948 949 950

    # exit() is not async signal safe.  _Exit (C99) and _exit (POSIX)
    # are safe but may not be available everywhere.  Thus we use
    # raise(SIGTERM) instead.  The check is run in a subshell so we
    # can redirect the "Terminated" message from the shell.  SIGBUS
    # is not defined by standard C so it is used conditionally.

951
    (check_exec "$@") >> $logfile 2>&1 <<EOF
952 953 954 955
#include <signal.h>
static void sighandler(int sig){
    raise(SIGTERM);
}
956 957 958
int foo(void){
    $code
}
959
int (*func_ptr)(void) = foo;
Diego Biurrun's avatar
Diego Biurrun committed
960
int main(void){
961 962 963 964 965 966
    signal(SIGILL, sighandler);
    signal(SIGFPE, sighandler);
    signal(SIGSEGV, sighandler);
#ifdef SIGBUS
    signal(SIGBUS, sighandler);
#endif
967
    return func_ptr();
968 969 970 971
}
EOF
}

972 973 974 975 976
check_type(){
    log check_type "$@"
    headers=$1
    type=$2
    shift 2
977
    disable_safe "$type"
978
    check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
979 980
}

981
check_struct(){
982
    log check_struct "$@"
983 984 985 986 987
    headers=$1
    struct=$2
    member=$3
    shift 3
    disable_safe "${struct}_${member}"
988 989
    check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
        enable_safe "${struct}_${member}"
990 991
}

992 993 994 995 996 997 998 999 1000 1001
check_builtin(){
    log check_builtin "$@"
    name=$1
    headers=$2
    builtin=$3
    shift 3
    disable "$name"
    check_code ld "$headers" "$builtin" "$@" && enable "$name"
}

1002 1003 1004 1005 1006 1007 1008 1009 1010 1011
check_compile_assert(){
    log check_compile_assert "$@"
    name=$1
    headers=$2
    condition=$3
    shift 3
    disable "$name"
    check_code cc "$headers" "char c[2 * !!($condition) - 1]" "$@" && enable "$name"
}

1012 1013 1014 1015 1016 1017
require(){
    name="$1"
    header="$2"
    func="$3"
    shift 3
    check_lib $header $func "$@" || die "ERROR: $name not found"
1018 1019
}

1020 1021 1022 1023 1024 1025 1026 1027
require2(){
    name="$1"
    headers="$2"
    func="$3"
    shift 3
    check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
}

1028 1029 1030 1031 1032 1033 1034
require_pkg_config(){
    pkg="$1"
    check_pkg_config "$@" || die "ERROR: $pkg not found"
    add_cflags    $(get_safe ${pkg}_cflags)
    add_extralibs $(get_safe ${pkg}_libs)
}

1035 1036 1037 1038
hostcc_e(){
    eval printf '%s\\n' $HOSTCC_E
}

1039 1040 1041 1042
hostcc_o(){
    eval printf '%s\\n' $HOSTCC_O
}

1043 1044 1045 1046
check_host_cc(){
    log check_host_cc "$@"
    cat > $TMPC
    log_file $TMPC
1047
    check_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
1048 1049
}

1050 1051 1052 1053 1054 1055 1056
check_host_cpp(){
    log check_host_cpp "$@"
    cat > $TMPC
    log_file $TMPC
    check_cmd $host_cc $HOSTCPPFLAGS $HOSTCFLAGS "$@" $(hostcc_e $TMPO) $TMPC
}

1057 1058 1059 1060 1061 1062 1063
check_host_cppflags(){
    log check_host_cppflags "$@"
    check_host_cc "$@" <<EOF && append host_cppflags "$@"
int x;
EOF
}

1064 1065
check_host_cflags(){
    log check_host_cflags "$@"
1066
    set -- $($host_cflags_filter "$@")
1067 1068 1069 1070 1071
    check_host_cc "$@" <<EOF && append host_cflags "$@"
int x;
EOF
}

1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084
check_host_cpp_condition(){
    log check_host_cpp_condition "$@"
    header=$1
    condition=$2
    shift 2
    check_host_cpp "$@" <<EOF
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

1085 1086 1087 1088 1089 1090
apply(){
    file=$1
    shift
    "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
}

1091
cp_if_changed(){
1092 1093
    cmp -s "$1" "$2" && echo "$2 is unchanged" && return
    mkdir -p "$(dirname $2)"
Mans Rullgard's avatar
Mans Rullgard committed
1094
    $cp_f "$1" "$2"
1095 1096
}

1097 1098 1099
# CONFIG_LIST contains configurable options, while HAVE_LIST is for
# system-dependent things.

1100 1101 1102 1103 1104
COMPONENT_LIST="
    bsfs
    decoders
    demuxers
    encoders
Vitor Sessak's avatar
Vitor Sessak committed
1105
    filters
1106
    hwaccels
1107
    indevs
1108
    muxers
1109
    outdevs
1110 1111 1112 1113
    parsers
    protocols
"

1114
EXAMPLE_LIST="
1115
    avcodec_example
1116
    filter_audio_example
1117
    metadata_example
1118
    output_example
1119
    transcode_aac_example
1120 1121
"

1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148
EXTERNAL_LIBRARY_LIST="
    avisynth
    bzlib
    frei0r
    gnutls
    libcdio
    libdc1394
    libfaac
    libfdk_aac
    libfreetype
    libgsm
    libilbc
    libmp3lame
    libopencore_amrnb
    libopencore_amrwb
    libopencv
    libopenjpeg
    libopus
    libpulse
    librtmp
    libschroedinger
    libspeex
    libtheora
    libvo_aacenc
    libvo_amrwbenc
    libvorbis
    libvpx
1149
    libwavpack
Justin Ruggles's avatar
Justin Ruggles committed
1150
    libwebp
1151
    libx264
Derek Buitenhuis's avatar
Derek Buitenhuis committed
1152
    libx265
1153 1154 1155 1156 1157 1158 1159
    libxavs
    libxvid
    openssl
    x11grab
    zlib
"

1160 1161 1162 1163 1164 1165
HWACCEL_LIST="
    dxva2
    vaapi
    vda
    vdpau
"
1166

1167 1168 1169 1170 1171 1172 1173 1174 1175 1176
LIBRARY_LIST="
    avcodec
    avdevice
    avfilter
    avformat
    avresample
    avutil
    swscale
"

1177 1178 1179 1180 1181 1182 1183
PROGRAM_LIST="
    avconv
    avplay
    avprobe
    avserver
"

1184 1185
CONFIG_LIST="
    $COMPONENT_LIST
1186
    $EXAMPLE_LIST
1187
    $EXTERNAL_LIBRARY_LIST
1188
    $HWACCEL_LIST
1189
    $LIBRARY_LIST
1190
    $PROGRAM_LIST
1191
    dct
1192
    doc
1193
    error_resilience
1194
    fft
1195
    gpl
1196
    gray
Aurelien Jacobs's avatar
Aurelien Jacobs committed
1197
    hardcoded_tables
1198
    lsp
1199
    lzo
1200
    mdct
1201
    memalign_hack
1202
    neon_clobber_test
1203
    network
1204
    nonfree
1205
    pic
1206
    pod2man
1207
    rdft
1208
    runtime_cpudetect
1209
    safe_bitstream_reader
1210
    shared
1211
    small
1212
    sram
1213
    static
1214
    swscale_alpha
1215
    texi2html
1216
    thumb
1217
    version3
1218
    xmm_clobber_test
1219
"
1220

1221
THREADS_LIST="
1222 1223
    pthreads
    w32threads
1224
"
1225

1226
ATOMICS_LIST="
1227 1228
    atomics_gcc
    atomics_suncc
1229
    atomics_win32
1230
"
1231

1232
ARCH_LIST="
1233
    aarch64
1234
    alpha
1235
    arm
1236 1237 1238
    avr32
    avr32_ap
    avr32_uc
1239 1240 1241 1242
    bfin
    ia64
    m68k
    mips
1243
    mips64
1244
    parisc
1245
    ppc
1246
    ppc64
1247 1248 1249 1250
    s390
    sh4
    sparc
    sparc64
1251 1252
    tilegx
    tilepro
1253
    tomi
1254 1255 1256
    x86
    x86_32
    x86_64
1257
"
1258

1259
ARCH_EXT_LIST_ARM="
1260 1261 1262 1263
    armv5te
    armv6
    armv6t2
    neon
1264
    vfp
1265
    vfpv3
1266
"
1267

1268
ARCH_EXT_LIST_X86_SIMD="
1269
    amd3dnow
1270
    amd3dnowext
1271
    avx
1272
    avx2
1273
    fma3
1274 1275 1276 1277 1278 1279 1280 1281 1282
    fma4
    mmx
    mmxext
    sse
    sse2
    sse3
    sse4
    sse42
    ssse3
1283 1284
    xop
"
1285

1286 1287 1288 1289 1290 1291
ARCH_EXT_LIST_X86="
    $ARCH_EXT_LIST_X86_SIMD
    cpunop
    i686
"

1292
ARCH_EXT_LIST="
1293
    $ARCH_EXT_LIST_ARM
1294 1295
    $ARCH_EXT_LIST_X86
    altivec
1296
    ppc4xx
1297
    vis
1298
"