configure 101 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
}

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."
47
    echo "THIS IS NOT A BUG IN LIBAV, DO NOT REPORT IT AS SUCH."
Diego Biurrun's avatar
Diego Biurrun committed
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
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
  --disable-logging        do not log configure debug information
  --prefix=PREFIX          install in PREFIX [$prefix]
  --bindir=DIR             install binaries in DIR [PREFIX/bin]
68
  --datadir=DIR            install data files in DIR [PREFIX/share/avconv]
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
  --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
84
  --disable-avconv         disable avconv build
Anton Khirnov's avatar
Anton Khirnov committed
85
  --disable-avplay         disable avplay build
Anton Khirnov's avatar
Anton Khirnov committed
86
  --disable-avprobe        disable avprobe build
Anton Khirnov's avatar
Anton Khirnov committed
87
  --disable-avserver       disable avserver build
88 89 90 91
  --disable-avdevice       disable libavdevice build
  --disable-avcodec        disable libavcodec build
  --disable-avformat       disable libavformat build
  --disable-swscale        disable libswscale build
92
  --disable-postproc       disable libpostproc build
93
  --disable-avfilter       disable video filter support [no]
94
  --disable-pthreads       disable pthreads [auto]
95 96 97 98 99 100 101 102
  --enable-w32threads      use Win32 threads [no]
  --enable-x11grab         enable X11 grabbing [no]
  --disable-network        disable network support [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
103
  --disable-dct            disable DCT code
104 105
  --disable-fft            disable FFT code
  --disable-golomb         disable Golomb code
106
  --disable-huffman        disable Huffman code
107 108 109
  --disable-lpc            disable LPC code
  --disable-mdct           disable MDCT code
  --disable-rdft           disable RDFT code
110
  --enable-vaapi           enable VAAPI code
111
  --enable-vdpau           enable VDPAU code
Laurent Aimar's avatar
Laurent Aimar committed
112
  --disable-dxva2          disable DXVA2 code
113 114 115
  --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
116
  --disable-everything     disable all components listed below
117 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
  --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
164
  --enable-frei0r          enable frei0r video filtering
165 166
  --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
  --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
167
  --enable-libopencv       enable video filtering via libopencv [no]
168 169 170 171
  --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]
172
  --enable-libfreetype     enable libfreetype [no]
173 174 175 176 177
  --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
  --enable-libschroedinger enable Dirac support via libschroedinger [no]
  --enable-libspeex        enable Speex decoding via libspeex [no]
  --enable-libtheora       enable Theora encoding via libtheora [no]
182
  --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
183
  --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
184 185
  --enable-libvorbis       enable Vorbis encoding via libvorbis,
                           native implementation exists [no]
James Zern's avatar
James Zern committed
186
  --enable-libvpx          enable VP8 support via libvpx [no]
187
  --enable-libx264         enable H.264 encoding via x264 [no]
188
  --enable-libxavs         enable AVS encoding via xavs [no]
189 190 191 192 193 194 195 196 197 198 199 200 201 202
  --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):
  --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
203
  --ar=AR                  use archive tool AR [$ar_default]
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
  --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)
219
  --disable-asm            disable all assembler optimizations
220 221 222 223 224 225 226
  --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
Mans Rullgard's avatar
Mans Rullgard committed
227
  --disable-avx            disable AVX optimizations
228 229 230 231 232 233 234 235 236 237
  --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
238
  --malloc-prefix=PFX      prefix malloc and related names with PFX
239
  --enable-sram            allow use of on-chip SRAM
240
  --disable-symver         disable symbol versioning
241
  --optflags               override optimization-related compiler flags
242

243
Developer options (useful when working on Libav itself):
244 245 246 247
  --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
248 249
  --samples=PATH           location of test samples for FATE, if not set use
                           \$FATE_SAMPLES at make invocation time.
250 251 252

NOTE: Object files are built at the place where configure is launched.
EOF
253
  exit 0
254
}
255

