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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

315 316
quotes='""'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

disable(){
    set_all no $*
}

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

disable_weak(){
    set_weak no $*
}

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

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

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

enable_deep(){
    do_enable_deep $*
    enable $*
}

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

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

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

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

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

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

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

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

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

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

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

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

584 585
        [ -n "$dep_ifa" ] && { enabled_all $dep_ifa && enable_weak $cfg; }
        [ -n "$dep_ifn" ] && { enabled_any $dep_ifn && enable_weak $cfg; }
Måns Rullgård's avatar
Måns Rullgård committed
586 587
        enabled_all  $dep_all || disable $cfg
        enabled_any  $dep_any || disable $cfg
588
        disabled_any $dep_sel && disable $cfg
589

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

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

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

    do_check_deps "$@"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

878 879
check_func_headers(){
    log check_func_headers "$@"
880
    headers=$1
881
    funcs=$2
882
    shift 2
883 884
    {
        for hdr in $headers; do
885
            print_include $hdr
886 887 888 889 890 891
        done
        for func in $funcs; do
            echo "long check_$func(void) { return (long) $func; }"
        done
        echo "int main(void) { return 0; }"
    } | check_ld "$@" && enable $funcs && enable_safe $headers
892 893
}

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

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

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

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

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

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

    # exit() is not async signal safe.  _Exit (C99) and _exit (POSIX)
    # are safe but may not be available everywhere.  Thus we use
    # raise(SIGTERM) instead.  The check is run in a subshell so we
    # can redirect the "Terminated" message from the shell.  SIGBUS
    # is not defined by standard C so it is used conditionally.

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

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

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

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

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

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

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

1027 1028 1029 1030 1031 1032 1033
require_pkg_config(){
    pkg="$1"
    check_pkg_config "$@" || die "ERROR: $pkg not found"
    add_cflags    $(get_safe ${pkg}_cflags)
    add_extralibs $(get_safe ${pkg}_libs)
}

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

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

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

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

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

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

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

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

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

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

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

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

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

1159 1160 1161 1162 1163 1164
HWACCEL_LIST="
    dxva2
    vaapi
    vda
    vdpau
"
1165

1166 1167 1168 1169 1170 1171 1172 1173 1174 1175
LIBRARY_LIST="
    avcodec
    avdevice
    avfilter
    avformat
    avresample
    avutil
    swscale
"

1176 1177 1178 1179 1180 1181 1182
PROGRAM_LIST="
    avconv
    avplay
    avprobe
    avserver
"

1183 1184
CONFIG_LIST="
    $COMPONENT_LIST
1185
    $EXAMPLE_LIST
1186
    $EXTERNAL_LIBRARY_LIST
1187
    $HWACCEL_LIST
1188
    $LIBRARY_LIST
1189
    $PROGRAM_LIST
1190
    dct
1191
    doc
1192
    error_resilience
1193
    fft
1194
    gpl
1195
    gray
Aurelien Jacobs's avatar
Aurelien Jacobs committed
1196
    hardcoded_tables
1197
    lsp
1198
    lzo
1199
    mdct
1200
    memalign_hack
1201
    neon_clobber_test
1202
    network
1203
    nonfree
1204
    pic
1205
    pod2man
1206
    rdft
1207
    runtime_cpudetect
1208
    safe_bitstream_reader
1209
    shared
1210
    small
1211
    sram
1212
    static
1213
    swscale_alpha
1214
    texi2html
1215
    thumb
1216
    version3
1217
    xmm_clobber_test
1218
"
1219

1220
THREADS_LIST="
1221 1222
    pthreads
    w32threads
1223
"
1224

1225
ATOMICS_LIST="
1226 1227
    atomics_gcc
    atomics_suncc
1228
    atomics_win32
1229
"
1230

1231
ARCH_LIST="
1232
    aarch64
1233
    alpha
1234
    arm
1235 1236 1237
    avr32
    avr32_ap
    avr32_uc
1238 1239 1240 1241
    bfin
    ia64
    m68k
    mips
1242
    mips64
1243
    parisc
1244
    ppc
1245
    ppc64
1246 1247 1248 1249
    s390
    sh4
    sparc
    sparc64
1250 1251
    tilegx
    tilepro
1252
    tomi
1253 1254 1255
    x86
    x86_32
    x86_64
1256
"
1257

1258
ARCH_EXT_LIST_ARM="
1259 1260 1261 1262
    armv5te
    armv6
    armv6t2
    neon
1263
    vfp
1264
    vfpv3
1265
"
1266

1267
ARCH_EXT_LIST_X86_SIMD="
1268
    amd3dnow
1269
    amd3dnowext
1270
    avx
1271
    avx2
1272
    fma3
1273 1274 1275 1276 1277 1278 1279 1280 1281
    fma4
    mmx
    mmxext
    sse
    sse2
    sse3
    sse4
    sse42
    ssse3
1282 1283
    xop
"
1284

1285 1286 1287 1288 1289 1290
ARCH_EXT_LIST_X86="
    $ARCH_EXT_LIST_X86_SIMD
    cpunop
    i686
"

1291
ARCH_EXT_LIST="
1292
    $ARCH_EXT_LIST_ARM
1293 1294
    $ARCH_EXT_LIST_X86
    altivec
1295
    ppc4xx
1296
"
1297

1298
HAVE_LIST_CMDLINE="
1299 1300 1301
    inline_asm
    symver
    yasm
1302
"
1303

1304
HAVE_LIST_PUB="
1305
    bigendian
1306
    fast_unaligned
1307
"
1308

1309
MATH_FUNCS="
1310 1311
    atanf
    atan2f
1312
    cbrtf
1313
    cosf
1314 1315
    exp2
    exp2f
1316
    expf
1317 1318
    isinf
    isnan
1319
    ldexpf
1320 1321 1322 1323
    llrint
    llrintf
    log2
    log2f
1324
    log10f
1325 1326
    lrint
    lrintf
1327
    powf
1328 1329 1330
    rint
    round
    roundf
1331
    sinf
1332 1333 1334 1335
    trunc
    truncf
"

1336 1337
HAVE_LIST="
    $ARCH_EXT_LIST
1338 1339
    $(add_suffix _external $ARCH_EXT_LIST)
    $(add_suffix _inline   $ARCH_EXT_LIST)
1340
    $ATOMICS_LIST
1341
    $HAVE_LIST_CMDLINE
1342
    $HAVE_LIST_PUB
1343
    $MATH_FUNCS
1344
    $THREADS_LIST
1345
    aligned_malloc
1346
    aligned_stack
1347
    alsa_asoundlib_h
1348
    altivec_h
1349
    arpa_inet_h
1350
    asm_mod_q
1351
    atomic_cas_ptr
1352
    atomics_native
1353
    attribute_may_alias
1354
    attribute_packed
1355 1356
    cdio_paranoia_h
    cdio_paranoia_paranoia_h
Alex Beregszaszi's avatar
Alex Beregszaszi committed
1357
    closesocket
1358
    CommandLineToArgvW
1359
    CryptGenRandom
1360
    dcbzl
1361 1362 1363 1364
    dev_bktr_ioctl_bt848_h
    dev_bktr_ioctl_meteor_h
    dev_ic_bt8xx_h
    dev_video_bktr_ioctl_bt848_h
1365
    dev_video_meteor_ioctl_meteor_h
1366
    direct_h
1367
    dlfcn_h
1368
    dlopen
1369
    dos_paths
1370
    dxva_h
1371 1372
    ebp_available
    ebx_available
1373
    fast_64bit
1374
    fast_clz
1375
    fast_cmov
Måns Rullgård's avatar
Måns Rullgård committed
1376
    fcntl
1377
    flt_lim
Måns Rullgård's avatar
Måns Rullgård committed
1378
    fork
1379
    getaddrinfo
1380
    gethrtime
1381
    getopt
1382
    GetProcessAffinityMask
1383
    GetProcessMemoryInfo
1384
    GetProcessTimes
Ramiro Polla's avatar
Ramiro Polla committed
1385
    getrusage
1386
    getservbyport
1387
    GetSystemTimeAsFileTime
1388
    gettimeofday
1389
    gnu_as
1390
    gsm_h
1391
    ibm_asm
1392
    inet_aton
1393
    inline_asm_labels
1394
    io_h
1395
    isatty
1396
    jack_port_get_latency_range
Måns Rullgård's avatar
Måns Rullgård committed
1397
    ldbrx
1398
    libc_msvcrt
1399 1400
    libdc1394_1
    libdc1394_2
1401 1402
    local_aligned_16
    local_aligned_8
1403
    localtime_r
1404
    loongson
1405 1406
    mach_absolute_time
    mach_mach_time_h
1407 1408
    machine_ioctl_bt848_h
    machine_ioctl_meteor_h
1409
    machine_rw_barrier
1410
    malloc_h
1411
    MapViewOfFile
1412
    memalign
1413
    MemoryBarrier
1414
    mkstemp
1415
    mm_empty
1416
    mmap
1417
    mprotect
1418
    nanosleep
1419
    poll_h
1420
    posix_memalign
1421
    pragma_deprecated
1422
    rdtsc
1423
    sched_getaffinity
1424
    sdl
1425
    SetConsoleTextAttribute
1426
    setmode
1427
    setrlimit
1428
    Sleep
1429
    sndio_h
1430
    socklen_t
Måns Rullgård's avatar
Måns Rullgård committed
1431
    soundcard_h
1432
    strerror_r
1433
    strptime
1434
    struct_addrinfo
1435 1436
    struct_group_source_req
    struct_ip_mreq_source
1437
    struct_ipv6_mreq
1438
    struct_pollfd
1439
    struct_rusage_ru_maxrss
1440
    struct_sockaddr_in6
1441
    struct_sockaddr_sa_len
1442
    struct_sockaddr_storage
1443
    struct_v4l2_frmivalenum_discrete
1444
    symver_asm_label
1445
    symver_gnu_asm
1446
    sync_val_compare_and_swap
1447
    sys_mman_h
1448
    sys_param_h
1449
    sys_resource_h
1450
    sys_select_h
Måns Rullgård's avatar
Måns Rullgård committed
1451
    sys_soundcard_h
1452
    sys_time_h
1453
    sys_un_h
1454
    sys_videoio_h
1455 1456
    sysconf
    sysctl
1457
    threads
1458
    unistd_h
1459
    usleep
1460
    vdpau_x11
1461
    vfp_args
1462
    VirtualAlloc
1463
    windows_h
1464
    winsock2_h
1465
    xform_asm
1466
    xlib
1467
    xmm_clobbers
1468
"
1469

Diego Biurrun's avatar
Diego Biurrun committed
1470
# options emitted with CONFIG_ prefix but not available on the command line
1471
CONFIG_EXTRA="
1472
    aandcttables
1473
    ac3dsp
1474
    audio_frame_queue
1475
    dsputil
1476
    gcrypt
1477
    golomb
1478
    gplv3
1479
    h263dsp
1480 1481 1482
    h264chroma
    h264dsp
    h264pred
1483
    h264qpel
1484
    hpeldsp
1485
    huffman
1486
    intrax8
1487
    lgplv3
1488
    lpc
1489
    mpegaudio
1490
    mpegaudiodsp
1491
    mpegvideo
1492
    mpegvideoenc
1493
    nettle
1494
    rangecoder
1495
    riffdec
1496
    riffenc
1497
    rtpdec
1498
    rtpenc_chain
1499
    sinewin
1500
    videodsp
1501
    vp3dsp
1502 1503
"

1504
CMDLINE_SELECT="
1505
    $ARCH_EXT_LIST
1506
    $CONFIG_LIST
1507
    $HAVE_LIST_CMDLINE
1508
    $THREADS_LIST
1509
    asm
1510
    cross_compile
1511 1512
    debug
    extra_warnings
1513
    logging
1514
    lto
1515
    optimizations
1516
"
1517

1518
PATHS_LIST="
1519
    bindir
1520
    datadir
1521
    docdir
1522 1523 1524 1525 1526
    incdir
    libdir
    mandir
    prefix
    shlibdir
1527
"
1528 1529 1530

CMDLINE_SET="
    $PATHS_LIST
1531
    ar
1532
    arch
1533
    as
1534 1535 1536 1537
    build_suffix
    cc
    cpu
    cross_prefix
1538
    dep_cc
1539
    extra_version
1540 1541
    host_cc
    host_cflags
1542
    host_ld
1543 1544
    host_ldflags
    host_libs
1545
    host_os
1546
    ld
1547
    logfile
1548
    malloc_prefix
1549
    nm
1550
    optflags
1551
    pkg_config
1552
    pkg_config_flags
1553
    random_seed
Måns Rullgård's avatar
Måns Rullgård committed
1554
    samples
1555 1556
    sysinclude
    sysroot
1557
    target_exec
1558
    target_os
1559
    target_path
1560
    target_samples
1561
    toolchain
1562
"
1563

1564 1565
CMDLINE_APPEND="
    extra_cflags
1566
    host_cppflags
1567 1568
"

1569 1570
# code dependency declarations

1571
# architecture extensions
1572

1573 1574
armv5te_deps="arm"
armv6_deps="arm"
1575
armv6t2_deps="arm"
1576 1577
neon_deps_any="aarch64 arm"
vfp_deps_any="aarch64 arm"
1578
vfpv3_deps="vfp"
1579

