configure 139 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
Anton Khirnov's avatar
Anton Khirnov committed
111
  --disable-avserver       deprecated, does nothing
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-libbs2b         enable bs2b DSP library [no]
182
  --enable-libcdio         enable audio CD grabbing with libcdio
183 184
  --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                           and libraw1394 [no]
185
  --enable-libfaac         enable AAC encoding via libfaac [no]
186
  --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
187
  --enable-libfreetype     enable libfreetype [no]
188
  --enable-libgsm          enable GSM de/encoding via libgsm [no]
189
  --enable-libilbc         enable iLBC de/encoding via libilbc [no]
190
  --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
191 192 193
  --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]
194
  --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
195
  --enable-libopus         enable Opus de/encoding via libopus [no]
196
  --enable-libpulse        enable Pulseaudio input via libpulse [no]
197
  --enable-librtmp         enable RTMP[E] support via librtmp [no]
198 199
  --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
  --enable-libspeex        enable Speex de/encoding via libspeex [no]
200
  --enable-libtheora       enable Theora encoding via libtheora [no]
201
  --enable-libtwolame      enable MP2 encoding via libtwolame [no]
202
  --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
203
  --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
204
  --enable-libvorbis       enable Vorbis encoding via libvorbis [no]
205
  --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
206
  --enable-libwavpack      enable wavpack encoding via libwavpack [no]
Justin Ruggles's avatar
Justin Ruggles committed
207
  --enable-libwebp         enable WebP encoding via libwebp [no]
208
  --enable-libx264         enable H.264 encoding via x264 [no]
Derek Buitenhuis's avatar
Derek Buitenhuis committed
209
  --enable-libx265         enable HEVC encoding via x265 [no]
210
  --enable-libxavs         enable AVS encoding via xavs [no]
211 212
  --enable-libxvid         enable Xvid encoding via xvidcore,
                           native MPEG-4/Xvid encoder exists [no]
213
  --enable-openssl         enable openssl [no]
214
  --enable-x11grab         enable X11 grabbing [no]
215 216
  --enable-zlib            enable zlib [autodetect]

217 218 219 220
Toolchain options:
  --arch=ARCH              select architecture [$arch]
  --cpu=CPU                select the minimum required CPU (affects
                           instruction selection, may crash on older CPUs)
221 222 223 224 225 226 227
  --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
228
  --target-samples=DIR     path to samples directory on target
229
  --toolchain=NAME         set tool defaults according to NAME
230
  --nm=NM                  use nm tool
231
  --ar=AR                  use archive tool AR [$ar_default]
232 233
  --as=AS                  use assembler AS [$as_default]
  --cc=CC                  use C compiler CC [$cc_default]
234
  --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
235
  --ld=LD                  use linker LD
236
  --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [$pkg_config_default]
237
  --pkg-config-flags=FLAGS pass additional flags to pkgconf []
238 239
  --host-cc=HOSTCC         use host C compiler HOSTCC
  --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
240
  --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
241
  --host-ld=HOSTLD         use host linker HOSTLD
242 243
  --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
  --host-libs=HLIBS        use libs HLIBS when linking for host
244
  --host-os=OS             compiler host OS [$target_os]
245 246 247 248
  --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 []
249
  --optflags=OPTFLAGS      override optimization-related compiler flags
250
  --build-suffix=SUFFIX    library name suffix []
251
  --enable-pic             build position-independent code
252
  --enable-thumb           compile for Thumb instruction set
253 254 255 256
  --enable-lto             use link-time optimization

Advanced options (experts only):
  --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
257 258 259 260 261 262
  --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
263
  --enable-sram            allow use of on-chip SRAM
264 265

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

291
Developer options (useful when working on Libav itself):
292 293 294 295
  --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
296
  --samples=PATH           location of test samples for FATE, if not set use
297
                           \$LIBAV_SAMPLES at make invocation time.
298 299
  --enable-neon-clobber-test check NEON registers for clobbering (should be
                           used only for debugging purposes)
300 301
  --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
                           should be used only for debugging purposes)
302 303 304 305 306 307 308 309
  --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
310 311 312

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

316 317
quotes='""'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

disable(){
    set_all no $*
}

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

disable_weak(){
    set_weak no $*
}

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

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

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

enable_deep(){
    do_enable_deep $*
    enable $*
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

600 601 602 603 604 605 606 607 608 609 610 611
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
}

612 613
print_config(){
    pfx=$1
614 615
    files=$2
    shift 2
616 617 618 619 620 621 622 623 624 625 626 627 628 629
    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\$/) {
630
                    n = -v ? \"\" : \"!\";
631 632 633 634
                    printf(\"%s%s=yes\\n\", n, c) >>file;
                }
            }
        }"
635 636
}

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

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

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

657 658 659 660 661 662 663 664 665
unique(){
    var=$1
    uniq_list=""
    for tok in $(eval echo \$$var); do
        uniq_list="$(filter_out $tok $uniq_list) $tok"
    done
    eval "$var=\"${uniq_list}\""
}

666
add_cppflags(){
667
    append CPPFLAGS "$@"
668 669
}

670
add_cflags(){
671
    append CFLAGS $($cflags_filter "$@")
672 673
}

674
add_asflags(){
675
    append ASFLAGS $($asflags_filter "$@")
676 677
}

678
add_ldflags(){
679
    append LDFLAGS $($ldflags_filter "$@")
680 681
}

682 683 684 685
add_stripflags(){
    append STRIPFLAGS "$@"
}

686
add_extralibs(){
687
    prepend extralibs $($ldflags_filter "$@")
688 689
}

690 691 692 693
add_host_cppflags(){
    append host_cppflags "$@"
}

694 695 696 697 698 699 700 701
add_host_cflags(){
    append host_cflags $($host_cflags_filter "$@")
}

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

702 703 704 705 706 707
add_compat(){
    append compat_objs $1
    shift
    map 'add_cppflags -D$v' "$@"
}

708
check_cmd(){
709
    log "$@"
710
    "$@" >> $logfile 2>&1
711 712
}

713 714 715 716
cc_o(){
    eval printf '%s\\n' $CC_O
}

717 718 719 720
cc_e(){
    eval printf '%s\\n' $CC_E
}

721
check_cc(){
722
    log check_cc "$@"
723
    cat > $TMPC
724
    log_file $TMPC
725
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
726 727 728 729
}

check_cpp(){
    log check_cpp "$@"
730
    cat > $TMPC
731
    log_file $TMPC
732
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
733 734
}

735 736 737 738
as_o(){
    eval printf '%s\\n' $AS_O
}

739 740
check_as(){
    log check_as "$@"
741 742 743
    cat > $TMPS
    log_file $TMPS
    check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
744 745
}

746 747
check_inline_asm(){
    log check_inline_asm "$@"
748
    name="$1"
749
    code="$2"
750
    shift 2
751
    disable $name
752
    check_cc "$@" <<EOF && enable $name
753
void foo(void){ __asm__ volatile($code); }
754 755 756
EOF
}

757 758 759 760 761 762
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
763 764 765 766 767 768 769 770
check_yasm(){
    log check_yasm "$@"
    echo "$1" > $TMPS
    log_file $TMPS
    shift 1
    check_cmd $yasmexe $YASMFLAGS "$@" -o $TMPO $TMPS
}

771 772 773 774
ld_o(){
    eval printf '%s\\n' $LD_O
}

775
check_ld(){
776
    log check_ld "$@"
777 778
    flags=$(filter_out '-l*' "$@")
    libs=$(filter '-l*' "$@")
779
    check_cc $($cflags_filter $flags) || return
780 781
    flags=$($ldflags_filter $flags)
    libs=$($ldflags_filter $libs)
782
    check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
783 784
}

785 786 787 788 789 790 791
print_include(){
    hdr=$1
    test "${hdr%.h}" = "${hdr}" &&
        echo "#include $hdr"    ||
        echo "#include <$hdr>"
}

792 793 794 795 796 797 798 799
check_code(){
    log check_code "$@"
    check=$1
    headers=$2
    code=$3
    shift 3
    {
        for hdr in $headers; do
800
            print_include $hdr
801 802 803 804 805
        done
        echo "int main(void) { $code; return 0; }"
    } | check_$check "$@"
}

806 807
check_cppflags(){
    log check_cppflags "$@"
808
    check_cc "$@" <<EOF && append CPPFLAGS "$@"
809 810 811 812
int x;
EOF
}

813 814
test_cflags(){
    log test_cflags "$@"
815
    set -- $($cflags_filter "$@")
816
    check_cc "$@" <<EOF
817 818 819 820
int x;
EOF
}

821 822 823 824 825
check_cflags(){
    log check_cflags "$@"
    test_cflags "$@" && add_cflags "$@"
}

826 827 828
test_ldflags(){
    log test_ldflags "$@"
    check_ld "$@" <<EOF
829
int main(void){ return 0; }
830 831 832
EOF
}

833 834 835 836 837
check_ldflags(){
    log check_ldflags "$@"
    test_ldflags "$@" && add_ldflags "$@"
}

838 839 840 841 842 843 844 845 846 847 848 849 850 851
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 "$@"
}

852
check_header(){
853
    log check_header "$@"
854 855
    header=$1
    shift
856 857
    disable_safe $header
    check_cpp "$@" <<EOF && enable_safe $header
858 859 860 861 862 863
#include <$header>
int x;
EOF
}

check_func(){
864
    log check_func "$@"
865 866
    func=$1
    shift
Måns Rullgård's avatar
Måns Rullgård committed
867 868
    disable $func
    check_ld "$@" <<EOF && enable $func
869
extern int $func();
870
int main(void){ $func(); }
871 872 873
EOF
}

874
check_mathfunc(){
875
    log check_mathfunc "$@"
876
    func=$1
877 878 879
    narg=$2
    shift 2
    test $narg = 2 && args="f, g" || args="f"
880 881 882
    disable $func
    check_ld "$@" <<EOF && enable $func
#include <math.h>
883
float foo(float f, float g) { return $func($args); }
884
int main(void){ return 0; }
885 886 887
EOF
}

888 889
check_func_headers(){
    log check_func_headers "$@"
890
    headers=$1
891
    funcs=$2
892
    shift 2
893 894
    {
        for hdr in $headers; do
895
            print_include $hdr
896 897 898 899 900 901
        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
902 903
}

904 905 906 907
check_cpp_condition(){
    log check_cpp_condition "$@"
    header=$1
    condition=$2
908
    shift 2
909
    check_cpp "$@" <<EOF
910 911 912 913 914 915 916
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

917 918 919 920 921
check_lib(){
    log check_lib "$@"
    header="$1"
    func="$2"
    shift 2
922
    check_header $header && check_func $func "$@" && add_extralibs "$@"
923 924
}

925 926 927
check_lib2(){
    log check_lib2 "$@"
    headers="$1"
928
    funcs="$2"
929
    shift 2
930
    check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
931 932
}

933 934 935 936 937 938
check_pkg_config(){
    log check_pkg_config "$@"
    pkg="$1"
    headers="$2"
    funcs="$3"
    shift 3
939
    check_cmd $pkg_config --exists --print-errors $pkg || return
940 941
    pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
    pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
942 943 944 945 946
    check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
        set_safe ${pkg}_cflags $pkg_cflags   &&
        set_safe ${pkg}_libs   $pkg_libs
}

947
check_exec(){
948
    check_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
949 950
}

951
check_exec_crash(){
952
    code=$(cat)
953 954 955 956 957 958 959

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

960
    (check_exec "$@") >> $logfile 2>&1 <<EOF
961 962 963 964
#include <signal.h>
static void sighandler(int sig){
    raise(SIGTERM);
}
965 966 967
int foo(void){
    $code
}
968
int (*func_ptr)(void) = foo;
Diego Biurrun's avatar
Diego Biurrun committed
969
int main(void){
970 971 972 973 974 975
    signal(SIGILL, sighandler);
    signal(SIGFPE, sighandler);
    signal(SIGSEGV, sighandler);
#ifdef SIGBUS
    signal(SIGBUS, sighandler);
#endif
976
    return func_ptr();
977 978 979 980
}
EOF
}

981 982 983 984 985
check_type(){
    log check_type "$@"
    headers=$1
    type=$2
    shift 2
986
    disable_safe "$type"
987
    check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
988 989
}

990
check_struct(){
991
    log check_struct "$@"
992 993 994 995 996
    headers=$1
    struct=$2
    member=$3
    shift 3
    disable_safe "${struct}_${member}"
997 998
    check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
        enable_safe "${struct}_${member}"
999 1000
}

1001 1002 1003 1004 1005 1006 1007 1008 1009 1010
check_builtin(){
    log check_builtin "$@"
    name=$1
    headers=$2
    builtin=$3
    shift 3
    disable "$name"
    check_code ld "$headers" "$builtin" "$@" && enable "$name"
}

1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
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"
}

1021 1022 1023 1024 1025 1026
require(){
    name="$1"
    header="$2"
    func="$3"
    shift 3
    check_lib $header $func "$@" || die "ERROR: $name not found"
1027 1028
}

1029 1030 1031 1032 1033 1034 1035 1036
require2(){
    name="$1"
    headers="$2"
    func="$3"
    shift 3
    check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
}

1037 1038 1039 1040 1041 1042 1043
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)
}

1044 1045 1046 1047
hostcc_e(){
    eval printf '%s\\n' $HOSTCC_E
}

1048 1049 1050 1051
hostcc_o(){
    eval printf '%s\\n' $HOSTCC_O
}

1052 1053 1054 1055
check_host_cc(){
    log check_host_cc "$@"
    cat > $TMPC
    log_file $TMPC
1056
    check_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
1057 1058
}

1059 1060 1061 1062 1063 1064 1065
check_host_cpp(){
    log check_host_cpp "$@"
    cat > $TMPC
    log_file $TMPC
    check_cmd $host_cc $HOSTCPPFLAGS $HOSTCFLAGS "$@" $(hostcc_e $TMPO) $TMPC
}

1066 1067 1068 1069 1070 1071 1072
check_host_cppflags(){
    log check_host_cppflags "$@"
    check_host_cc "$@" <<EOF && append host_cppflags "$@"
int x;
EOF
}

1073 1074
check_host_cflags(){
    log check_host_cflags "$@"
1075
    set -- $($host_cflags_filter "$@")
1076 1077 1078 1079 1080
    check_host_cc "$@" <<EOF && append host_cflags "$@"
int x;
EOF
}

1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093
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
}

1094 1095 1096 1097 1098 1099
apply(){
    file=$1
    shift
    "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
}

1100
cp_if_changed(){
1101 1102
    cmp -s "$1" "$2" && echo "$2 is unchanged" && return
    mkdir -p "$(dirname $2)"
Mans Rullgard's avatar
Mans Rullgard committed
1103
    $cp_f "$1" "$2"
1104 1105
}

1106 1107 1108
# CONFIG_LIST contains configurable options, while HAVE_LIST is for
# system-dependent things.

1109 1110 1111 1112 1113
COMPONENT_LIST="
    bsfs
    decoders
    demuxers
    encoders
Vitor Sessak's avatar
Vitor Sessak committed
1114
    filters
1115
    hwaccels
1116
    indevs
1117
    muxers
1118
    outdevs
1119 1120 1121 1122
    parsers
    protocols
"

1123
EXAMPLE_LIST="
1124
    avcodec_example
1125
    filter_audio_example
1126
    metadata_example
1127
    output_example
1128
    transcode_aac_example
1129 1130
"

1131 1132 1133 1134 1135
EXTERNAL_LIBRARY_LIST="
    avisynth
    bzlib
    frei0r
    gnutls
1136
    libbs2b
1137 1138 1139 1140
    libcdio
    libdc1394
    libfaac
    libfdk_aac
1141
    libfontconfig
1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155
    libfreetype
    libgsm
    libilbc
    libmp3lame
    libopencore_amrnb
    libopencore_amrwb
    libopencv
    libopenjpeg
    libopus
    libpulse
    librtmp
    libschroedinger
    libspeex
    libtheora
1156
    libtwolame
1157 1158 1159 1160
    libvo_aacenc
    libvo_amrwbenc
    libvorbis
    libvpx
1161
    libwavpack
Justin Ruggles's avatar
Justin Ruggles committed
1162
    libwebp
1163
    libx264
Derek Buitenhuis's avatar
Derek Buitenhuis committed
1164
    libx265
1165 1166 1167 1168 1169 1170 1171
    libxavs
    libxvid
    openssl
    x11grab
    zlib
"

1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183
FEATURE_LIST="
    gray
    hardcoded_tables
    runtime_cpudetect
    safe_bitstream_reader
    shared
    small
    sram
    static
    swscale_alpha
"

1184 1185 1186 1187 1188 1189
HWACCEL_LIST="
    dxva2
    vaapi
    vda
    vdpau
"
1190

1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
LIBRARY_LIST="
    avcodec
    avdevice
    avfilter
    avformat
    avresample
    avutil
    swscale
"

1201 1202 1203 1204 1205 1206
LICENSE_LIST="
    gpl
    nonfree
    version3
"

1207 1208 1209 1210 1211 1212
PROGRAM_LIST="
    avconv
    avplay
    avprobe
"

1213
SUBSYSTEM_LIST="
1214
    dct
1215
    doc
1216
    error_resilience
1217
    fft
1218
    lsp
1219
    lzo
1220
    mdct
1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234
    network
    rdft
"

CONFIG_LIST="
    $COMPONENT_LIST
    $EXAMPLE_LIST
    $EXTERNAL_LIBRARY_LIST
    $FEATURE_LIST
    $HWACCEL_LIST
    $LICENSE_LIST
    $LIBRARY_LIST
    $PROGRAM_LIST
    $SUBSYSTEM_LIST
1235
    memalign_hack
1236
    neon_clobber_test
1237
    pic
1238
    pod2man
1239
    texi2html
1240
    thumb
1241
    xmm_clobber_test
1242
"
1243

1244
THREADS_LIST="
1245 1246
    pthreads
    w32threads
1247
"
1248

1249
ATOMICS_LIST="
1250 1251
    atomics_gcc
    atomics_suncc
1252
    atomics_win32
1253
"
1254

1255
ARCH_LIST="
1256
    aarch64
1257
    alpha
1258
    arm
1259 1260 1261
    avr32
    avr32_ap
    avr32_uc
1262 1263 1264 1265
    bfin
    ia64
    m68k
    mips
1266
    mips64
1267
    parisc
1268
    ppc
1269
    ppc64
1270 1271 1272 1273
    s390
    sh4
    sparc
    sparc64
1274 1275
    tilegx
    tilepro
1276
    tomi
1277 1278 1279
    x86
    x86_32
    x86_64
1280
"
1281

1282
ARCH_EXT_LIST_ARM="
1283 1284 1285
    armv5te
    armv6
    armv6t2
1286
    armv8
1287
    neon
1288
    vfp
1289
    vfpv3
1290
"
1291

1292
ARCH_EXT_LIST_X86_SIMD="
1293
    amd3dnow
1294
    amd3dnowext
1295
    avx
1296
    avx2
1297
    fma3
1298 1299 1300 1301 1302 1303 1304 1305 1306
    fma4
    mmx
    mmxext
    sse
    sse2
    sse3
    sse4
    sse42
    ssse3
1307 1308
    xop
"
1309

