configure 98.7 KB
Newer Older
1
#!/bin/sh
2
#
3 4
# FFmpeg configure script
#
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
}

Måns Rullgård's avatar
Måns Rullgård committed
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
typo  
Diego Biurrun committed
45
    echo "This configure script requires a POSIX-compatible shell"
46
    echo "such as bash or ksh."
Diego Biurrun's avatar
Diego Biurrun committed
47 48 49
    echo "THIS IS NOT A BUG IN FFMPEG, DO NOT REPORT IT AS SUCH."
    echo "Instead, install a working POSIX-compatible shell."
    echo "Disabling this configure test will create a broken FFmpeg."
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
show_help(){
58 59 60 61 62 63
cat <<EOF
Usage: configure [options]
Options: [defaults in brackets after descriptions]

Standard options:
  --help                   print this message
64
  --logfile=FILE           log tests and output to FILE [config.log]
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
  --disable-logging        do not log configure debug information
  --prefix=PREFIX          install in PREFIX [$prefix]
  --bindir=DIR             install binaries in DIR [PREFIX/bin]
  --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]
  --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]

Configuration options:
  --disable-static         do not build static libraries [no]
  --enable-shared          build shared libraries [no]
  --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]
  --disable-doc            do not build documentation
  --disable-ffmpeg         disable ffmpeg build
  --disable-ffplay         disable ffplay build
Stefano Sabatini's avatar
Stefano Sabatini committed
85
  --disable-ffprobe        disable ffprobe build
86
  --disable-ffserver       disable ffserver build
87 88
  --disable-avdevice       disable libavdevice build
  --disable-avcodec        disable libavcodec build
Stefano Sabatini's avatar
Stefano Sabatini committed
89
  --disable-avcore         disable libavcore build
90 91
  --disable-avformat       disable libavformat build
  --disable-swscale        disable libswscale build
92
  --enable-postproc        enable GPLed postprocessing support [no]
93
  --disable-avfilter       disable video filter support [no]
94
  --disable-pthreads       disable pthreads [auto]
95 96 97 98 99 100 101 102 103
  --enable-w32threads      use Win32 threads [no]
  --enable-x11grab         enable X11 grabbing [no]
  --disable-network        disable network support [no]
  --disable-mpegaudio-hp   faster (but less accurate) MPEG audio decoding [no]
  --enable-gray            enable full grayscale support (slower color)
  --disable-swscale-alpha  disable alpha channel support in swscale
  --disable-fastdiv        disable table-based division
  --enable-small           optimize for size instead of speed
  --disable-aandct         disable AAN DCT code
104
  --disable-dct            disable DCT code
105 106
  --disable-fft            disable FFT code
  --disable-golomb         disable Golomb code
107
  --disable-huffman        disable Huffman code
108 109 110 111 112
  --disable-lpc            disable LPC code
  --disable-mdct           disable MDCT code
  --disable-rdft           disable RDFT code
  --disable-vaapi          disable VAAPI code
  --disable-vdpau          disable VDPAU code
Laurent Aimar's avatar
Laurent Aimar committed
113
  --disable-dxva2          disable DXVA2 code
114 115 116
  --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary)
  --enable-hardcoded-tables use hardcoded tables instead of runtime generation
  --enable-memalign-hack   emulate memalign, interferes with memory debuggers
117
  --disable-everything     disable all components listed below
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 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
  --disable-indev=NAME     disable input device NAME
  --disable-outdev=NAME    disable output device NAME
  --disable-indevs         disable input devices
  --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
  --list-decoders          show all available decoders
  --list-encoders          show all available encoders
  --list-hwaccels          show all available hardware accelerators
  --list-muxers            show all available muxers
  --list-demuxers          show all available demuxers
  --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

External library support:
  --enable-avisynth        enable reading of AVISynth script files [no]
  --enable-bzlib           enable bzlib [autodetect]
Stefano Sabatini's avatar
Stefano Sabatini committed
165
  --enable-frei0r          enable frei0r video filtering
166 167
  --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
  --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
168
  --enable-libopencv       enable video filtering via libopencv [no]
169 170 171 172 173 174 175 176 177
  --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                           and libraw1394 [no]
  --enable-libdirac        enable Dirac support via libdirac [no]
  --enable-libfaac         enable FAAC support via libfaac [no]
  --enable-libgsm          enable GSM support via libgsm [no]
  --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
  --enable-libnut          enable NUT (de)muxing via libnut,
                           native (de)muxer exists [no]
  --enable-libopenjpeg     enable JPEG 2000 decoding via OpenJPEG [no]