1580 1581
map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM

1582 1583 1584
altivec_deps="ppc"
ppc4xx_deps="ppc"

1585 1586 1587
cpunop_deps="i686"
x86_64_select="i686"
x86_64_suggest="fast_cmov"
1588

1589 1590
amd3dnow_deps="mmx"
amd3dnowext_deps="amd3dnow"
1591
i686_deps="x86"
1592
mmx_deps="x86"
1593
mmxext_deps="mmx"
1594 1595 1596 1597 1598 1599 1600
sse_deps="mmxext"
sse2_deps="sse"
sse3_deps="sse2"
ssse3_deps="sse3"
sse4_deps="ssse3"
sse42_deps="sse4"
avx_deps="sse42"
1601
xop_deps="avx"
1602
fma3_deps="avx"
1603
fma4_deps="avx"
1604
avx2_deps="avx"
1605

1606 1607 1608 1609
mmx_external_deps="yasm"
mmx_inline_deps="inline_asm"
mmx_suggest="mmx_external mmx_inline"

1610
for ext in $(filter_out mmx $ARCH_EXT_LIST_X86_SIMD); do
1611 1612 1613 1614 1615 1616
    eval dep=\$${ext}_deps
    eval ${ext}_external_deps='"${dep}_external"'
    eval ${ext}_inline_deps='"${dep}_inline"'
    eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
done

1617 1618 1619 1620
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"
1621

1622
need_memalign="altivec neon sse"
1623

1624 1625 1626
# system capabilities
log2_deps="!libc_msvcrt"

1627 1628
symver_if_any="symver_asm_label symver_gnu_asm"

1629 1630 1631 1632 1633
# 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"
1634
w32threads_deps="atomics_native"
1635 1636
threads_if_any="$THREADS_LIST"

1637
# subsystems
1638
dct_select="rdft"
1639
error_resilience_select="dsputil"
1640 1641
mdct_select="fft"
rdft_select="fft"
1642
mpegaudio_select="mpegaudiodsp"
1643
mpegaudiodsp_select="dct"
1644
mpegvideo_select="dsputil hpeldsp videodsp"
1645
mpegvideoenc_select="dsputil mpegvideo"
1646

1647
# decoders / encoders
1648
aac_decoder_select="mdct sinewin"
1649
aac_encoder_select="audio_frame_queue mdct sinewin"
1650
aac_latm_decoder_select="aac_decoder aac_latm_parser"
1651 1652 1653
ac3_decoder_select="mdct ac3dsp ac3_parser dsputil"
ac3_encoder_select="mdct ac3dsp dsputil"
ac3_fixed_encoder_select="mdct ac3dsp dsputil"
1654
aic_decoder_select="dsputil golomb"
1655
alac_encoder_select="lpc"
1656
als_decoder_select="dsputil"
1657
amrnb_decoder_select="lsp"
1658
amrwb_decoder_select="lsp"
1659
amv_decoder_select="sp5x_decoder"
1660 1661 1662 1663 1664
ape_decoder_select="dsputil"
asv1_decoder_select="dsputil"
asv1_encoder_select="dsputil"
asv2_decoder_select="dsputil"
asv2_encoder_select="dsputil"
1665
atrac1_decoder_select="mdct sinewin"
1666
atrac3_decoder_select="mdct"
Maxim Polijakowski's avatar
Maxim Polijakowski committed
1667
atrac3p_decoder_select="mdct sinewin"
1668
bink_decoder_select="dsputil hpeldsp"
1669 1670
binkaudio_dct_decoder_select="mdct rdft dct sinewin"
binkaudio_rdft_decoder_select="mdct rdft sinewin"
1671 1672
cavs_decoder_select="dsputil golomb h264chroma videodsp"
cllc_decoder_select="dsputil"
1673
comfortnoise_encoder_select="lpc"
1674
cook_decoder_select="dsputil mdct sinewin"
1675
cscd_decoder_select="lzo"
1676
cscd_decoder_suggest="zlib"
1677
dca_decoder_select="mdct"
1678 1679 1680 1681
dnxhd_decoder_select="dsputil"
dnxhd_encoder_select="aandcttables dsputil mpegvideoenc"
dvvideo_decoder_select="dsputil"
dvvideo_encoder_select="dsputil"
1682
dxa_decoder_deps="zlib"
1683
eac3_decoder_select="ac3_decoder"
1684
eac3_encoder_select="ac3_encoder"
1685 1686
eamad_decoder_select="aandcttables dsputil mpegvideo"
eatgq_decoder_select="aandcttables dsputil"
1687
eatqi_decoder_select="aandcttables dsputil error_resilience mpegvideo"
1688 1689
ffv1_decoder_select="golomb rangecoder"
ffv1_encoder_select="rangecoder"
1690 1691
ffvhuff_decoder_select="huffyuv_decoder"
ffvhuff_encoder_select="huffyuv_encoder"
1692
fic_decoder_select="dsputil golomb"
1693
flac_decoder_select="golomb"
1694
flac_encoder_select="dsputil golomb lpc"
1695 1696 1697
flashsv_decoder_deps="zlib"
flashsv_encoder_deps="zlib"
flashsv2_decoder_deps="zlib"
1698
flv_decoder_select="h263_decoder"
1699
flv_encoder_select="h263_encoder"
1700 1701
fourxm_decoder_select="dsputil"
fraps_decoder_select="dsputil huffman"
1702 1703
g2m_decoder_deps="zlib"
g2m_decoder_select="dsputil"
1704
h261_decoder_select="error_resilience mpegvideo"
1705
h261_encoder_select="aandcttables mpegvideoenc"
1706 1707
h263_decoder_select="error_resilience h263_parser h263dsp mpegvideo"
h263_encoder_select="aandcttables h263dsp mpegvideoenc"
1708
h263i_decoder_select="h263_decoder"
1709
h263p_encoder_select="h263_encoder"
1710 1711
h264_decoder_select="golomb h264chroma h264dsp h264pred h264qpel videodsp"
h264_decoder_suggest="error_resilience"
Guillaume Martres's avatar
Guillaume Martres committed
1712
hevc_decoder_select="dsputil golomb videodsp"
1713 1714
huffyuv_decoder_select="dsputil"
huffyuv_encoder_select="dsputil huffman"
1715
iac_decoder_select="imc_decoder"
1716
imc_decoder_select="dsputil fft mdct sinewin"
1717
indeo3_decoder_select="hpeldsp"
1718
interplay_video_decoder_select="hpeldsp"
1719
jpegls_decoder_select="golomb mjpeg_decoder"
1720
jpegls_encoder_select="golomb"
1721 1722
jv_decoder_select="dsputil"
lagarith_decoder_select="dsputil"
1723
ljpeg_encoder_select="aandcttables mpegvideoenc"
1724
loco_decoder_select="golomb"
1725
mdec_decoder_select="dsputil error_resilience mpegvideo"
1726
metasound_decoder_select="lsp mdct sinewin"
1727
mimic_decoder_select="dsputil hpeldsp"
1728
mjpeg_decoder_select="dsputil hpeldsp"
1729
mjpeg_encoder_select="aandcttables mpegvideoenc"
1730
mjpegb_decoder_select="mjpeg_decoder"
1731
mlp_decoder_select="mlp_parser"
1732
motionpixels_decoder_select="dsputil"
1733 1734 1735 1736 1737 1738 1739 1740 1741 1742
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"
1743
mpc7_decoder_select="dsputil mpegaudiodsp"
1744
mpc8_decoder_select="mpegaudiodsp"
1745
mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
1746
mpeg_xvmc_decoder_select="mpeg2video_decoder"
1747
mpeg1video_decoder_select="error_resilience mpegvideo"
1748
mpeg1video_encoder_select="aandcttables mpegvideoenc"
1749
mpeg2video_decoder_select="error_resilience mpegvideo"
1750
mpeg2video_encoder_select="aandcttables mpegvideoenc"
1751 1752
mpeg4_decoder_select="h263_decoder mpeg4video_parser"
mpeg4_encoder_select="h263_encoder"
1753 1754
msmpeg4v1_decoder_select="h263_decoder"
msmpeg4v2_decoder_select="h263_decoder"
1755
msmpeg4v2_encoder_select="h263_encoder"
1756
msmpeg4v3_decoder_select="h263_decoder"
1757
msmpeg4v3_encoder_select="h263_encoder"
1758
mss2_decoder_select="error_resilience vc1_decoder"
1759
mxpeg_decoder_select="mjpeg_decoder"
1760
nellymoser_decoder_select="mdct sinewin"
1761
nellymoser_encoder_select="audio_frame_queue mdct sinewin"
1762
nuv_decoder_select="dsputil lzo"
1763 1764 1765
png_decoder_deps="zlib"
png_encoder_deps="zlib"
png_encoder_select="dsputil"
1766 1767
prores_decoder_select="dsputil"
prores_encoder_select="dsputil"
1768
qcelp_decoder_select="lsp"
1769
qdm2_decoder_select="mdct rdft mpegaudiodsp"
1770
ra_144_encoder_select="audio_frame_queue lpc"
1771
ralf_decoder_select="golomb"
1772
rv10_decoder_select="error_resilience h263_decoder h263dsp"
1773
rv10_encoder_select="h263_encoder"
1774
rv20_decoder_select="error_resilience h263_decoder h263dsp"
1775
rv20_encoder_select="h263_encoder"
1776 1777
rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpegvideo videodsp"
rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpegvideo videodsp"
1778
shorten_decoder_select="golomb"
1779
sipr_decoder_select="lsp"
1780
sp5x_decoder_select="mjpeg_decoder"
1781
svq1_decoder_select="hpeldsp"
1782
svq1_encoder_select="aandcttables dsputil hpeldsp mpegvideoenc"
1783 1784
svq3_decoder_select="h264_decoder hpeldsp mpegvideo"
svq3_decoder_suggest="zlib"
1785
tak_decoder_select="dsputil"
1786
theora_decoder_select="vp3_decoder"
1787
thp_decoder_select="mjpeg_decoder"
1788 1789
tiff_decoder_suggest="zlib"
tiff_encoder_suggest="zlib"
1790
truehd_decoder_select="mlp_decoder"
1791 1792
truemotion2_decoder_select="dsputil"
truespeech_decoder_select="dsputil"
1793
tscc_decoder_deps="zlib"
1794
twinvq_decoder_select="mdct lsp sinewin"
1795 1796 1797
utvideo_decoder_select="dsputil"
utvideo_encoder_select="dsputil huffman"
vble_decoder_select="dsputil"
1798
vc1_decoder_select="error_resilience h263_decoder h264chroma h264qpel intrax8"
1799
vc1image_decoder_select="vc1_decoder"
1800 1801
vorbis_decoder_select="mdct"
vorbis_encoder_select="mdct"
1802
vp3_decoder_select="hpeldsp vp3dsp videodsp"
1803 1804
vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp"
vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp"
1805 1806
vp6a_decoder_select="vp6_decoder"
vp6f_decoder_select="vp6_decoder"
1807
vp8_decoder_select="h264pred videodsp"
Ronald S. Bultje's avatar
Ronald S. Bultje committed
1808
vp9_decoder_select="videodsp"
Justin Ruggles's avatar
Justin Ruggles committed
1809
webp_decoder_select="vp8_decoder"
1810 1811 1812 1813 1814 1815
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"
1816
wmv1_decoder_select="h263_decoder"
1817
wmv1_encoder_select="h263_encoder"
1818
wmv2_decoder_select="h263_decoder intrax8 videodsp"
1819
wmv2_encoder_select="h263_encoder"
1820
wmv3_decoder_select="vc1_decoder"
1821
wmv3image_decoder_select="wmv3_decoder"
1822 1823 1824 1825 1826
zerocodec_decoder_deps="zlib"
zlib_decoder_deps="zlib"
zlib_encoder_deps="zlib"
zmbv_decoder_deps="zlib"
zmbv_encoder_deps="zlib"
1827

1828
# hardware accelerators
1829
dxva2_deps="dxva2api_h"
1830
vaapi_deps="va_va_h"
1831
vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
1832
vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore"
1833 1834
vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"

1835 1836 1837 1838
h263_vaapi_hwaccel_deps="vaapi"
h263_vaapi_hwaccel_select="h263_decoder"
h263_vdpau_hwaccel_deps="vdpau"
h263_vdpau_hwaccel_select="h263_decoder"
1839 1840
h264_dxva2_hwaccel_deps="dxva2"
h264_dxva2_hwaccel_select="h264_decoder"
1841 1842 1843 1844 1845 1846 1847 1848
h264_vaapi_hwaccel_deps="vaapi"
h264_vaapi_hwaccel_select="h264_decoder"
h264_vda_hwaccel_deps="vda"
h264_vda_hwaccel_select="h264_decoder"
h264_vdpau_hwaccel_deps="vdpau"
h264_vdpau_hwaccel_select="h264_decoder"
mpeg1_vdpau_hwaccel_deps="vdpau"
mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
1849 1850
mpeg2_dxva2_hwaccel_deps="dxva2"
mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
1851 1852 1853 1854 1855 1856 1857 1858
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"
1859 1860
vc1_dxva2_hwaccel_deps="dxva2"
vc1_dxva2_hwaccel_select="vc1_decoder"
1861 1862 1863 1864
vc1_vaapi_hwaccel_deps="vaapi"
vc1_vaapi_hwaccel_select="vc1_decoder"
vc1_vdpau_hwaccel_deps="vdpau"
vc1_vdpau_hwaccel_select="vc1_decoder"
1865 1866
wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
1867
wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
1868