1310 1311 1312 1313 1314 1315 1316
ARCH_EXT_LIST_PPC="
    altivec
    dcbzl
    ldbrx
    ppc4xx
"

1317 1318 1319 1320 1321 1322
ARCH_EXT_LIST_X86="
    $ARCH_EXT_LIST_X86_SIMD
    cpunop
    i686
"

1323
ARCH_EXT_LIST="
1324
    $ARCH_EXT_LIST_ARM
1325
    $ARCH_EXT_LIST_PPC
1326
    $ARCH_EXT_LIST_X86
1327 1328
    loongson
    vis
1329
"
1330

1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347
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
"
1348
HAVE_LIST_CMDLINE="
1349 1350 1351
    inline_asm
    symver
    yasm
1352
"
1353

1354
HAVE_LIST_PUB="
1355
    bigendian
1356
    fast_unaligned
1357
"
1358

1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394
HEADERS_LIST="
    alsa_asoundlib_h
    altivec_h
    arpa_inet_h
    cdio_paranoia_h
    cdio_paranoia_paranoia_h
    dev_bktr_ioctl_bt848_h
    dev_bktr_ioctl_meteor_h
    dev_ic_bt8xx_h
    dev_video_bktr_ioctl_bt848_h
    dev_video_meteor_ioctl_meteor_h
    direct_h
    dlfcn_h
    dxva_h
    gsm_h
    io_h
    mach_mach_time_h
    machine_ioctl_bt848_h
    machine_ioctl_meteor_h
    malloc_h
    poll_h
    sndio_h
    soundcard_h
    sys_mman_h
    sys_param_h
    sys_resource_h
    sys_select_h
    sys_soundcard_h
    sys_time_h
    sys_un_h
    sys_videoio_h
    unistd_h
    windows_h
    winsock2_h
"

1395
MATH_FUNCS="
1396 1397
    atanf
    atan2f
1398
    cbrtf
1399
    cosf
1400 1401
    exp2
    exp2f
1402
    expf
1403 1404
    isinf
    isnan
1405
    ldexpf
1406 1407 1408 1409
    llrint
    llrintf
    log2
    log2f
1410
    log10f
1411 1412
    lrint
    lrintf
1413
    powf
1414 1415 1416
    rint
    round
    roundf
1417
    sinf
1418 1419 1420 1421
    trunc
    truncf
"

1422
SYSTEM_FUNCS="
1423
    aligned_malloc
Alex Beregszaszi's avatar
Alex Beregszaszi committed
1424
    closesocket
1425
    CommandLineToArgvW
1426
    CoTaskMemFree
1427
    CryptGenRandom
1428
    dlopen
Måns Rullgård's avatar
Måns Rullgård committed
1429
    fcntl
1430
    flt_lim
Måns Rullgård's avatar
Måns Rullgård committed
1431
    fork
1432
    getaddrinfo
1433
    gethrtime
1434
    getopt
1435
    GetProcessAffinityMask
1436
    GetProcessMemoryInfo
1437
    GetProcessTimes
Ramiro Polla's avatar
Ramiro Polla committed
1438
    getrusage
1439
    getservbyport
1440
    GetSystemTimeAsFileTime
1441
    gettimeofday
1442
    inet_aton
1443
    isatty
1444
    jack_port_get_latency_range
1445
    localtime_r
1446
    mach_absolute_time
1447
    MapViewOfFile
1448
    memalign
1449
    mkstemp
1450
    mmap
1451
    mprotect
1452
    nanosleep
1453
    posix_memalign
1454
    sched_getaffinity
1455
    SetConsoleTextAttribute
1456
    setmode
1457
    setrlimit
1458
    Sleep
1459
    strerror_r
1460
    strptime
1461 1462 1463 1464 1465 1466 1467
    sysconf
    sysctl
    usleep
    VirtualAlloc
"

TOOLCHAIN_FEATURES="
1468
    as_dn_directive
1469
    as_func
1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487
    asm_mod_q
    attribute_may_alias
    attribute_packed
    ebp_available
    ebx_available
    gnu_as
    ibm_asm
    inline_asm_labels
    pragma_deprecated
    symver_asm_label
    symver_gnu_asm
    vfp_args
    xform_asm
    xmm_clobbers
"

TYPES_LIST="
    socklen_t
1488
    struct_addrinfo
1489 1490
    struct_group_source_req
    struct_ip_mreq_source
1491
    struct_ipv6_mreq
1492
    struct_pollfd
1493
    struct_rusage_ru_maxrss
1494
    struct_sockaddr_in6
1495
    struct_sockaddr_sa_len
1496
    struct_sockaddr_storage
1497
    struct_v4l2_frmivalenum_discrete
1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516
"

HAVE_LIST="
    $ARCH_EXT_LIST
    $(add_suffix _external $ARCH_EXT_LIST)
    $(add_suffix _inline   $ARCH_EXT_LIST)
    $ARCH_FEATURES
    $ATOMICS_LIST
    $BUILTIN_LIST
    $HAVE_LIST_CMDLINE
    $HAVE_LIST_PUB
    $HEADERS_LIST
    $MATH_FUNCS
    $SYSTEM_FUNCS
    $THREADS_LIST
    $TOOLCHAIN_FEATURES
    $TYPES_LIST
    atomics_native
    dos_paths
1517
    dxva2_lib
1518 1519 1520 1521
    libc_msvcrt
    libdc1394_1
    libdc1394_2
    sdl
1522
    threads
1523 1524
    vdpau_x11
    xlib
1525
"
1526

Diego Biurrun's avatar
Diego Biurrun committed
1527
# options emitted with CONFIG_ prefix but not available on the command line
1528
CONFIG_EXTRA="
1529
    aandcttables
1530
    ac3dsp
1531
    audio_frame_queue
1532
    audiodsp
1533
    blockdsp
1534
    bswapdsp
1535
    cabac
1536
    dsputil
1537
    gcrypt
1538
    golomb
1539
    gplv3
1540
    h263dsp
1541 1542 1543
    h264chroma
    h264dsp
    h264pred
1544
    h264qpel
1545
    hpeldsp
1546
    huffman
1547
    huffyuvdsp
1548
    huffyuvencdsp
1549
    idctdsp
1550
    intrax8
1551
    lgplv3
1552
    lpc
1553
    mpeg_er
1554
    mpegaudio
1555
    mpegaudiodsp
1556
    mpegvideo
1557
    mpegvideoenc
1558
    nettle
1559
    qpeldsp
1560
    rangecoder
1561
    riffdec
1562
    riffenc
1563
    rtpdec
1564
    rtpenc_chain
1565
    sinewin
1566
    tpeldsp
1567
    videodsp
1568
    vp3dsp
1569 1570
"

1571
CMDLINE_SELECT="
1572
    $ARCH_EXT_LIST
1573
    $CONFIG_LIST
1574
    $HAVE_LIST_CMDLINE
1575
    $THREADS_LIST
1576
    asm
1577
    cross_compile
1578 1579
    debug
    extra_warnings
1580
    logging
1581
    lto
1582
    optimizations
1583
"
1584

1585
PATHS_LIST="
1586
    bindir
1587
    datadir
1588
    docdir
1589 1590 1591 1592 1593
    incdir
    libdir
    mandir
    prefix
    shlibdir
1594
"
1595 1596 1597

CMDLINE_SET="
    $PATHS_LIST
1598
    ar
1599
    arch
1600
    as
1601 1602 1603 1604
    build_suffix
    cc
    cpu
    cross_prefix
1605
    dep_cc
1606
    extra_version
1607 1608
    host_cc
    host_cflags
1609
    host_ld
1610 1611
    host_ldflags
    host_libs
1612
    host_os
1613
    ld
1614
    logfile
1615
    malloc_prefix
1616
    nm
1617
    optflags
1618
    pkg_config
1619
    pkg_config_flags
1620
    random_seed
Måns Rullgård's avatar
Måns Rullgård committed
1621
    samples
1622 1623
    sysinclude
    sysroot
1624
    target_exec
1625
    target_os
1626
    target_path
1627
    target_samples
1628
    toolchain
1629
"
1630

1631 1632
CMDLINE_APPEND="
    extra_cflags
1633
    host_cppflags
1634 1635
"

1636 1637
# code dependency declarations

1638
# architecture extensions
1639

1640 1641
armv5te_deps="arm"
armv6_deps="arm"
1642
armv6t2_deps="arm"
1643
armv8_deps="aarch64"
1644 1645
neon_deps_any="aarch64 arm"
vfp_deps_any="aarch64 arm"
1646
vfpv3_deps="vfp"
1647

1648 1649
map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM

1650 1651 1652
altivec_deps="ppc"
ppc4xx_deps="ppc"

1653 1654 1655
cpunop_deps="i686"
x86_64_select="i686"
x86_64_suggest="fast_cmov"
1656

1657 1658
amd3dnow_deps="mmx"
amd3dnowext_deps="amd3dnow"
1659
i686_deps="x86"
1660
mmx_deps="x86"
1661
mmxext_deps="mmx"
1662 1663 1664 1665 1666 1667 1668
sse_deps="mmxext"
sse2_deps="sse"
sse3_deps="sse2"
ssse3_deps="sse3"
sse4_deps="ssse3"
sse42_deps="sse4"
avx_deps="sse42"
1669
xop_deps="avx"
1670
fma3_deps="avx"
1671
fma4_deps="avx"
1672
avx2_deps="avx"
1673

1674 1675 1676 1677
mmx_external_deps="yasm"
mmx_inline_deps="inline_asm"
mmx_suggest="mmx_external mmx_inline"

1678
for ext in $(filter_out mmx $ARCH_EXT_LIST_X86_SIMD); do
1679 1680 1681 1682 1683 1684
    eval dep=\$${ext}_deps
    eval ${ext}_external_deps='"${dep}_external"'
    eval ${ext}_inline_deps='"${dep}_inline"'
    eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
done

1685 1686 1687 1688
aligned_stack_if_any="aarch64 ppc x86"
fast_64bit_if_any="aarch64 alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
fast_clz_if_any="aarch64 alpha avr32 mips ppc x86"
fast_unaligned_if_any="aarch64 ppc x86"
1689

1690
need_memalign="altivec neon sse"
1691

1692 1693 1694
# system capabilities
log2_deps="!libc_msvcrt"

1695 1696
symver_if_any="symver_asm_label symver_gnu_asm"

1697 1698 1699 1700 1701
# threading support
atomics_gcc_if="sync_val_compare_and_swap"
atomics_suncc_if="atomic_cas_ptr machine_rw_barrier"
atomics_win32_if="MemoryBarrier"
atomics_native_if_any="$ATOMICS_LIST"
1702
w32threads_deps="atomics_native"
1703 1704
threads_if_any="$THREADS_LIST"

1705
# subsystems
1706
dct_select="rdft"
1707
dsputil_select="idctdsp"
1708
error_resilience_select="dsputil"
1709
intrax8_select="error_resilience"
1710 1711
mdct_select="fft"
rdft_select="fft"
1712
mpeg_er_select="error_resilience"
1713
mpegaudio_select="mpegaudiodsp"
1714
mpegaudiodsp_select="dct"
1715
mpegvideo_select="blockdsp dsputil hpeldsp idctdsp videodsp"
1716
mpegvideoenc_select="dsputil mpegvideo qpeldsp"
1717

1718
# decoders / encoders
1719
aac_decoder_select="mdct sinewin"
1720
aac_encoder_select="audio_frame_queue mdct sinewin"
1721
aac_latm_decoder_select="aac_decoder aac_latm_parser"
1722
ac3_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
1723 1724
ac3_encoder_select="ac3dsp audiodsp dsputil mdct"
ac3_fixed_encoder_select="ac3dsp audiodsp dsputil mdct"
1725
aic_decoder_select="golomb idctdsp"
1726
alac_encoder_select="lpc"
1727
als_decoder_select="bswapdsp"
1728
amrnb_decoder_select="lsp"
1729
amrwb_decoder_select="lsp"
1730
amv_decoder_select="sp5x_decoder"
1731
ape_decoder_select="bswapdsp"
1732
asv1_decoder_select="blockdsp bswapdsp idctdsp"
1733
asv1_encoder_select="bswapdsp dsputil"
1734
asv2_decoder_select="blockdsp bswapdsp idctdsp"
1735
asv2_encoder_select="bswapdsp dsputil"
1736
atrac1_decoder_select="mdct sinewin"
1737
atrac3_decoder_select="mdct"
Maxim Polijakowski's avatar
Maxim Polijakowski committed
1738
atrac3p_decoder_select="mdct sinewin"
1739
bink_decoder_select="blockdsp hpeldsp"
1740 1741
binkaudio_dct_decoder_select="mdct rdft dct sinewin"
binkaudio_rdft_decoder_select="mdct rdft sinewin"
1742
cavs_decoder_select="blockdsp golomb h264chroma idctdsp qpeldsp videodsp"
1743
cllc_decoder_select="bswapdsp"
1744
comfortnoise_encoder_select="lpc"
1745
cook_decoder_select="audiodsp mdct sinewin"
1746
cscd_decoder_select="lzo"
1747
cscd_decoder_suggest="zlib"
1748
dca_decoder_select="mdct"
1749 1750 1751
dnxhd_decoder_select="blockdsp idctdsp"
dnxhd_encoder_select="aandcttables blockdsp dsputil idctdsp mpegvideoenc"
dvvideo_decoder_select="idctdsp"
1752
dvvideo_encoder_select="dsputil"
1753
dxa_decoder_deps="zlib"
1754
eac3_decoder_select="ac3_decoder"
1755
eac3_encoder_select="ac3_encoder"
1756 1757 1758
eamad_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpegvideo"
eatgq_decoder_select="aandcttables idctdsp"
eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpeg1video_decoder"
Jimmy Christensen's avatar
Jimmy Christensen committed
1759
exr_decoder_deps="zlib"
1760 1761
ffv1_decoder_select="golomb rangecoder"
ffv1_encoder_select="rangecoder"
1762 1763
ffvhuff_decoder_select="huffyuv_decoder"
ffvhuff_encoder_select="huffyuv_encoder"
Kostya Shishkov's avatar
Kostya Shishkov committed
1764
fic_decoder_select="golomb"
1765
flac_decoder_select="golomb"
1766
flac_encoder_select="bswapdsp golomb lpc"
1767 1768 1769
flashsv_decoder_deps="zlib"
flashsv_encoder_deps="zlib"
flashsv2_decoder_deps="zlib"
1770
flv_decoder_select="h263_decoder"
1771
flv_encoder_select="h263_encoder"
1772 1773
fourxm_decoder_select="blockdsp bswapdsp"
fraps_decoder_select="bswapdsp huffman"
1774
g2m_decoder_deps="zlib"
1775
g2m_decoder_select="blockdsp idctdsp"
1776
h261_decoder_select="mpeg_er mpegvideo"
1777
h261_encoder_select="aandcttables mpegvideoenc"
1778
h263_decoder_select="error_resilience h263_parser h263dsp mpeg_er mpegvideo qpeldsp"
1779
h263_encoder_select="aandcttables h263dsp mpegvideoenc"
1780
h263i_decoder_select="h263_decoder"
1781
h263p_encoder_select="h263_encoder"
1782
h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel videodsp"
1783
h264_decoder_suggest="error_resilience"
1784 1785 1786
hevc_decoder_select="bswapdsp cabac golomb videodsp"
huffyuv_decoder_select="bswapdsp huffyuvdsp"
huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp"
1787
iac_decoder_select="imc_decoder"
1788
imc_decoder_select="bswapdsp fft mdct sinewin"
1789
indeo3_decoder_select="hpeldsp"
1790
interplay_video_decoder_select="hpeldsp"
1791
jpegls_decoder_select="golomb mjpeg_decoder"
1792
jpegls_encoder_select="golomb"
1793
jv_decoder_select="blockdsp"
1794
lagarith_decoder_select="huffyuvdsp"
1795
ljpeg_encoder_select="aandcttables idctdsp"
1796
loco_decoder_select="golomb"
1797
mdec_decoder_select="blockdsp idctdsp mpegvideo"
1798
metasound_decoder_select="lsp mdct sinewin"
1799 1800
mimic_decoder_select="blockdsp bswapdsp hpeldsp idctdsp"
mjpeg_decoder_select="blockdsp hpeldsp idctdsp"
1801
mjpeg_encoder_select="aandcttables mpegvideoenc"
1802
mjpegb_decoder_select="mjpeg_decoder"
1803
mlp_decoder_select="mlp_parser"
1804
motionpixels_decoder_select="bswapdsp"
1805 1806 1807 1808 1809 1810 1811 1812 1813 1814
mp1_decoder_select="mpegaudio"
mp1float_decoder_select="mpegaudio"
mp2_decoder_select="mpegaudio"
mp2float_decoder_select="mpegaudio"
mp3_decoder_select="mpegaudio"
mp3adu_decoder_select="mpegaudio"
mp3adufloat_decoder_select="mpegaudio"
mp3float_decoder_select="mpegaudio"
mp3on4_decoder_select="mpegaudio"
mp3on4float_decoder_select="mpegaudio"
1815
mpc7_decoder_select="bswapdsp mpegaudiodsp"
1816
mpc8_decoder_select="mpegaudiodsp"
1817
mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
1818
mpeg_xvmc_decoder_select="mpeg2video_decoder"
1819
mpeg1video_decoder_select="error_resilience mpeg_er mpegvideo"
1820
mpeg1video_encoder_select="aandcttables mpegvideoenc"
1821
mpeg2video_decoder_select="error_resilience mpeg_er mpegvideo"
1822
mpeg2video_encoder_select="aandcttables mpegvideoenc"
1823 1824
mpeg4_decoder_select="h263_decoder mpeg4video_parser"
mpeg4_encoder_select="h263_encoder"
1825 1826
msmpeg4v1_decoder_select="h263_decoder"
msmpeg4v2_decoder_select="h263_decoder"
1827
msmpeg4v2_encoder_select="h263_encoder"
1828
msmpeg4v3_decoder_select="h263_decoder"
1829
msmpeg4v3_encoder_select="h263_encoder"
1830
mss2_decoder_select="error_resilience mpeg_er qpeldsp vc1_decoder"
1831
mxpeg_decoder_select="mjpeg_decoder"
1832
nellymoser_decoder_select="mdct sinewin"
1833
nellymoser_encoder_select="audio_frame_queue mdct sinewin"
1834
nuv_decoder_select="idctdsp lzo"
Kostya Shishkov's avatar
Kostya Shishkov committed
1835
on2avc_decoder_select="mdct"
1836
opus_decoder_deps="avresample"
1837 1838
png_decoder_deps="zlib"
png_encoder_deps="zlib"
1839
png_encoder_select="huffyuvencdsp"
1840
prores_decoder_select="idctdsp"
1841
prores_encoder_select="dsputil"
1842
qcelp_decoder_select="lsp"
1843
qdm2_decoder_select="mdct rdft mpegaudiodsp"
1844
ra_144_encoder_select="audio_frame_queue lpc"
1845
ralf_decoder_select="golomb"
1846
rv10_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
1847
rv10_encoder_select="h263_encoder"
1848
rv20_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
1849
rv20_encoder_select="h263_encoder"
1850 1851
rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo videodsp"
rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo videodsp"
1852
shorten_decoder_select="golomb"
1853
sipr_decoder_select="lsp"
1854
sp5x_decoder_select="mjpeg_decoder"
1855
svq1_decoder_select="hpeldsp"
1856
svq1_encoder_select="aandcttables dsputil hpeldsp mpegvideoenc"
1857
svq3_decoder_select="h264_decoder hpeldsp tpeldsp"
1858
svq3_decoder_suggest="zlib"
1859
tak_decoder_select="audiodsp"
1860
theora_decoder_select="vp3_decoder"
1861
thp_decoder_select="mjpeg_decoder"
1862 1863
tiff_decoder_suggest="zlib"
tiff_encoder_suggest="zlib"
1864
truehd_decoder_select="mlp_decoder"
1865 1866
truemotion2_decoder_select="bswapdsp"
truespeech_decoder_select="bswapdsp"
1867
tscc_decoder_deps="zlib"
1868
twinvq_decoder_select="mdct lsp sinewin"
1869 1870
utvideo_decoder_select="bswapdsp"
utvideo_encoder_select="bswapdsp huffman huffyuvencdsp"
1871
vble_decoder_select="huffyuvdsp"
1872
vc1_decoder_select="blockdsp error_resilience h263_decoder h264chroma h264qpel intrax8 mpeg_er qpeldsp"
1873
vc1image_decoder_select="vc1_decoder"
1874 1875
vorbis_decoder_select="mdct"
vorbis_encoder_select="mdct"
1876
vp3_decoder_select="hpeldsp vp3dsp videodsp"
1877 1878
vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp"
vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp"
1879 1880
vp6a_decoder_select="vp6_decoder"
vp6f_decoder_select="vp6_decoder"
Peter Ross's avatar
Peter Ross committed
1881
vp7_decoder_select="h264pred videodsp"
1882
vp8_decoder_select="h264pred videodsp"
Ronald S. Bultje's avatar
Ronald S. Bultje committed
1883
vp9_decoder_select="videodsp"
Justin Ruggles's avatar
Justin Ruggles committed
1884
webp_decoder_select="vp8_decoder"
1885 1886 1887 1888 1889 1890
wmapro_decoder_select="mdct sinewin"
wmav1_decoder_select="mdct sinewin"
wmav1_encoder_select="mdct sinewin"
wmav2_decoder_select="mdct sinewin"
wmav2_encoder_select="mdct sinewin"
wmavoice_decoder_select="lsp rdft dct mdct sinewin"
1891
wmv1_decoder_select="h263_decoder"
1892
wmv1_encoder_select="h263_encoder"
1893
wmv2_decoder_select="blockdsp h263_decoder idctdsp intrax8 videodsp"
1894
wmv2_encoder_select="h263_encoder"
1895
wmv3_decoder_select="vc1_decoder"
1896
wmv3image_decoder_select="wmv3_decoder"
1897 1898 1899 1900 1901
zerocodec_decoder_deps="zlib"
zlib_decoder_deps="zlib"
zlib_encoder_deps="zlib"
zmbv_decoder_deps="zlib"
zmbv_encoder_deps="zlib"
1902

