configure 102 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
  --enable-libcdio         enable audio CD grabbing with libcdio
169 170 171 172
  --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]
173
  --enable-libfreetype     enable libfreetype [no]
174 175 176 177 178
  --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]
179
  --enable-librtmp         enable RTMP[E] support via librtmp [no]
180
  --enable-libschroedinger enable Dirac support via libschroedinger [no]
181
  --enable-libspeex        enable Speex support via libspeex [no]
182
  --enable-libtheora       enable Theora encoding via libtheora [no]
183
  --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
184
  --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
185 186
  --enable-libvorbis       enable Vorbis encoding via libvorbis,
                           native implementation exists [no]
James Zern's avatar
James Zern committed
187
  --enable-libvpx          enable VP8 support via libvpx [no]
188
  --enable-libx264         enable H.264 encoding via x264 [no]
189
  --enable-libxavs         enable AVS encoding via xavs [no]
190 191 192 193 194 195 196 197 198 199 200 201 202 203
  --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
204
  --ar=AR                  use archive tool AR [$ar_default]
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219
  --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)
220
  --disable-asm            disable all assembler optimizations
221 222 223 224 225 226 227
  --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
228
  --disable-avx            disable AVX optimizations
229 230 231 232 233 234 235 236 237 238
  --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
239
  --malloc-prefix=PFX      prefix malloc and related names with PFX
240
  --enable-sram            allow use of on-chip SRAM
241
  --disable-symver         disable symbol versioning
242
  --optflags               override optimization-related compiler flags
243

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

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

257 258
quotes='""'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

362 363 364 365 366 367 368 369 370 371
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')
}

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

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

disable(){
    set_all no $*
}

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

disable_weak(){
    set_weak no $*
}

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

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

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

enable_deep(){
    do_enable_deep $*
    enable $*
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

712 713
check_func_headers(){
    log check_func_headers "$@"
714
    headers=$1
715
    funcs=$2
716
    shift 2
717 718 719 720 721 722 723 724 725
    {
        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
726 727
}

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

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

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

757 758 759 760 761 762 763 764 765 766 767 768 769 770
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
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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