1869
# parsers
1870
h264_parser_select="golomb h264chroma h264dsp h264pred h264qpel videodsp"
1871
mpeg4video_parser_select="error_resilience h263dsp mpegvideo"
1872
mpegvideo_parser_select="error_resilience mpegvideo"
1873
vc1_parser_select="mpegvideo"
1874

1875
# external libraries
1876
libfaac_encoder_deps="libfaac"
1877
libfaac_encoder_select="audio_frame_queue"
1878
libfdk_aac_decoder_deps="libfdk_aac"
1879
libfdk_aac_encoder_deps="libfdk_aac"
1880
libfdk_aac_encoder_select="audio_frame_queue"
1881 1882
libgsm_decoder_deps="libgsm"
libgsm_encoder_deps="libgsm"
1883 1884
libgsm_ms_decoder_deps="libgsm"
libgsm_ms_encoder_deps="libgsm"
1885 1886
libilbc_decoder_deps="libilbc"
libilbc_encoder_deps="libilbc"
1887
libmp3lame_encoder_deps="libmp3lame"
1888
libmp3lame_encoder_select="audio_frame_queue"
1889 1890
libopencore_amrnb_decoder_deps="libopencore_amrnb"
libopencore_amrnb_encoder_deps="libopencore_amrnb"
1891
libopencore_amrnb_encoder_select="audio_frame_queue"
1892
libopencore_amrwb_decoder_deps="libopencore_amrwb"
1893
libopenjpeg_decoder_deps="libopenjpeg"
1894
libopenjpeg_encoder_deps="libopenjpeg"
1895
libopus_decoder_deps="libopus"
1896
libopus_encoder_deps="libopus"
1897
libopus_encoder_select="audio_frame_queue"
1898 1899
libschroedinger_decoder_deps="libschroedinger"
libschroedinger_encoder_deps="libschroedinger"
1900
libspeex_decoder_deps="libspeex"
1901
libspeex_encoder_deps="libspeex"
1902
libspeex_encoder_select="audio_frame_queue"
1903
libtheora_encoder_deps="libtheora"
1904
libvo_aacenc_encoder_deps="libvo_aacenc"
1905
libvo_aacenc_encoder_select="audio_frame_queue"
1906
libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
1907
libvorbis_encoder_deps="libvorbis"
1908
libvorbis_encoder_select="audio_frame_queue"
1909 1910 1911 1912
libvpx_vp8_decoder_deps="libvpx"
libvpx_vp8_encoder_deps="libvpx"
libvpx_vp9_decoder_deps="libvpx"
libvpx_vp9_encoder_deps="libvpx"
1913
libwavpack_encoder_deps="libwavpack"
Justin Ruggles's avatar
Justin Ruggles committed
1914
libwebp_encoder_deps="libwebp"
1915
libx264_encoder_deps="libx264"
Derek Buitenhuis's avatar
Derek Buitenhuis committed
1916
libx265_encoder_deps="libx265"
1917
libxavs_encoder_deps="libxavs"
1918
libxvid_encoder_deps="libxvid"
1919

1920
# demuxers / muxers
1921
ac3_demuxer_select="ac3_parser"
1922
asf_demuxer_select="riffdec"
1923
asf_muxer_select="riffenc"
1924
asf_stream_muxer_select="asf_muxer"
1925
avi_demuxer_select="riffdec"
1926
avi_muxer_select="riffenc"
1927
avisynth_demuxer_deps="avisynth"
1928 1929
avisynth_demuxer_select="riffdec"
caf_demuxer_select="riffdec"
1930
dirac_demuxer_select="dirac_parser"
1931
dxa_demuxer_select="riffdec"
1932
eac3_demuxer_select="ac3_parser"
1933
f4v_muxer_select="mov_muxer"
1934
flac_demuxer_select="flac_parser"
1935
hds_muxer_select="flv_muxer"
1936
hls_muxer_select="mpegts_muxer"
1937
ipod_muxer_select="mov_muxer"
1938
ismv_muxer_select="mov_muxer"
1939
matroska_audio_muxer_select="matroska_muxer"
1940
matroska_demuxer_select="riffdec"
1941
matroska_demuxer_suggest="bzlib lzo zlib"
1942 1943
matroska_muxer_select="riffenc"
mmf_muxer_select="riffenc"
1944
mov_demuxer_select="riffdec"
1945
mov_demuxer_suggest="zlib"
1946
mov_muxer_select="riffenc rtpenc_chain"
1947
mp3_demuxer_select="mpegaudio_parser"
1948
mp4_muxer_select="mov_muxer"
1949
mpegts_muxer_select="adts_muxer latm_muxer"
1950 1951
mpegtsraw_demuxer_select="mpegts_demuxer"
mxf_d10_muxer_select="mxf_muxer"
1952
nut_muxer_select="riffenc"
1953
nuv_demuxer_select="riffdec"
1954
ogg_demuxer_select="golomb"
1955
psp_muxer_select="mov_muxer"
1956
rtp_demuxer_select="sdp_demuxer"
1957 1958
rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
rtsp_demuxer_select="http_protocol rtpdec"
1959
rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
Martin Storsjö's avatar
Martin Storsjö committed
1960
sap_demuxer_select="sdp_demuxer"
1961
sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
1962
sdp_demuxer_select="rtpdec"
1963
smoothstreaming_muxer_select="ismv_muxer"
1964
spdif_muxer_select="aac_parser"
1965
tak_demuxer_select="tak_parser"
1966 1967
tg2_muxer_select="mov_muxer"
tgp_muxer_select="mov_muxer"
1968
w64_demuxer_select="wav_demuxer"
1969
wav_demuxer_select="riffdec"
1970 1971
wav_muxer_select="riffenc"
webm_muxer_select="riffenc"
1972 1973 1974
wtv_demuxer_select="riffdec"
xmv_demuxer_select="riffdec"
xwma_demuxer_select="riffdec"
1975 1976

# indevs / outdevs
1977 1978 1979
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"
1980 1981
dv1394_indev_deps="dv1394"
dv1394_indev_select="dv_demuxer"
1982
fbdev_indev_deps="linux_fb_h"
1983
jack_indev_deps="jack_jack_h pthreads"
1984
libcdio_indev_deps="libcdio"
1985 1986 1987
libdc1394_indev_deps="libdc1394"
oss_indev_deps_any="soundcard_h sys_soundcard_h"
oss_outdev_deps_any="soundcard_h sys_soundcard_h"
1988
pulse_indev_deps="libpulse"
1989 1990
sndio_indev_deps="sndio_h"
sndio_outdev_deps="sndio_h"
1991
v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
1992
vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
1993
vfwcap_indev_extralibs="-lavicap32"
1994
x11grab_indev_deps="x11grab XShmCreateImage"
1995

1996
# protocols
Samuel Pitoiset's avatar
Samuel Pitoiset committed
1997 1998 1999
ffrtmpcrypt_protocol_deps="!librtmp_protocol"
ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
ffrtmpcrypt_protocol_select="tcp_protocol"
2000 2001
ffrtmphttp_protocol_deps="!librtmp_protocol"
ffrtmphttp_protocol_select="http_protocol"
2002
gopher_protocol_select="network"
2003
http_protocol_select="tcp_protocol"
2004
httpproxy_protocol_select="tcp_protocol"
2005
https_protocol_select="tls_protocol"
2006 2007 2008 2009 2010
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
2011
mmsh_protocol_select="http_protocol"
2012
mmst_protocol_select="network"
2013
rtmp_protocol_deps="!librtmp_protocol"
2014
rtmp_protocol_select="tcp_protocol"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2015
rtmpe_protocol_select="ffrtmpcrypt_protocol"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2016 2017
rtmps_protocol_deps="!librtmp_protocol"
rtmps_protocol_select="tls_protocol"
2018
rtmpt_protocol_select="ffrtmphttp_protocol"
2019
rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2020
rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2021
rtp_protocol_select="udp_protocol"
2022 2023
sctp_protocol_deps="struct_sctp_event_subscribe"
sctp_protocol_select="network"
2024
srtp_protocol_select="rtp_protocol"
2025
tcp_protocol_select="network"
2026 2027
tls_protocol_deps_any="openssl gnutls"
tls_protocol_select="tcp_protocol"
2028
udp_protocol_select="network"
2029 2030
unix_protocol_deps="sys_un_h"
unix_protocol_select="network"
2031

2032
# filters
2033
blackframe_filter_deps="gpl"
2034
boxblur_filter_deps="gpl"
2035
cropdetect_filter_deps="gpl"
2036
delogo_filter_deps="gpl"
2037
drawtext_filter_deps="libfreetype"
2038
frei0r_filter_deps="frei0r dlopen"
2039
frei0r_filter_extralibs='$ldl'
2040
frei0r_src_filter_deps="frei0r dlopen"
2041
frei0r_src_filter_extralibs='$ldl'
2042
hqdn3d_filter_deps="gpl"
2043
interlace_filter_deps="gpl"
2044
ocv_filter_deps="libopencv"
2045
resample_filter_deps="avresample"
2046
scale_filter_deps="swscale"
2047

2048
# examples
2049
avcodec_example_deps="avcodec avutil"
2050
filter_audio_example_deps="avfilter avutil"
2051
metadata_example_deps="avformat avutil"
2052
output_example_deps="avcodec avformat avutil swscale"
2053
transcode_aac_example_deps="avcodec avformat avresample"
2054

2055
# libraries
2056 2057 2058 2059 2060 2061
avcodec_deps="avutil"
avdevice_deps="avutil avcodec avformat"
avfilter_deps="avutil"
avformat_deps="avutil avcodec"
avresample_deps="avutil"
swscale_deps="avutil"
2062

2063
# programs
2064
avconv_deps="avcodec avfilter avformat avresample swscale"
2065
avconv_select="aformat_filter anull_filter asyncts_filter atrim_filter format_filter
2066
               fps_filter null_filter resample_filter scale_filter
2067
               setpts_filter trim_filter"
2068
avplay_deps="avcodec avformat avresample swscale sdl"
2069
avplay_libs='$sdl_libs'
Anton Khirnov's avatar
Anton Khirnov committed
2070
avplay_select="rdft"
2071
avprobe_deps="avcodec avformat"
2072 2073
avserver_deps="avformat fork !shared"
avserver_select="ffm_muxer rtp_protocol rtsp_demuxer"
Måns Rullgård's avatar
Måns Rullgård committed
2074

2075
# documentation
2076
pod2man_deps="doc"
2077 2078
texi2html_deps="doc"

Fabrice Bellard's avatar
Fabrice Bellard committed
2079
# default parameters
2080

2081
logfile="config.log"
2082 2083

# installation paths
2084 2085
prefix_default="/usr/local"
bindir_default='${prefix}/bin'
2086
datadir_default='${prefix}/share/avconv'
2087
docdir_default='${prefix}/share/doc/libav'
2088 2089 2090 2091
incdir_default='${prefix}/include'
libdir_default='${prefix}/lib'
mandir_default='${prefix}/share/man'
shlibdir_default="$libdir_default"
2092 2093

# toolchain
2094
ar_default="ar"
2095
cc_default="gcc"
2096
host_cc_default="gcc"
Mans Rullgard's avatar
Mans Rullgard committed
2097
cp_f="cp -f"
2098
ln_s="ln -s -f"
2099
nm_default="nm -g"
2100
objformat="elf"
2101
pkg_config_default=pkg-config
Michael Niedermayer's avatar
Michael Niedermayer committed
2102
ranlib="ranlib"
2103
strip="strip"
2104
yasmexe="yasm"
2105

2106
nogas=":"
2107

2108
# machine
2109
arch_default=$(uname -m)
2110
cpu="generic"
2111 2112

# OS
2113 2114
target_os_default=$(tolower $(uname -s))
host_os=$target_os_default
2115 2116

# configurable options
2117
enable $EXAMPLE_LIST $LIBRARY_LIST $PROGRAM_LIST
2118 2119 2120 2121

enable asm
enable debug
enable doc
2122
enable optimizations
2123
enable safe_bitstream_reader
2124
enable static
2125
enable swscale_alpha
2126

2127 2128 2129
# By default, enable only those hwaccels that have no external dependencies.
enable dxva2 vdpau

2130
# build settings
2131
SHFLAGS='-shared -Wl,-soname,$$(@F)'
2132 2133
LIBPREF="lib"
LIBSUF=".a"
2134 2135
FULLNAME='$(NAME)$(BUILDSUF)'
LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
2136 2137
SLIBPREF="lib"
SLIBSUF=".so"
2138
SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
2139 2140
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
Måns Rullgård's avatar
Måns Rullgård committed
2141
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2142 2143
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2144

2145 2146
asflags_filter=echo
cflags_filter=echo
2147 2148
ldflags_filter=echo

2149
AS_C='-c'
2150
AS_O='-o $@'
2151
CC_C='-c'
2152
CC_E='-E -o $@'
2153
CC_O='-o $@'
2154
LD_O='-o $@'
2155 2156
LD_LIB='-l%'
LD_PATH='-L'
2157
HOSTCC_C='-c'
2158
HOSTCC_E='-E -o $@'
2159
HOSTCC_O='-o $@'
2160
HOSTLD_O='-o $@'
2161