178
  --enable-librtmp         enable RTMP[E] support via librtmp [no]
179 180 181 182 183
  --enable-libschroedinger enable Dirac support via libschroedinger [no]
  --enable-libspeex        enable Speex decoding via libspeex [no]
  --enable-libtheora       enable Theora encoding via libtheora [no]
  --enable-libvorbis       enable Vorbis encoding via libvorbis,
                           native implementation exists [no]
James Zern's avatar
James Zern committed
184
  --enable-libvpx          enable VP8 support via libvpx [no]
185
  --enable-libx264         enable H.264 encoding via x264 [no]
186
  --enable-libxavs         enable AVS encoding via xavs [no]
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
  --enable-libxvid         enable Xvid encoding via xvidcore,
                           native MPEG-4/Xvid encoder exists [no]
  --enable-mlib            enable Sun medialib [no]
  --enable-zlib            enable zlib [autodetect]

Advanced options (experts only):
  --source-path=PATH       path to source code [$source_path]
  --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
  --nm=NM                  use nm tool
202
  --ar=AR                  use archive tool AR [$ar_default]
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
  --as=AS                  use assembler AS [$as_default]
  --cc=CC                  use C compiler CC [$cc_default]
  --ld=LD                  use linker LD
  --host-cc=HOSTCC         use host C compiler HOSTCC
  --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
  --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
  --host-libs=HLIBS        use libs HLIBS when linking for host
  --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 []
  --build-suffix=SUFFIX    library name suffix []
  --arch=ARCH              select architecture [$arch]
  --cpu=CPU                select the minimum required CPU (affects
                           instruction selection, may crash on older CPUs)
218
  --disable-asm            disable all assembler optimizations
219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
  --disable-altivec        disable AltiVec optimizations
  --disable-amd3dnow       disable 3DNow! optimizations
  --disable-amd3dnowext    disable 3DNow! extended optimizations
  --disable-mmx            disable MMX optimizations
  --disable-mmx2           disable MMX2 optimizations
  --disable-sse            disable SSE optimizations
  --disable-ssse3          disable SSSE3 optimizations
  --disable-armv5te        disable armv5te optimizations
  --disable-armv6          disable armv6 optimizations
  --disable-armv6t2        disable armv6t2 optimizations
  --disable-armvfp         disable ARM VFP optimizations
  --disable-iwmmxt         disable iwmmxt optimizations
  --disable-mmi            disable MMI optimizations
  --disable-neon           disable neon optimizations
  --disable-vis            disable VIS optimizations
  --disable-yasm           disable use of yasm assembler
  --enable-pic             build position-independent code
236
  --malloc-prefix=PFX      prefix malloc and related names with PFX
237
  --enable-sram            allow use of on-chip SRAM
238
  --disable-symver         disable symbol versioning
239 240 241 242 243 244 245

Developer options (useful when working on FFmpeg itself):
  --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
  --disable-stripping      disable stripping of executables and shared libraries
Måns Rullgård's avatar
Måns Rullgård committed
246
  --samples=PATH           location of test samples for FATE
247 248 249

NOTE: Object files are built at the place where configure is launched.
EOF
250
  exit 0
251
}
252

253 254
quotes='""'

255
log(){
256
    echo "$@" >> $logfile
257 258
}

259
log_file(){
Måns Rullgård's avatar
Måns Rullgård committed
260
    log BEGIN $1
261
    pr -n -t $1 >> $logfile
Måns Rullgård's avatar
Måns Rullgård committed
262 263 264
    log END $1
}

265
echolog(){
Måns Rullgård's avatar
Måns Rullgård committed
266
    log "$@"
267
    echo "$@"
268 269
}

270 271 272 273 274
warn(){
    log "WARNING: $*"
    WARNINGS="${WARNINGS}WARNING: $*\n"
}