1903
# hardware accelerators
1904
dxva2_deps="dxva2api_h"
1905
vaapi_deps="va_va_h"
1906
vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
1907
vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore"
1908 1909
vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"

1910 1911 1912 1913
h263_vaapi_hwaccel_deps="vaapi"
h263_vaapi_hwaccel_select="h263_decoder"
h263_vdpau_hwaccel_deps="vdpau"
h263_vdpau_hwaccel_select="h263_decoder"
1914 1915
h264_dxva2_hwaccel_deps="dxva2"
h264_dxva2_hwaccel_select="h264_decoder"
1916 1917 1918 1919
h264_vaapi_hwaccel_deps="vaapi"
h264_vaapi_hwaccel_select="h264_decoder"
h264_vda_hwaccel_deps="vda"
h264_vda_hwaccel_select="h264_decoder"
1920 1921
h264_vda_old_hwaccel_deps="vda"
h264_vda_old_hwaccel_select="h264_decoder"
1922 1923 1924 1925
h264_vdpau_hwaccel_deps="vdpau"
h264_vdpau_hwaccel_select="h264_decoder"
mpeg1_vdpau_hwaccel_deps="vdpau"
mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
1926 1927
mpeg2_dxva2_hwaccel_deps="dxva2"
mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
1928 1929 1930 1931 1932 1933 1934 1935
mpeg2_vaapi_hwaccel_deps="vaapi"
mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
mpeg2_vdpau_hwaccel_deps="vdpau"
mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
mpeg4_vaapi_hwaccel_deps="vaapi"
mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
mpeg4_vdpau_hwaccel_deps="vdpau"
mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
1936 1937
vc1_dxva2_hwaccel_deps="dxva2"
vc1_dxva2_hwaccel_select="vc1_decoder"
1938 1939 1940 1941
vc1_vaapi_hwaccel_deps="vaapi"
vc1_vaapi_hwaccel_select="vc1_decoder"
vc1_vdpau_hwaccel_deps="vdpau"
vc1_vdpau_hwaccel_select="vc1_decoder"
1942 1943
wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
1944
wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
1945

1946
# parsers
1947
h264_parser_select="h264_decoder"
1948
mpegvideo_parser_select="mpegvideo"
1949
mpeg4video_parser_select="error_resilience h263dsp mpeg_er mpegvideo qpeldsp"
1950
vc1_parser_select="mpegvideo"
1951

1952
# external libraries
1953
libfaac_encoder_deps="libfaac"
1954
libfaac_encoder_select="audio_frame_queue"
1955
libfdk_aac_decoder_deps="libfdk_aac"
1956
libfdk_aac_encoder_deps="libfdk_aac"
1957
libfdk_aac_encoder_select="audio_frame_queue"
1958 1959
libgsm_decoder_deps="libgsm"
libgsm_encoder_deps="libgsm"
1960 1961
libgsm_ms_decoder_deps="libgsm"
libgsm_ms_encoder_deps="libgsm"
1962 1963
libilbc_decoder_deps="libilbc"
libilbc_encoder_deps="libilbc"
1964
libmp3lame_encoder_deps="libmp3lame"
1965
libmp3lame_encoder_select="audio_frame_queue"
1966 1967
libopencore_amrnb_decoder_deps="libopencore_amrnb"
libopencore_amrnb_encoder_deps="libopencore_amrnb"
1968
libopencore_amrnb_encoder_select="audio_frame_queue"
1969
libopencore_amrwb_decoder_deps="libopencore_amrwb"
1970
libopenjpeg_decoder_deps="libopenjpeg"
1971
libopenjpeg_encoder_deps="libopenjpeg"
1972
libopus_decoder_deps="libopus"
1973
libopus_encoder_deps="libopus"
1974
libopus_encoder_select="audio_frame_queue"
1975 1976
libschroedinger_decoder_deps="libschroedinger"
libschroedinger_encoder_deps="libschroedinger"
1977
libspeex_decoder_deps="libspeex"
1978
libspeex_encoder_deps="libspeex"
1979
libspeex_encoder_select="audio_frame_queue"
1980
libtheora_encoder_deps="libtheora"
1981
libtwolame_encoder_deps="libtwolame"
1982
libvo_aacenc_encoder_deps="libvo_aacenc"
1983
libvo_aacenc_encoder_select="audio_frame_queue"
1984
libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
1985
libvorbis_encoder_deps="libvorbis"
1986
libvorbis_encoder_select="audio_frame_queue"
1987 1988 1989 1990
libvpx_vp8_decoder_deps="libvpx"
libvpx_vp8_encoder_deps="libvpx"
libvpx_vp9_decoder_deps="libvpx"
libvpx_vp9_encoder_deps="libvpx"
1991
libwavpack_encoder_deps="libwavpack"
Justin Ruggles's avatar
Justin Ruggles committed
1992
libwebp_encoder_deps="libwebp"
1993
libx264_encoder_deps="libx264"
Derek Buitenhuis's avatar
Derek Buitenhuis committed
1994
libx265_encoder_deps="libx265"
1995
libxavs_encoder_deps="libxavs"
1996
libxvid_encoder_deps="libxvid"
1997

1998
# demuxers / muxers
1999
ac3_demuxer_select="ac3_parser"
2000
asf_demuxer_select="riffdec"
2001
asf_muxer_select="riffenc"
2002
asf_stream_muxer_select="asf_muxer"
2003
avi_demuxer_select="riffdec"
2004
avi_muxer_select="riffenc"
2005
avisynth_demuxer_deps="avisynth"
2006 2007
avisynth_demuxer_select="riffdec"
caf_demuxer_select="riffdec"
2008
dirac_demuxer_select="dirac_parser"
2009
dxa_demuxer_select="riffdec"
2010
eac3_demuxer_select="ac3_parser"
2011
f4v_muxer_select="mov_muxer"
2012
flac_demuxer_select="flac_parser"
2013
hds_muxer_select="flv_muxer"
2014
hls_muxer_select="mpegts_muxer"
2015
ipod_muxer_select="mov_muxer"
2016
ismv_muxer_select="mov_muxer"
2017
matroska_audio_muxer_select="matroska_muxer"
2018
matroska_demuxer_select="riffdec"
2019
matroska_demuxer_suggest="bzlib lzo zlib"
2020 2021
matroska_muxer_select="riffenc"
mmf_muxer_select="riffenc"
2022
mov_demuxer_select="riffdec"
2023
mov_demuxer_suggest="zlib"
2024
mov_muxer_select="riffenc rtpenc_chain"
2025
mp3_demuxer_select="mpegaudio_parser"
2026
mp4_muxer_select="mov_muxer"
2027
mpegts_muxer_select="adts_muxer latm_muxer"
2028 2029
mpegtsraw_demuxer_select="mpegts_demuxer"
mxf_d10_muxer_select="mxf_muxer"
2030
nut_muxer_select="riffenc"
2031
nuv_demuxer_select="riffdec"
2032
ogg_demuxer_select="golomb"
2033
psp_muxer_select="mov_muxer"
2034
rtp_demuxer_select="sdp_demuxer"
2035 2036
rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
rtsp_demuxer_select="http_protocol rtpdec"
2037
rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
Martin Storsjö's avatar
Martin Storsjö committed
2038
sap_demuxer_select="sdp_demuxer"
2039
sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
2040
sdp_demuxer_select="rtpdec"
2041
smoothstreaming_muxer_select="ismv_muxer"
2042
spdif_muxer_select="aac_parser"
2043
tak_demuxer_select="tak_parser"
2044 2045
tg2_muxer_select="mov_muxer"
tgp_muxer_select="mov_muxer"
2046
w64_demuxer_select="wav_demuxer"
2047
wav_demuxer_select="riffdec"
2048 2049
wav_muxer_select="riffenc"
webm_muxer_select="riffenc"
2050 2051 2052
wtv_demuxer_select="riffdec"
xmv_demuxer_select="riffdec"
xwma_demuxer_select="riffdec"
2053 2054

# indevs / outdevs
2055 2056 2057
alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
alsa_outdev_deps="alsa_asoundlib_h"
bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
2058 2059
dv1394_indev_deps="dv1394"
dv1394_indev_select="dv_demuxer"
2060
fbdev_indev_deps="linux_fb_h"
2061
jack_indev_deps="jack_jack_h pthreads"
2062
libcdio_indev_deps="libcdio"
2063 2064 2065
libdc1394_indev_deps="libdc1394"
oss_indev_deps_any="soundcard_h sys_soundcard_h"
oss_outdev_deps_any="soundcard_h sys_soundcard_h"
2066
pulse_indev_deps="libpulse"
2067 2068
sndio_indev_deps="sndio_h"
sndio_outdev_deps="sndio_h"
2069
v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
2070
vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
2071
vfwcap_indev_extralibs="-lavicap32"
2072
x11grab_indev_deps="x11grab XShmCreateImage"
2073

2074
# protocols
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2075 2076 2077
ffrtmpcrypt_protocol_deps="!librtmp_protocol"
ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
ffrtmpcrypt_protocol_select="tcp_protocol"
2078 2079
ffrtmphttp_protocol_deps="!librtmp_protocol"
ffrtmphttp_protocol_select="http_protocol"
2080
gopher_protocol_select="network"
2081
http_protocol_select="tcp_protocol"
2082
httpproxy_protocol_select="tcp_protocol"
2083
https_protocol_select="tls_protocol"
2084 2085 2086 2087 2088
librtmp_protocol_deps="librtmp"
librtmpe_protocol_deps="librtmp"
librtmps_protocol_deps="librtmp"
librtmpt_protocol_deps="librtmp"
librtmpte_protocol_deps="librtmp"
Måns Rullgård's avatar
Måns Rullgård committed
2089
mmsh_protocol_select="http_protocol"
2090
mmst_protocol_select="network"
2091
rtmp_protocol_deps="!librtmp_protocol"
2092
rtmp_protocol_select="tcp_protocol"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2093
rtmpe_protocol_select="ffrtmpcrypt_protocol"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2094 2095
rtmps_protocol_deps="!librtmp_protocol"
rtmps_protocol_select="tls_protocol"
2096
rtmpt_protocol_select="ffrtmphttp_protocol"
2097
rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2098
rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2099
rtp_protocol_select="udp_protocol"
2100 2101
sctp_protocol_deps="struct_sctp_event_subscribe"
sctp_protocol_select="network"
2102
srtp_protocol_select="rtp_protocol"
2103
tcp_protocol_select="network"
2104 2105
tls_protocol_deps_any="openssl gnutls"
tls_protocol_select="tcp_protocol"
2106
udp_protocol_select="network"
2107 2108
unix_protocol_deps="sys_un_h"
unix_protocol_select="network"
2109

2110
# filters
2111
blackframe_filter_deps="gpl"
2112
boxblur_filter_deps="gpl"
2113
bs2b_filter_deps="libbs2b"
2114
cropdetect_filter_deps="gpl"
2115
delogo_filter_deps="gpl"
2116
drawtext_filter_deps="libfreetype"
2117
frei0r_filter_deps="frei0r dlopen"
2118
frei0r_filter_extralibs='$ldl'
2119
frei0r_src_filter_deps="frei0r dlopen"
2120
frei0r_src_filter_extralibs='$ldl'
2121
hqdn3d_filter_deps="gpl"
2122
interlace_filter_deps="gpl"
2123
ocv_filter_deps="libopencv"
2124
resample_filter_deps="avresample"
2125
scale_filter_deps="swscale"
2126

2127
# examples
2128
avcodec_example_deps="avcodec avutil"
2129
filter_audio_example_deps="avfilter avutil"
2130
metadata_example_deps="avformat avutil"
2131
output_example_deps="avcodec avformat avutil swscale"
2132
transcode_aac_example_deps="avcodec avformat avresample"
2133

2134
# libraries, in linking order
2135
avcodec_deps="avutil"
2136
avdevice_deps="avformat avcodec avutil"
2137
avfilter_deps="avutil"
2138
avformat_deps="avcodec avutil"
2139 2140
avresample_deps="avutil"
swscale_deps="avutil"
2141

2142
# programs
2143
avconv_deps="avcodec avfilter avformat avresample swscale"
2144
avconv_select="aformat_filter anull_filter asyncts_filter atrim_filter format_filter
2145
               fps_filter null_filter resample_filter scale_filter
2146
               setpts_filter trim_filter"
2147
avplay_deps="avcodec avformat avresample swscale sdl"
2148
avplay_libs='$sdl_libs'
Anton Khirnov's avatar
Anton Khirnov committed
2149
avplay_select="rdft"
2150
avprobe_deps="avcodec avformat"
Måns Rullgård's avatar
Måns Rullgård committed
2151

2152
# documentation
2153
pod2man_deps="doc"
2154 2155
texi2html_deps="doc"

Fabrice Bellard's avatar
Fabrice Bellard committed
2156
# default parameters
2157

2158
logfile="config.log"
2159 2160

# installation paths
2161 2162
prefix_default="/usr/local"
bindir_default='${prefix}/bin'
2163
datadir_default='${prefix}/share/avconv'
2164
docdir_default='${prefix}/share/doc/libav'
2165 2166 2167 2168
incdir_default='${prefix}/include'
libdir_default='${prefix}/lib'
mandir_default='${prefix}/share/man'
shlibdir_default="$libdir_default"
2169 2170

# toolchain
2171
ar_default="ar"
2172
cc_default="gcc"
2173
host_cc_default="gcc"
Mans Rullgard's avatar
Mans Rullgard committed
2174
cp_f="cp -f"
2175
ln_s="ln -s -f"
2176
nm_default="nm -g"
2177
objformat="elf"
2178
pkg_config_default=pkg-config
Michael Niedermayer's avatar
Michael Niedermayer committed
2179
ranlib="ranlib"
2180
strip="strip"
2181
yasmexe="yasm"
2182

2183
nogas=":"
2184

2185
# machine
2186
arch_default=$(uname -m)
2187
cpu="generic"
2188 2189

# OS
2190 2191
target_os_default=$(tolower $(uname -s))
host_os=$target_os_default
2192 2193

# configurable options
2194
enable $EXAMPLE_LIST $LIBRARY_LIST $PROGRAM_LIST
2195 2196 2197 2198

enable asm
enable debug
enable doc
2199
enable optimizations
2200
enable safe_bitstream_reader
2201
enable static
2202
enable swscale_alpha
2203

2204 2205 2206
# By default, enable only those hwaccels that have no external dependencies.
enable dxva2 vdpau

2207
# build settings
2208
SHFLAGS='-shared -Wl,-soname,$$(@F)'
2209 2210
LIBPREF="lib"
LIBSUF=".a"
2211 2212
FULLNAME='$(NAME)$(BUILDSUF)'
LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
2213 2214
SLIBPREF="lib"
SLIBSUF=".so"
2215
SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
2216 2217
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
Måns Rullgård's avatar
Måns Rullgård committed
2218
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2219 2220
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2221

2222 2223
asflags_filter=echo
cflags_filter=echo
2224 2225
ldflags_filter=echo

2226
AS_C='-c'
2227
AS_O='-o $@'
2228
CC_C='-c'
2229
CC_E='-E -o $@'
2230
CC_O='-o $@'
2231
LD_O='-o $@'
2232 2233
LD_LIB='-l%'
LD_PATH='-L'
2234
HOSTCC_C='-c'
2235
HOSTCC_E='-E -o $@'
2236
HOSTCC_O='-o $@'
2237
HOSTLD_O='-o $@'
2238

2239
host_libs='-lm'
2240 2241
host_cflags_filter=echo
host_ldflags_filter=echo
2242

2243
target_path='$(CURDIR)'
2244

2245 2246
# since the object filename is not given with the -MM flag, the compiler
# is only able to print the basename, and we must add the path ourselves
2247 2248
DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
DEPFLAGS='-MM'
2249

2250
# find source path
2251
if test -f configure; then
2252
    source_path=.
2253
else
2254
    source_path=$(cd $(dirname "$0"); pwd)
2255
    echo "$source_path" | grep -q '[[:blank:]]' &&
2256
        die "Out of tree builds are impossible with whitespace in source path."
2257 2258
    test -e "$source_path/config.h" &&
        die "Out of tree builds are impossible with config.h in source dir."
2259 2260
fi