256 257
quotes='""'

258
log(){
259
    echo "$@" >> $logfile
260 261
}

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

268
echolog(){
Måns Rullgård's avatar
Måns Rullgård committed
269
    log "$@"
270
    echo "$@"
271 272
}

273 274 275 276 277
warn(){
    log "WARNING: $*"
    WARNINGS="${WARNINGS}WARNING: $*\n"
}

278 279 280
die(){
    echolog "$@"
    cat <<EOF
281

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

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

Måns Rullgård's avatar
Måns Rullgård committed
305
tolower(){
306
    echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
Måns Rullgård's avatar
Måns Rullgård committed
307 308
}

309 310 311 312
c_escape(){
    echo "$*" | sed 's/["\\]/\\\0/g'
}

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

319 320 321 322
cleanws(){
    echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//'
}

323 324 325 326
filter(){
    pat=$1
    shift
    for v; do
327
        eval "case $v in $pat) echo $v ;; esac"
328 329 330
    done
}

331 332 333 334 335 336 337 338
filter_out(){
    pat=$1
    shift
    for v; do
        eval "case $v in $pat) ;; *) echo $v ;; esac"
    done
}

339 340 341
map(){
    m=$1
    shift
Måns Rullgård's avatar
Måns Rullgård committed
342
    for v; do eval $m; done
343 344
}

345 346 347 348 349 350 351 352
set_all(){
    value=$1
    shift
    for var in $*; do
        eval $var=$value
    done
}

353 354 355 356 357 358 359 360
set_weak(){
    value=$1
    shift
    for var; do
        eval : \${$var:=$value}
    done
}

361 362 363 364 365 366 367 368 369 370
set_safe(){
    var=$1
    shift
    eval $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')='$*'
}

get_safe(){
    eval echo \$$(echo "$1" | sed 's/[^A-Za-z0-9_]/_/g')
}

371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389
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
}

390 391 392 393 394 395 396 397
enable(){
    set_all yes $*
}

disable(){
    set_all no $*
}

398 399 400 401 402 403 404 405
enable_weak(){
    set_weak yes $*
}

disable_weak(){
    set_weak no $*
}

406
enable_safe(){
407 408 409
    for var; do
        enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
410 411 412
}

disable_safe(){
413 414 415
    for var; do
        disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
416 417
}

418 419 420 421
do_enable_deep(){
    for var; do
        enabled $var && continue
        eval sel="\$${var}_select"
422 423
        eval sgs="\$${var}_suggest"
        pushvar var sgs
424
        enable_deep $sel
425 426
        popvar sgs
        enable_deep_weak $sgs
427 428 429 430 431 432 433 434 435
        popvar var
    done
}

enable_deep(){
    do_enable_deep $*
    enable $*
}

436 437 438 439 440
enable_deep_weak(){
    do_enable_deep $*
    enable_weak $*
}

441
enabled(){
442 443
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xyes"
444 445
}

446
disabled(){
447 448
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xno"
449 450
}

451 452 453 454 455 456
enabled_all(){
    for opt; do
        enabled $opt || return 1
    done
}

457 458 459 460 461 462
disabled_all(){
    for opt; do
        disabled $opt || return 1
    done
}

463 464 465 466 467 468
enabled_any(){
    for opt; do
        enabled $opt && return 0
    done
}

469 470 471 472
disabled_any(){
    for opt; do
        disabled $opt && return 0
    done
473
    return 1
474 475
}

476 477
set_default(){
    for opt; do
478
        eval : \${$opt:=\$${opt}_default}
479 480 481
    done
}

482 483 484 485 486 487 488 489 490
is_in(){
    value=$1
    shift
    for var in $*; do
        [ $var = $value ] && return 0
    done
    return 1
}