275 276 277
die(){
    echolog "$@"
    cat <<EOF
278

279 280
If you think configure made a mistake, make sure you are using the latest
version from SVN.  If the latest version fails, report the problem to the
281
ffmpeg-user@mplayerhq.hu mailing list or IRC #ffmpeg on irc.freenode.net.
282
EOF
283
    if disabled logging; then
284
        cat <<EOF
285 286
Rerun configure with logging enabled (do not use --disable-logging), and
include the log this produces with your report.
287 288 289
EOF
    else
cat <<EOF
290 291
Include the log file "$logfile" produced by configure as this will help
solving the problem.
292 293
EOF
    fi
294 295 296
    exit 1
}

297
# Avoid locale weirdness, besides we really just want to translate ASCII.
298
toupper(){
299
    echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
300 301
}

Måns Rullgård's avatar
Måns Rullgård committed
302
tolower(){
303
    echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
Måns Rullgård's avatar
Måns Rullgård committed
304 305
}

306 307 308 309
c_escape(){
    echo "$*" | sed 's/["\\]/\\\0/g'
}

310 311
sh_quote(){
    v=$(echo "$1" | sed "s/'/'\\\\''/g")
312
    test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
313 314 315
    echo "$v"
}

316 317 318 319
filter(){
    pat=$1
    shift
    for v; do
320
        eval "case $v in $pat) echo $v ;; esac"
321 322 323
    done
}

324 325 326
map(){
    m=$1
    shift
Måns Rullgård's avatar
Måns Rullgård committed
327
    for v; do eval $m; done
328 329
}

330 331 332 333 334 335 336 337
set_all(){
    value=$1
    shift
    for var in $*; do
        eval $var=$value
    done
}

338 339 340 341 342 343 344 345
set_weak(){
    value=$1
    shift
    for var; do
        eval : \${$var:=$value}
    done
}

346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364
pushvar(){
    for var in $*; do
        eval level=\${${var}_level:=0}
        eval ${var}_${level}="\$$var"
        eval ${var}_level=$(($level+1))
    done
}

popvar(){
    for var in $*; do
        eval level=\${${var}_level:-0}
        test $level = 0 && continue
        eval level=$(($level-1))
        eval $var="\${${var}_${level}}"
        eval ${var}_level=$level
        eval unset ${var}_${level}
    done
}

365 366 367 368 369 370 371 372
enable(){
    set_all yes $*
}

disable(){
    set_all no $*
}

373 374 375 376 377 378 379 380
enable_weak(){
    set_weak yes $*
}

disable_weak(){
    set_weak no $*
}

381
enable_safe(){
382 383 384
    for var; do
        enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
385 386 387
}

disable_safe(){
388 389 390
    for var; do
        disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
391 392
}

393 394 395 396
do_enable_deep(){
    for var; do
        enabled $var && continue
        eval sel="\$${var}_select"
397 398
        eval sgs="\$${var}_suggest"
        pushvar var sgs
399
        enable_deep $sel
400 401
        popvar sgs
        enable_deep_weak $sgs
402 403 404 405 406 407 408 409 410
        popvar var
    done
}

enable_deep(){
    do_enable_deep $*
    enable $*
}

411 412 413 414 415
enable_deep_weak(){
    do_enable_deep $*
    enable_weak $*
}

416
enabled(){
417 418
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xyes"
419 420
}

421
disabled(){
422 423
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xno"
424 425
}

426 427 428 429 430 431
enabled_all(){
    for opt; do
        enabled $opt || return 1
    done
}

432 433 434 435 436 437
disabled_all(){
    for opt; do
        disabled $opt || return 1
    done
}

438 439 440 441 442 443
enabled_any(){
    for opt; do
        enabled $opt && return 0
    done
}

444 445 446 447
disabled_any(){
    for opt; do
        disabled $opt && return 0
    done
448
    return 1
449 450
}

451 452
set_default(){
    for opt; do
453
        eval : \${$opt:=\$${opt}_default}
454 455 456
    done
}

457 458 459 460 461 462 463 464 465
is_in(){
    value=$1
    shift
    for var in $*; do
        [ $var = $value ] && return 0
    done
    return 1
}

