configure 105 KB
Newer Older
1
#!/bin/sh
2
#
3
# FFmpeg 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 FFMPEG, 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 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 89 90
  --disable-avdevice       disable libavdevice build
  --disable-avcodec        disable libavcodec build
  --disable-avformat       disable libavformat build
  --disable-swscale        disable libswscale build
91
  --disable-postproc       disable libpostproc build
92
  --disable-avfilter       disable video filter support [no]
93
  --disable-pthreads       disable pthreads [auto]
94 95 96 97 98 99 100 101
  --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
102
  --disable-dct            disable DCT code
103 104
  --disable-fft            disable FFT code
  --disable-golomb         disable Golomb code
105
  --disable-huffman        disable Huffman code
106 107 108
  --disable-lpc            disable LPC code
  --disable-mdct           disable MDCT code
  --disable-rdft           disable RDFT code
109
  --enable-vaapi           enable VAAPI code
110
  --enable-vdpau           enable VDPAU code
111
  --disable-dxva2          disable DXVA2 code
112 113 114
  --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
115
  --disable-everything     disable all components listed below
116 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
  --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]
163
  --enable-libcelt         enable CELT/Opus decoding via libcelt [no]
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
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

242
Developer options (useful when working on FFmpeg itself):
243 244 245 246
  --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
247
  --disable-stripping      disable stripping of executables and shared libraries
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
283
version from Git.  If the latest version fails, report the problem to the
284
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg 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
}