491 492
check_deps(){
    for cfg; do
493
        cfg="${cfg#!}"
494 495 496 497
        enabled ${cfg}_checking && die "Circular dependency for $cfg."
        disabled ${cfg}_checking && continue
        enable ${cfg}_checking

498 499
        eval dep_all="\$${cfg}_deps"
        eval dep_any="\$${cfg}_deps_any"
500
        eval dep_sel="\$${cfg}_select"
501
        eval dep_sgs="\$${cfg}_suggest"
502 503
        eval dep_ifa="\$${cfg}_if"
        eval dep_ifn="\$${cfg}_if_any"
504

505 506 507
        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
508

509 510
        [ -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
511 512
        enabled_all  $dep_all || disable $cfg
        enabled_any  $dep_any || disable $cfg
513
        disabled_any $dep_sel && disable $cfg
514

515 516 517
        if enabled $cfg; then
            eval dep_extralibs="\$${cfg}_extralibs"
            test -n "$dep_extralibs" && add_extralibs $dep_extralibs
518
            enable_deep $dep_sel
519
            enable_deep_weak $dep_sgs
520 521
        fi

522
        disable ${cfg}_checking
523 524 525
    done
}

526 527 528 529 530 531 532 533 534 535
print_config_h(){
    enabled $1 && v=1 || v=0
    echo "#define $2 $v"
}

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

536 537 538 539
print_config_asm(){
    enabled $1 && echo "%define $2"
}

540 541
print_config(){
    pfx=$1
542 543
    files=$2
    shift 2
544
    for cfg; do
545
        ucname="$(toupper $cfg)"
546 547 548
        for f in $files; do
            "print_config_${f##*.}" $cfg ${pfx}${ucname} >>$f
        done
549
    done
550 551
}

552 553 554 555 556 557 558 559 560
print_enabled(){
    test "$1" = -n && end=" " && shift || end="\n"
    suf=$1
    shift
    for v; do
        enabled $v && printf "%s$end" ${v%$suf};
    done
}

561 562 563 564 565 566
append(){
    var=$1
    shift
    eval "$var=\"\$$var $*\""
}

567 568 569 570 571 572
prepend(){
    var=$1
    shift
    eval "$var=\"$* \$$var\""
}

573
add_cppflags(){
574
    append CPPFLAGS $($filter_cppflags "$@")
575 576
}

577
add_cflags(){
578
    append CFLAGS $($filter_cflags "$@")
579 580
}

581
add_asflags(){
582
    append ASFLAGS $($filter_asflags "$@")
583 584
}

585 586 587 588 589
add_ldflags(){
    append LDFLAGS "$@"
}

add_extralibs(){
590
    prepend extralibs "$@"
591 592
}

593
check_cmd(){
Måns Rullgård's avatar
Måns Rullgård committed
594
    log "$@"
595
    "$@" >> $logfile 2>&1
596 597
}

598
check_cc(){
599
    log check_cc "$@"
600
    cat > $TMPC
601
    log_file $TMPC
602
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" -c -o $TMPO $TMPC
603 604 605 606
}

check_cpp(){
    log check_cpp "$@"
607
    cat > $TMPC
608
    log_file $TMPC
Måns Rullgård's avatar
Måns Rullgård committed
609
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" -E -o $TMPO $TMPC
610 611
}

612 613 614 615
check_as(){
    log check_as "$@"
    cat > $TMPC
    log_file $TMPC
616
    check_cmd $as $CPPFLAGS $ASFLAGS "$@" -c -o $TMPO $TMPC
617 618
}

619 620 621
check_asm(){
    log check_asm "$@"
    name="$1"
622
    code="$2"
623
    shift 2
624 625
    disable $name
    check_as "$@" <<EOF && enable $name
626
void foo(void){ __asm__ volatile($code); }
627 628 629
EOF
}

Loren Merritt's avatar
Loren Merritt committed
630 631 632 633 634 635 636 637
check_yasm(){
    log check_yasm "$@"
    echo "$1" > $TMPS
    log_file $TMPS
    shift 1
    check_cmd $yasmexe $YASMFLAGS "$@" -o $TMPO $TMPS
}

638
check_ld(){
639
    log check_ld "$@"
640 641 642 643 644
    flags=''
    libs=''
    for f; do
        test "${f}" = "${f#-l}" && flags="$flags $f" || libs="$libs $f"
    done
645
    check_cc $($filter_cflags $flags) || return
646
    check_cmd $ld $LDFLAGS $flags -o $TMPE $TMPO $libs $extralibs
647 648
}

649 650
check_cppflags(){
    log check_cppflags "$@"
651 652
    set -- $($filter_cppflags "$@")
    check_cc "$@" <<EOF && append CPPFLAGS "$@"
653 654 655 656
int x;
EOF
}

657
check_cflags(){
658
    log check_cflags "$@"
659 660
    set -- $($filter_cflags "$@")
    check_cc "$@" <<EOF && append CFLAGS "$@"
661 662 663 664
int x;
EOF
}

665 666 667
test_ldflags(){
    log test_ldflags "$@"
    check_ld "$@" <<EOF
668
int main(void){ return 0; }
669 670 671
EOF
}

672 673 674 675 676
check_ldflags(){
    log check_ldflags "$@"
    test_ldflags "$@" && add_ldflags "$@"
}

677
check_header(){
678
    log check_header "$@"
679 680
    header=$1
    shift
681 682
    disable_safe $header
    check_cpp "$@" <<EOF && enable_safe $header
683 684 685 686 687 688
#include <$header>
int x;
EOF
}

check_func(){
689
    log check_func "$@"
690 691
    func=$1
    shift
Måns Rullgård's avatar
Måns Rullgård committed
692 693
    disable $func
    check_ld "$@" <<EOF && enable $func
694
extern int $func();
695
int main(void){ $func(); }
696 697 698
EOF
}

699
check_mathfunc(){
700
    log check_mathfunc "$@"
701 702 703 704 705
    func=$1
    shift
    disable $func
    check_ld "$@" <<EOF && enable $func
#include <math.h>
706 707
float foo(float f) { return $func(f); }
int main(void){ return 0; }
708 709 710
EOF
}

711 712
check_func_headers(){
    log check_func_headers "$@"
713
    headers=$1
714
    funcs=$2
715
    shift 2
716 717 718 719 720 721 722 723 724
    {
        for hdr in $headers; do
            echo "#include <$hdr>"
        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
725 726
}

727 728 729 730
check_cpp_condition(){
    log check_cpp_condition "$@"
    header=$1
    condition=$2
731 732
    shift 2
    check_cpp $($filter_cppflags "$@") <<EOF
733 734 735 736 737 738 739
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

740 741 742 743 744
check_lib(){
    log check_lib "$@"
    header="$1"
    func="$2"
    shift 2
745
    check_header $header && check_func $func "$@" && add_extralibs "$@"
746 747
}

748 749 750
check_lib2(){
    log check_lib2 "$@"
    headers="$1"
751
    funcs="$2"
752
    shift 2
753
    check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
754 755
}

756 757 758 759 760 761 762 763 764 765 766 767 768 769
check_pkg_config(){
    log check_pkg_config "$@"
    pkg="$1"
    headers="$2"
    funcs="$3"
    shift 3
    $pkg_config --exists $pkg || return
    pkg_cflags=$($pkg_config --cflags $pkg)
    pkg_libs=$($pkg_config --libs $pkg)
    check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
        set_safe ${pkg}_cflags $pkg_cflags   &&
        set_safe ${pkg}_libs   $pkg_libs
}

770
check_exec(){
771
    check_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
772 773
}

774
check_exec_crash(){
775
    code=$(cat)
776 777 778 779 780 781 782

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

783
    (check_exec "$@") >> $logfile 2>&1 <<EOF
784 785 786 787
#include <signal.h>
static void sighandler(int sig){
    raise(SIGTERM);
}
Diego Biurrun's avatar
Diego Biurrun committed
788
int main(void){
789 790 791 792 793 794 795 796 797 798 799
    signal(SIGILL, sighandler);
    signal(SIGFPE, sighandler);
    signal(SIGSEGV, sighandler);
#ifdef SIGBUS
    signal(SIGBUS, sighandler);
#endif
    { $code }
}
EOF
}

800 801 802 803 804
check_type(){
    log check_type "$@"
    headers=$1
    type=$2
    shift 2
805
    disable_safe "$type"
806 807 808 809 810
    incs=""
    for hdr in $headers; do
        incs="$incs
#include <$hdr>"
    done
811
    check_cc "$@" <<EOF && enable_safe "$type"
812 813 814 815 816
$incs
$type v;
EOF
}

817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834
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
}

835 836 837 838 839 840
require(){
    name="$1"
    header="$2"
    func="$3"
    shift 3
    check_lib $header $func "$@" || die "ERROR: $name not found"
841 842
}

843 844 845 846 847 848 849 850
require2(){
    name="$1"
    headers="$2"
    func="$3"
    shift 3
    check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
}

851 852 853 854 855 856 857
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)
}