2162
host_libs='-lm'
2163 2164
host_cflags_filter=echo
host_ldflags_filter=echo
2165

2166
target_path='$(CURDIR)'
2167

2168 2169
# 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
2170 2171
DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< | sed -e "/^\#.*/d" -e "s,^[[:space:]]*$(*F)\\.o,$(@D)/$(*F).o," > $(@:.o=.d)'
DEPFLAGS='-MM'
2172

2173
# find source path
2174
if test -f configure; then
2175
    source_path=.
2176
else
2177
    source_path=$(cd $(dirname "$0"); pwd)
2178
    echo "$source_path" | grep -q '[[:blank:]]' &&
2179
        die "Out of tree builds are impossible with whitespace in source path."
2180 2181
    test -e "$source_path/config.h" &&
        die "Out of tree builds are impossible with config.h in source dir."
2182 2183
fi

2184
for v in "$@"; do
2185 2186 2187
    r=${v#*=}
    l=${v%"$r"}
    r=$(sh_quote "$r")
2188
    LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
2189
done
2190

2191 2192 2193 2194
find_things(){
    thing=$1
    pattern=$2
    file=$source_path/$3
2195
    sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2196 2197 2198 2199
}

ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2200
HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
2201 2202 2203 2204
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)
2205 2206
OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2207
PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
2208
FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2209

2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223
ALL_COMPONENTS="
    $BSF_LIST
    $DECODER_LIST
    $DEMUXER_LIST
    $ENCODER_LIST
    $FILTER_LIST
    $HWACCEL_LIST
    $INDEV_LIST
    $MUXER_LIST
    $OUTDEV_LIST
    $PARSER_LIST
    $PROTOCOL_LIST
"

2224 2225 2226 2227 2228 2229
for n in $COMPONENT_LIST; do
    v=$(toupper ${n%s})_LIST
    eval enable \$$v
    eval ${n}_if_any="\$$v"
done

2230
enable $ARCH_EXT_LIST
2231 2232 2233 2234 2235 2236 2237

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

2238 2239 2240 2241
print_3_columns() {
    cat | tr ' ' '\n' | sort | pr -r -3 -t
}

2242
show_list() {
Ramiro Polla's avatar
Ramiro Polla committed
2243 2244
    suffix=_$1
    shift
2245
    echo $* | sed s/$suffix//g | print_3_columns
2246 2247 2248
    exit 0
}

2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269
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 }")
}

2270
for opt do
2271 2272
    optval="${opt#*=}"
    case "$opt" in
2273 2274
        --extra-ldflags=*)
            add_ldflags $optval
2275
        ;;
2276 2277
        --extra-libs=*)
            add_extralibs $optval
2278
        ;;
2279 2280
        --disable-devices)
            disable $INDEV_LIST $OUTDEV_LIST
2281
        ;;
2282 2283
        --enable-debug=*)
            debuglevel="$optval"
2284 2285 2286 2287 2288 2289 2290
        ;;
        --disable-programs)
            disable $PROGRAM_LIST
        ;;
        --disable-everything)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
        ;;
2291 2292 2293 2294
        --disable-all)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
            disable $LIBRARY_LIST $PROGRAM_LIST doc
        ;;
2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340
        --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)
        ;;
        --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
        ;;
2341
    esac
2342 2343
done

2344 2345
disabled logging && logfile=/dev/null

2346
echo "# $0 $LIBAV_CONFIGURATION" > $logfile
2347 2348
set >> $logfile

2349 2350
test -n "$cross_prefix" && enable cross_compile

2351 2352 2353 2354 2355
if enabled cross_compile; then
    test -n "$arch" && test -n "$target_os" ||
        die "Must specify target arch and OS when cross-compiling"
fi

2356
ar_default="${cross_prefix}${ar_default}"
2357
cc_default="${cross_prefix}${cc_default}"
Måns Rullgård's avatar
Måns Rullgård committed
2358
nm_default="${cross_prefix}${nm_default}"
2359
pkg_config_default="${cross_prefix}${pkg_config_default}"
2360
ranlib="${cross_prefix}${ranlib}"
2361
strip="${cross_prefix}${strip}"
2362

2363 2364
sysinclude_default="${sysroot}/usr/include"

2365
case "$toolchain" in
2366 2367
    clang-asan)
        cc_default="clang"
2368 2369
        add_cflags  -fsanitize=address
        add_ldflags -fsanitize=address
2370 2371 2372
    ;;
    clang-tsan)
        cc_default="clang"
2373 2374
        add_cflags  -fsanitize=thread -pie
        add_ldflags -fsanitize=thread -pie
2375
    ;;
2376 2377 2378 2379 2380
    clang-usan)
        cc_default="clang"
        add_cflags  -fsanitize=undefined
        add_ldflags -fsanitize=undefined
    ;;
2381 2382 2383 2384 2385 2386 2387 2388 2389 2390
    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
    ;;
2391 2392 2393 2394 2395
    gcc-usan)
        cc_default="gcc"
        add_cflags  -fsanitize=undefined
        add_ldflags -fsanitize=undefined
    ;;
2396 2397 2398 2399
    valgrind-massif)
        target_exec_default="valgrind"
        target_exec_args="--alloc-fn=av_malloc --alloc-fn=av_mallocz"
    ;;
2400 2401 2402 2403
    valgrind-memcheck)
        target_exec_default="valgrind"
        target_exec_args="--track-origins=yes --leak-check=full"
    ;;
2404
    msvc)
2405 2406
        # Check whether the current MSVC version needs the C99 converter.
        # From MSVC 2013 (compiler major version 18) onwards, it does actually
2407
        # support enough of C99 to build libav. Default to the new
2408 2409 2410 2411 2412
        # 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
2413
            cc_default="cl"
2414 2415 2416
        else
            cc_default="c99wrap cl"
        fi
2417
        ld_default="link"
2418
        nm_default="dumpbin -symbols"
2419
        ar_default="lib"
2420
        target_os_default="win32"
2421 2422 2423 2424 2425
        # 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=.
2426
    ;;
2427
    icl)
2428 2429
        cc_default="icl"
        ld_default="xilink"
2430 2431 2432
        nm_default="dumpbin -symbols"
        ar_default="xilib"
        target_os_default="win32"
2433
        TMPDIR=.
2434
    ;;
2435 2436 2437 2438
    gcov)
        add_cflags  -fprofile-arcs -ftest-coverage
        add_ldflags -fprofile-arcs -ftest-coverage
    ;;
2439
    hardened)
2440
        add_cflags  -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all
2441 2442
        add_ldflags -Wl,-z,relro -Wl,-z,now
    ;;
2443 2444 2445 2446 2447
    ?*)
        die "Unknown toolchain $toolchain"
    ;;
esac

2448
set_default arch cc pkg_config sysinclude target_exec target_os
2449 2450
enabled cross_compile || host_cc_default=$cc
set_default host_cc
2451

2452 2453 2454 2455 2456
if ! $pkg_config --version >/dev/null 2>&1; then
    warn "$pkg_config not found, library detection may fail."
    pkg_config=false
fi

2457 2458
exesuf() {
    case $1 in
2459
        mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
2460 2461 2462 2463 2464
    esac
}

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

2466
# set temporary file name
2467
: ${TMPDIR:=$TEMPDIR}
2468
: ${TMPDIR:=$TMP}
2469
: ${TMPDIR:=/tmp}
2470

2471
if ! check_cmd mktemp -u XXXXXX; then
2472 2473 2474
    # simple replacement for missing mktemp
    # NOT SAFE FOR GENERAL USE
    mktemp(){
2475
        echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
2476 2477 2478 2479 2480 2481
    }
fi

tmpfile(){
    tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
        (set -C; exec > $tmp) 2>/dev/null ||
2482
        die "Unable to create temporary file in $TMPDIR."
2483 2484 2485 2486 2487 2488
    append TMPFILES $tmp
    eval $1=$tmp
}

trap 'rm -f -- $TMPFILES' EXIT

2489
tmpfile TMPASM .asm
2490 2491 2492 2493 2494 2495 2496
tmpfile TMPC   .c
tmpfile TMPE   $EXESUF
tmpfile TMPH   .h
tmpfile TMPO   .o
tmpfile TMPS   .S
tmpfile TMPSH  .sh
tmpfile TMPV   .ver
2497 2498

unset -f mktemp
2499

2500 2501
chmod +x $TMPE

2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514
# 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

2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532
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
2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544
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
}

2545
msvc_common_flags(){
2546 2547
    for flag; do
        case $flag in
2548 2549 2550 2551 2552 2553
            # 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
2554
            -fomit-frame-pointer) ;;
2555 2556 2557 2558
            -g)                   echo -Z7 ;;
            -fno-math-errno)      ;;
            -fno-common)          ;;
            -fno-signed-zeros)    ;;
2559
            -fPIC)                ;;
2560 2561
            -mthumb)              ;;
            -march=*)             ;;
2562
            -lz)                  echo zlib.lib ;;
2563 2564
            -lavifil32)           echo vfw32.lib ;;
            -lavicap32)           echo vfw32.lib user32.lib ;;
2565 2566 2567 2568 2569 2570
            -l*)                  echo ${flag#-l}.lib ;;
            *)                    echo $flag ;;
        esac
    done
}

2571 2572 2573 2574
msvc_flags(){
    msvc_common_flags "$@"
    for flag; do
        case $flag in
2575
            -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
2576 2577
                                       -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
                                       -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
2578
                                       -wd4273 ;;
2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594
        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
}

2595 2596 2597
pgi_flags(){
    for flag; do
        case $flag in
2598
            -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622
            -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   ;;
2623 2624
                    corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
                    corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
2625
                    amdfam10|barcelona|bdver*) echo -xarch=sse4_1        ;;
2626
                    athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
2627
                    k8|opteron|athlon64|athlon-fx)
2628 2629
                                               echo -xarch=sse2a         ;;
                    athlon*)                   echo -xarch=pentium_proa  ;;
2630 2631 2632 2633 2634 2635
                esac
                ;;
            -std=c99)             echo -xc99              ;;
            -fomit-frame-pointer) echo -xregs=frameptr    ;;
            -fPIC)                echo -KPIC -xcode=pic32 ;;
            -W*,*)                echo $flag              ;;
2636 2637
            -f*-*|-W*|-mimpure-text)                      ;;
            -shared)              echo -G                 ;;
2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659
            *)                    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        ;;
2660
            -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
2661 2662 2663 2664
            -msoft-float)   echo --float_support=vfplib       ;;
            -O[0-3]|-mf=*)  echo $flag                        ;;
            -g)             echo -g -mn                       ;;
            -pds=*)         echo $flag                        ;;
2665 2666 2667
            -D*|-I*)        echo $flag                        ;;
            --gcc|--abi=*)  echo $flag                        ;;
            -me)            echo $flag                        ;;
2668 2669 2670 2671
        esac
    done
}

2672 2673 2674 2675
probe_cc(){
    pfx=$1
    _cc=$2

2676 2677
    unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
    unset _ld_o _ldflags _ld_lib _ld_path
2678
    unset _depflags _DEPCMD _DEPFLAGS
2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699
    _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'
2700
    elif $_cc --version 2>/dev/null | grep -q ^icc; then
2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717
        _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'
2718
        _flags_filter=ccc_flags
2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734
    elif $_cc --vsn 2>/dev/null | grep -q "ARM C/C++ Compiler"; then
        test -d "$sysroot" || die "No valid sysroot specified."
        _type=armcc
        _ident=$($_cc --vsn | head -n1)
        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'
2735
    elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
2736 2737 2738
        _type=tms470
        _ident=$($_cc -version | head -n1 | tr -s ' ')
        _flags='--gcc --abi=eabi -me'
2739
        _cc_e='-ppl -fe=$@'
2740 2741 2742 2743 2744 2745 2746 2747
        _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)
2748
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2749 2750 2751 2752 2753 2754
        _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)'
2755
        _DEPFLAGS='-xM1 -xc99'
2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776
        _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 }')"
2777
        opt_common='-alias=ansi -Mdse -Mlre -Mpre'
2778 2779 2780 2781
        _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
        _cflags_size="-O2 -Munroll=c:1 $opt_common"
        _cflags_noopt="-O1"
        _flags_filter=pgi_flags
2782 2783 2784 2785 2786 2787 2788 2789
    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
2790
            _ld_o='-out:$@'
2791 2792 2793
        else
            _ld_o='-Fe$@'
        fi
2794 2795
        _cc_o='-Fo$@'
        _cc_e='-P -Fi$@'
2796 2797 2798 2799
        _flags_filter=msvc_flags
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
        _flags='-nologo'
2800
        _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
2801
        if [ $pfx = hostcc ]; then
2802
            append _cflags -Dsnprintf=_snprintf
2803
        fi
2804 2805 2806 2807
    elif $_cc 2>&1 | grep -q Intel; then
        _type=icl
        _ident=$($cc 2>&1 | head -n1)
        _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
2808 2809
        # Not only is O3 broken on 13.x+ but it is slower on all previous
        # versions (tested) as well.