305
tolower(){
306
    echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
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
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(){
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
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
check_pkg_config(){
    log check_pkg_config "$@"
    pkg="$1"
    headers="$2"
    funcs="$3"
    shift 3
762
    $pkg_config --exists $pkg 2>/dev/null || return
763 764 765 766 767 768 769
    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 879 880 881 882 883
cp_if_changed(){
    cmp -s "$1" "$2" &&
        echo "$2 is unchanged" ||
        cp -f "$1" "$2"
}

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
    crystalhd
912
    dct
913
    doc
914
    dwt
915
    dxva2
916
    fastdiv
917 918
    ffmpeg
    ffplay
Stefano Sabatini's avatar
Stefano Sabatini committed
919
    ffprobe
920
    ffserver
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
930
    libcelt
Ramiro Polla's avatar
Ramiro Polla committed
931
    libdc1394
932
    libdirac
933
    libfaac
934
    libfreetype
935
    libgsm
936
    libmp3lame
937
    libnut
938 939
    libopencore_amrnb
    libopencore_amrwb
940
    libopencv
941
    libopenjpeg
942
    librtmp
943
    libschroedinger
944
    libspeex
945
    libtheora
946
    libvo_aacenc
947
    libvo_amrwbenc
948
    libvorbis
James Zern's avatar
James Zern committed
949
    libvpx
950
    libx264
951
    libxavs
952
    libxvid
953
    lpc
954
    lsp
955
    mdct
956
    memalign_hack
957
    mlib
958
    mpegaudiodsp
959
    network
960
    nonfree
961
    pic
962
    postproc
963
    rdft
964
    rtpdec
965
    runtime_cpudetect
966
    shared
967
    sinewin
968
    small
969
    sram
970
    static
971
    swscale
972
    swscale_alpha
973 974
    vaapi
    vdpau
975
    version3
976
    x11grab
977
    zlib
978
"
979

980 981 982 983 984
THREADS_LIST='
    pthreads
    w32threads
'

985 986
ARCH_LIST='
    alpha
987
    arm
988 989 990
    avr32
    avr32_ap
    avr32_uc
991 992 993 994
    bfin
    ia64
    m68k
    mips
995
    mips64
996
    parisc
997
    ppc
998
    ppc64
999 1000 1001 1002
    s390
    sh4
    sparc
    sparc64
1003
    tomi
1004 1005 1006 1007 1008 1009
    x86
    x86_32
    x86_64
'

ARCH_EXT_LIST='
1010
    altivec
1011
    amd3dnow
1012
    amd3dnowext
1013
    armv5te
1014
    armv6
1015
    armv6t2
1016
    armvfp
1017
    avx
1018 1019 1020
    iwmmxt
    mmi
    mmx
1021
    mmx2
1022
    neon
1023
    ppc4xx
1024
    sse
1025
    ssse3
Mans Rullgard's avatar
Mans Rullgard committed
1026
    vfpv3
1027
    vis
1028 1029
'

1030 1031
HAVE_LIST_PUB='
    bigendian
1032
    fast_unaligned
1033 1034
'

1035 1036
HAVE_LIST="
    $ARCH_EXT_LIST
1037
    $HAVE_LIST_PUB
1038
    $THREADS_LIST
1039
    aligned_stack
1040
    alsa_asoundlib_h
1041
    altivec_h
1042
    arpa_inet_h
1043
    attribute_may_alias
1044
    attribute_packed
1045
    bswap
Alex Beregszaszi's avatar
Alex Beregszaszi committed
1046
    closesocket
1047
    cmov
1048
    dcbzl
1049 1050 1051 1052 1053
    dev_bktr_ioctl_bt848_h
    dev_bktr_ioctl_meteor_h
    dev_ic_bt8xx_h
    dev_video_meteor_ioctl_meteor_h
    dev_video_bktr_ioctl_bt848_h
1054
    dlfcn_h
1055
    dlopen
1056
    dos_paths
1057 1058
    ebp_available
    ebx_available
1059 1060
    exp2
    exp2f
1061
    fast_64bit
1062
    fast_clz
1063
    fast_cmov
Måns Rullgård's avatar
Måns Rullgård committed
1064
    fcntl
Måns Rullgård's avatar
Måns Rullgård committed
1065
    fork
1066
    getaddrinfo
1067
    gethrtime
1068
    GetProcessMemoryInfo
1069
    GetProcessTimes
Ramiro Polla's avatar
Ramiro Polla committed
1070
    getrusage
1071
    gnu_as
1072
    struct_rusage_ru_maxrss
1073
    ibm_asm
1074
    inet_aton
1075
    inline_asm
1076
    isatty
1077
    kbhit
Måns Rullgård's avatar
Måns Rullgård committed
1078
    ldbrx
1079
    llrint
1080
    llrintf
1081 1082
    local_aligned_16
    local_aligned_8
1083
    localtime_r
1084
    log2
1085
    log2f
1086
    loongson
1087
    lrint
1088
    lrintf
1089
    lzo1x_999_compress
1090 1091
    machine_ioctl_bt848_h
    machine_ioctl_meteor_h
1092
    malloc_h
1093
    MapViewOfFile
1094
    memalign
1095
    mkstemp
1096
    mmap
1097
    pld
1098
    posix_memalign
1099 1100
    round
    roundf
1101 1102
    sdl
    sdl_video_size
1103
    setmode
1104
    sndio_h
1105
    socklen_t
Måns Rullgård's avatar
Måns Rullgård committed
1106
    soundcard_h
1107
    poll_h
Måns Rullgård's avatar
Måns Rullgård committed
1108
    setrlimit
1109
    strerror_r
Stefano Sabatini's avatar
Stefano Sabatini committed
1110
    strtok_r
1111
    struct_addrinfo
1112 1113
    struct_ipv6_mreq
    struct_sockaddr_in6
1114
    struct_sockaddr_sa_len
1115
    struct_sockaddr_storage
1116 1117 1118
    symver
    symver_gnu_asm
    symver_asm_label
1119
    sys_mman_h
1120
    sys_resource_h
1121
    sys_select_h
Måns Rullgård's avatar
Måns Rullgård committed
1122
    sys_soundcard_h
1123
    sys_videoio_h
1124
    ten_operands
1125
    termios_h
1126
    threads
1127
    trunc
1128
    truncf
1129
    vfp_args
1130
    VirtualAlloc
1131
    winsock2_h
1132
    xform_asm
1133
    xmm_clobbers
Loren Merritt's avatar
Loren Merritt committed
1134
    yasm
1135
"
1136

1137 1138
# options emitted with CONFIG_ prefix but not available on command line
CONFIG_EXTRA="
1139
    avutil
1140 1141
    gplv3
    lgplv3
1142 1143
"

1144
CMDLINE_SELECT="
1145
    $ARCH_EXT_LIST
1146
    $CONFIG_LIST
1147
    $THREADS_LIST
1148
    asm
1149
    cross_compile
1150 1151
    debug
    extra_warnings
1152
    logging
1153
    optimizations
1154
    stripping
1155
    symver
1156
    yasm
1157
"
1158 1159

PATHS_LIST='
1160
    bindir
1161
    datadir
1162 1163 1164 1165 1166
    incdir
    libdir
    mandir
    prefix
    shlibdir
1167 1168 1169 1170
'

CMDLINE_SET="
    $PATHS_LIST
1171
    ar
1172
    arch
1173
    as
1174 1175 1176 1177
    build_suffix
    cc
    cpu
    cross_prefix
1178
    dep_cc
1179
    extra_version
1180 1181 1182 1183
    host_cc
    host_cflags
    host_ldflags
    host_libs
1184
    host_os
1185
    install
1186
    ld
1187
    logfile
1188
    malloc_prefix
1189
    nm
1190
    pkg_config
Måns Rullgård's avatar
Måns Rullgård committed
1191
    samples
1192
    strip
1193 1194
    sysinclude
    sysroot
1195
    target_exec
1196
    target_os
1197
    target_path
1198
"
1199

1200 1201 1202 1203
CMDLINE_APPEND="
    extra_cflags
"

1204 1205
# code dependency declarations

1206
# architecture extensions
1207

1208 1209
armv5te_deps="arm"
armv6_deps="arm"
1210
armv6t2_deps="arm"
1211 1212
armvfp_deps="arm"
iwmmxt_deps="arm"
1213
neon_deps="arm"
Mans Rullgard's avatar
Mans Rullgard committed
1214
vfpv3_deps="armvfp"
1215

1216
mmi_deps="mips"
1217 1218 1219 1220 1221 1222

altivec_deps="ppc"
ppc4xx_deps="ppc"

vis_deps="sparc"

1223
x86_64_suggest="cmov fast_cmov"
1224 1225
amd3dnow_deps="mmx"
amd3dnowext_deps="amd3dnow"
1226
mmx_deps="x86"
1227 1228 1229
mmx2_deps="mmx"
sse_deps="mmx"
ssse3_deps="sse"
1230
avx_deps="ssse3"
1231

1232
aligned_stack_if_any="ppc x86"
1233
fast_64bit_if_any="alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
1234
fast_clz_if_any="alpha armv5te avr32 mips ppc x86"
1235
fast_unaligned_if_any="armv6 ppc x86"
1236

1237
need_memalign="altivec neon sse"
1238
inline_asm_deps="!tms470"
1239

1240 1241
symver_if_any="symver_asm_label symver_gnu_asm"

1242
# subsystems
1243
dct_select="rdft"
1244