858 859 860 861 862 863 864 865 866 867 868 869 870 871
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
}

872 873 874 875 876 877
apply(){
    file=$1
    shift
    "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
}

878
cp_if_changed(){
879 880 881
    cmp -s "$1" "$2" && echo "$2 is unchanged" && return
    mkdir -p "$(dirname $2)"
    cp -f "$1" "$2"
882 883
}

884 885 886
# CONFIG_LIST contains configurable options, while HAVE_LIST is for
# system-dependent things.

887 888 889 890 891
COMPONENT_LIST="
    bsfs
    decoders
    demuxers
    encoders
Vitor Sessak's avatar
Vitor Sessak committed
892
    filters
893
    hwaccels
894
    indevs
895
    muxers
896
    outdevs
897 898 899 900 901 902
    parsers
    protocols
"

CONFIG_LIST="
    $COMPONENT_LIST
903
    aandct
904
    ac3dsp
905 906
    avcodec
    avdevice
907
    avfilter
908
    avformat
909
    avisynth
910
    bzlib
911
    dct
912
    doc
913
    dwt
Laurent Aimar's avatar
Laurent Aimar committed
914
    dxva2
915
    fastdiv
916
    ffmpeg
917
    avconv
Anton Khirnov's avatar
Anton Khirnov committed
918
    avplay