2261
for v in "$@"; do
2262 2263 2264
    r=${v#*=}
    l=${v%"$r"}
    r=$(sh_quote "$r")
2265
    LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
2266
done
2267

2268 2269 2270 2271
find_things(){
    thing=$1
    pattern=$2
    file=$source_path/$3
2272
    sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2273 2274 2275 2276
}

ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2277
HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
2278 2279 2280 2281
PARSER_LIST=$(find_things   parser   PARSER   libavcodec/allcodecs.c)
BSF_LIST=$(find_things      bsf      BSF      libavcodec/allcodecs.c)
MUXER_LIST=$(find_things    muxer    _MUX     libavformat/allformats.c)
DEMUXER_LIST=$(find_things  demuxer  DEMUX    libavformat/allformats.c)
2282 2283
OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2284
PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
2285
FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2286

2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300
ALL_COMPONENTS="
    $BSF_LIST
    $DECODER_LIST
    $DEMUXER_LIST
    $ENCODER_LIST
    $FILTER_LIST
    $HWACCEL_LIST
    $INDEV_LIST
    $MUXER_LIST
    $OUTDEV_LIST
    $PARSER_LIST
    $PROTOCOL_LIST
"

2301 2302 2303 2304 2305 2306
for n in $COMPONENT_LIST; do
    v=$(toupper ${n%s})_LIST
    eval enable \$$v
    eval ${n}_if_any="\$$v"
done

2307
enable $ARCH_EXT_LIST
2308 2309 2310 2311 2312 2313 2314

die_unknown(){
    echo "Unknown option \"$1\"."
    echo "See $0 --help for available options."
    exit 1
}

2315 2316 2317 2318
print_3_columns() {
    cat | tr ' ' '\n' | sort | pr -r -3 -t
}

2319
show_list() {
Ramiro Polla's avatar
Ramiro Polla committed
2320 2321
    suffix=_$1
    shift
2322
    echo $* | sed s/$suffix//g | print_3_columns
2323 2324 2325
    exit 0
}

2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346
rand_list(){
    IFS=', '
    set -- $*
    unset IFS
    for thing; do
        comp=${thing%:*}
        prob=${thing#$comp}
        prob=${prob#:}
        is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
        echo "prob ${prob:-0.5}"
        printf '%s\n' $comp
    done
}

do_random(){
    action=$1
    shift
    random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
    $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
}

2347
for opt do
2348 2349
    optval="${opt#*=}"
    case "$opt" in
2350 2351
        --extra-ldflags=*)
            add_ldflags $optval
2352
        ;;
2353 2354
        --extra-libs=*)
            add_extralibs $optval
2355
        ;;
2356 2357
        --disable-devices)
            disable $INDEV_LIST $OUTDEV_LIST
2358
        ;;
2359 2360
        --enable-debug=*)
            debuglevel="$optval"
2361 2362 2363 2364 2365 2366 2367
        ;;
        --disable-programs)
            disable $PROGRAM_LIST
        ;;
        --disable-everything)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
        ;;
2368 2369 2370 2371
        --disable-all)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
            disable $LIBRARY_LIST $PROGRAM_LIST doc
        ;;
2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386
        --enable-random|--disable-random)
            action=${opt%%-random}
            do_random ${action#--} $COMPONENT_LIST
        ;;
        --enable-random=*|--disable-random=*)
            action=${opt%%-random=*}
            do_random ${action#--} $optval
        ;;
        --enable-*=*|--disable-*=*)
            eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
            is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
            eval list=\$$(toupper $thing)_LIST
            name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
            $action $(filter "$name" $list)
        ;;
Anton Khirnov's avatar
Anton Khirnov committed
2387 2388 2389 2390
        --enable-avserver|--disable-avserver*)
            warn "avserver has been removed, the ${opt} option is only"\
                 "provided for compatibility and will be removed in the future"
        ;;
2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421
        --enable-?*|--disable-?*)
            eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
            if is_in $option $COMPONENT_LIST; then
                test $action = disable && action=unset
                eval $action \$$(toupper ${option%s})_LIST
            elif is_in $option $CMDLINE_SELECT; then
                $action $option
            else
                die_unknown $opt
            fi
        ;;
        --list-*)
            NAME="${opt#--list-}"
            is_in $NAME $COMPONENT_LIST || die_unknown $opt
            NAME=${NAME%s}
            eval show_list $NAME \$$(toupper $NAME)_LIST
        ;;
        --help|-h) show_help
        ;;
        *)
            optname="${opt%%=*}"
            optname="${optname#--}"
            optname=$(echo "$optname" | sed 's/-/_/g')
            if is_in $optname $CMDLINE_SET; then
                eval $optname='$optval'
            elif is_in $optname $CMDLINE_APPEND; then
                append $optname "$optval"
            else
                die_unknown $opt
            fi
        ;;
2422
    esac
2423 2424
done

2425 2426
disabled logging && logfile=/dev/null

2427
echo "# $0 $LIBAV_CONFIGURATION" > $logfile
2428 2429
set >> $logfile

2430 2431
test -n "$cross_prefix" && enable cross_compile

2432 2433 2434 2435 2436
if enabled cross_compile; then
    test -n "$arch" && test -n "$target_os" ||
        die "Must specify target arch and OS when cross-compiling"
fi

2437
ar_default="${cross_prefix}${ar_default}"
2438
cc_default="${cross_prefix}${cc_default}"
Måns Rullgård's avatar
Måns Rullgård committed
2439
nm_default="${cross_prefix}${nm_default}"
2440
pkg_config_default="${cross_prefix}${pkg_config_default}"
2441
ranlib="${cross_prefix}${ranlib}"
2442
strip="${cross_prefix}${strip}"
2443

2444 2445
sysinclude_default="${sysroot}/usr/include"

2446
case "$toolchain" in
2447 2448
    clang-asan)
        cc_default="clang"
2449 2450
        add_cflags  -fsanitize=address
        add_ldflags -fsanitize=address
2451 2452 2453
    ;;
    clang-tsan)
        cc_default="clang"
2454 2455
        add_cflags  -fsanitize=thread -pie
        add_ldflags -fsanitize=thread -pie
2456
    ;;
2457 2458
    clang-usan)
        cc_default="clang"
2459
        add_cflags  -fsanitize=undefined -O1
2460 2461
        add_ldflags -fsanitize=undefined
    ;;
2462 2463 2464 2465 2466 2467 2468 2469 2470 2471
    gcc-asan)
        cc_default="gcc"
        add_cflags  -fsanitize=address
        add_ldflags -fsanitize=address
    ;;
    gcc-tsan)
        cc_default="gcc"
        add_cflags  -fsanitize=thread -pie -fPIC
        add_ldflags -fsanitize=thread -pie -fPIC
    ;;
2472 2473 2474 2475 2476
    gcc-usan)
        cc_default="gcc"
        add_cflags  -fsanitize=undefined
        add_ldflags -fsanitize=undefined
    ;;
2477 2478 2479 2480
    valgrind-massif)
        target_exec_default="valgrind"
        target_exec_args="--alloc-fn=av_malloc --alloc-fn=av_mallocz"
    ;;
2481 2482 2483 2484
    valgrind-memcheck)
        target_exec_default="valgrind"
        target_exec_args="--track-origins=yes --leak-check=full"
    ;;
2485
    msvc)
2486 2487
        # Check whether the current MSVC version needs the C99 converter.
        # From MSVC 2013 (compiler major version 18) onwards, it does actually
2488
        # support enough of C99 to build libav. Default to the new
2489 2490 2491 2492 2493
        # behaviour if the regexp was unable to match anything, since this
        # successfully parses the version number of existing supported
        # versions that require the converter (MSVC 2010 and 2012).
        cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
        if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
2494
            cc_default="cl"
2495 2496 2497
        else
            cc_default="c99wrap cl"
        fi
2498
        ld_default="link"
2499
        nm_default="dumpbin -symbols"
2500
        ar_default="lib"
2501
        target_os_default="win32"
2502 2503 2504 2505 2506
        # Use a relative path for TMPDIR. This makes sure all the
        # ffconf temp files are written with a relative path, avoiding
        # issues with msys/win32 path conversion for MSVC parameters
        # such as -Fo<file> or -out:<file>.
        TMPDIR=.
2507
    ;;
2508
    icl)
2509 2510
        cc_default="icl"
        ld_default="xilink"
2511 2512 2513
        nm_default="dumpbin -symbols"
        ar_default="xilib"
        target_os_default="win32"
2514
        TMPDIR=.
2515
    ;;
2516 2517 2518 2519
    gcov)
        add_cflags  -fprofile-arcs -ftest-coverage
        add_ldflags -fprofile-arcs -ftest-coverage
    ;;
2520
    hardened)
2521
        add_cflags  -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all
2522 2523
        add_ldflags -Wl,-z,relro -Wl,-z,now
    ;;
2524 2525 2526 2527 2528
    ?*)
        die "Unknown toolchain $toolchain"
    ;;
esac

2529
set_default arch cc pkg_config sysinclude target_exec target_os
2530 2531
enabled cross_compile || host_cc_default=$cc
set_default host_cc
2532

2533 2534 2535 2536 2537
if ! $pkg_config --version >/dev/null 2>&1; then
    warn "$pkg_config not found, library detection may fail."
    pkg_config=false
fi

2538 2539
exesuf() {
    case $1 in
2540
        mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
2541 2542 2543 2544 2545
    esac
}

EXESUF=$(exesuf $target_os)
HOSTEXESUF=$(exesuf $host_os)
2546

2547
# set temporary file name
2548
: ${TMPDIR:=$TEMPDIR}
2549
: ${TMPDIR:=$TMP}
2550
: ${TMPDIR:=/tmp}
2551

2552
if ! check_cmd mktemp -u XXXXXX; then
2553 2554 2555
    # simple replacement for missing mktemp
    # NOT SAFE FOR GENERAL USE
    mktemp(){
2556
        echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
2557 2558 2559 2560 2561 2562
    }
fi

tmpfile(){
    tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
        (set -C; exec > $tmp) 2>/dev/null ||
2563
        die "Unable to create temporary file in $TMPDIR."
2564 2565 2566 2567 2568 2569
    append TMPFILES $tmp
    eval $1=$tmp
}

trap 'rm -f -- $TMPFILES' EXIT

2570
tmpfile TMPASM .asm
2571 2572 2573 2574 2575 2576 2577
tmpfile TMPC   .c
tmpfile TMPE   $EXESUF
tmpfile TMPH   .h
tmpfile TMPO   .o
tmpfile TMPS   .S
tmpfile TMPSH  .sh
tmpfile TMPV   .ver
2578 2579

unset -f mktemp
2580

2581 2582
chmod +x $TMPE

2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595
# make sure we can execute files in $TMPDIR
cat > $TMPSH 2>> $logfile <<EOF
#! /bin/sh
EOF
chmod +x $TMPSH >> $logfile 2>&1
if ! $TMPSH >> $logfile 2>&1; then
    cat <<EOF
Unable to create and execute files in $TMPDIR.  Set the TMPDIR environment
variable to another directory and make sure that it is not mounted noexec.
EOF
    die "Sanity test failed."
fi

2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613
ccc_flags(){
    for flag; do
        case $flag in
            -std=c99)           echo -c99                       ;;
            -mcpu=*)            echo -arch ${flag#*=}           ;;
            -mieee)             echo -ieee                      ;;
            -O*|-fast)          echo $flag                      ;;
            -fno-math-errno)    echo -assume nomath_errno       ;;
            -g)                 echo -g3                        ;;
            -Wall)              echo -msg_enable level2         ;;
            -Wno-pointer-sign)  echo -msg_disable ptrmismatch1  ;;
            -Wl,*)              echo $flag                      ;;
            -f*|-W*)                                            ;;
            *)                  echo $flag                      ;;
        esac
   done
}

Luca Barbato's avatar
Luca Barbato committed
2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625
cparser_flags(){
    for flag; do
        case $flag in
            -Wno-switch)             echo -Wno-switch-enum ;;
            -Wno-format-zero-length) ;;
            -Wdisabled-optimization) ;;
            -Wno-pointer-sign)       echo -Wno-other ;;
            *)                       echo $flag ;;
        esac
    done
}

2626
msvc_common_flags(){
2627 2628
    for flag; do
        case $flag in
2629 2630 2631 2632 2633 2634
            # In addition to specifying certain flags under the compiler
            # specific filters, they must be specified here as well or else the
            # generic catch all at the bottom will print the original flag.
            -Wall)                ;;
            -std=c99)             ;;
            # Common flags
2635
            -fomit-frame-pointer) ;;
2636 2637 2638 2639
            -g)                   echo -Z7 ;;
            -fno-math-errno)      ;;
            -fno-common)          ;;
            -fno-signed-zeros)    ;;
2640
            -fPIC)                ;;
2641 2642
            -mthumb)              ;;
            -march=*)             ;;
2643
            -lz)                  echo zlib.lib ;;
2644 2645
            -lavifil32)           echo vfw32.lib ;;
            -lavicap32)           echo vfw32.lib user32.lib ;;
2646 2647 2648 2649 2650 2651
            -l*)                  echo ${flag#-l}.lib ;;
            *)                    echo $flag ;;
        esac
    done
}

2652 2653 2654 2655
msvc_flags(){
    msvc_common_flags "$@"
    for flag; do
        case $flag in
2656
            -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
2657 2658
                                       -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
                                       -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
2659
                                       -wd4273 ;;
2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675
        esac
    done
}

icl_flags(){
    msvc_common_flags "$@"
    for flag; do
        case $flag in
            # Despite what Intel's documentation says -Wall, which is supported
            # on Windows, does enable remarks so disable them here.
            -Wall)                echo $flag -Qdiag-disable:remark ;;
            -std=c99)             echo -Qstd=c99 ;;
        esac
    done
}

2676 2677 2678
pgi_flags(){
    for flag; do
        case $flag in
2679
            -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703
            -fomit-frame-pointer) echo -Mnoframe ;;
            -g)                   echo -gopt ;;
            *)                    echo $flag ;;
        esac
    done
}

suncc_flags(){
    for flag; do
        case $flag in
            -march=*|-mcpu=*)
                case "${flag#*=}" in
                    native)                   echo -xtarget=native       ;;
                    v9|niagara)               echo -xarch=sparc          ;;
                    ultrasparc)               echo -xarch=sparcvis       ;;
                    ultrasparc3|niagara2)     echo -xarch=sparcvis2      ;;
                    i586|pentium)             echo -xchip=pentium        ;;
                    i686|pentiumpro|pentium2) echo -xtarget=pentium_pro  ;;
                    pentium3*|c3-2)           echo -xtarget=pentium3     ;;
                    pentium-m)          echo -xarch=sse2 -xchip=pentium3 ;;
                    pentium4*)          echo -xtarget=pentium4           ;;
                    prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
                    *-sse3)             echo -xarch=sse3                 ;;
                    core2)              echo -xarch=ssse3 -xchip=core2   ;;
2704 2705
                    corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
                    corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
2706
                    amdfam10|barcelona|bdver*) echo -xarch=sse4_1        ;;
2707
                    athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
2708
                    k8|opteron|athlon64|athlon-fx)
2709 2710
                                               echo -xarch=sse2a         ;;
                    athlon*)                   echo -xarch=pentium_proa  ;;
2711 2712 2713 2714 2715 2716
                esac
                ;;
            -std=c99)             echo -xc99              ;;
            -fomit-frame-pointer) echo -xregs=frameptr    ;;
            -fPIC)                echo -KPIC -xcode=pic32 ;;
            -W*,*)                echo $flag              ;;
2717 2718
            -f*-*|-W*|-mimpure-text)                      ;;
            -shared)              echo -G                 ;;
2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740
            *)                    echo $flag              ;;
        esac
    done
}

tms470_flags(){
    for flag; do
        case $flag in
            -march=*|-mcpu=*)
                case "${flag#*=}" in
                    armv7-a|cortex-a*)      echo -mv=7a8 ;;
                    armv7-r|cortex-r*)      echo -mv=7r4 ;;
                    armv7-m|cortex-m*)      echo -mv=7m3 ;;
                    armv6*|arm11*)          echo -mv=6   ;;
                    armv5*e|arm[79]*e*|arm9[24]6*|arm96*|arm102[26])
                                            echo -mv=5e  ;;
                    armv4*|arm7*|arm9[24]*) echo -mv=4   ;;
                esac
                ;;
            -mfpu=neon)     echo --float_support=vfpv3 --neon ;;
            -mfpu=vfp)      echo --float_support=vfpv2        ;;
            -mfpu=vfpv3)    echo --float_support=vfpv3        ;;
2741
            -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
2742 2743 2744 2745
            -msoft-float)   echo --float_support=vfplib       ;;
            -O[0-3]|-mf=*)  echo $flag                        ;;
            -g)             echo -g -mn                       ;;
            -pds=*)         echo $flag                        ;;
2746 2747 2748
            -D*|-I*)        echo $flag                        ;;
            --gcc|--abi=*)  echo $flag                        ;;
            -me)            echo $flag                        ;;
2749 2750 2751 2752
        esac
    done
}