466 467
check_deps(){
    for cfg; do
468
        cfg="${cfg#!}"
469 470 471 472
        enabled ${cfg}_checking && die "Circular dependency for $cfg."
        disabled ${cfg}_checking && continue
        enable ${cfg}_checking

473 474
        eval dep_all="\$${cfg}_deps"
        eval dep_any="\$${cfg}_deps_any"
475
        eval dep_sel="\$${cfg}_select"
476
        eval dep_sgs="\$${cfg}_suggest"
477 478
        eval dep_ifa="\$${cfg}_if"
        eval dep_ifn="\$${cfg}_if_any"
479

480 481 482
        pushvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
        check_deps $dep_all $dep_any $dep_sel $dep_sgs $dep_ifa $dep_ifn
        popvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
483

484 485
        [ -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
486 487
        enabled_all  $dep_all || disable $cfg
        enabled_any  $dep_any || disable $cfg
488
        disabled_any $dep_sel && disable $cfg
489

490 491 492
        if enabled $cfg; then
            eval dep_extralibs="\$${cfg}_extralibs"
            test -n "$dep_extralibs" && add_extralibs $dep_extralibs
493
            enable_deep $dep_sel
494
            enable_deep_weak $dep_sgs
495 496
        fi

497
        disable ${cfg}_checking
498 499 500
    done
}

501 502 503 504 505 506 507 508 509 510
print_config_h(){
    enabled $1 && v=1 || v=0
    echo "#define $2 $v"
}

print_config_mak(){
    enabled $1 && v= || v=!
    echo "$v$2=yes"
}

511 512 513 514
print_config_asm(){
    enabled $1 && echo "%define $2"
}

515 516
print_config(){
    pfx=$1
517 518
    files=$2
    shift 2
519
    for cfg; do
520
        ucname="$(toupper $cfg)"
521 522 523
        for f in $files; do
            "print_config_${f##*.}" $cfg ${pfx}${ucname} >>$f
        done
524
    done
525 526
}

527 528 529 530 531 532 533 534 535
print_enabled(){
    test "$1" = -n && end=" " && shift || end="\n"
    suf=$1
    shift
    for v; do
        enabled $v && printf "%s$end" ${v%$suf};
    done
}

536 537 538 539 540 541
append(){
    var=$1
    shift
    eval "$var=\"\$$var $*\""
}

542 543 544 545 546 547
prepend(){
    var=$1
    shift
    eval "$var=\"$* \$$var\""
}

548
add_cppflags(){
549
    append CPPFLAGS $($filter_cppflags "$@")
550 551
}

552
add_cflags(){
553
    append CFLAGS $($filter_cflags "$@")
554 555
}

556
add_asflags(){
557
    append ASFLAGS $($filter_asflags "$@")
558 559
}

560 561 562 563 564
add_ldflags(){
    append LDFLAGS "$@"
}

add_extralibs(){
565
    prepend extralibs "$@"
566 567
}

568
check_cmd(){
Måns Rullgård's avatar
Måns Rullgård committed
569
    log "$@"
570
    "$@" >> $logfile 2>&1
571 572
}

573
check_cc(){
574
    log check_cc "$@"
575
    cat > $TMPC
576
    log_file $TMPC
577
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" -c -o $TMPO $TMPC
578 579 580 581
}

check_cpp(){
    log check_cpp "$@"
582
    cat > $TMPC
583
    log_file $TMPC
Måns Rullgård's avatar
Måns Rullgård committed
584
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" -E -o $TMPO $TMPC
585 586
}

587 588 589 590
check_as(){
    log check_as "$@"
    cat > $TMPC
    log_file $TMPC
591
    check_cmd $as $CPPFLAGS $ASFLAGS "$@" -c -o $TMPO $TMPC
592 593
}

594 595 596
check_asm(){
    log check_asm "$@"
    name="$1"
597
    code="$2"
598
    shift 2
599 600
    disable $name
    check_as "$@" <<EOF && enable $name
601
void foo(void){ __asm__ volatile($code); }
602 603 604
EOF
}

Loren Merritt's avatar
Loren Merritt committed
605 606 607 608 609 610 611 612
check_yasm(){
    log check_yasm "$@"
    echo "$1" > $TMPS
    log_file $TMPS
    shift 1
    check_cmd $yasmexe $YASMFLAGS "$@" -o $TMPO $TMPS
}

613
check_ld(){
614
    log check_ld "$@"
615 616 617 618 619
    flags=''
    libs=''
    for f; do
        test "${f}" = "${f#-l}" && flags="$flags $f" || libs="$libs $f"
    done
620
    check_cc $($filter_cflags $flags) || return
621
    check_cmd $ld $LDFLAGS $flags -o $TMPE $TMPO $extralibs $libs
622 623
}

624 625
check_cppflags(){
    log check_cppflags "$@"
626 627
    set -- $($filter_cppflags "$@")
    check_cc "$@" <<EOF && append CPPFLAGS "$@"
628 629 630 631
int x;
EOF
}

632
check_cflags(){
633
    log check_cflags "$@"
634 635
    set -- $($filter_cflags "$@")
    check_cc "$@" <<EOF && append CFLAGS "$@"
636 637 638 639
int x;
EOF
}

640 641 642
test_ldflags(){
    log test_ldflags "$@"
    check_ld "$@" <<EOF
643
int main(void){ return 0; }
644 645 646
EOF
}

647 648 649 650 651
check_ldflags(){
    log check_ldflags "$@"
    test_ldflags "$@" && add_ldflags "$@"
}

652
check_header(){
653
    log check_header "$@"
654 655
    header=$1
    shift
656 657
    disable_safe $header
    check_cpp "$@" <<EOF && enable_safe $header
658 659 660 661 662 663
#include <$header>
int x;
EOF
}

check_func(){
664
    log check_func "$@"
665 666
    func=$1
    shift
Måns Rullgård's avatar
Måns Rullgård committed
667 668
    disable $func
    check_ld "$@" <<EOF && enable $func
669
extern int $func();
670
int main(void){ $func(); }
671 672 673
EOF
}

674
check_mathfunc(){
675
    log check_mathfunc "$@"
676 677 678 679 680
    func=$1
    shift
    disable $func
    check_ld "$@" <<EOF && enable $func
#include <math.h>
681 682
float foo(float f) { return $func(f); }
int main(void){ return 0; }
683 684 685
EOF
}

686 687
check_func_headers(){
    log check_func_headers "$@"
688 689 690 691 692 693 694 695 696
    headers=$1
    func=$2
    shift 2
    disable $func
    incs=""
    for hdr in $headers; do
        incs="$incs
#include <$hdr>"
    done
697
    check_ld "$@" <<EOF && enable $func && enable_safe $headers
698
$incs
699
int main(int argc, char **argv){
700
    return (long) $func;
701 702 703 704
}
EOF
}

705 706 707 708
check_cpp_condition(){
    log check_cpp_condition "$@"
    header=$1
    condition=$2
709 710
    shift 2
    check_cpp $($filter_cppflags "$@") <<EOF
711 712 713 714 715 716 717
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

718 719 720 721 722
check_lib(){
    log check_lib "$@"
    header="$1"
    func="$2"
    shift 2
723
    check_header $header && check_func $func "$@" && add_extralibs "$@"
724 725
}

726 727 728 729 730
check_lib2(){
    log check_lib2 "$@"
    headers="$1"
    func="$2"
    shift 2
731
    check_func_headers "$headers" $func "$@" && add_extralibs "$@"
732 733
}

734
check_exec(){
735
    check_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
736 737
}

738
check_exec_crash(){
739
    code=$(cat)
740 741 742 743 744 745 746

    # 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.

747
    (check_exec "$@") >> $logfile 2>&1 <<EOF
748 749 750 751
#include <signal.h>
static void sighandler(int sig){
    raise(SIGTERM);
}
Diego Biurrun's avatar
Diego Biurrun committed
752
int main(void){
753 754 755 756 757 758 759 760 761 762 763
    signal(SIGILL, sighandler);
    signal(SIGFPE, sighandler);
    signal(SIGSEGV, sighandler);
#ifdef SIGBUS
    signal(SIGBUS, sighandler);
#endif
    { $code }
}
EOF
}

764 765 766 767 768
check_type(){
    log check_type "$@"
    headers=$1
    type=$2
    shift 2
769
    disable_safe "$type"
770 771 772 773 774
    incs=""
    for hdr in $headers; do
        incs="$incs
#include <$hdr>"
    done
775
    check_cc "$@" <<EOF && enable_safe "$type"
776 777 778 779 780
$incs
$type v;
EOF
}

781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798
check_struct(){
    log check_type "$@"
    headers=$1
    struct=$2
    member=$3
    shift 3
    disable_safe "${struct}_${member}"
    incs=""
    for hdr in $headers; do
        incs="$incs
#include <$hdr>"
    done
    check_cc "$@" <<EOF && enable_safe "${struct}_${member}"
$incs
const void *p = &(($struct *)0)->$member;
EOF
}

799 800 801 802 803 804
require(){
    name="$1"
    header="$2"
    func="$3"
    shift 3
    check_lib $header $func "$@" || die "ERROR: $name not found"
805 806
}

807 808 809 810 811 812 813 814
require2(){
    name="$1"
    headers="$2"
    func="$3"
    shift 3
    check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
}

815 816 817 818 819 820 821 822 823 824 825 826 827 828
check_host_cc(){
    log check_host_cc "$@"
    cat > $TMPC
    log_file $TMPC
    check_cmd $host_cc $host_cflags "$@" -c -o $TMPO $TMPC
}

check_host_cflags(){
    log check_host_cflags "$@"
    check_host_cc "$@" <<EOF && append host_cflags "$@"
int x;
EOF
}

829 830 831 832 833 834
apply(){
    file=$1
    shift
    "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
}

835 836 837 838 839 840
cp_if_changed(){
    cmp -s "$1" "$2" &&
        echo "$2 is unchanged" ||
        cp -f "$1" "$2"
}

841 842 843
# CONFIG_LIST contains configurable options, while HAVE_LIST is for
# system-dependent things.

844 845 846 847 848
COMPONENT_LIST="
    bsfs
    decoders
    demuxers
    encoders
Vitor Sessak's avatar
Vitor Sessak committed
849
    filters
850
    hwaccels
851
    indevs
852
    muxers
853
    outdevs
854 855 856 857 858 859
    parsers
    protocols
"

CONFIG_LIST="
    $COMPONENT_LIST
860
    aandct
861
    avcodec
Stefano Sabatini's avatar
Stefano Sabatini committed
862
    avcore
863
    avdevice
864
    avfilter
865
    avformat
866
    avisynth
867
    bzlib
868
    dct
869
    doc
870
    dwt
Laurent Aimar's avatar
Laurent Aimar committed
871
    dxva2
872
    fastdiv
873 874
    ffmpeg
    ffplay
Stefano Sabatini's avatar
Stefano Sabatini committed
875
    ffprobe
876
    ffserver
877
    fft
Stefano Sabatini's avatar
Stefano Sabatini committed
878
    frei0r
879
    golomb
880
    gpl
881
    gray
882
    h264dsp
883
    h264pred
Aurelien Jacobs's avatar
Aurelien Jacobs committed
884
    hardcoded_tables
885
    huffman
Ramiro Polla's avatar
Ramiro Polla committed
886
    libdc1394
887
    libdirac
888
    libfaac
889
    libgsm
890
    libmp3lame
891
    libnut
892 893
    libopencore_amrnb
    libopencore_amrwb
894
    libopencv
895
    libopenjpeg
896
    librtmp
897
    libschroedinger
David Conrad's avatar
David Conrad committed
898
    libspeex
Diego Biurrun's avatar
Diego Biurrun committed
899
    libtheora
900
    libvorbis
James Zern's avatar
James Zern committed
901
    libvpx
902
    libx264
903
    libxavs
904
    libxvid
905
    lpc
906
    lsp
907
    mdct
908
    memalign_hack
909
    mlib
910 911
    mpegaudio_hp
    network
912
    nonfree
913
    pic
914
    postproc
915
    rdft
916
    rtpdec
917
    runtime_cpudetect
918
    shared
919
    small
920
    sram
921
    static
922
    swscale
923
    swscale_alpha
924 925
    vaapi
    vdpau
926
    version3
927
    x11grab
928
    zlib
929
"
930

931 932 933 934 935
THREADS_LIST='
    pthreads
    w32threads
'

936 937
ARCH_LIST='
    alpha
938
    arm
939 940 941
    avr32
    avr32_ap
    avr32_uc
942 943 944 945
    bfin
    ia64
    m68k
    mips
946
    mips64
947
    parisc
948
    ppc
949
    ppc64
950 951 952 953
    s390
    sh4
    sparc
    sparc64
Måns Rullgård's avatar
Måns Rullgård committed
954
    tomi
955 956 957 958 959 960
    x86
    x86_32
    x86_64
'

ARCH_EXT_LIST='
961
    altivec
962
    amd3dnow
963
    amd3dnowext
964
    armv5te
965
    armv6
966
    armv6t2
Måns Rullgård's avatar
Måns Rullgård committed
967
    armvfp
968 969 970
    iwmmxt
    mmi
    mmx
971
    mmx2
972
    neon
973
    ppc4xx
974
    sse