2810 2811 2812
        _cflags_speed="-O2"
        _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
        if $_cc 2>&1 | grep -q Linker; then
2813
            _ld_o='-out:$@'
2814 2815 2816
        else
            _ld_o='-Fe$@'
        fi
2817
        _cc_o='-Fo$@'
2818
        _cc_e='-P'
2819
        _flags_filter=icl_flags
2820 2821
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
2822
        # -Qdiag-error to make icl error when seeing certain unknown arguments
2823
        _flags='-nologo -Qdiag-error:4044,10157'
2824 2825
        # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency
        # with MSVC which enables it by default.
2826
        _cflags='-D_USE_MATH_DEFINES -FIstdlib.h -Dstrtoll=_strtoi64 -Qms0 -Qvec- -Qsimd- -GS'
2827 2828 2829
        if [ $pfx = hostcc ]; then
            append _cflags -Dsnprintf=_snprintf
        fi
Luca Barbato's avatar
Luca Barbato committed
2830 2831 2832 2833 2834 2835 2836
    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
2837
    fi
2838 2839 2840 2841 2842 2843

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

set_ccvars(){
2844
    eval ${1}_C=\${_cc_c-\${${1}_C}}
2845
    eval ${1}_E=\${_cc_e-\${${1}_E}}
2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869
    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
2870

2871 2872
test -n "$cc_type" && enable $cc_type ||
    warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
2873

2874
: ${as_default:=$cc}
2875
: ${dep_cc_default:=$cc}
2876
: ${ld_default:=$cc}
2877 2878
: ${host_ld_default:=$host_cc}
set_default ar as dep_cc ld host_ld
2879

2880 2881 2882 2883 2884 2885 2886 2887 2888
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
2889
LD_O=${_ld_o-$LD_O}
2890 2891
LD_LIB=${_ld_lib-$LD_LIB}
LD_PATH=${_ld_path-$LD_PATH}
2892

2893 2894 2895 2896 2897
probe_cc hostld "$host_ld"
host_ldflags_filter=$_flags_filter
add_host_ldflags $_flags $_ldflags
HOSTLD_O=${_ld_o-$HOSTLD_O}

2898 2899 2900 2901 2902 2903
if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
    probe_cc depcc "$dep_cc"
    CCDEP=${_DEPCMD:-$DEPCMD}
    CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
    DEPCCFLAGS=$_flags
fi
2904

2905 2906 2907 2908 2909 2910
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='$@'
2911 2912 2913
elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then
    arflags='-Xany -r -c'
    ar_o='$@'
2914 2915 2916 2917 2918
else
    arflags="rc"
    ar_o='$@'
fi

2919
add_cflags $extra_cflags
2920
add_asflags $extra_cflags
2921

2922 2923
if test -n "$sysroot"; then
    case "$cc_type" in
2924
        gcc|llvm_gcc|clang)
2925
            add_cppflags --sysroot="$sysroot"
2926 2927
            add_ldflags --sysroot="$sysroot"
        ;;
2928 2929 2930 2931
        tms470)
            add_cppflags -I"$sysinclude"
            add_ldflags  --sysroot="$sysroot"
        ;;
2932 2933 2934
    esac
fi

2935
if test "$cpu" = host; then
2936 2937
    enabled cross_compile &&
        die "--cpu=host makes no sense when cross-compiling."
2938 2939

    case "$cc_type" in
2940
        gcc|llvm_gcc)
2941 2942
            check_native(){
                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
2943
                sed -n "/cc1.*$1=/{
2944 2945 2946 2947
                            s/.*$1=\\([^ ]*\\).*/\\1/
                            p
                            q
                        }" $TMPE
2948 2949 2950 2951 2952
            }
            cpu=$(check_native -march || check_native -mcpu)
        ;;
    esac

2953 2954
    test "${cpu:-host}" = host &&
        die "--cpu=host not supported with compiler $cc"
2955 2956
fi

2957 2958
# Deal with common $arch aliases
case "$arch" in
2959 2960 2961
    aarch64|arm64)
        arch="aarch64"
    ;;
2962 2963 2964
    arm*)
        arch="arm"
    ;;
2965
    mips*|IP*)
2966 2967
        arch="mips"
    ;;
2968
    parisc*|hppa*)
2969 2970
        arch="parisc"
    ;;
2971
    "Power Macintosh"|ppc*|powerpc*)
2972 2973 2974 2975 2976 2977 2978 2979
        arch="ppc"
    ;;
    s390|s390x)
        arch="s390"
    ;;
    sh4|sh)
        arch="sh4"
    ;;
2980
    sun4u|sparc*)
2981 2982
        arch="sparc"
    ;;
2983 2984 2985
    tilegx|tile-gx)
        arch="tilegx"
    ;;
2986
    i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
2987 2988 2989 2990
        arch="x86"
    ;;
esac

2991
is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
2992
enable $arch
2993

2994
# Add processor-specific flags
2995
if enabled aarch64; then
2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011

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

elif enabled alpha; then

    cpuflags="-mcpu=$cpu"

elif enabled arm; then

3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042
    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)

3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056
    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   ;;
3057
                *)                             subarch=$(probe_arm_arch) ;;
3058 3059 3060 3061
            esac
        ;;
    esac

3062 3063 3064 3065 3066
    case "$subarch" in
        armv5t*)    enable fast_clz                ;;
        armv[6-8]*) enable fast_clz fast_unaligned ;;
    esac

3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095
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"

3096
elif enabled ppc; then
3097

3098 3099
    case $(tolower $cpu) in
        601|ppc601|powerpc601)
Måns Rullgård's avatar
Måns Rullgård committed
3100
            cpuflags="-mcpu=601"
3101
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3102
        ;;
3103
        603*|ppc603*|powerpc603*)
Måns Rullgård's avatar
Måns Rullgård committed
3104
            cpuflags="-mcpu=603"
3105
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3106
        ;;
3107
        604*|ppc604*|powerpc604*)
Måns Rullgård's avatar
Måns Rullgård committed
3108
            cpuflags="-mcpu=604"
3109
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3110
        ;;
3111
        g3|75*|ppc75*|powerpc75*)
3112
            cpuflags="-mcpu=750"
3113
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3114
        ;;
3115
        g4|745*|ppc745*|powerpc745*)
3116
            cpuflags="-mcpu=7450"
Måns Rullgård's avatar
Måns Rullgård committed
3117
        ;;
3118
        74*|ppc74*|powerpc74*)
3119
            cpuflags="-mcpu=7400"
Måns Rullgård's avatar
Måns Rullgård committed
3120
        ;;
3121
        g5|970|ppc970|powerpc970)
3122
            cpuflags="-mcpu=970"
Måns Rullgård's avatar
Måns Rullgård committed
3123
        ;;
3124
        power[3-7]*)
3125
            cpuflags="-mcpu=$cpu"
3126
        ;;
3127
        cell)
Måns Rullgård's avatar
Måns Rullgård committed
3128 3129 3130
            cpuflags="-mcpu=cell"
            enable ldbrx
        ;;
3131 3132 3133 3134
        e500mc)
            cpuflags="-mcpu=e500mc"
            disable altivec
        ;;
3135 3136 3137 3138 3139 3140 3141 3142
        e500v2)
            cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
            disable altivec
        ;;
        e500)
            cpuflags="-mcpu=8540 -mhard-float"
            disable altivec
        ;;
Måns Rullgård's avatar
Måns Rullgård committed
3143
    esac
3144

3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155
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

3156 3157
elif enabled x86; then

Måns Rullgård's avatar
Måns Rullgård committed
3158 3159 3160 3161 3162
    case $cpu in
        i[345]86|pentium)
            cpuflags="-march=$cpu"
            disable mmx
        ;;
3163
        # targets that do NOT support nopl and conditional mov (cmov)
Måns Rullgård's avatar
Måns Rullgård committed
3164 3165
        pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
            cpuflags="-march=$cpu"
3166
            disable i686
Måns Rullgård's avatar
Måns Rullgård committed
3167
        ;;
3168
        # targets that do support nopl and conditional mov (cmov)
3169
        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
3170
            cpuflags="-march=$cpu"
3171
            enable i686
Måns Rullgård's avatar
Måns Rullgård committed
3172 3173 3174 3175 3176
            enable fast_cmov
        ;;
        # targets that do support conditional mov but on which it's slow
        pentium4|pentium4m|prescott|nocona)
            cpuflags="-march=$cpu"
3177
            enable i686
Måns Rullgård's avatar
Måns Rullgård committed
3178 3179 3180
            disable fast_cmov
        ;;
    esac
3181 3182 3183

fi

3184 3185 3186 3187
if [ "$cpu" != generic ]; then
    add_cflags  $cpuflags
    add_asflags $cpuflags
fi
3188

3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201
# 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

3202
add_cppflags -D_ISOC99_SOURCE
3203
check_cflags -std=c99
3204
check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
3205 3206
#include <stdlib.h>
EOF
3207
check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
3208 3209
#include <stdlib.h>
EOF
3210

3211
add_host_cppflags -D_ISOC99_SOURCE
3212
check_host_cflags -std=c99
3213
check_host_cflags -Wall
3214
check_host_cflags -O3
3215

3216 3217 3218 3219 3220 3221 3222 3223
check_64bit(){
    arch32=$1
    arch64=$2
    expr=$3
    check_code cc "" "int test[2*($expr) - 1]" &&
        subarch=$arch64 || subarch=$arch32
}

3224
case "$arch" in
3225
    aarch64|alpha|ia64)
3226 3227 3228 3229
        spic=$shared
    ;;
    mips)
        check_64bit mips mips64 '_MIPS_SIM > 1'
3230
        spic=$shared
3231
    ;;
3232 3233 3234 3235
    parisc)
        check_64bit parisc parisc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
3236 3237
    ppc)
        check_64bit ppc ppc64 'sizeof(void *) > 4'
3238
        spic=$shared
3239
    ;;
3240 3241 3242 3243
    s390)
        check_64bit s390 s390x 'sizeof(void *) > 4'
        spic=$shared
    ;;
3244 3245 3246 3247
    sparc)
        check_64bit sparc sparc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
3248
    x86)
3249
        check_64bit x86_32 x86_64 'sizeof(void *) > 4'
3250
        if test "$subarch" = "x86_64"; then
3251
            spic=$shared
3252
        fi
3253 3254 3255
    ;;
esac

3256
enable $subarch
3257
enabled spic && enable_weak pic
3258

3259
# OS specific
3260
case $target_os in
3261
    aix)
3262
        SHFLAGS=-shared
3263
        add_cppflags '-I\$(SRC_PATH)/compat/aix'
3264
        enabled shared && add_ldflags -Wl,-brtl
3265
        ;;
3266
    haiku)
3267
        prefix_default="/boot/common"
3268
        network_extralibs="-lnetwork"
François Revol's avatar
François Revol committed
3269
        host_libs=
3270
        ;;
3271
    sunos)
3272
        SHFLAGS='-shared -Wl,-h,$$(@F)'
3273
        enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
3274
        network_extralibs="-lsocket -lnsl"
3275 3276 3277 3278 3279
        # 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.
3280 3281 3282
        enabled_all suncc x86 &&
            echo "hwcap_1 = OVERRIDE;" > mapfile &&
            add_ldflags -Wl,-M,mapfile
3283
        nm_default='nm -P -g'
3284 3285
        ;;
    netbsd)
3286
        disable symver
3287 3288
        oss_indev_extralibs="-lossaudio"
        oss_outdev_extralibs="-lossaudio"
3289
        ;;
3290
    openbsd|bitrig)
3291
        disable symver
3292
        SHFLAGS='-shared'
3293
        SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
3294
        SLIB_INSTALL_LINKS=
3295 3296
        oss_indev_extralibs="-lossaudio"
        oss_outdev_extralibs="-lossaudio"
3297
        ;;
3298 3299 3300 3301
    dragonfly)
        disable symver
        ;;
    freebsd)
3302 3303
        ;;
    bsd/os)
3304
        add_extralibs -lpoll -lgnugetopt
3305 3306
        ;;
    darwin)
3307
        gas="gas-preprocessor.pl $cc"
3308
        enabled ppc && add_asflags -force_cpusubtype_ALL
3309
        SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
3310
        enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
3311
        add_ldflags -Wl,-dynamic,-search_paths_first
3312 3313 3314
        SLIBSUF=".dylib"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
Loren Merritt's avatar
Loren Merritt committed
3315
        objformat="macho"
3316
        enabled x86_64 && objformat="macho64"
3317
        enabled_any pic shared ||
3318
            { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
3319 3320
        ;;
    mingw32*)
3321
        if test $target_os = "mingw32ce"; then
3322 3323 3324 3325
            disable network
        else
            target_os=mingw32
        fi
3326
        LIBTARGET=i386
3327
        if enabled x86_64; then
3328
            LIBTARGET="i386:x86-64"
3329
        elif enabled arm; then
3330
            LIBTARGET=arm-wince
3331
        fi
3332 3333
        check_ldflags -Wl,--nxcompat
        check_ldflags -Wl,--dynamicbase
3334
        shlibdir_default="$bindir_default"
3335 3336 3337 3338
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3339
        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)'
3340 3341 3342 3343
        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)'
3344
        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
3345
        objformat="win32"
3346
        dlltool="${cross_prefix}dlltool"
3347
        ranlib=:
3348
        enable dos_paths
3349
        ;;
3350
    win32|win64)
3351
        disable symver
3352 3353 3354 3355
        if enabled shared; then
            # Link to the import library instead of the normal static library
            # for shared libs.
            LD_LIB='%.lib'
3356
            # Cannot build both shared and static libs with MSVC or icl.
3357 3358 3359 3360 3361 3362 3363
            disable static
        fi
        shlibdir_default="$bindir_default"
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3364
        SLIB_CREATE_DEF_CMD='$(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
3365 3366 3367 3368 3369
        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)'
3370 3371 3372 3373
        objformat="win32"
        ranlib=:
        enable dos_paths
        ;;
3374
    cygwin*)
3375
        target_os=cygwin
3376
        shlibdir_default="$bindir_default"
3377 3378 3379 3380
        SLIBPREF="cyg"
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3381 3382 3383 3384
        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
3385
        objformat="win32"
3386
        enable dos_paths
3387
        ;;
3388 3389
    *-dos|freedos|opendos)
        network_extralibs="-lsocket"
3390
        objformat="coff"
3391
        enable dos_paths
3392
        add_cppflags -U__STRICT_ANSI__
3393
        ;;
3394 3395 3396 3397
    linux)
        enable dv1394
        ;;
    irix*)
3398
        target_os=irix
3399 3400
        ranlib="echo ignoring ranlib"
        ;;
3401 3402
    os/2*)
        ln_s="cp -f"
3403
        objformat="aout"
3404
        add_cppflags -D_GNU_SOURCE
3405
        add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
3406
        SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
3407
        LIBSUF="_s.a"
3408 3409 3410 3411
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
3412
        SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
3413 3414 3415 3416 3417
            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'
3418
        SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
3419
            emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
3420
        SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
3421
        enable dos_paths
3422
        ;;
3423
    gnu/kfreebsd)
3424
        add_cppflags -D_BSD_SOURCE
3425
        ;;
3426 3427
    gnu)
        ;;
3428 3429 3430 3431
    qnx)
        add_cppflags -D_QNX_SOURCE
        network_extralibs="-lsocket"
        ;;
3432 3433 3434
    symbian)
        SLIBSUF=".dll"
        enable dos_paths
3435 3436 3437 3438 3439 3440 3441 3442
        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
3443
        ;;
3444 3445 3446
    osf1)
        add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
        ;;
3447 3448
    minix)
        ;;
Mans Rullgard's avatar
Mans Rullgard committed
3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460
    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
        disable avserver
        cp_f='cp'
        ;;
3461 3462
    none)
        ;;
3463
    *)
3464
        die "Unknown OS '$target_os'."
3465 3466 3467
        ;;
esac

3468 3469
# determine libc flavour

3470 3471
probe_libc(){
    pfx=$1
3472
    pfx_no_=${pfx%_}
3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486
    # 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
3487
        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3488 3489
        eval test \$${pfx_no_}cc_type = "gcc" &&
            add_${pfx}cppflags -D__printf__=__gnu_printf__
3490 3491
    elif check_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
         check_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
3492 3493 3494 3495
        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."
3496
        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3497 3498
        eval test \$${pfx_no_}cc_type = "gcc" &&
            add_${pfx}cppflags -D__printf__=__gnu_printf__
3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512
    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
3513
    elif check_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
3514 3515 3516 3517
        eval ${pfx}libc_type=solaris
        add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
    fi
}
3518

3519
probe_libc
3520
test -n "$libc_type" && enable libc_$libc_type
3521 3522
probe_libc host_
test -n "$host_libc_type" && enable host_libc_$host_libc_type
3523

3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535
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

3536 3537
# hacks for compiler/libc/os combinations

3538
if enabled_all tms470 libc_glibc; then
3539
    CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
3540 3541 3542 3543 3544 3545
    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

3546
if enabled_all ccc libc_glibc; then
3547 3548 3549
    add_ldflags -Wl,-z,now  # calls to libots crash without this
fi

3550 3551 3552
check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
    add_cppflags '-I\$(SRC_PATH)/compat/float'

3553 3554 3555 3556 3557
esc(){
    echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
}

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

3559
check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
3560

3561
set_default $PATHS_LIST
3562
set_default nm
3563

3564
# we need to build at least one lib type
3565
if ! enabled_any static shared; then
3566 3567 3568 3569 3570 3571 3572 3573 3574
    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

3575
die_license_disabled() {
3576
    enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
3577 3578
}

3579
die_license_disabled gpl libcdio
3580
die_license_disabled gpl libx264
Derek Buitenhuis's avatar
Derek Buitenhuis committed
3581
die_license_disabled gpl libx265
3582
die_license_disabled gpl libxavs
3583 3584 3585
die_license_disabled gpl libxvid
die_license_disabled gpl x11grab

3586
die_license_disabled nonfree libfaac
3587
die_license_disabled nonfree libfdk_aac
3588
die_license_disabled nonfree openssl
3589

3590 3591
die_license_disabled version3 libopencore_amrnb
die_license_disabled version3 libopencore_amrwb
3592
die_license_disabled version3 libvo_aacenc
3593
die_license_disabled version3 libvo_amrwbenc
3594

3595
enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
3596

3597
disabled optimizations || check_cflags -fomit-frame-pointer
3598

3599 3600
enable_weak_pic() {
    disabled pic && return
3601
    enable pic
3602
    add_cppflags -DPIC
3603 3604 3605 3606 3607 3608 3609
    case "$target_os" in
    mingw*|cygwin*)
        ;;
    *)
        add_cflags -fPIC
        ;;
    esac
3610
    add_asflags  -fPIC
3611 3612
}

3613
enabled pic && enable_weak_pic
3614

3615 3616 3617
check_cc <<EOF || die "Symbol mangling check failed."
int ff_extern;
EOF
3618
sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
3619 3620
extern_prefix=${sym%%ff_extern*}

3621
check_cc <<EOF && enable_weak inline_asm
3622 3623
void foo(void) { __asm__ volatile ("" ::); }
EOF
3624

3625 3626 3627 3628 3629 3630 3631
_restrict=
for restrict_keyword in restrict __restrict__ __restrict; do
    check_cc <<EOF && _restrict=$restrict_keyword && break
void foo(char * $restrict_keyword p);
EOF
done

3632
check_cc <<EOF && enable pragma_deprecated
3633
void foo(void) { _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") }
3634 3635
EOF

3636 3637 3638 3639
check_cc <<EOF && enable attribute_packed
struct { int x; } __attribute__((packed)) x;
EOF

3640 3641 3642 3643
check_cc <<EOF && enable attribute_may_alias
union { int x; } __attribute__((may_alias)) x;
EOF

3644 3645 3646
check_cc <<EOF || die "endian test failed"
unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
EOF
3647
od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
3648

3649 3650
check_inline_asm inline_asm_labels '"1:\n"'

3651 3652 3653 3654 3655 3656 3657 3658
if enabled aarch64; then
    # 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
3659 3660 3661 3662

    check_cflags -mieee

elif enabled arm; then
3663

3664
    check_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb
3665
    enabled thumb && check_cflags -mthumb || check_cflags -marm
3666
    nogas=die
3667

3668 3669 3670 3671 3672 3673
    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 ;;
3674 3675 3676
__asm__ (".eabi_attribute 28, 1");
int main(void) { return 0; }
EOF
3677 3678 3679
        esac
        warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
    fi
3680

3681 3682 3683 3684
    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'
3685
    enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
3686 3687
    enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'

3688 3689 3690
    [ $target_os = linux ] ||
        map 'enabled_any ${v}_external ${v}_inline || disable $v' \
            $ARCH_EXT_LIST_ARM
3691

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

3694
    [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
3695

3696
elif enabled mips; then
3697

3698
    check_inline_asm loongson '"dmult.g $1, $2, $3"'
3699

3700 3701 3702 3703 3704 3705 3706 3707
elif enabled parisc; then

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

3708
elif enabled ppc; then
3709

3710 3711
    enable local_aligned_8 local_aligned_16

3712 3713 3714 3715
    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)'
3716 3717 3718

    # AltiVec flags: The FSF version of GCC differs from the Apple version
    if enabled altivec; then
3719
        nogas=warn
3720 3721 3722 3723 3724 3725 3726 3727
        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) {
3728 3729 3730
    vector signed int v1 = (vector signed int) { 0 };
    vector signed int v2 = (vector signed int) { 1 };
    v1 = vec_add(v1, v2);
3731 3732 3733 3734
    return 0;
}
EOF

3735
        enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
3736
    fi
3737

3738
elif enabled x86; then
3739

3740 3741
    check_builtin rdtsc    intrin.h   "__rdtsc()"
    check_builtin mm_empty mmintrin.h "_mm_empty()"
3742

3743 3744
    enable local_aligned_8 local_aligned_16

3745 3746 3747 3748
    # 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.
3749
    check_exec_crash <<EOF && enable ebp_available
3750 3751 3752
volatile int i=0;
__asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
return i;
3753 3754
EOF

Reimar Döffinger's avatar
Reimar Döffinger committed
3755
    # check whether EBX is available on x86
3756 3757
    check_inline_asm ebx_available '""::"b"(0)' &&
        check_inline_asm ebx_available '"":::"%ebx"'
3758

3759
    # check whether xmm clobbers are supported
3760
    check_inline_asm xmm_clobbers '"":::"%xmm0"'
3761

3762
    # check whether binutils is new enough to compile SSSE3/MMXEXT
3763 3764
    enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
    enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
3765

3766
    if ! disabled_any asm mmx yasm; then
3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782
        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

3783 3784
        check_yasm "movbe ecx, [5]" && enable yasm ||
            die "yasm/nasm not found or too old. Use --disable-yasm for a crippled build."
3785
        check_yasm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
3786
        check_yasm "vfmadd132ps ymm0, ymm1, ymm2"    || disable fma3_external
3787
        check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
3788
        check_yasm "CPU amdnop" || disable cpunop
3789
    fi
3790

3791 3792 3793 3794 3795 3796
    case "$cpu" in
        athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
            disable fast_clz
        ;;
    esac

3797 3798
fi

3799 3800
if enabled asm; then
    as=${gas:=$as}
3801
    check_as <<EOF && enable gnu_as || \
3802
        $nogas "GNU assembler not found, install gas-preprocessor"
3803 3804 3805 3806 3807
.macro m n
\n: .int 0
.endm
m x
EOF
3808 3809
fi

3810 3811
check_ldflags -Wl,--as-needed

3812 3813 3814 3815
if check_func dlopen; then
    ldl=
elif check_func dlopen -ldl; then
    ldl=-ldl
3816 3817
fi

3818
if ! disabled network; then
3819 3820
    check_type "sys/types.h sys/socket.h" socklen_t
    check_type netdb.h "struct addrinfo"
3821 3822
    check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
    check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
3823 3824
    check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
    check_type netinet/in.h "struct sockaddr_in6"
3825
    check_type poll.h "struct pollfd"
3826 3827
    check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
    check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
3828
    check_type netinet/sctp.h "struct sctp_event_subscribe"
3829
    check_func getaddrinfo $network_extralibs
3830
    check_func getservbyport $network_extralibs
3831
    check_func inet_aton $network_extralibs
3832 3833 3834 3835
    # Prefer arpa/inet.h over winsock2
    if check_header arpa/inet.h ; then
        check_func closesocket
    elif check_header winsock2.h ; then
3836 3837 3838
        check_func_headers winsock2.h closesocket -lws2 &&
            network_extralibs="-lws2" ||
        { check_func_headers winsock2.h closesocket -lws2_32 &&
3839
            network_extralibs="-lws2_32"; } || disable winsock2_h network
3840
        check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
3841 3842
        check_type ws2tcpip.h socklen_t
        check_type ws2tcpip.h "struct addrinfo"
3843 3844
        check_type ws2tcpip.h "struct group_source_req"
        check_type ws2tcpip.h "struct ip_mreq_source"
3845
        check_type ws2tcpip.h "struct ipv6_mreq"
3846
        check_type winsock2.h "struct pollfd"
3847 3848 3849 3850 3851 3852 3853 3854
        check_type ws2tcpip.h "struct sockaddr_in6"
        check_type ws2tcpip.h "struct sockaddr_storage"
        check_struct winsock2.h "struct sockaddr" sa_len
    else
        disable network
    fi
fi

3855 3856 3857
# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
check_func nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }

Måns Rullgård's avatar
Måns Rullgård committed
3858
check_func  fcntl
3859
check_func  fork
3860
check_func_headers stdlib.h getenv
3861
check_func  gethrtime
3862
check_func  getopt
3863
check_func  getrusage
3864
check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
3865
check_func  gettimeofday
3866
check_func  isatty
3867
check_func  localtime_r
3868
check_func  mach_absolute_time
3869
check_func  ${malloc_prefix}memalign            && enable memalign
3870
check_func  mkstemp
3871
check_func  mmap
3872
check_func  mprotect
3873
check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
3874
check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
Måns Rullgård's avatar
Måns Rullgård committed
3875
check_func  setrlimit
3876
check_func  strerror_r
3877
check_func  strptime
3878
check_func  sched_getaffinity
3879
check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
3880
check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
3881
check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
3882
check_builtin MemoryBarrier windows.h "MemoryBarrier()"
3883
check_func  sysconf
3884
check_func  sysctl
3885
check_func  usleep
3886
check_func_headers io.h setmode
3887
check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
3888
check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
3889
check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
3890
check_func_headers windows.h GetProcessAffinityMask
3891
check_func_headers windows.h GetProcessTimes
3892
check_func_headers windows.h GetSystemTimeAsFileTime
3893
check_func_headers windows.h MapViewOfFile
3894
check_func_headers windows.h SetConsoleTextAttribute
3895
check_func_headers windows.h Sleep
3896
check_func_headers windows.h VirtualAlloc
3897