2753 2754 2755 2756
probe_cc(){
    pfx=$1
    _cc=$2

2757 2758
    unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
    unset _ld_o _ldflags _ld_lib _ld_path
2759
    unset _depflags _DEPCMD _DEPFLAGS
2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780
    _flags_filter=echo

    if $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
        _type=llvm_gcc
        gcc_extra_ver=$(expr "$($_cc --version | head -n1)" : '.*\((.*)\)')
        _ident="llvm-gcc $($_cc -dumpversion) $gcc_extra_ver"
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        _cflags_speed='-O3'
        _cflags_size='-Os'
    elif $_cc -v 2>&1 | grep -qi ^gcc; then
        _type=gcc
        gcc_version=$($_cc --version | head -n1)
        gcc_basever=$($_cc -dumpversion)
        gcc_pkg_ver=$(expr "$gcc_version" : '[^ ]* \(([^)]*)\)')
        gcc_ext_ver=$(expr "$gcc_version" : ".*$gcc_pkg_ver $gcc_basever \\(.*\\)")
        _ident=$(cleanws "gcc $gcc_basever $gcc_pkg_ver $gcc_ext_ver")
        if ! $_cc -dumpversion | grep -q '^2\.'; then
            _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        fi
        _cflags_speed='-O3'
        _cflags_size='-Os'
2781
    elif $_cc --version 2>/dev/null | grep -q ^icc; then
2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798
        _type=icc
        _ident=$($_cc --version | head -n1)
        _depflags='-MMD'
        _cflags_speed='-O3'
        _cflags_size='-Os'
        _cflags_noopt='-O1'
    elif $_cc -v 2>&1 | grep -q xlc; then
        _type=xlc
        _ident=$($_cc -qversion 2>/dev/null | head -n1)
        _cflags_speed='-O5'
        _cflags_size='-O5 -qcompact'
    elif $_cc -V 2>/dev/null | grep -q Compaq; then
        _type=ccc
        _ident=$($_cc -V | head -n1 | cut -d' ' -f1-3)
        _DEPFLAGS='-M'
        _cflags_speed='-fast'
        _cflags_size='-O1'
2799
        _flags_filter=ccc_flags
2800
    elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
2801 2802
        test -d "$sysroot" || die "No valid sysroot specified."
        _type=armcc
2803
        _ident=$($_cc --vsn | head -n1 | sed 's/.*: //')
2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815
        armcc_conf="$PWD/armcc.conf"
        $_cc --arm_linux_configure                 \
             --arm_linux_config_file="$armcc_conf" \
             --configure_sysroot="$sysroot"        \
             --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
             die "Error creating armcc configuration file."
        $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
        _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
        as_default="${cross_prefix}gcc"
        _depflags='-MMD'
        _cflags_speed='-O3'
        _cflags_size='-Os'
2816
    elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
2817 2818 2819
        _type=tms470
        _ident=$($_cc -version | head -n1 | tr -s ' ')
        _flags='--gcc --abi=eabi -me'
2820
        _cc_e='-ppl -fe=$@'
2821 2822 2823 2824 2825 2826 2827 2828
        _cc_o='-fe=$@'
        _depflags='-ppa -ppd=$(@:.o=.d)'
        _cflags_speed='-O3 -mf=5'
        _cflags_size='-O3 -mf=2'
        _flags_filter=tms470_flags
    elif $_cc -v 2>&1 | grep -q clang; then
        _type=clang
        _ident=$($_cc --version | head -n1)
2829
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2830 2831 2832 2833 2834 2835
        _cflags_speed='-O3'
        _cflags_size='-Os'
    elif $_cc -V 2>&1 | grep -q Sun; then
        _type=suncc
        _ident=$($_cc -V 2>&1 | head -n1 | cut -d' ' -f 2-)
        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "1s,^.*: ,$@: ," -e "\$$!s,\$$, \\\," -e "1!s,^.*: , ," > $(@:.o=.d)'
2836
        _DEPFLAGS='-xM1 -xc99'
2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857
        _ldflags='-std=c99'
        _cflags_speed='-O5'
        _cflags_size='-O5 -xspace'
        _flags_filter=suncc_flags
    elif $_cc -v 2>&1 | grep -q 'PathScale\|Path64'; then
        _type=pathscale
        _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        _cflags_speed='-O2'
        _cflags_size='-Os'
        _flags_filter='filter_out -Wdisabled-optimization'
    elif $_cc -v 2>&1 | grep -q Open64; then
        _type=open64
        _ident=$($_cc -v 2>&1 | head -n1 | tr -d :)
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
        _cflags_speed='-O2'
        _cflags_size='-Os'
        _flags_filter='filter_out -Wdisabled-optimization|-Wtype-limits|-fno-signed-zeros'
    elif $_cc -V 2>&1 | grep -q Portland; then
        _type=pgi
        _ident="PGI $($_cc -V 2>&1 | awk '/^pgcc/ { print $2; exit }')"
2858
        opt_common='-alias=ansi -Mdse -Mlre -Mpre'
2859 2860 2861 2862
        _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
        _cflags_size="-O2 -Munroll=c:1 $opt_common"
        _cflags_noopt="-O1"
        _flags_filter=pgi_flags
2863 2864 2865 2866 2867 2868 2869 2870
    elif $_cc 2>&1 | grep -q Microsoft; then
        _type=msvc
        _ident=$($cc 2>&1 | head -n1)
        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
        _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
        _cflags_speed="-O2"
        _cflags_size="-O1"
        if $_cc 2>&1 | grep -q Linker; then
2871
            _ld_o='-out:$@'
2872 2873 2874
        else
            _ld_o='-Fe$@'
        fi
2875 2876
        _cc_o='-Fo$@'
        _cc_e='-P -Fi$@'
2877 2878 2879 2880
        _flags_filter=msvc_flags
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
        _flags='-nologo'
2881
        _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
2882
        if [ $pfx = hostcc ]; then
2883
            append _cflags -Dsnprintf=_snprintf
2884
        fi
2885 2886 2887 2888
    elif $_cc 2>&1 | grep -q Intel; then
        _type=icl
        _ident=$($cc 2>&1 | head -n1)
        _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
2889 2890
        # Not only is O3 broken on 13.x+ but it is slower on all previous
        # versions (tested) as well.
2891 2892 2893
        _cflags_speed="-O2"
        _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
        if $_cc 2>&1 | grep -q Linker; then
2894
            _ld_o='-out:$@'
2895 2896 2897
        else
            _ld_o='-Fe$@'
        fi
2898
        _cc_o='-Fo$@'
2899
        _cc_e='-P'
2900
        _flags_filter=icl_flags
2901 2902
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
2903
        # -Qdiag-error to make icl error when seeing certain unknown arguments
2904
        _flags='-nologo -Qdiag-error:4044,10157'
2905 2906
        # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency
        # with MSVC which enables it by default.
2907
        _cflags='-D_USE_MATH_DEFINES -FIstdlib.h -Dstrtoll=_strtoi64 -Qms0 -Qvec- -Qsimd- -GS'
2908 2909 2910
        if [ $pfx = hostcc ]; then
            append _cflags -Dsnprintf=_snprintf
        fi
Luca Barbato's avatar
Luca Barbato committed
2911 2912 2913 2914 2915 2916 2917
    elif $_cc --version 2>/dev/null | grep -q ^cparser; then
        _type=cparser
        _ident=$($_cc --version | head -n1)
        _depflags='-MMD'
        _cflags_speed='-O4'
        _cflags_size='-O2'
        _flags_filter=cparser_flags
2918
    fi
2919 2920 2921 2922 2923 2924

    eval ${pfx}_type=\$_type
    eval ${pfx}_ident=\$_ident
}

set_ccvars(){
2925
    eval ${1}_C=\${_cc_c-\${${1}_C}}
2926
    eval ${1}_E=\${_cc_e-\${${1}_E}}
2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950
    eval ${1}_O=\${_cc_o-\${${1}_O}}

    if [ -n "$_depflags" ]; then
        eval ${1}_DEPFLAGS=\$_depflags
    else
        eval ${1}DEP=\${_DEPCMD:-\$DEPCMD}
        eval ${1}DEP_FLAGS=\${_DEPFLAGS:-\$DEPFLAGS}
        eval DEP${1}FLAGS=\$_flags
    fi
}

probe_cc cc "$cc"
cflags_filter=$_flags_filter
cflags_speed=$_cflags_speed
cflags_size=$_cflags_size
cflags_noopt=$_cflags_noopt
add_cflags $_flags $_cflags
cc_ldflags=$_ldflags
set_ccvars CC

probe_cc hostcc "$host_cc"
host_cflags_filter=$_flags_filter
add_host_cflags  $_flags $_cflags
set_ccvars HOSTCC
2951

2952 2953
test -n "$cc_type" && enable $cc_type ||
    warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
2954

2955
: ${as_default:=$cc}
2956
: ${dep_cc_default:=$cc}
2957
: ${ld_default:=$cc}
2958 2959
: ${host_ld_default:=$host_cc}
set_default ar as dep_cc ld host_ld
2960

2961 2962 2963 2964 2965 2966 2967 2968 2969
probe_cc as "$as"
asflags_filter=$_flags_filter
add_asflags $_flags $_cflags
set_ccvars AS

probe_cc ld "$ld"
ldflags_filter=$_flags_filter
add_ldflags $_flags $_ldflags
test "$cc_type" != "$ld_type" && add_ldflags $cc_ldflags
2970
LD_O=${_ld_o-$LD_O}
2971 2972
LD_LIB=${_ld_lib-$LD_LIB}
LD_PATH=${_ld_path-$LD_PATH}
2973

2974 2975 2976 2977 2978
probe_cc hostld "$host_ld"
host_ldflags_filter=$_flags_filter
add_host_ldflags $_flags $_ldflags
HOSTLD_O=${_ld_o-$HOSTLD_O}

2979 2980 2981 2982 2983 2984
if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
    probe_cc depcc "$dep_cc"
    CCDEP=${_DEPCMD:-$DEPCMD}
    CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
    DEPCCFLAGS=$_flags
fi
2985

2986 2987 2988 2989 2990 2991
if $ar 2>&1 | grep -q Microsoft; then
    arflags="-nologo"
    ar_o='-out:$@'
elif $ar 2>&1 | grep -q 'Texas Instruments'; then
    arflags="rq"
    ar_o='$@'
2992 2993 2994
elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then
    arflags='-Xany -r -c'
    ar_o='$@'
2995 2996 2997 2998 2999
else
    arflags="rc"
    ar_o='$@'
fi

3000
add_cflags $extra_cflags
3001
add_asflags $extra_cflags
3002

3003 3004
if test -n "$sysroot"; then
    case "$cc_type" in
3005
        gcc|llvm_gcc|clang)
3006
            add_cppflags --sysroot="$sysroot"
3007 3008
            add_ldflags --sysroot="$sysroot"
        ;;
3009 3010 3011 3012
        tms470)
            add_cppflags -I"$sysinclude"
            add_ldflags  --sysroot="$sysroot"
        ;;
3013 3014 3015
    esac
fi

3016
if test "$cpu" = host; then
3017 3018
    enabled cross_compile &&
        die "--cpu=host makes no sense when cross-compiling."
3019 3020

    case "$cc_type" in
3021
        gcc|llvm_gcc)
3022 3023
            check_native(){
                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
3024
                sed -n "/cc1.*$1=/{
3025 3026 3027 3028
                            s/.*$1=\\([^ ]*\\).*/\\1/
                            p
                            q
                        }" $TMPE
3029 3030 3031 3032 3033
            }
            cpu=$(check_native -march || check_native -mcpu)
        ;;
    esac

3034 3035
    test "${cpu:-host}" = host &&
        die "--cpu=host not supported with compiler $cc"
3036 3037
fi

3038 3039
# Deal with common $arch aliases
case "$arch" in
3040 3041 3042
    aarch64|arm64)
        arch="aarch64"
    ;;
3043 3044 3045
    arm*)
        arch="arm"
    ;;
3046
    mips*|IP*)
3047 3048
        arch="mips"
    ;;
3049
    parisc*|hppa*)
3050 3051
        arch="parisc"
    ;;
3052
    "Power Macintosh"|ppc*|powerpc*)
3053 3054 3055 3056 3057 3058 3059 3060
        arch="ppc"
    ;;
    s390|s390x)
        arch="s390"
    ;;
    sh4|sh)
        arch="sh4"
    ;;
3061
    sun4u|sparc*)
3062 3063
        arch="sparc"
    ;;
3064 3065 3066
    tilegx|tile-gx)
        arch="tilegx"
    ;;
3067
    i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
3068 3069 3070 3071
        arch="x86"
    ;;
esac

3072
is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
3073
enable $arch
3074

3075
# Add processor-specific flags
3076
if enabled aarch64; then
3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092

    case $cpu in
        armv*)
            cpuflags="-march=$cpu"
        ;;
        *)
            cpuflags="-mcpu=$cpu"
        ;;
    esac

elif enabled alpha; then

    cpuflags="-mcpu=$cpu"

elif enabled arm; then

3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123
    check_arm_arch() {
        check_cpp_condition stddef.h \
            "defined __ARM_ARCH_${1}__ || defined __TARGET_ARCH_${2:-$1}" \
            $cpuflags
    }

    probe_arm_arch() {
        if   check_arm_arch 4;        then echo armv4;
        elif check_arm_arch 4T;       then echo armv4t;
        elif check_arm_arch 5;        then echo armv5;
        elif check_arm_arch 5E;       then echo armv5e;
        elif check_arm_arch 5T;       then echo armv5t;
        elif check_arm_arch 5TE;      then echo armv5te;
        elif check_arm_arch 5TEJ;     then echo armv5te;
        elif check_arm_arch 6;        then echo armv6;
        elif check_arm_arch 6J;       then echo armv6j;
        elif check_arm_arch 6K;       then echo armv6k;
        elif check_arm_arch 6Z;       then echo armv6z;
        elif check_arm_arch 6ZK;      then echo armv6zk;
        elif check_arm_arch 6T2;      then echo armv6t2;
        elif check_arm_arch 7;        then echo armv7;
        elif check_arm_arch 7A  7_A;  then echo armv7-a;
        elif check_arm_arch 7R  7_R;  then echo armv7-r;
        elif check_arm_arch 7M  7_M;  then echo armv7-m;
        elif check_arm_arch 7EM 7E_M; then echo armv7-m;
        elif check_arm_arch 8A  8_A;  then echo armv8-a;
        fi
    }

    [ "$cpu" = generic ] && cpu=$(probe_arm_arch)

3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137
    case $cpu in
        armv*)
            cpuflags="-march=$cpu"
            subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
        ;;
        *)
            cpuflags="-mcpu=$cpu"
            case $cpu in
                cortex-a*)                               subarch=armv7a  ;;
                cortex-r*)                               subarch=armv7r  ;;
                cortex-m*)                 enable thumb; subarch=armv7m  ;;
                arm11*)                                  subarch=armv6   ;;
                arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
                armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
3138
                *)                             subarch=$(probe_arm_arch) ;;
3139 3140 3141 3142
            esac
        ;;
    esac

3143 3144 3145 3146 3147
    case "$subarch" in
        armv5t*)    enable fast_clz                ;;
        armv[6-8]*) enable fast_clz fast_unaligned ;;
    esac

3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176
elif enabled avr32; then

    case $cpu in
        ap7[02]0[0-2])
            subarch="avr32_ap"
            cpuflags="-mpart=$cpu"
        ;;
        ap)
            subarch="avr32_ap"
            cpuflags="-march=$cpu"
        ;;
        uc3[ab]*)
            subarch="avr32_uc"
            cpuflags="-mcpu=$cpu"
        ;;
        uc)
            subarch="avr32_uc"
            cpuflags="-march=$cpu"
        ;;
    esac

elif enabled bfin; then

    cpuflags="-mcpu=$cpu"

elif enabled mips; then

    cpuflags="-march=$cpu"

3177
elif enabled ppc; then
3178

3179 3180
    disable ldbrx

3181 3182
    case $(tolower $cpu) in
        601|ppc601|powerpc601)
Måns Rullgård's avatar
Måns Rullgård committed
3183
            cpuflags="-mcpu=601"
3184
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3185
        ;;
3186
        603*|ppc603*|powerpc603*)
Måns Rullgård's avatar
Måns Rullgård committed
3187
            cpuflags="-mcpu=603"
3188
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3189
        ;;
3190
        604*|ppc604*|powerpc604*)
Måns Rullgård's avatar
Måns Rullgård committed
3191
            cpuflags="-mcpu=604"
3192
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3193
        ;;
3194
        g3|75*|ppc75*|powerpc75*)
3195
            cpuflags="-mcpu=750"
3196
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3197
        ;;
3198
        g4|745*|ppc745*|powerpc745*)
3199
            cpuflags="-mcpu=7450"
Måns Rullgård's avatar
Måns Rullgård committed
3200
        ;;
3201
        74*|ppc74*|powerpc74*)
3202
            cpuflags="-mcpu=7400"
Måns Rullgård's avatar
Måns Rullgård committed
3203
        ;;
3204
        g5|970|ppc970|powerpc970)
3205
            cpuflags="-mcpu=970"
Måns Rullgård's avatar
Måns Rullgård committed
3206
        ;;
3207
        power[3-7]*)
3208
            cpuflags="-mcpu=$cpu"
3209
        ;;
3210
        cell)
Måns Rullgård's avatar
Måns Rullgård committed
3211 3212 3213
            cpuflags="-mcpu=cell"
            enable ldbrx
        ;;
3214 3215 3216 3217
        e500mc)
            cpuflags="-mcpu=e500mc"
            disable altivec
        ;;
3218 3219 3220
        e500v2)
            cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
            disable altivec
3221
            disable dcbzl
3222 3223 3224 3225
        ;;
        e500)
            cpuflags="-mcpu=8540 -mhard-float"
            disable altivec
3226
            disable dcbzl
3227
        ;;
Måns Rullgård's avatar
Måns Rullgård committed
3228
    esac
3229

3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240
elif enabled sparc; then

    case $cpu in
        cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
            cpuflags="-mcpu=$cpu"
        ;;
        ultrasparc*|niagara[234])
            cpuflags="-mcpu=$cpu"
        ;;
    esac

3241 3242
elif enabled x86; then

Måns Rullgård's avatar
Måns Rullgård committed
3243 3244 3245 3246 3247
    case $cpu in
        i[345]86|pentium)
            cpuflags="-march=$cpu"
            disable mmx
        ;;
3248
        # targets that do NOT support nopl and conditional mov (cmov)
Måns Rullgård's avatar
Måns Rullgård committed
3249 3250
        pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
            cpuflags="-march=$cpu"
3251
            disable i686
Måns Rullgård's avatar
Måns Rullgård committed
3252
        ;;
3253
        # targets that do support nopl and conditional mov (cmov)
3254
        i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx|core2|corei7*|amdfam10|barcelona|atom|bdver*)
Måns Rullgård's avatar
Måns Rullgård committed
3255
            cpuflags="-march=$cpu"
3256
            enable i686
Måns Rullgård's avatar
Måns Rullgård committed
3257 3258 3259 3260 3261
            enable fast_cmov
        ;;
        # targets that do support conditional mov but on which it's slow
        pentium4|pentium4m|prescott|nocona)
            cpuflags="-march=$cpu"
3262
            enable i686
Måns Rullgård's avatar
Måns Rullgård committed
3263 3264 3265
            disable fast_cmov
        ;;
    esac
3266 3267 3268

fi

3269 3270 3271 3272
if [ "$cpu" != generic ]; then
    add_cflags  $cpuflags
    add_asflags $cpuflags
fi
3273

3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286
# compiler sanity check
check_exec <<EOF
int main(void){ return 0; }
EOF
if test "$?" != 0; then
    echo "$cc is unable to create an executable file."
    if test -z "$cross_prefix" && ! enabled cross_compile ; then
        echo "If $cc is a cross-compiler, use the --enable-cross-compile option."
        echo "Only do this if you know what cross compiling means."
    fi
    die "C compiler test failed."
fi

3287
add_cppflags -D_ISOC99_SOURCE
3288
check_cflags -std=c99
3289
check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
3290 3291
#include <stdlib.h>
EOF
3292
check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
3293 3294
#include <stdlib.h>
EOF
3295

3296
add_host_cppflags -D_ISOC99_SOURCE
3297
check_host_cflags -std=c99
3298
check_host_cflags -Wall
3299
check_host_cflags -O3
3300

3301 3302 3303 3304 3305 3306 3307 3308
check_64bit(){
    arch32=$1
    arch64=$2
    expr=$3
    check_code cc "" "int test[2*($expr) - 1]" &&
        subarch=$arch64 || subarch=$arch32
}

3309
case "$arch" in
3310
    aarch64|alpha|ia64)
3311 3312 3313 3314
        spic=$shared
    ;;
    mips)
        check_64bit mips mips64 '_MIPS_SIM > 1'
3315
        spic=$shared
3316
    ;;
3317 3318 3319 3320
    parisc)
        check_64bit parisc parisc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
3321 3322
    ppc)
        check_64bit ppc ppc64 'sizeof(void *) > 4'
3323
        spic=$shared
3324
    ;;
3325 3326 3327 3328
    s390)
        check_64bit s390 s390x 'sizeof(void *) > 4'
        spic=$shared
    ;;
3329 3330 3331 3332
    sparc)
        check_64bit sparc sparc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
3333
    x86)
3334
        check_64bit x86_32 x86_64 'sizeof(void *) > 4'
3335
        if test "$subarch" = "x86_64"; then
3336
            spic=$shared
3337
        fi
3338 3339 3340
    ;;
esac

