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

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

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

try_exec(){
18
    echo "Trying shell $1"
19
    type "$1" > /dev/null 2>&1 && exec "$@"
20 21
}

22
unset foo
23
(: ${foo%%bar}) 2> /dev/null
24 25
E1="$?"

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

if test "$E1" != 0 || test "$E2" = 0; then
    echo "Broken shell detected.  Trying alternatives."
31 32 33 34 35 36 37 38 39 40 41 42
    export FF_CONF_EXEC
    if test "0$FF_CONF_EXEC" -lt 1; then
        FF_CONF_EXEC=1
        try_exec bash "$0" "$@"
    fi
    if test "0$FF_CONF_EXEC" -lt 2; then
        FF_CONF_EXEC=2
        try_exec ksh "$0" "$@"
    fi
    if test "0$FF_CONF_EXEC" -lt 3; then
        FF_CONF_EXEC=3
        try_exec /usr/xpg4/bin/sh "$0" "$@"
43 44
    fi
    echo "No compatible shell script interpreter found."
Diego Biurrun's avatar
Diego Biurrun committed
45
    echo "This configure script requires a POSIX-compatible shell"
46
    echo "such as bash or ksh."
47
    echo "THIS IS NOT A BUG IN LIBAV, DO NOT REPORT IT AS SUCH."
48
    echo "Instead, install a working POSIX-compatible shell."
49
    echo "Disabling this configure test will create a broken Libav."
50 51 52 53
    if test "$BASH_VERSION" = '2.04.0(1)-release'; then
        echo "This bash version ($BASH_VERSION) is broken on your platform."
        echo "Upgrade to a later version if available."
    fi
54 55 56
    exit 1
fi

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

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

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

Standard options:
79
  --logfile=FILE           log tests and output to FILE [config.log]
80 81 82
  --disable-logging        do not log configure debug information
  --prefix=PREFIX          install in PREFIX [$prefix]
  --bindir=DIR             install binaries in DIR [PREFIX/bin]
83
  --datadir=DIR            install data files in DIR [PREFIX/share/avconv]
84
  --docdir=DIR             install documentation in DIR [PREFIX/share/doc/libav]
85 86 87 88 89
  --libdir=DIR             install libs in DIR [PREFIX/lib]
  --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
  --incdir=DIR             install includes in DIR [PREFIX/include]
  --mandir=DIR             install man page in DIR [PREFIX/share/man]

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

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

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

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

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

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

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

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

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

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

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

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

315 316
quotes='""'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

disable(){
    set_all no $*
}

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

disable_weak(){
    set_weak no $*
}

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

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

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

enable_deep(){
    do_enable_deep $*
    enable $*
}

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

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

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

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

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

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

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

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

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

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

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

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

584 585
        [ -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
586 587
        enabled_all  $dep_all || disable $cfg
        enabled_any  $dep_any || disable $cfg
588
        disabled_any $dep_sel && disable $cfg
589

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

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

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

    do_check_deps "$@"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

878 879
check_func_headers(){
    log check_func_headers "$@"
880
    headers=$1
881
    funcs=$2
882
    shift 2
883 884
    {
        for hdr in $headers; do
885
            print_include $hdr
886 887 888 889 890 891
        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
892 893
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1027 1028 1029 1030 1031 1032 1033
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)
}

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

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

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

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

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

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

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

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

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

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

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

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

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

1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170
FEATURE_LIST="
    gray
    hardcoded_tables
    runtime_cpudetect
    safe_bitstream_reader
    shared
    small
    sram
    static
    swscale_alpha
"

1171 1172 1173 1174 1175 1176
HWACCEL_LIST="
    dxva2
    vaapi
    vda
    vdpau
"
1177

1178 1179 1180 1181 1182 1183 1184 1185 1186 1187
LIBRARY_LIST="
    avcodec
    avdevice
    avfilter
    avformat
    avresample
    avutil
    swscale
"

1188 1189 1190 1191 1192 1193
LICENSE_LIST="
    gpl
    nonfree
    version3
"

1194 1195 1196 1197 1198 1199 1200
PROGRAM_LIST="
    avconv
    avplay
    avprobe
    avserver
"

1201
SUBSYSTEM_LIST="
1202
    dct
1203
    doc
1204
    error_resilience
1205
    fft
1206
    lsp
1207
    lzo
1208
    mdct
1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222
    network
    rdft
"

CONFIG_LIST="
    $COMPONENT_LIST
    $EXAMPLE_LIST
    $EXTERNAL_LIBRARY_LIST
    $FEATURE_LIST
    $HWACCEL_LIST
    $LICENSE_LIST
    $LIBRARY_LIST
    $PROGRAM_LIST
    $SUBSYSTEM_LIST
1223
    memalign_hack
1224
    neon_clobber_test
1225
    pic
1226
    pod2man
1227
    texi2html
1228
    thumb
1229
    xmm_clobber_test
1230
"
1231

1232
THREADS_LIST="
1233 1234
    pthreads
    w32threads
1235
"
1236

1237
ATOMICS_LIST="
1238 1239
    atomics_gcc
    atomics_suncc
1240
    atomics_win32
1241
"
1242

1243
ARCH_LIST="
1244
    aarch64
1245
    alpha
1246
    arm
1247 1248 1249
    avr32
    avr32_ap
    avr32_uc
1250 1251 1252 1253
    bfin
    ia64
    m68k
    mips
1254
    mips64
1255
    parisc
1256
    ppc
1257
    ppc64
1258 1259 1260 1261
    s390
    sh4
    sparc
    sparc64
1262 1263
    tilegx
    tilepro
1264
    tomi
1265 1266 1267
    x86
    x86_32
    x86_64
1268
"
1269

1270
ARCH_EXT_LIST_ARM="
1271 1272 1273 1274
    armv5te
    armv6
    armv6t2
    neon
1275
    vfp
1276
    vfpv3
1277
"
1278

1279
ARCH_EXT_LIST_X86_SIMD="
1280
    amd3dnow
1281
    amd3dnowext
1282
    avx
1283
    avx2
1284
    fma3
1285 1286 1287 1288 1289 1290 1291 1292 1293
    fma4
    mmx
    mmxext
    sse
    sse2
    sse3
    sse4
    sse42
    ssse3
1294 1295
    xop
"
1296

1297 1298 1299 1300 1301 1302 1303
ARCH_EXT_LIST_PPC="
    altivec
    dcbzl
    ldbrx
    ppc4xx
"

1304 1305 1306 1307 1308 1309
ARCH_EXT_LIST_X86="
    $ARCH_EXT_LIST_X86_SIMD
    cpunop
    i686
"

1310
ARCH_EXT_LIST="
1311
    $ARCH_EXT_LIST_ARM
1312
    $ARCH_EXT_LIST_PPC
1313
    $ARCH_EXT_LIST_X86
1314 1315
    loongson
    vis
1316
"
1317

1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334
ARCH_FEATURES="
    aligned_stack
    fast_64bit
    fast_clz
    fast_cmov
    local_aligned_8
    local_aligned_16
"

BUILTIN_LIST="
    atomic_cas_ptr
    machine_rw_barrier
    MemoryBarrier
    mm_empty
    rdtsc
    sync_val_compare_and_swap
"
1335
HAVE_LIST_CMDLINE="
1336 1337 1338
    inline_asm
    symver
    yasm
1339
"
1340

1341
HAVE_LIST_PUB="
1342
    bigendian