3898
check_header direct.h
3899
check_header dlfcn.h
3900
check_header dxva.h
3901
check_header dxva2api.h
3902
check_header io.h
3903
check_header mach/mach_time.h
3904
check_header malloc.h
3905
check_header poll.h
3906
check_header sys/mman.h
3907
check_header sys/param.h
3908
check_header sys/resource.h
3909
check_header sys/select.h
3910
check_header sys/time.h
3911
check_header sys/un.h
3912
check_header unistd.h
3913 3914
check_header vdpau/vdpau.h
check_header vdpau/vdpau_x11.h
3915
check_header VideoDecodeAcceleration/VDADecoder.h
3916
check_header windows.h
3917
check_header X11/extensions/XvMClib.h
3918

3919
if ! disabled w32threads && ! enabled pthreads; then
3920 3921
    check_func_headers "windows.h process.h" _beginthreadex &&
        enable w32threads || disable w32threads
3922 3923
fi

3924 3925
# check for some common methods of building with pthread support
# do this before the optional library checks as some of them require pthreads
3926 3927
if ! disabled pthreads && ! enabled w32threads; then
    enable pthreads
3928
    if check_func pthread_join -pthread; then
Måns Rullgård's avatar
Måns Rullgård committed
3929
        add_cflags -pthread
3930
        add_extralibs -pthread
3931
    elif check_func pthread_join -pthreads; then
Måns Rullgård's avatar
Måns Rullgård committed
3932
        add_cflags -pthreads
3933
        add_extralibs -pthreads
3934
    elif check_func pthread_join -lpthreadGC2; then
3935
        add_extralibs -lpthreadGC2
3936 3937 3938
    elif check_lib pthread.h pthread_join -lpthread; then
        :
    elif ! check_func pthread_join; then
3939
        disable pthreads
Måns Rullgård's avatar
Måns Rullgård committed
3940
    fi
3941 3942
fi

3943 3944 3945
disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib

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

3949 3950 3951 3952
atan2f_args=2
ldexpf_args=2
powf_args=2

3953
for func in $MATH_FUNCS; do
3954
    eval check_mathfunc $func \${${func}_args:-1}
3955
done
3956

3957
# these are off by default, so fail if requested and not available
d s's avatar
d s committed
3958 3959 3960
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"; }
3961 3962 3963 3964
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
enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
enabled libfdk_aac        && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
3965
enabled libfreetype       && require_pkg_config freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
3966 3967 3968 3969 3970 3971 3972 3973
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
3974 3975
enabled libopenjpeg       && { { check_header openjpeg.h && check_lib2 openjpeg.h opj_version -lopenjpeg; } ||
                               { require_pkg_config libopenjpeg1 openjpeg.h opj_version; } }
3976 3977 3978 3979 3980 3981 3982 3983 3984 3985
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
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            && {
3986
    enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
3987
                                    die "ERROR: libvpx decoder version must be >=0.9.1"; }
3988
    enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VPX_CQ" -lvpx ||
3989 3990
                                    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; }
3991
    enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } }
3992
enabled libwavpack        && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput  -lwavpack
Justin Ruggles's avatar
Justin Ruggles committed
3993
enabled libwebp           && require_pkg_config libwebp webp/encode.h WebPGetEncoderVersion
3994 3995 3996
enabled libx264           && require libx264 x264.h x264_encoder_encode -lx264 &&
                             { check_cpp_condition x264.h "X264_BUILD >= 118" ||
                               die "ERROR: libx264 version must be >= 0.118."; }
Derek Buitenhuis's avatar
Derek Buitenhuis committed
3997
enabled libx265           && require_pkg_config x265 x265.h x265_encoder_encode &&
3998 3999
                             { check_cpp_condition x265.h "X265_BUILD >= 9" ||
                               die "ERROR: libx265 version must be >= 9."; }
4000 4001 4002 4003 4004 4005
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"; }
4006

Samuel Pitoiset's avatar
Samuel Pitoiset committed
4007 4008 4009 4010 4011
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

4012 4013 4014 4015 4016 4017 4018 4019 4020
# 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

4021
if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
4022
    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
4023 4024
    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
    enable sdl
4025
fi
4026

4027
pod2man --help     > /dev/null 2>&1 && enable pod2man   || disable pod2man
4028
texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html
4029

4030
check_header linux/fb.h
4031
check_header linux/videodev2.h
4032 4033
check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete

4034
check_header sys/videoio.h
4035

4036
check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
4037 4038 4039
# 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
4040

4041
# check for ioctl_meteor.h, ioctl_bt848.h and alternatives
Ramiro Polla's avatar
Ramiro Polla committed
4042 4043 4044 4045 4046 4047 4048
{ 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
4049

4050
check_header sndio.h
4051 4052
check_header sys/soundcard.h
check_header soundcard.h
Måns Rullgård's avatar
Måns Rullgård committed
4053

4054 4055
enabled_any alsa_indev alsa_outdev &&
    check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound
4056

4057 4058
enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack &&
    check_func jack_port_get_latency_range -ljack
4059

4060 4061
enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio

4062
if enabled libcdio; then
4063 4064
    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
4065
fi
4066

4067 4068
check_lib X11/Xlib.h XOpenDisplay -lX11 && enable xlib

4069 4070
enabled x11grab                                           &&
require Xext X11/extensions/XShm.h XShmCreateImage -lXext &&
4071 4072
require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes &&
{ enabled xlib || die "ERROR: Xlib not found"; }
4073

4074
enabled vdpau &&
4075
    check_cpp_condition vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" ||
4076
    disable vdpau
4077

4078
enabled vdpau && enabled xlib &&
4079 4080
    check_func_headers "vdpau/vdpau.h vdpau/vdpau_x11.h" vdp_device_create_x11 -lvdpau &&
    prepend avconv_libs $($ldflags_filter "-lvdpau") &&
4081 4082
    enable vdpau_x11

4083
enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
4084 4085 4086

# add some useful compiler flags if supported
check_cflags -Wdeclaration-after-statement
4087
check_cflags -Wall
Michael Niedermayer's avatar
Michael Niedermayer committed
4088 4089 4090
check_cflags -Wdisabled-optimization
check_cflags -Wpointer-arith
check_cflags -Wredundant-decls
4091
check_cflags -Wcast-qual
4092
check_cflags -Wwrite-strings
4093
check_cflags -Wtype-limits
4094
check_cflags -Wundef
4095
check_cflags -Wmissing-prototypes
4096
check_cflags -Wstrict-prototypes
4097
enabled extra_warnings && check_cflags -Winline
4098

4099 4100 4101 4102 4103 4104 4105 4106 4107 4108
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

4109
# add some linker flags
4110
check_ldflags -Wl,--warn-common
4111
check_ldflags -Wl,-rpath-link=libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
4112
test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
4113

4114 4115 4116 4117
# add some strip flags
# -wN '..@*' is more selective than -x, but not available everywhere.
check_stripflags -wN \'..@*\' || check_stripflags -x || strip='true'

4118 4119 4120 4121 4122 4123 4124
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      \
4125 4126
                  -Wl,--wrap,avcodec_encode_subtitle    \
                  -Wl,--wrap,avresample_convert ||
4127 4128
    disable neon_clobber_test

4129
enabled xmm_clobber_test &&
4130 4131 4132 4133 4134
    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      \
4135
                  -Wl,--wrap,avcodec_encode_video2      \
4136
                  -Wl,--wrap,avcodec_encode_subtitle    \
4137
                  -Wl,--wrap,avresample_convert         \
4138
                  -Wl,--wrap,sws_scale ||
4139 4140
    disable xmm_clobber_test

4141
echo "X{};" > $TMPV
4142
if test_ldflags -Wl,--version-script,$TMPV; then
4143
    append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
4144 4145
    check_cc <<EOF && enable symver_asm_label
void ff_foo(void) __asm__ ("av_foo@VERSION");
4146
void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
4147 4148 4149 4150 4151 4152
EOF
    check_cc <<EOF && enable symver_gnu_asm
__asm__(".symver ff_foo,av_foo@VERSION");
void ff_foo(void) {}
EOF
fi
4153

4154 4155 4156 4157 4158 4159 4160 4161
if [ -z "$optflags" ]; then
    if enabled small; then
        optflags=$cflags_size
    elif enabled optimizations; then
        optflags=$cflags_speed
    else
        optflags=$cflags_noopt
    fi
4162
fi
4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178

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
4179

4180
if enabled icc; then
Måns Rullgård's avatar
Måns Rullgård committed
4181 4182 4183 4184
    # Just warnings, no remarks
    check_cflags -w1
    # -wd: Disable following warnings
    # 144, 167, 556: -Wno-pointer-sign
4185
    # 1292: attribute "foo" ignored
4186
    # 1419: external declaration in primary source file
Måns Rullgård's avatar
Måns Rullgård committed
4187
    # 10006: ignoring unknown option -fno-signed-zeros
4188
    # 10148: ignoring unknown option -Wno-parentheses
Måns Rullgård's avatar
Måns Rullgård committed
4189
    # 10156: ignoring option '-W'; no argument required
4190
    check_cflags -wd144,167,556,1292,1419,10006,10148,10156
Måns Rullgård's avatar
Måns Rullgård committed
4191 4192 4193
    # 11030: Warning unknown option --as-needed
    # 10156: ignoring option '-export'; no argument required
    check_ldflags -wd10156,11030
4194 4195
    # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
    enable ebp_available
4196
    if enabled x86_32; then
4197
        icc_version=$($cc -dumpversion)
4198 4199
        test ${icc_version%%.*} -ge 11 &&
            check_cflags -falign-stack=maintain-16-byte ||
4200 4201
            disable aligned_stack
    fi
4202 4203
elif enabled ccc; then
    # disable some annoying warnings
4204 4205 4206 4207
    add_cflags -msg_disable bitnotint
    add_cflags -msg_disable mixfuncvoid
    add_cflags -msg_disable nonstandcast
    add_cflags -msg_disable unsupieee
4208
elif enabled gcc; then
4209
    check_optflags -fno-tree-vectorize
4210
    check_cflags -Werror=implicit-function-declaration
4211
    check_cflags -Werror=missing-prototypes
4212
    check_cflags -Werror=return-type
4213
    check_cflags -Werror=declaration-after-statement
4214
    check_cflags -Werror=vla
4215
    enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
4216 4217
elif enabled llvm_gcc; then
    check_cflags -mllvm -stack-alignment=16
4218
elif enabled clang; then
4219
    check_cflags -mllvm -stack-alignment=16
4220
    check_cflags -Qunused-arguments
4221 4222
    check_cflags -Werror=implicit-function-declaration
    check_cflags -Werror=missing-prototypes
4223
    check_cflags -Werror=return-type
Luca Barbato's avatar
Luca Barbato committed
4224 4225 4226
elif enabled cparser; then
    add_cflags -Wno-missing-variable-declarations
    add_cflags -Wno-empty-statement
4227 4228
elif enabled armcc; then
    # 2523: use of inline assembler is deprecated
4229 4230
    add_cflags -W${armcc_opt},--diag_suppress=2523
    add_cflags -W${armcc_opt},--diag_suppress=1207
4231
    add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
4232
    add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
4233 4234
    add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
    add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
4235 4236
elif enabled tms470; then
    add_cflags -pds=824 -pds=837
4237
    disable inline_asm
4238 4239
elif enabled pathscale; then
    add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
4240
elif enabled_any msvc icl; then
4241
    enabled x86_32 && disable aligned_stack
4242
    enabled_all x86_32 debug && add_cflags -Oy-
4243
    enabled debug && add_ldflags -debug
4244
    enable pragma_deprecated
4245
    if enabled icl; then
4246 4247 4248 4249
        # -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
4250 4251
        # icl will pass the inline asm tests but inline asm is currently
        # not supported (build will fail)
4252 4253
        disable inline_asm
    fi
4254 4255
fi

4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267
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
4268
case $target_os in
4269 4270 4271
    osf1)
        enabled ccc && add_ldflags '-Wl,-expect_unresolved,*'
    ;;
Mans Rullgard's avatar
Mans Rullgard committed
4272 4273 4274 4275 4276
    plan9)
        add_cppflags -Dmain=plan9_main
    ;;
esac

4277 4278
enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }

4279
check_deps $CONFIG_LIST       \
4280
           $CONFIG_EXTRA      \
4281
           $HAVE_LIST         \
4282
           $ALL_COMPONENTS    \
4283

4284
! enabled_any memalign posix_memalign aligned_malloc &&
4285 4286
    enabled_any $need_memalign && enable memalign_hack

4287 4288 4289 4290 4291 4292 4293 4294
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