3341
enable $subarch
3342
enabled spic && enable_weak pic
3343

3344
# OS specific
3345
case $target_os in
3346
    aix)
3347
        SHFLAGS=-shared
3348
        add_cppflags '-I\$(SRC_PATH)/compat/aix'
3349
        enabled shared && add_ldflags -Wl,-brtl
3350
        ;;
3351 3352 3353 3354 3355 3356 3357
    android)
        disable symver
        SLIB_INSTALL_NAME='$(SLIBNAME)'
        SLIB_INSTALL_LINKS=
        # soname not set on purpose
        SHFLAGS=-shared
        ;;
3358
    haiku)
3359
        prefix_default="/boot/common"
3360
        network_extralibs="-lnetwork"
François Revol's avatar
François Revol committed
3361
        host_libs=
3362
        ;;
3363
    sunos)
3364
        SHFLAGS='-shared -Wl,-h,$$(@F)'
3365
        enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
3366
        network_extralibs="-lsocket -lnsl"
3367 3368 3369 3370 3371
        # When using suncc to build, the Solaris linker will mark
        # an executable with each instruction set encountered by
        # the Solaris assembler.  As our libraries contain their own
        # guards for processor-specific code, instead suppress
        # generation of the HWCAPS ELF section on Solaris x86 only.
3372 3373 3374
        enabled_all suncc x86 &&
            echo "hwcap_1 = OVERRIDE;" > mapfile &&
            add_ldflags -Wl,-M,mapfile
3375
        nm_default='nm -P -g'
3376 3377
        ;;
    netbsd)
3378
        disable symver
3379 3380
        oss_indev_extralibs="-lossaudio"
        oss_outdev_extralibs="-lossaudio"
3381
        ;;
3382
    openbsd|bitrig)
3383
        disable symver
3384
        SHFLAGS='-shared'
3385
        SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
3386
        SLIB_INSTALL_LINKS=
3387 3388
        oss_indev_extralibs="-lossaudio"
        oss_outdev_extralibs="-lossaudio"
3389
        ;;
3390 3391 3392 3393
    dragonfly)
        disable symver
        ;;
    freebsd)
3394 3395
        ;;
    bsd/os)
3396
        add_extralibs -lpoll -lgnugetopt
3397 3398
        ;;
    darwin)
3399
        gas="gas-preprocessor.pl $cc"
3400
        enabled ppc && add_asflags -force_cpusubtype_ALL
3401
        SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
3402
        enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
3403
        add_ldflags -Wl,-dynamic,-search_paths_first
3404 3405 3406
        SLIBSUF=".dylib"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
Loren Merritt's avatar
Loren Merritt committed
3407
        objformat="macho"
3408
        enabled x86_64 && objformat="macho64"
3409
        enabled_any pic shared ||
3410
            { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
3411 3412
        ;;
    mingw32*)
3413
        if test $target_os = "mingw32ce"; then
3414 3415 3416 3417
            disable network
        else
            target_os=mingw32
        fi
3418
        LIBTARGET=i386
3419
        if enabled x86_64; then
3420
            LIBTARGET="i386:x86-64"
3421
        elif enabled arm; then
3422
            LIBTARGET=arm-wince
3423
        fi
3424 3425
        check_ldflags -Wl,--nxcompat
        check_ldflags -Wl,--dynamicbase
3426
        shlibdir_default="$bindir_default"
3427 3428 3429 3430
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3431
        SLIB_EXTRA_CMD=-'sed -e "s/ @[^ ]*//" $$(@:$(SLIBSUF)=.orig.def) > $$(@:$(SLIBSUF)=.def); $(DLLTOOL) -m $(LIBTARGET) -d $$(@:$(SLIBSUF)=.def) -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D $(SLIBNAME_WITH_MAJOR)'
3432 3433 3434 3435
        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
        SLIB_INSTALL_LINKS=
        SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
        SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
3436
        SHFLAGS='-shared -Wl,--output-def,$$(@:$(SLIBSUF)=.orig.def) -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-image-base'
Loren Merritt's avatar
Loren Merritt committed
3437
        objformat="win32"
3438
        dlltool="${cross_prefix}dlltool"
3439
        ranlib=:
3440
        enable dos_paths
3441
        ;;
3442
    win32|win64)
3443
        disable symver
3444 3445 3446 3447
        if enabled shared; then
            # Link to the import library instead of the normal static library
            # for shared libs.
            LD_LIB='%.lib'
3448
            # Cannot build both shared and static libs with MSVC or icl.
3449 3450 3451 3452 3453 3454 3455
            disable static
        fi
        shlibdir_default="$bindir_default"
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3456
        SLIB_CREATE_DEF_CMD='$(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
3457 3458 3459 3460 3461
        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
        SLIB_INSTALL_LINKS=
        SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
        SLIB_INSTALL_EXTRA_LIB='$(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
        SHFLAGS='-dll -def:$$(@:$(SLIBSUF)=.def) -implib:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
3462 3463 3464 3465
        objformat="win32"
        ranlib=:
        enable dos_paths
        ;;
3466
    cygwin*)
3467
        target_os=cygwin
3468
        shlibdir_default="$bindir_default"
3469 3470 3471 3472
        SLIBPREF="cyg"
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3473 3474 3475 3476
        SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
        SLIB_INSTALL_LINKS=
        SLIB_INSTALL_EXTRA_LIB='lib$(FULLNAME).dll.a'
        SHFLAGS='-shared -Wl,--out-implib,$(SUBDIR)lib$(FULLNAME).dll.a'
Loren Merritt's avatar
Loren Merritt committed
3477
        objformat="win32"
3478
        enable dos_paths
3479
        ;;
3480 3481
    *-dos|freedos|opendos)
        network_extralibs="-lsocket"
3482
        objformat="coff"
3483
        enable dos_paths
3484
        add_cppflags -U__STRICT_ANSI__
3485
        ;;
3486 3487 3488 3489
    linux)
        enable dv1394
        ;;
    irix*)
3490
        target_os=irix
3491 3492
        ranlib="echo ignoring ranlib"
        ;;
3493 3494
    os/2*)
        ln_s="cp -f"
3495
        objformat="aout"
3496
        add_cppflags -D_GNU_SOURCE
3497
        add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
3498
        SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
3499
        LIBSUF="_s.a"
3500 3501 3502 3503
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
3504
        SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
3505 3506 3507 3508 3509
            echo PROTMODE >> $(SUBDIR)$(NAME).def; \
            echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
            echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
            echo EXPORTS >> $(SUBDIR)$(NAME).def; \
            emxexp -o $(OBJS) >> $(SUBDIR)$(NAME).def'
3510
        SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
3511
            emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
3512
        SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
3513
        enable dos_paths
3514
        ;;
3515
    gnu/kfreebsd)
3516
        add_cppflags -D_BSD_SOURCE
3517
        ;;
3518 3519
    gnu)
        ;;
3520 3521 3522 3523
    qnx)
        add_cppflags -D_QNX_SOURCE
        network_extralibs="-lsocket"
        ;;
3524 3525 3526
    symbian)
        SLIBSUF=".dll"
        enable dos_paths
3527 3528 3529 3530 3531 3532 3533 3534
        add_cflags --include=$sysinclude/gcce/gcce.h -fvisibility=default
        add_cppflags -D__GCCE__ -D__SYMBIAN32__ -DSYMBIAN_OE_POSIX_SIGNALS
        add_ldflags -Wl,--target1-abs,--no-undefined \
                    -Wl,-Ttext,0x80000,-Tdata,0x1000000 -shared \
                    -Wl,--entry=_E32Startup -Wl,-u,_E32Startup
        add_extralibs -l:eexe.lib -l:usrt2_2.lib -l:dfpaeabi.dso \
                      -l:drtaeabi.dso -l:scppnwdl.dso -lsupc++ -lgcc \
                      -l:libc.dso -l:libm.dso -l:euser.dso -l:libcrt0.lib
3535
        ;;
3536 3537 3538
    osf1)
        add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
        ;;
3539 3540
    minix)
        ;;
Mans Rullgard's avatar
Mans Rullgard committed
3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551
    plan9)
        add_cppflags -D_C99_SNPRINTF_EXTENSION  \
                     -D_REENTRANT_SOURCE        \
                     -D_RESEARCH_SOURCE         \
                     -DFD_SETSIZE=96            \
                     -DHAVE_SOCK_OPTS
        add_compat strtod.o strtod=avpriv_strtod
        network_extralibs='-lbsd'
        exeobjs=compat/plan9/main.o
        cp_f='cp'
        ;;
3552 3553
    none)
        ;;
3554
    *)
3555
        die "Unknown OS '$target_os'."
3556 3557 3558
        ;;
esac

3559 3560
# determine libc flavour

3561 3562
probe_libc(){
    pfx=$1
3563
    pfx_no_=${pfx%_}
3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577
    # uclibc defines __GLIBC__, so it needs to be checked before glibc.
    if check_${pfx}cpp_condition features.h "defined __UCLIBC__"; then
        eval ${pfx}libc_type=uclibc
        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
    elif check_${pfx}cpp_condition features.h "defined __GLIBC__"; then
        eval ${pfx}libc_type=glibc
        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
    # MinGW headers can be installed on Cygwin, so check for newlib first.
    elif check_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
        eval ${pfx}libc_type=newlib
        add_${pfx}cppflags -U__STRICT_ANSI__
    # MinGW64 is backwards compatible with MinGW32, so check for it first.
    elif check_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then
        eval ${pfx}libc_type=mingw64
3578
        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3579 3580
        eval test \$${pfx_no_}cc_type = "gcc" &&
            add_${pfx}cppflags -D__printf__=__gnu_printf__
3581 3582
    elif check_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
         check_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
3583 3584 3585 3586
        eval ${pfx}libc_type=mingw32
        check_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \
            (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
            die "ERROR: MinGW32 runtime version must be >= 3.15."
3587
        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3588 3589
        eval test \$${pfx_no_}cc_type = "gcc" &&
            add_${pfx}cppflags -D__printf__=__gnu_printf__
3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603
    elif check_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
        eval ${pfx}libc_type=msvcrt
        # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to
        # 0x601 by default unless something else is set by the user.
        # This can easily lead to us detecting functions only present
        # in such new versions and producing binaries requiring windows 7.0.
        # Therefore explicitly set the default to XP unless the user has
        # set something else on the command line.
        check_${pfx}cpp_condition stdlib.h "defined(_WIN32_WINNT)" ||
            add_${pfx}cppflags -D_WIN32_WINNT=0x0502
    elif check_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then
        eval ${pfx}libc_type=klibc
    elif check_${pfx}cpp_condition sys/cdefs.h "defined __BIONIC__"; then
        eval ${pfx}libc_type=bionic
3604
    elif check_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
3605 3606 3607 3608
        eval ${pfx}libc_type=solaris
        add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
    fi
}
3609

3610
probe_libc
3611
test -n "$libc_type" && enable libc_$libc_type
3612 3613
probe_libc host_
test -n "$host_libc_type" && enable host_libc_$host_libc_type
3614

3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626
case $libc_type in
    bionic)
        add_compat strtod.o strtod=avpriv_strtod
        ;;
    msvcrt)
        add_compat strtod.o strtod=avpriv_strtod
        add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
                                     _snprintf=avpriv_snprintf  \
                                     vsnprintf=avpriv_vsnprintf
        ;;
esac

3627 3628
# hacks for compiler/libc/os combinations

3629
if enabled_all tms470 libc_glibc; then
3630
    CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
3631 3632 3633 3634 3635 3636
    add_cppflags -D__USER_LABEL_PREFIX__=
    add_cppflags -D__builtin_memset=memset
    add_cppflags -D__gnuc_va_list=va_list -D_VA_LIST_DEFINED
    add_cflags   -pds=48    # incompatible redefinition of macro
fi

3637
if enabled_all ccc libc_glibc; then
3638 3639 3640
    add_ldflags -Wl,-z,now  # calls to libots crash without this
fi

3641 3642 3643
check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
    add_cppflags '-I\$(SRC_PATH)/compat/float'

3644 3645 3646 3647 3648
esc(){
    echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
}

echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $LIBAV_CONFIGURATION)" >config.fate
3649

3650
check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
3651

3652
set_default $PATHS_LIST
3653
set_default nm
3654

3655
# we need to build at least one lib type
3656
if ! enabled_any static shared; then
3657 3658 3659 3660 3661 3662 3663 3664 3665
    cat <<EOF
At least one library type must be built.
Specify --enable-static to build the static libraries or --enable-shared to
build the shared libraries as well. To only build the shared libraries specify
--disable-static in addition to --enable-shared.
EOF
    exit 1;
fi

3666
die_license_disabled() {
3667
    enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
3668 3669
}

3670
die_license_disabled gpl libcdio
3671
die_license_disabled gpl libx264
Derek Buitenhuis's avatar
Derek Buitenhuis committed
3672
die_license_disabled gpl libx265
3673
die_license_disabled gpl libxavs
3674 3675 3676
die_license_disabled gpl libxvid
die_license_disabled gpl x11grab

3677
die_license_disabled nonfree libfaac
3678
die_license_disabled nonfree libfdk_aac
3679
die_license_disabled nonfree openssl
3680

3681 3682
die_license_disabled version3 libopencore_amrnb
die_license_disabled version3 libopencore_amrwb
3683
die_license_disabled version3 libvo_aacenc
3684
die_license_disabled version3 libvo_amrwbenc
3685

3686
enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
3687

3688
disabled optimizations || check_cflags -fomit-frame-pointer
3689

3690 3691
enable_weak_pic() {
    disabled pic && return
3692
    enable pic
3693
    add_cppflags -DPIC
3694 3695 3696 3697 3698 3699 3700
    case "$target_os" in
    mingw*|cygwin*)
        ;;
    *)
        add_cflags -fPIC
        ;;
    esac
3701
    add_asflags  -fPIC
3702 3703
}

3704
enabled pic && enable_weak_pic
3705

3706 3707 3708
check_cc <<EOF || die "Symbol mangling check failed."
int ff_extern;
EOF
3709
sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
3710 3711
extern_prefix=${sym%%ff_extern*}

3712
check_cc <<EOF && enable_weak inline_asm
3713 3714
void foo(void) { __asm__ volatile ("" ::); }
EOF
3715

3716 3717 3718 3719 3720 3721 3722
_restrict=
for restrict_keyword in restrict __restrict__ __restrict; do
    check_cc <<EOF && _restrict=$restrict_keyword && break
void foo(char * $restrict_keyword p);
EOF
done

3723
check_cc <<EOF && enable pragma_deprecated
3724
void foo(void) { _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") }
3725 3726
EOF

3727 3728 3729 3730
check_cc <<EOF && enable attribute_packed
struct { int x; } __attribute__((packed)) x;
EOF

3731 3732 3733 3734
check_cc <<EOF && enable attribute_may_alias
union { int x; } __attribute__((may_alias)) x;
EOF

3735 3736 3737
check_cc <<EOF || die "endian test failed"
unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
EOF
3738
od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
3739

3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750

if enabled asm; then
    enabled     arm         && nogas=die
    enabled_all ppc altivec && nogas=warn
    as=${gas:=$as}
    check_as <<EOF && enable gnu_as || \
        $nogas "GNU assembler not found, install gas-preprocessor"
.macro m n
\n: .int 0
.endm
m x
3751 3752 3753 3754
EOF

    check_as <<EOF || $nogas "GNU assembler not found, install gas-preprocessor"
.altmacro
3755 3756 3757 3758 3759
EOF

    check_as <<EOF && enable as_func
.func test
.endfunc
3760 3761 3762
EOF
fi

3763 3764
check_inline_asm inline_asm_labels '"1:\n"'

3765
if enabled aarch64; then
3766
    enabled armv8 && check_insn armv8 'prfm   pldl1strm, [x0]'
3767 3768 3769 3770 3771 3772 3773
    # internal assembler in clang 3.3 does not support this instruction
    enabled neon && check_insn neon 'ext   v0.8B, v0.8B, v1.8B, #1'
    enabled vfp  && check_insn vfp  'fmadd d0,    d0,    d1,    d2'

    map 'enabled_any ${v}_external ${v}_inline || disable $v' $ARCH_EXT_LIST_ARM

elif enabled alpha; then
3774 3775 3776 3777

    check_cflags -mieee

elif enabled arm; then
3778

3779
    check_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb
3780
    enabled thumb && check_cflags -mthumb || check_cflags -marm
3781

3782 3783 3784 3785 3786 3787
    if     check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then
        enable vfp_args
    elif ! check_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__"; then
        case "${cross_prefix:-$cc}" in
            *hardfloat*)         enable vfp_args;   fpabi=vfp ;;
            *) check_ld <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
3788 3789 3790
__asm__ (".eabi_attribute 28, 1");
int main(void) { return 0; }
EOF
3791 3792 3793
        esac
        warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
    fi
3794

3795 3796 3797 3798
    enabled armv5te && check_insn armv5te 'qadd r0, r0, r0'
    enabled armv6   && check_insn armv6   'sadd16 r0, r0, r0'
    enabled armv6t2 && check_insn armv6t2 'movt r0, #0'
    enabled neon    && check_insn neon    'vadd.i16 q0, q0, q0'
3799
    enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
3800 3801
    enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'

3802 3803 3804
    [ $target_os = linux ] ||
        map 'enabled_any ${v}_external ${v}_inline || disable $v' \
            $ARCH_EXT_LIST_ARM
3805

3806
    check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
3807

3808 3809 3810 3811 3812
    check_as <<EOF && enable as_dn_directive
ra .dn d0.i16
.unreq ra
EOF

3813
    [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
3814

3815
elif enabled mips; then
3816

3817
    check_inline_asm loongson '"dmult.g $1, $2, $3"'
3818

3819 3820 3821 3822 3823 3824 3825 3826
elif enabled parisc; then

    if enabled gcc; then
        case $($cc -dumpversion) in
            4.[3-8].*) check_cflags -fno-optimize-sibling-calls ;;
        esac
    fi

3827
elif enabled ppc; then
3828

3829 3830
    enable local_aligned_8 local_aligned_16

3831 3832 3833 3834
    check_inline_asm dcbzl     '"dcbzl 0, %0" :: "r"(0)'
    check_inline_asm ibm_asm   '"add 0, 0, 0"'
    check_inline_asm ppc4xx    '"maclhw r10, r11, r12"'
    check_inline_asm xform_asm '"lwzx %1, %y0" :: "Z"(*(int*)0), "r"(0)'
3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845

    # AltiVec flags: The FSF version of GCC differs from the Apple version
    if enabled altivec; then
        check_cflags -maltivec -mabi=altivec &&
        { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } ||
        check_cflags -faltivec

        # check if our compiler supports Motorola AltiVec C API
        check_cc <<EOF || disable altivec
$inc_altivec_h
int main(void) {
3846 3847 3848
    vector signed int v1 = (vector signed int) { 0 };
    vector signed int v2 = (vector signed int) { 1 };
    v1 = vec_add(v1, v2);
3849 3850 3851 3852
    return 0;
}
EOF

3853
        enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
3854
    fi
3855

3856
elif enabled x86; then
3857

3858 3859
    check_builtin rdtsc    intrin.h   "__rdtsc()"
    check_builtin mm_empty mmintrin.h "_mm_empty()"
3860

3861 3862
    enable local_aligned_8 local_aligned_16