Anton Khirnov's avatar
Anton Khirnov committed
919
    avprobe
Anton Khirnov's avatar
Anton Khirnov committed
920
    avserver
921
    fft
Stefano Sabatini's avatar
Stefano Sabatini committed
922
    frei0r
923
    golomb
924
    gpl
925
    gray
926
    h264dsp
927
    h264pred
Aurelien Jacobs's avatar
Aurelien Jacobs committed
928
    hardcoded_tables
929
    huffman
Ramiro Polla's avatar
Ramiro Polla committed
930
    libdc1394
931
    libdirac
932
    libfaac
933
    libfreetype
934
    libgsm
935
    libmp3lame
936
    libnut
937 938
    libopencore_amrnb
    libopencore_amrwb
939
    libopencv
940
    libopenjpeg
941
    librtmp
942
    libschroedinger
David Conrad's avatar
David Conrad committed
943
    libspeex
Diego Biurrun's avatar
Diego Biurrun committed
944
    libtheora
945
    libvo_aacenc
946
    libvo_amrwbenc
947
    libvorbis
James Zern's avatar
James Zern committed
948
    libvpx
949
    libx264
950
    libxavs
951
    libxvid
952
    lpc
953
    lsp
954
    mdct
955
    memalign_hack
956
    mlib
957
    mpegaudiodsp
958
    network
959
    nonfree
960
    pic
961
    postproc
962
    rdft
963
    rtpdec
964
    runtime_cpudetect
965
    shared
966
    sinewin
967
    small
968
    sram