4295
echo "install prefix            $prefix"
Diego Biurrun's avatar
Diego Biurrun committed
4296 4297
echo "source path               $source_path"
echo "C compiler                $cc"
4298
echo "C library                 $libc_type"
4299 4300
if test "$host_cc" != "$cc"; then
    echo "host C compiler           $host_cc"
4301
    echo "host C library            $host_libc_type"
4302
fi
Diego Biurrun's avatar
Diego Biurrun committed
4303
echo "ARCH                      $arch ($cpu)"
4304 4305
if test "$build_suffix" != ""; then
    echo "build suffix              $build_suffix"
4306
fi
4307 4308 4309
if test "$extra_version" != ""; then
    echo "version string suffix     $extra_version"
fi
4310
echo "big-endian                ${bigendian-no}"
4311
echo "runtime cpu detection     ${runtime_cpudetect-no}"
4312
if enabled x86; then
4313
    echo "${yasmexe}                      ${yasm-no}"
4314
    echo "MMX enabled               ${mmx-no}"
4315
    echo "MMXEXT enabled            ${mmxext-no}"
4316
    echo "3DNow! enabled            ${amd3dnow-no}"
4317
    echo "3DNow! extended enabled   ${amd3dnowext-no}"
4318
    echo "SSE enabled               ${sse-no}"
4319
    echo "SSSE3 enabled             ${ssse3-no}"
4320
    echo "AVX enabled               ${avx-no}"
4321
    echo "XOP enabled               ${xop-no}"
4322
    echo "FMA3 enabled              ${fma3-no}"
4323
    echo "FMA4 enabled              ${fma4-no}"
4324
    echo "i686 features enabled     ${i686-no}"
4325
    echo "CMOV is fast              ${fast_cmov-no}"
4326 4327
    echo "EBX available             ${ebx_available-no}"
    echo "EBP available             ${ebp_available-no}"
4328
fi
4329 4330 4331 4332
if enabled aarch64; then
    echo "NEON enabled              ${neon-no}"
    echo "VFP enabled               ${vfp-no}"
fi
4333
if enabled arm; then
4334 4335
    echo "ARMv5TE enabled           ${armv5te-no}"
    echo "ARMv6 enabled             ${armv6-no}"
4336
    echo "ARMv6T2 enabled           ${armv6t2-no}"
4337
    echo "VFP enabled               ${vfp-no}"
4338
    echo "NEON enabled              ${neon-no}"
4339
fi
4340
if enabled ppc; then
4341
    echo "AltiVec enabled           ${altivec-no}"
4342
    echo "PPC 4xx optimizations     ${ppc4xx-no}"
4343
    echo "dcbzl available           ${dcbzl-no}"
4344
fi
4345
echo "debug symbols             ${debug-no}"
4346
echo "optimize for size         ${small-no}"
4347
echo "optimizations             ${optimizations-no}"
4348 4349
echo "static                    ${static-no}"
echo "shared                    ${shared-no}"
4350
echo "new filter support        ${avfilter-no}"
4351 4352
echo "network support           ${network-no}"
echo "threading support         ${thread_type-no}"
4353
echo "safe bitstream reader     ${safe_bitstream_reader-no}"
4354
echo "SDL support               ${sdl-no}"
4355 4356
test -n "$random_seed" &&
    echo "random seed               ${random_seed}"
4357
echo
Fabrice Bellard's avatar
Fabrice Bellard committed
4358

4359 4360 4361 4362
echo "External libraries:"
print_enabled '' $EXTERNAL_LIBRARY_LIST | print_3_columns
echo

4363
for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
4364
    echo "Enabled ${type}s:"
4365
    eval list=\$$(toupper $type)_LIST
4366
    print_enabled '_*' $list | print_3_columns
4367
    echo
4368 4369
done

4370
license="LGPL version 2.1 or later"
4371
if enabled nonfree; then
4372
    license="nonfree and unredistributable"
4373 4374 4375 4376
elif enabled gplv3; then
    license="GPL version 3 or later"
elif enabled lgplv3; then
    license="LGPL version 3 or later"
4377
elif enabled gpl; then
4378
    license="GPL version 2 or later"
4379 4380 4381
fi

echo "License: $license"
4382

4383 4384
echo "Creating config.mak and config.h..."

4385
test -e Makefile || echo "include $source_path/Makefile" > Makefile
4386

4387 4388
config_files="$TMPH config.mak"

4389 4390
cat > config.mak <<EOF
# Automatically generated by configure - do not modify!
4391
LIBAV_CONFIGURATION=$LIBAV_CONFIGURATION
4392 4393 4394 4395 4396 4397
prefix=$prefix
LIBDIR=\$(DESTDIR)$libdir
SHLIBDIR=\$(DESTDIR)$shlibdir
INCDIR=\$(DESTDIR)$incdir
BINDIR=\$(DESTDIR)$bindir
DATADIR=\$(DESTDIR)$datadir
4398
DOCDIR=\$(DESTDIR)$docdir
4399
MANDIR=\$(DESTDIR)$mandir
4400
SRC_PATH=$source_path
4401
CC_IDENT=$cc_ident
4402 4403 4404 4405 4406
ARCH=$arch
CC=$cc
AS=$as
LD=$ld
DEPCC=$dep_cc
4407 4408 4409
DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
DEPAS=$as
DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
4410
YASM=$yasmexe
4411
DEPYASM=$yasmexe
4412
AR=$ar
4413 4414
ARFLAGS=$arflags
AR_O=$ar_o
4415
RANLIB=$ranlib
4416
STRIP=$strip
4417 4418 4419 4420
LN_S=$ln_s
CPPFLAGS=$CPPFLAGS
CFLAGS=$CFLAGS
ASFLAGS=$ASFLAGS
4421
AS_C=$AS_C
4422
AS_O=$AS_O
4423
CC_C=$CC_C
4424
CC_E=$CC_E
4425
CC_O=$CC_O
4426
LD_O=$LD_O
4427 4428
LD_LIB=$LD_LIB
LD_PATH=$LD_PATH
4429
DLLTOOL=$dlltool
4430
LDFLAGS=$LDFLAGS
4431
SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
4432
STRIPFLAGS=$STRIPFLAGS
4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443
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
4444
CCDEP_FLAGS=$CCDEP_FLAGS
4445
ASDEP=$ASDEP
4446
ASDEP_FLAGS=$ASDEP_FLAGS
4447 4448 4449
CC_DEPFLAGS=$CC_DEPFLAGS
AS_DEPFLAGS=$AS_DEPFLAGS
HOSTCC=$host_cc
4450
HOSTLD=$host_ld
4451
HOSTCFLAGS=$host_cflags
4452
HOSTCPPFLAGS=$host_cppflags
4453 4454 4455
HOSTEXESUF=$HOSTEXESUF
HOSTLDFLAGS=$host_ldflags
HOSTLIBS=$host_libs
4456 4457 4458 4459 4460
DEPHOSTCC=$host_cc
DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
HOSTCCDEP=$HOSTCCDEP
HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
4461
HOSTCC_C=$HOSTCC_C
4462
HOSTCC_O=$HOSTCC_O
4463
HOSTLD_O=$HOSTLD_O
4464
TARGET_EXEC=$target_exec $target_exec_args
4465
TARGET_PATH=$target_path
4466
TARGET_SAMPLES=${target_samples:-\$(SAMPLES)}
4467
CFLAGS-avplay=$sdl_cflags
4468
ZLIB=$($ldflags_filter -lz)
4469 4470
LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
EXTRALIBS=$extralibs
4471
COMPAT_OBJS=$compat_objs
4472
EXEOBJS=$exeobjs
4473
INSTALL=install
4474 4475 4476 4477 4478 4479
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}
4480 4481 4482 4483
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}
4484
SAMPLES:=${samples:-\$(LIBAV_SAMPLES)}
4485
EOF
4486

4487
get_version(){
4488
    lcname=lib${1}
4489 4490
    name=$(toupper $lcname)
    file=$source_path/$lcname/version.h
4491
    eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file")
4492
    eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
4493 4494
    eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
    eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
4495
    eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> config.mak
4496 4497
}

4498
map 'get_version $v' $LIBRARY_LIST
4499

4500 4501 4502 4503 4504 4505 4506
print_program_libs(){
    eval "program_libs=\$${1}_libs"
    eval echo "LIBS-${1}=${program_libs}" >> config.mak
}

map 'print_program_libs $v' $PROGRAM_LIST

4507 4508
cat > $TMPH <<EOF
/* Automatically generated by configure - do not modify! */
4509 4510 4511
#ifndef LIBAV_CONFIG_H
#define LIBAV_CONFIG_H
#define LIBAV_CONFIGURATION "$(c_escape $LIBAV_CONFIGURATION)"
4512
#define LIBAV_LICENSE "$(c_escape $license)"
4513
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
4514
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
4515 4516 4517
#define restrict $_restrict
#define EXTERN_PREFIX "${extern_prefix}"
#define EXTERN_ASM ${extern_prefix}
4518
#define SLIBSUF "$SLIBSUF"
4519
EOF
4520

4521 4522 4523
test -n "$malloc_prefix" &&
    echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH

4524 4525 4526 4527 4528
if enabled yasm; then
    append config_files $TMPASM
    printf '' >$TMPASM
fi

4529 4530
enabled getenv || echo "#define getenv(x) NULL" >> $TMPH

4531 4532 4533
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
4534
                                     $CONFIG_EXTRA      \
4535
                                     $ALL_COMPONENTS    \
4536

4537
echo "#endif /* LIBAV_CONFIG_H */" >> $TMPH
4538

Diego Biurrun's avatar
Diego Biurrun committed
4539
# Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
4540
cp_if_changed $TMPH config.h
4541
touch .config
Nick Kurshev's avatar
Nick Kurshev committed
4542

4543 4544
enabled yasm && cp_if_changed $TMPASM config.asm

4545 4546 4547 4548 4549 4550
cat > $TMPH <<EOF
/* Generated by ffconf */
#ifndef AVUTIL_AVCONFIG_H
#define AVUTIL_AVCONFIG_H
EOF

4551
print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
4552 4553 4554 4555 4556

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

cp_if_changed $TMPH libavutil/avconfig.h

4557 4558
test -n "$WARNINGS" && printf "\n$WARNINGS"

4559
# build pkg-config files
4560

4561
pkgconfig_generate(){
4562 4563 4564 4565 4566 4567 4568 4569 4570
    name=$1
    shortname=${name#lib}${build_suffix}
    comment=$2
    version=$3
    libs=$4
    requires=$5
    enabled ${name#lib} || return 0
    mkdir -p $name
    cat <<EOF > $name/$name.pc
4571
prefix=$prefix
4572
exec_prefix=\${prefix}
4573
libdir=$libdir
4574
includedir=$incdir
4575

4576 4577 4578
Name: $name
Description: $comment
Version: $version
4579
Requires: $(enabled shared || echo $requires)
4580
Requires.private: $(enabled shared && echo $requires)
4581
Conflicts:
4582
Libs: -L\${libdir} -l${shortname} $(enabled shared || echo $libs)
4583
Libs.private: $(enabled shared && echo $libs)
4584
Cflags: -I\${includedir}
4585
EOF
4586
    cat <<EOF > $name/$name-uninstalled.pc
4587 4588
prefix=
exec_prefix=
4589
libdir=\${pcfiledir}
4590
includedir=${source_path}
4591

4592 4593 4594 4595
Name: $name
Description: $comment
Version: $version
Requires: $requires
4596
Conflicts:
4597
Libs: \${libdir}/${LIBPREF}${shortname}${LIBSUF} $libs
4598 4599
Cflags: -I\${includedir}
EOF
4600
}
4601

4602 4603 4604 4605 4606
lavfi_libs="libavutil = $LIBAVUTIL_VERSION"
enabled movie_filter    && prepend lavfi_libs "libavformat >= $LIBAVFORMAT_VERSION, libavcodec >= $LIBAVCODEC_VERSION,"
enabled resample_filter && prepend lavfi_libs "libavresample >= $LIBAVRESAMPLE_VERSION,"
enabled scale_filter    && prepend lavfi_libs "libswscale >= $LIBSWSCALE_VERSION,"

4607 4608 4609 4610 4611
pkgconfig_generate libavutil     "Libav utility library"          "$LIBAVUTIL_VERSION"     "$LIBM"
pkgconfig_generate libavcodec    "Libav codec library"            "$LIBAVCODEC_VERSION"    "$extralibs" "libavutil = $LIBAVUTIL_VERSION"
pkgconfig_generate libavformat   "Libav container format library" "$LIBAVFORMAT_VERSION"   "$extralibs" "libavcodec = $LIBAVCODEC_VERSION"
pkgconfig_generate libavdevice   "Libav device handling library"  "$LIBAVDEVICE_VERSION"   "$extralibs" "libavformat = $LIBAVFORMAT_VERSION"
pkgconfig_generate libavfilter   "Libav video filtering library"  "$LIBAVFILTER_VERSION"   "$extralibs" "$lavfi_libs"
4612
pkgconfig_generate libavresample "Libav audio resampling library" "$LIBAVRESAMPLE_VERSION" "$extralibs" "libavutil = $LIBAVUTIL_VERSION"
4613
pkgconfig_generate libswscale    "Libav image rescaling library"  "$LIBSWSCALE_VERSION"    "$LIBM"      "libavutil = $LIBAVUTIL_VERSION"