3863 3864 3865 3866
    # check whether EBP is available on x86
    # As 'i' is stored on the stack, this program will crash
    # if the base pointer is used to access it because the
    # base pointer is cleared in the inline assembly code.
3867
    check_exec_crash <<EOF && enable ebp_available
3868 3869 3870
volatile int i=0;
__asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
return i;
3871 3872
EOF

Reimar Döffinger's avatar
Reimar Döffinger committed
3873
    # check whether EBX is available on x86
3874 3875
    check_inline_asm ebx_available '""::"b"(0)' &&
        check_inline_asm ebx_available '"":::"%ebx"'
3876

3877
    # check whether xmm clobbers are supported
3878
    check_inline_asm xmm_clobbers '"":::"%xmm0"'
3879

3880
    # check whether binutils is new enough to compile SSSE3/MMXEXT
3881 3882
    enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
    enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
3883

3884
    if ! disabled_any asm mmx yasm; then
3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900
        if check_cmd $yasmexe --version; then
            enabled x86_64 && yasm_extra="-m amd64"
            yasm_debug="-g dwarf2"
        elif check_cmd nasm -v; then
            yasmexe=nasm
            yasm_debug="-g -F dwarf"
            enabled x86_64 && test "$objformat" = elf && objformat=elf64
        fi

        YASMFLAGS="-f $objformat $yasm_extra"
        enabled pic               && append YASMFLAGS "-DPIC"
        test -n "$extern_prefix"  && append YASMFLAGS "-DPREFIX"
        case "$objformat" in
            elf*) enabled debug && append YASMFLAGS $yasm_debug ;;
        esac

3901 3902
        check_yasm "movbe ecx, [5]" && enable yasm ||
            die "yasm/nasm not found or too old. Use --disable-yasm for a crippled build."
3903
        check_yasm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
3904
        check_yasm "vfmadd132ps ymm0, ymm1, ymm2"    || disable fma3_external
3905
        check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
3906
        check_yasm "CPU amdnop" || disable cpunop
3907
    fi
3908

3909 3910 3911 3912 3913 3914
    case "$cpu" in
        athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
            disable fast_clz
        ;;
    esac

3915 3916
fi

3917 3918
check_ldflags -Wl,--as-needed

3919 3920 3921 3922
if check_func dlopen; then
    ldl=
elif check_func dlopen -ldl; then
    ldl=-ldl
3923 3924
fi

3925
if ! disabled network; then
3926 3927 3928 3929
    check_func getaddrinfo $network_extralibs
    check_func getservbyport $network_extralibs
    check_func inet_aton $network_extralibs

3930
    check_type netdb.h "struct addrinfo"
3931 3932
    check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
    check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
3933
    check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
3934
    check_type poll.h "struct pollfd"
3935
    check_type netinet/sctp.h "struct sctp_event_subscribe"
3936 3937 3938 3939 3940
    check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
    check_type netinet/in.h "struct sockaddr_in6"
    check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
    check_type "sys/types.h sys/socket.h" socklen_t

3941 3942 3943 3944
    # Prefer arpa/inet.h over winsock2
    if check_header arpa/inet.h ; then
        check_func closesocket
    elif check_header winsock2.h ; then
3945 3946 3947
        check_func_headers winsock2.h closesocket -lws2 &&
            network_extralibs="-lws2" ||
        { check_func_headers winsock2.h closesocket -lws2_32 &&
3948
            network_extralibs="-lws2_32"; } || disable winsock2_h network
3949
        check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
3950

3951 3952
        check_type ws2tcpip.h socklen_t
        check_type ws2tcpip.h "struct addrinfo"
3953 3954
        check_type ws2tcpip.h "struct group_source_req"
        check_type ws2tcpip.h "struct ip_mreq_source"
3955
        check_type ws2tcpip.h "struct ipv6_mreq"
3956
        check_type winsock2.h "struct pollfd"
3957
        check_struct winsock2.h "struct sockaddr" sa_len
3958 3959 3960 3961 3962 3963 3964
        check_type ws2tcpip.h "struct sockaddr_in6"
        check_type ws2tcpip.h "struct sockaddr_storage"
    else
        disable network
    fi
fi

3965 3966 3967 3968 3969 3970 3971 3972
check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
check_builtin MemoryBarrier windows.h "MemoryBarrier()"
check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"

check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
check_func  ${malloc_prefix}memalign            && enable memalign
check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
3973

Måns Rullgård's avatar
Måns Rullgård committed
3974
check_func  fcntl
3975 3976
check_func  fork
check_func  gethrtime
3977
check_func  getopt
3978
check_func  getrusage
3979
check_func  gettimeofday
3980
check_func  isatty
3981
check_func  localtime_r
3982
check_func  mach_absolute_time
3983
check_func  mkstemp
3984
check_func  mmap
3985
check_func  mprotect
3986 3987 3988
# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
check_func  nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }
check_func  sched_getaffinity
Måns Rullgård's avatar
Måns Rullgård committed
3989
check_func  setrlimit
3990
check_func  strerror_r
3991
check_func  strptime
3992
check_func  sysconf
3993
check_func  sysctl
3994
check_func  usleep
3995

3996
check_func_headers io.h setmode
3997 3998
check_func_headers stdlib.h getenv

3999
check_func_headers windows.h CoTaskMemFree -lole32
4000
check_func_headers windows.h GetProcessAffinityMask
4001
check_func_headers windows.h GetProcessTimes
4002
check_func_headers windows.h GetSystemTimeAsFileTime
4003
check_func_headers windows.h MapViewOfFile
4004
check_func_headers windows.h SetConsoleTextAttribute
4005
check_func_headers windows.h Sleep
4006
check_func_headers windows.h VirtualAlloc
4007

4008
check_header direct.h
4009
check_header dlfcn.h
4010
check_header dxva.h
4011
check_header dxva2api.h
4012
check_header io.h
4013
check_header mach/mach_time.h
4014
check_header malloc.h
4015
check_header poll.h
4016
check_header sys/mman.h
4017
check_header sys/param.h
4018
check_header sys/resource.h
4019
check_header sys/select.h
4020
check_header sys/time.h
4021
check_header sys/un.h
4022
check_header unistd.h
4023 4024
check_header vdpau/vdpau.h
check_header vdpau/vdpau_x11.h
4025
check_header VideoDecodeAcceleration/VDADecoder.h
4026
check_header windows.h
4027
check_header X11/extensions/XvMClib.h
4028

4029 4030 4031 4032 4033 4034
check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi

check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss

4035
if ! disabled w32threads && ! enabled pthreads; then
4036 4037
    check_func_headers "windows.h process.h" _beginthreadex &&
        enable w32threads || disable w32threads
4038 4039
fi

4040 4041
# check for some common methods of building with pthread support
# do this before the optional library checks as some of them require pthreads
4042 4043
if ! disabled pthreads && ! enabled w32threads; then
    enable pthreads
4044
    if check_func pthread_join -pthread; then
Måns Rullgård's avatar
Måns Rullgård committed
4045
        add_cflags -pthread
4046
        add_extralibs -pthread
4047
    elif check_func pthread_join -pthreads; then
Måns Rullgård's avatar
Måns Rullgård committed
4048
        add_cflags -pthreads
4049
        add_extralibs -pthreads
4050
    elif check_func pthread_join -lpthreadGC2; then
4051
        add_extralibs -lpthreadGC2
4052 4053 4054
    elif check_lib pthread.h pthread_join -lpthread; then
        :
    elif ! check_func pthread_join; then
4055
        disable pthreads
Måns Rullgård's avatar
Måns Rullgård committed
4056
    fi
4057 4058
fi

4059 4060 4061
disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib

4062
check_lib math.h sin -lm && LIBM="-lm"
4063
enabled vaapi && require vaapi va/va.h vaInitialize -lva
Måns Rullgård's avatar
Måns Rullgård committed
4064

4065 4066 4067 4068
atan2f_args=2
ldexpf_args=2
powf_args=2

4069
for func in $MATH_FUNCS; do
4070
    eval check_mathfunc $func \${${func}_args:-1}
4071
done
4072

4073
# these are off by default, so fail if requested and not available
d s's avatar
d s committed
4074 4075 4076
enabled avisynth          && { { check_header "avisynth/avisynth_c.h" && check_lib2 "windows.h" LoadLibrary; } ||
                               { check_header "avxsynth/avxsynth_c.h" && check_lib2 "dlfcn.h" dlopen -ldl; } ||
                               die "ERROR: LoadLibrary/dlopen not found, or avisynth header not found"; }
4077 4078
enabled frei0r            && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; }
enabled gnutls            && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
4079
enabled libbs2b           && require_pkg_config libbs2b bs2b.h bs2b_open
4080 4081
enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
enabled libfdk_aac        && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
4082
enabled libfontconfig     && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
4083
enabled libfreetype       && require_pkg_config freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
4084 4085 4086 4087 4088 4089 4090 4091
enabled libgsm            && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
                                   check_lib "${gsm_hdr}" gsm_create -lgsm && break;
                               done || die "ERROR: libgsm not found"; }
enabled libilbc           && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
enabled libopencv         && require_pkg_config opencv opencv/cv.h cvCreateImageHeader
4092 4093
enabled libopenjpeg       && { { check_header openjpeg.h && check_lib2 openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC; } ||
                               { require_pkg_config libopenjpeg1 openjpeg.h opj_version -DOPJ_STATIC; } }
4094 4095 4096 4097 4098 4099
enabled libopus           && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
enabled libpulse          && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
enabled librtmp           && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
enabled libschroedinger   && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
enabled libspeex          && require libspeex speex/speex.h speex_decoder_init -lspeex
enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
4100
enabled libtwolame        && require libtwolame twolame.h twolame_init -ltwolame
4101 4102 4103 4104
enabled libvo_aacenc      && require libvo_aacenc vo-aacenc/voAAC.h voGetAACEncAPI -lvo-aacenc
enabled libvo_amrwbenc    && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
enabled libvorbis         && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg
enabled libvpx            && {
4105
    enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
4106
                                    die "ERROR: libvpx decoder version must be >=0.9.1"; }
4107
    enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VPX_CQ" -lvpx ||
4108 4109
                                    die "ERROR: libvpx encoder version must be >=0.9.6"; }
    enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder; }
4110
    enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } }
4111
enabled libwavpack        && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput  -lwavpack
Justin Ruggles's avatar
Justin Ruggles committed
4112
enabled libwebp           && require_pkg_config libwebp webp/encode.h WebPGetEncoderVersion
4113
enabled libx264           && require_pkg_config x264 "stdint.h x264.h" x264_encoder_encode &&
4114 4115
                             { check_cpp_condition x264.h "X264_BUILD >= 118" ||
                               die "ERROR: libx264 version must be >= 0.118."; }
Derek Buitenhuis's avatar
Derek Buitenhuis committed
4116
enabled libx265           && require_pkg_config x265 x265.h x265_encoder_encode &&
4117 4118
                             { check_cpp_condition x265.h "X265_BUILD >= 17" ||
                               die "ERROR: libx265 version must be >= 17."; }
4119 4120 4121 4122 4123 4124
enabled libxavs           && require libxavs xavs.h xavs_encoder_encode -lxavs
enabled libxvid           && require libxvid xvid.h xvid_global -lxvidcore
enabled openssl           && { check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto ||
                               check_lib openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
                               check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
                               die "ERROR: openssl not found"; }
4125

Samuel Pitoiset's avatar
Samuel Pitoiset committed
4126 4127 4128 4129 4130
if enabled gnutls; then
    { check_lib nettle/bignum.h nettle_mpz_get_str_256 -lnettle -lhogweed -lgmp && enable nettle; } ||
    { check_lib gcrypt.h gcry_mpi_new -lgcrypt && enable gcrypt; }
fi

4131 4132 4133 4134 4135 4136 4137 4138 4139
# libdc1394 check
if enabled libdc1394; then
    { check_lib dc1394/dc1394.h dc1394_new -ldc1394 -lraw1394 &&
        enable libdc1394_2; } ||
    { check_lib libdc1394/dc1394_control.h dc1394_create_handle -ldc1394_control -lraw1394 &&
        enable libdc1394_1; } ||
    die "ERROR: No version of libdc1394 found "
fi

4140
if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
4141
    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
4142 4143
    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
    enable sdl
4144
fi
4145

4146
pod2man --help     > /dev/null 2>&1 && enable pod2man   || disable pod2man
4147
texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html
4148

4149
check_header linux/fb.h
4150
check_header linux/videodev2.h
4151 4152
check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete

4153
check_header sys/videoio.h
4154

4155
check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
4156 4157 4158
# check that WM_CAP_DRIVER_CONNECT is defined to the proper value
# w32api 3.12 had it defined wrong
check_cpp_condition vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER" && enable vfwcap_defines
Ramiro Polla's avatar
Ramiro Polla committed
4159

4160
# check for ioctl_meteor.h, ioctl_bt848.h and alternatives
Ramiro Polla's avatar
Ramiro Polla committed
4161 4162 4163 4164 4165 4166 4167
{ check_header dev/bktr/ioctl_meteor.h &&
  check_header dev/bktr/ioctl_bt848.h; } ||
{ check_header machine/ioctl_meteor.h &&
  check_header machine/ioctl_bt848.h; } ||
{ check_header dev/video/meteor/ioctl_meteor.h &&
  check_header dev/video/bktr/ioctl_bt848.h; } ||
check_header dev/ic/bt8xx.h
4168

4169
check_header sndio.h
4170 4171
check_header sys/soundcard.h
check_header soundcard.h
Måns Rullgård's avatar
Måns Rullgård committed
4172

4173 4174
enabled_any alsa_indev alsa_outdev &&
    check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound
4175

4176 4177
enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack &&
    check_func jack_port_get_latency_range -ljack
4178

4179 4180
enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio

4181
if enabled libcdio; then
4182 4183
    check_lib2 "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
    check_lib2 "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio
4184
fi
4185

4186 4187
check_lib X11/Xlib.h XOpenDisplay -lX11 && enable xlib

4188 4189
enabled x11grab                                           &&
require Xext X11/extensions/XShm.h XShmCreateImage -lXext &&
4190 4191
require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes &&
{ enabled xlib || die "ERROR: Xlib not found"; }
4192

4193
enabled vdpau &&
4194
    check_cpp_condition vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" ||
4195
    disable vdpau
4196

4197
enabled vdpau && enabled xlib &&
4198 4199
    check_func_headers "vdpau/vdpau.h vdpau/vdpau_x11.h" vdp_device_create_x11 -lvdpau &&
    prepend avconv_libs $($ldflags_filter "-lvdpau") &&
4200 4201
    enable vdpau_x11

4202
enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
4203 4204 4205

# add some useful compiler flags if supported
check_cflags -Wdeclaration-after-statement
4206
check_cflags -Wall
Michael Niedermayer's avatar
Michael Niedermayer committed
4207 4208 4209
check_cflags -Wdisabled-optimization
check_cflags -Wpointer-arith
check_cflags -Wredundant-decls
4210
check_cflags -Wcast-qual
4211
check_cflags -Wwrite-strings
4212
check_cflags -Wtype-limits
4213
check_cflags -Wundef
4214
check_cflags -Wmissing-prototypes
4215
check_cflags -Wstrict-prototypes
4216
enabled extra_warnings && check_cflags -Winline
4217

4218 4219 4220 4221 4222 4223 4224 4225 4226 4227
check_disable_warning(){
    warning_flag=-W${1#-Wno-}
    test_cflags $warning_flag && add_cflags $1
}

check_disable_warning -Wno-parentheses
check_disable_warning -Wno-switch
check_disable_warning -Wno-format-zero-length
check_disable_warning -Wno-pointer-sign

4228
# add some linker flags
4229
check_ldflags -Wl,--warn-common
4230
check_ldflags -Wl,-rpath-link=libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
4231
test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
4232

4233 4234 4235 4236
# add some strip flags
# -wN '..@*' is more selective than -x, but not available everywhere.
check_stripflags -wN \'..@*\' || check_stripflags -x || strip='true'

4237 4238 4239 4240 4241 4242 4243
enabled neon_clobber_test &&
    check_ldflags -Wl,--wrap,avcodec_open2              \
                  -Wl,--wrap,avcodec_decode_audio4      \
                  -Wl,--wrap,avcodec_decode_video2      \
                  -Wl,--wrap,avcodec_decode_subtitle2   \
                  -Wl,--wrap,avcodec_encode_audio2      \
                  -Wl,--wrap,avcodec_encode_video2      \
4244 4245
                  -Wl,--wrap,avcodec_encode_subtitle    \
                  -Wl,--wrap,avresample_convert ||
4246 4247
    disable neon_clobber_test

4248
enabled xmm_clobber_test &&
4249 4250 4251 4252 4253
    check_ldflags -Wl,--wrap,avcodec_open2              \
                  -Wl,--wrap,avcodec_decode_audio4      \
                  -Wl,--wrap,avcodec_decode_video2      \
                  -Wl,--wrap,avcodec_decode_subtitle2   \
                  -Wl,--wrap,avcodec_encode_audio2      \
4254
                  -Wl,--wrap,avcodec_encode_video2      \
4255
                  -Wl,--wrap,avcodec_encode_subtitle    \
4256
                  -Wl,--wrap,avresample_convert         \
4257
                  -Wl,--wrap,sws_scale ||
4258 4259
    disable xmm_clobber_test

4260
echo "X{};" > $TMPV
4261
if test_ldflags -Wl,--version-script,$TMPV; then
4262
    append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
4263 4264
    check_cc <<EOF && enable symver_asm_label
void ff_foo(void) __asm__ ("av_foo@VERSION");
4265
void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
4266 4267 4268 4269 4270 4271
EOF
    check_cc <<EOF && enable symver_gnu_asm
__asm__(".symver ff_foo,av_foo@VERSION");
void ff_foo(void) {}
EOF
fi
4272

4273 4274 4275 4276 4277 4278 4279 4280
if [ -z "$optflags" ]; then
    if enabled small; then
        optflags=$cflags_size
    elif enabled optimizations; then
        optflags=$cflags_speed
    else
        optflags=$cflags_noopt
    fi
4281
fi
4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297

check_optflags(){
    check_cflags "$@"
    enabled lto && check_ldflags "$@"
}


if enabled lto; then
    test "$cc_type" != "$ld_type" && die "LTO requires same compiler and linker"
    check_cflags  -flto
    check_ldflags -flto $cpuflags
fi

check_optflags $optflags
check_optflags -fno-math-errno
check_optflags -fno-signed-zeros
4298

4299
if enabled icc; then
Måns Rullgård's avatar
Måns Rullgård committed
4300 4301 4302 4303
    # Just warnings, no remarks
    check_cflags -w1
    # -wd: Disable following warnings
    # 144, 167, 556: -Wno-pointer-sign
4304
    # 1292: attribute "foo" ignored
4305
    # 1419: external declaration in primary source file
Måns Rullgård's avatar
Måns Rullgård committed
4306
    # 10006: ignoring unknown option -fno-signed-zeros
4307
    # 10148: ignoring unknown option -Wno-parentheses
Måns Rullgård's avatar
Måns Rullgård committed
4308
    # 10156: ignoring option '-W'; no argument required
4309
    check_cflags -wd144,167,556,1292,1419,10006,10148,10156
Måns Rullgård's avatar
Måns Rullgård committed
4310 4311 4312
    # 11030: Warning unknown option --as-needed
    # 10156: ignoring option '-export'; no argument required
    check_ldflags -wd10156,11030
4313 4314
    # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
    enable ebp_available
4315
    if enabled x86_32; then
4316
        icc_version=$($cc -dumpversion)
4317 4318
        test ${icc_version%%.*} -ge 11 &&
            check_cflags -falign-stack=maintain-16-byte ||
4319 4320
            disable aligned_stack
    fi
4321 4322
elif enabled ccc; then
    # disable some annoying warnings
4323 4324 4325 4326
    add_cflags -msg_disable bitnotint
    add_cflags -msg_disable mixfuncvoid
    add_cflags -msg_disable nonstandcast
    add_cflags -msg_disable unsupieee
4327
elif enabled gcc; then
4328
    check_optflags -fno-tree-vectorize
4329
    check_cflags -Werror=implicit-function-declaration
4330
    check_cflags -Werror=missing-prototypes
4331
    check_cflags -Werror=return-type
4332
    check_cflags -Werror=declaration-after-statement
4333
    check_cflags -Werror=vla
4334
    enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
4335 4336
elif enabled llvm_gcc; then
    check_cflags -mllvm -stack-alignment=16
4337
elif enabled clang; then
4338
    check_cflags -mllvm -stack-alignment=16
4339
    check_cflags -Qunused-arguments
4340 4341
    check_cflags -Werror=implicit-function-declaration
    check_cflags -Werror=missing-prototypes
4342
    check_cflags -Werror=return-type
Luca Barbato's avatar
Luca Barbato committed
4343 4344 4345
elif enabled cparser; then
    add_cflags -Wno-missing-variable-declarations
    add_cflags -Wno-empty-statement
4346
elif enabled armcc; then
4347 4348
    add_cflags -W${armcc_opt},--diag_suppress=4343 # hardfp compat
    add_cflags -W${armcc_opt},--diag_suppress=3036 # using . as system include dir
4349
    # 2523: use of inline assembly is deprecated
4350 4351
    add_cflags -W${armcc_opt},--diag_suppress=2523
    add_cflags -W${armcc_opt},--diag_suppress=1207
4352
    add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
4353
    add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
4354 4355
    add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
    add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
4356 4357
elif enabled tms470; then
    add_cflags -pds=824 -pds=837
4358
    disable inline_asm
4359 4360
elif enabled pathscale; then
    add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
4361
elif enabled_any msvc icl; then
4362
    enabled x86_32 && disable aligned_stack
4363
    enabled_all x86_32 debug && add_cflags -Oy-
4364
    enabled debug && add_ldflags -debug
4365
    enable pragma_deprecated
4366
    if enabled icl; then
4367 4368 4369 4370
        # -Qansi-alias is basically -fstrict-aliasing, but does not work
        # (correctly) on icl 13.x.
        check_cpp_condition "windows.h" "__ICL < 1300 || __ICL >= 1400" &&
            add_cflags -Qansi-alias
4371 4372
        # icl will pass the inline asm tests but inline asm is currently
        # not supported (build will fail)
4373 4374
        disable inline_asm
    fi
4375 4376
fi

4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388
case $as_type in
    clang)
        add_asflags -Qunused-arguments
    ;;
esac

case $ld_type in
    clang)
        check_ldflags -Qunused-arguments
    ;;
esac

Mans Rullgard's avatar
Mans Rullgard committed
4389
case $target_os in
4390 4391 4392
    osf1)
        enabled ccc && add_ldflags '-Wl,-expect_unresolved,*'
    ;;
Mans Rullgard's avatar
Mans Rullgard committed
4393 4394 4395 4396 4397
    plan9)
        add_cppflags -Dmain=plan9_main
    ;;
esac

4398 4399
enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }

4400
check_deps $CONFIG_LIST       \
4401
           $CONFIG_EXTRA      \
4402
           $HAVE_LIST         \
4403
           $ALL_COMPONENTS    \
4404

4405 4406 4407 4408
enabled_all dxva2 CoTaskMemFree &&
    prepend avconv_libs $($ldflags_filter "-lole32") &&
    enable dxva2_lib

4409
! enabled_any memalign posix_memalign aligned_malloc &&
4410 4411
    enabled_any $need_memalign && enable memalign_hack

4412 4413 4414 4415 4416 4417 4418 4419
for thread in $THREADS_LIST; do
    if enabled $thread; then
        test -n "$thread_type" &&
            die "ERROR: Only one thread type must be selected." ||
            thread_type="$thread"
    fi
done

4420 4421 4422 4423 4424
# conditional library dependencies, in linking order
enabled movie_filter    && prepend avfilter_deps "avformat avcodec"
enabled resample_filter && prepend avfilter_deps "avresample"
enabled scale_filter    && prepend avfilter_deps "swscale"

4425 4426
enabled opus_decoder    && prepend avcodec_deps "avresample"

4427 4428 4429 4430 4431 4432 4433 4434 4435
expand_deps(){
    lib_deps=${1}_deps
    eval "deps=\$$lib_deps"
    append $lib_deps $(map 'eval echo \$${v}_deps' $deps)
    unique $lib_deps
}

map 'expand_deps $v' $LIBRARY_LIST

4436
echo "install prefix            $prefix"
Diego Biurrun's avatar
Diego Biurrun committed
4437 4438
echo "source path               $source_path"
echo "C compiler                $cc"
4439
echo "C library                 $libc_type"
4440 4441
if test "$host_cc" != "$cc"; then
    echo "host C compiler           $host_cc"
4442
    echo "host C library            $host_libc_type"
4443
fi
Diego Biurrun's avatar
Diego Biurrun committed
4444
echo "ARCH                      $arch ($cpu)"
4445 4446
if test "$build_suffix" != ""; then
    echo "build suffix              $build_suffix"
4447
fi
4448 4449 4450
if test "$extra_version" != ""; then
    echo "version string suffix     $extra_version"
fi
4451
echo "big-endian                ${bigendian-no}"
4452
echo "runtime cpu detection     ${runtime_cpudetect-no}"
4453
if enabled x86; then
4454
    echo "${yasmexe}                      ${yasm-no}"
4455
    echo "MMX enabled               ${mmx-no}"
4456
    echo "MMXEXT enabled            ${mmxext-no}"
4457
    echo "3DNow! enabled            ${amd3dnow-no}"
4458
    echo "3DNow! extended enabled   ${amd3dnowext-no}"
4459
    echo "SSE enabled               ${sse-no}"
4460
    echo "SSSE3 enabled             ${ssse3-no}"
4461
    echo "AVX enabled               ${avx-no}"
4462
    echo "XOP enabled               ${xop-no}"
4463
    echo "FMA3 enabled              ${fma3-no}"
4464
    echo "FMA4 enabled              ${fma4-no}"
4465
    echo "i686 features enabled     ${i686-no}"
4466
    echo "CMOV is fast              ${fast_cmov-no}"
4467 4468
    echo "EBX available             ${ebx_available-no}"
    echo "EBP available             ${ebp_available-no}"
4469
fi
4470 4471 4472 4473
if enabled aarch64; then
    echo "NEON enabled              ${neon-no}"
    echo "VFP enabled               ${vfp-no}"
fi
4474
if enabled arm; then
4475 4476
    echo "ARMv5TE enabled           ${armv5te-no}"
    echo "ARMv6 enabled             ${armv6-no}"
4477
    echo "ARMv6T2 enabled           ${armv6t2-no}"
4478
    echo "VFP enabled               ${vfp-no}"
4479
    echo "NEON enabled              ${neon-no}"
4480
fi
4481
if enabled ppc; then
4482
    echo "AltiVec enabled           ${altivec-no}"
4483
    echo "PPC 4xx optimizations     ${ppc4xx-no}"
4484
    echo "dcbzl available           ${dcbzl-no}"
4485
fi
4486
echo "debug symbols             ${debug-no}"
4487
echo "optimize for size         ${small-no}"
4488
echo "optimizations             ${optimizations-no}"
4489 4490
echo "static                    ${static-no}"
echo "shared                    ${shared-no}"
4491
echo "new filter support        ${avfilter-no}"
4492 4493
echo "network support           ${network-no}"
echo "threading support         ${thread_type-no}"
4494
echo "safe bitstream reader     ${safe_bitstream_reader-no}"
4495
echo "SDL support               ${sdl-no}"
4496 4497
test -n "$random_seed" &&
    echo "random seed               ${random_seed}"
4498
echo
Fabrice Bellard's avatar
Fabrice Bellard committed
4499

4500 4501 4502 4503
echo "External libraries:"
print_enabled '' $EXTERNAL_LIBRARY_LIST | print_3_columns
echo

4504
for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
4505
    echo "Enabled ${type}s:"
4506
    eval list=\$$(toupper $type)_LIST
4507
    print_enabled '_*' $list | print_3_columns
4508
    echo
4509 4510
done

4511
license="LGPL version 2.1 or later"
4512
if enabled nonfree; then
4513
    license="nonfree and unredistributable"
4514 4515 4516 4517
elif enabled gplv3; then
    license="GPL version 3 or later"
elif enabled lgplv3; then
    license="LGPL version 3 or later"
4518
elif enabled gpl; then
4519
    license="GPL version 2 or later"
4520 4521 4522
fi

echo "License: $license"
4523

4524 4525
echo "Creating config.mak and config.h..."

4526
test -e Makefile || echo "include $source_path/Makefile" > Makefile
4527

4528 4529
config_files="$TMPH config.mak"

4530 4531
cat > config.mak <<EOF
# Automatically generated by configure - do not modify!
4532
LIBAV_CONFIGURATION=$LIBAV_CONFIGURATION
4533 4534 4535 4536 4537 4538
prefix=$prefix
LIBDIR=\$(DESTDIR)$libdir
SHLIBDIR=\$(DESTDIR)$shlibdir
INCDIR=\$(DESTDIR)$incdir
BINDIR=\$(DESTDIR)$bindir
DATADIR=\$(DESTDIR)$datadir
4539
DOCDIR=\$(DESTDIR)$docdir
4540
MANDIR=\$(DESTDIR)$mandir
4541
SRC_PATH=$source_path
4542
CC_IDENT=$cc_ident
4543 4544 4545 4546 4547
ARCH=$arch
CC=$cc
AS=$as
LD=$ld
DEPCC=$dep_cc
4548 4549 4550
DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
DEPAS=$as
DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
4551
YASM=$yasmexe
4552
DEPYASM=$yasmexe
4553
AR=$ar
4554 4555
ARFLAGS=$arflags
AR_O=$ar_o
4556
RANLIB=$ranlib
4557
STRIP=$strip
4558 4559 4560 4561
LN_S=$ln_s
CPPFLAGS=$CPPFLAGS
CFLAGS=$CFLAGS
ASFLAGS=$ASFLAGS
4562
AS_C=$AS_C
4563
AS_O=$AS_O
4564
CC_C=$CC_C
4565
CC_E=$CC_E
4566
CC_O=$CC_O
4567
LD_O=$LD_O
4568 4569
LD_LIB=$LD_LIB
LD_PATH=$LD_PATH
4570
DLLTOOL=$dlltool
4571
LDFLAGS=$LDFLAGS
4572
SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
4573
STRIPFLAGS=$STRIPFLAGS
4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584
YASMFLAGS=$YASMFLAGS
BUILDSUF=$build_suffix
FULLNAME=$FULLNAME
LIBPREF=$LIBPREF
LIBSUF=$LIBSUF
LIBNAME=$LIBNAME
SLIBPREF=$SLIBPREF
SLIBSUF=$SLIBSUF
EXESUF=$EXESUF
EXTRA_VERSION=$extra_version
CCDEP=$CCDEP
4585
CCDEP_FLAGS=$CCDEP_FLAGS
4586
ASDEP=$ASDEP
4587
ASDEP_FLAGS=$ASDEP_FLAGS
4588 4589 4590
CC_DEPFLAGS=$CC_DEPFLAGS
AS_DEPFLAGS=$AS_DEPFLAGS
HOSTCC=$host_cc
4591
HOSTLD=$host_ld
4592
HOSTCFLAGS=$host_cflags
4593
HOSTCPPFLAGS=$host_cppflags
4594 4595 4596
HOSTEXESUF=$HOSTEXESUF
HOSTLDFLAGS=$host_ldflags
HOSTLIBS=$host_libs
4597 4598 4599 4600 4601
DEPHOSTCC=$host_cc
DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
HOSTCCDEP=$HOSTCCDEP
HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
4602
HOSTCC_C=$HOSTCC_C
4603
HOSTCC_O=$HOSTCC_O
4604
HOSTLD_O=$HOSTLD_O
4605
TARGET_EXEC=$target_exec $target_exec_args
4606
TARGET_PATH=$target_path
4607
TARGET_SAMPLES=${target_samples:-\$(SAMPLES)}
4608
CFLAGS-avplay=$sdl_cflags
4609
ZLIB=$($ldflags_filter -lz)
4610 4611
LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
EXTRALIBS=$extralibs
4612
COMPAT_OBJS=$compat_objs
4613
EXEOBJS=$exeobjs
4614
INSTALL=install
4615 4616 4617 4618 4619 4620
LIBTARGET=${LIBTARGET}
SLIBNAME=${SLIBNAME}
SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
SLIBNAME_WITH_MAJOR=${SLIBNAME_WITH_MAJOR}
SLIB_CREATE_DEF_CMD=${SLIB_CREATE_DEF_CMD}
SLIB_EXTRA_CMD=${SLIB_EXTRA_CMD}
4621 4622 4623 4624
SLIB_INSTALL_NAME=${SLIB_INSTALL_NAME}
SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS}
SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
4625
SAMPLES:=${samples:-\$(LIBAV_SAMPLES)}
4626
EOF
4627

4628
get_version(){
4629
    lcname=lib${1}
4630 4631
    name=$(toupper $lcname)
    file=$source_path/$lcname/version.h
4632
    eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file")
4633
    eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
4634 4635
    eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
    eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
4636
    eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> config.mak
4637 4638
}

4639
map 'get_version $v' $LIBRARY_LIST
4640

4641
map 'eval echo "${v}_FFLIBS=\$${v}_deps" >> config.mak' $LIBRARY_LIST
4642

4643 4644 4645 4646 4647 4648 4649
print_program_libs(){
    eval "program_libs=\$${1}_libs"
    eval echo "LIBS-${1}=${program_libs}" >> config.mak
}

map 'print_program_libs $v' $PROGRAM_LIST

4650 4651
cat > $TMPH <<EOF
/* Automatically generated by configure - do not modify! */
4652 4653 4654
#ifndef LIBAV_CONFIG_H
#define LIBAV_CONFIG_H
#define LIBAV_CONFIGURATION "$(c_escape $LIBAV_CONFIGURATION)"
4655
#define LIBAV_LICENSE "$(c_escape $license)"
4656
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
4657
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
4658 4659 4660
#define restrict $_restrict
#define EXTERN_PREFIX "${extern_prefix}"
#define EXTERN_ASM ${extern_prefix}
4661
#define SLIBSUF "$SLIBSUF"
4662
EOF
4663

4664 4665 4666
test -n "$malloc_prefix" &&
    echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH

4667 4668 4669 4670 4671
if enabled yasm; then
    append config_files $TMPASM
    printf '' >$TMPASM
fi

4672 4673
enabled getenv || echo "#define getenv(x) NULL" >> $TMPH

4674 4675 4676
print_config ARCH_   "$config_files" $ARCH_LIST
print_config HAVE_   "$config_files" $HAVE_LIST
print_config CONFIG_ "$config_files" $CONFIG_LIST       \
Måns Rullgård's avatar
Måns Rullgård committed
4677
                                     $CONFIG_EXTRA      \
4678
                                     $ALL_COMPONENTS    \
4679

4680
echo "#endif /* LIBAV_CONFIG_H */" >> $TMPH
4681

Diego Biurrun's avatar
Diego Biurrun committed
4682
# Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
4683
cp_if_changed $TMPH config.h
4684
touch .config
Nick Kurshev's avatar
Nick Kurshev committed
4685

4686 4687
enabled yasm && cp_if_changed $TMPASM config.asm

4688 4689 4690 4691 4692 4693
cat > $TMPH <<EOF
/* Generated by ffconf */
#ifndef AVUTIL_AVCONFIG_H
#define AVUTIL_AVCONFIG_H
EOF

4694
print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
4695 4696 4697 4698 4699

echo "#endif /* AVUTIL_AVCONFIG_H */" >> $TMPH

cp_if_changed $TMPH libavutil/avconfig.h

4700 4701
test -n "$WARNINGS" && printf "\n$WARNINGS"

4702
# build pkg-config files
4703

4704 4705 4706 4707
lib_version(){
    eval printf "\"lib${1} >= \$LIB$(toupper ${1})_VERSION, \""
}

4708
pkgconfig_generate(){
4709 4710 4711 4712 4713
    name=$1
    shortname=${name#lib}${build_suffix}
    comment=$2
    version=$3
    libs=$4
4714 4715
    requires=$(map 'lib_version $v' $(eval echo \$${name#lib}_deps))
    requires=${requires%, }
4716 4717 4718
    enabled ${name#lib} || return 0
    mkdir -p $name
    cat <<EOF > $name/$name.pc
4719
prefix=$prefix
4720
exec_prefix=\${prefix}
4721
libdir=$libdir
4722
includedir=$incdir
4723

4724 4725 4726
Name: $name
Description: $comment
Version: $version
4727
Requires: $(enabled shared || echo $requires)
4728
Requires.private: $(enabled shared && echo $requires)
4729
Conflicts:
4730
Libs: -L\${libdir} -l${shortname} $(enabled shared || echo $libs)
4731
Libs.private: $(enabled shared && echo $libs)
4732
Cflags: -I\${includedir}
4733
EOF
4734
    cat <<EOF > $name/$name-uninstalled.pc
4735 4736
prefix=
exec_prefix=
4737
libdir=\${pcfiledir}
4738
includedir=${source_path}
4739

4740 4741 4742 4743
Name: $name
Description: $comment
Version: $version
Requires: $requires
4744
Conflicts:
4745
Libs: \${libdir}/${LIBPREF}${shortname}${LIBSUF} $libs
4746 4747
Cflags: -I\${includedir}
EOF
4748
}
4749

4750
pkgconfig_generate libavutil     "Libav utility library"          "$LIBAVUTIL_VERSION"     "$LIBM"
4751 4752 4753 4754 4755 4756
pkgconfig_generate libavcodec    "Libav codec library"            "$LIBAVCODEC_VERSION"    "$extralibs"
pkgconfig_generate libavformat   "Libav container format library" "$LIBAVFORMAT_VERSION"   "$extralibs"
pkgconfig_generate libavdevice   "Libav device handling library"  "$LIBAVDEVICE_VERSION"   "$extralibs"
pkgconfig_generate libavfilter   "Libav video filtering library"  "$LIBAVFILTER_VERSION"   "$extralibs"
pkgconfig_generate libavresample "Libav audio resampling library" "$LIBAVRESAMPLE_VERSION" "$extralibs"
pkgconfig_generate libswscale    "Libav image rescaling library"  "$LIBSWSCALE_VERSION"    "$LIBM"