configure 144 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
  --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]
89
  --enable-rpath           use rpath when linking programs [USE WITH CARE]
90

91
Licensing options:
92 93 94 95 96
  --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]
97 98 99 100 101 102 103 104

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
105
  --disable-all            disable building components, libraries and programs
106

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

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

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

Individual component options:
142
  --disable-everything     disable all components listed below
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
  --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
167
  --enable-indev=NAME      enable input device NAME
168 169
  --disable-indev=NAME     disable input device NAME
  --disable-indevs         disable input devices
170 171
  --enable-outdev=NAME     enable output device NAME
  --disable-outdev=NAME    disable output device NAME
172 173 174 175 176 177 178
  --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
179
  --enable-avisynth        enable reading of AviSynth script files [no]
180
  --enable-bzlib           enable bzlib [autodetect]
Stefano Sabatini's avatar
Stefano Sabatini committed
181
  --enable-frei0r          enable frei0r video filtering
182
  --enable-gnutls          enable gnutls [no]
183
  --enable-libbs2b         enable bs2b DSP library [no]
184
  --enable-libcdio         enable audio CD grabbing with libcdio
185 186
  --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                           and libraw1394 [no]
187
  --enable-libfaac         enable AAC encoding via libfaac [no]
188
  --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
189
  --enable-libfreetype     enable libfreetype [no]
190
  --enable-libgsm          enable GSM de/encoding via libgsm [no]
191
  --enable-libilbc         enable iLBC de/encoding via libilbc [no]
192
  --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
193 194 195
  --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]
196
  --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
197
  --enable-libopus         enable Opus de/encoding via libopus [no]
198
  --enable-libpulse        enable Pulseaudio input via libpulse [no]
199
  --enable-librtmp         enable RTMP[E] support via librtmp [no]
200 201
  --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
  --enable-libspeex        enable Speex de/encoding via libspeex [no]
202
  --enable-libtheora       enable Theora encoding via libtheora [no]
203
  --enable-libtwolame      enable MP2 encoding via libtwolame [no]
204
  --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
205
  --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
206
  --enable-libvorbis       enable Vorbis encoding via libvorbis [no]
207
  --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
208
  --enable-libwavpack      enable wavpack encoding via libwavpack [no]
Justin Ruggles's avatar
Justin Ruggles committed
209
  --enable-libwebp         enable WebP encoding via libwebp [no]
210
  --enable-libx264         enable H.264 encoding via x264 [no]
Derek Buitenhuis's avatar
Derek Buitenhuis committed
211
  --enable-libx265         enable HEVC encoding via x265 [no]
212
  --enable-libxavs         enable AVS encoding via xavs [no]
213 214 215
  --enable-libxcb          enable X11 grabbing using XCB [no]
  --enable-libxcb-shm      enable X11 grabbing shm communication [auto]
  --enable-libxcb-xfixes   enable X11 grabbing mouse rendering [auto]
216 217
  --enable-libxvid         enable Xvid encoding via xvidcore,
                           native MPEG-4/Xvid encoder exists [no]
218
  --enable-openssl         enable openssl [no]
219
  --enable-x11grab         enable X11 grabbing (legacy) [no]
220 221
  --enable-zlib            enable zlib [autodetect]

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

Advanced options (experts only):
  --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
263 264 265 266 267 268
  --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
269
  --enable-sram            allow use of on-chip SRAM
270 271

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

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

NOTE: Object files are built at the place where configure is launched.
EOF
319
  exit 0
320
}
321

322 323
quotes='""'

324
log(){
325
    echo "$@" >> $logfile
326 327
}

328
log_file(){
Måns Rullgård's avatar
Måns Rullgård committed
329
    log BEGIN $1
330
    pr -n -t $1 >> $logfile
Måns Rullgård's avatar
Måns Rullgård committed
331 332 333
    log END $1
}

334
echolog(){
Måns Rullgård's avatar
Måns Rullgård committed
335
    log "$@"
336
    echo "$@"
337 338
}

339 340 341 342 343
warn(){
    log "WARNING: $*"
    WARNINGS="${WARNINGS}WARNING: $*\n"
}

344 345 346
die(){
    echolog "$@"
    cat <<EOF
347

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

366
# Avoid locale weirdness, besides we really just want to translate ASCII.
367
toupper(){
368
    echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
369 370
}

371
tolower(){
372
    echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
373 374
}

375 376 377 378
c_escape(){
    echo "$*" | sed 's/["\\]/\\\0/g'
}

379 380
sh_quote(){
    v=$(echo "$1" | sed "s/'/'\\\\''/g")
381
    test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
382 383 384
    echo "$v"
}

385 386 387 388
cleanws(){
    echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//'
}

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

397 398 399 400 401 402 403 404
filter_out(){
    pat=$1
    shift
    for v; do
        eval "case $v in $pat) ;; *) echo $v ;; esac"
    done
}

405 406 407
map(){
    m=$1
    shift
408
    for v; do eval $m; done
409 410
}

411 412 413 414 415 416
add_suffix(){
    suffix=$1
    shift
    for v; do echo ${v}${suffix}; done
}

417 418 419 420 421 422 423 424
set_all(){
    value=$1
    shift
    for var in $*; do
        eval $var=$value
    done
}

425 426 427 428 429 430 431 432
set_weak(){
    value=$1
    shift
    for var; do
        eval : \${$var:=$value}
    done
}

433 434 435 436
sanitize_var_name(){
    echo $@ | sed 's/[^A-Za-z0-9_]/_/g'
}

437 438 439
set_safe(){
    var=$1
    shift
440
    eval $(sanitize_var_name "$var")='$*'
441 442 443
}

get_safe(){
444
    eval echo \$$(sanitize_var_name "$1")
445 446
}

447
pushvar(){
448 449 450 451
    for pvar in $*; do
        eval level=\${${pvar}_level:=0}
        eval ${pvar}_${level}="\$$pvar"
        eval ${pvar}_level=$(($level+1))
452 453 454 455
    done
}

popvar(){
456 457
    for pvar in $*; do
        eval level=\${${pvar}_level:-0}
458 459
        test $level = 0 && continue
        eval level=$(($level-1))
460 461 462
        eval $pvar="\${${pvar}_${level}}"
        eval ${pvar}_level=$level
        eval unset ${pvar}_${level}
463 464 465
    done
}

466 467 468 469 470 471 472 473
enable(){
    set_all yes $*
}

disable(){
    set_all no $*
}

474 475 476 477 478 479 480 481
enable_weak(){
    set_weak yes $*
}

disable_weak(){
    set_weak no $*
}

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

disable_safe(){
489 490 491
    for var; do
        disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
492 493
}

494 495 496 497
do_enable_deep(){
    for var; do
        enabled $var && continue
        eval sel="\$${var}_select"
498 499
        eval sgs="\$${var}_suggest"
        pushvar var sgs
500
        enable_deep $sel
501 502
        popvar sgs
        enable_deep_weak $sgs
503 504 505 506 507 508 509 510 511
        popvar var
    done
}

enable_deep(){
    do_enable_deep $*
    enable $*
}

512
enable_deep_weak(){
513 514 515 516 517 518 519
    for var; do
        disabled $var && continue
        pushvar var
        do_enable_deep $var
        popvar var
        enable_weak $var
    done
520 521
}

522
enabled(){
523 524
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xyes"
525 526
}

527
disabled(){
528 529
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xno"
530 531
}

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

538 539 540 541 542 543
disabled_all(){
    for opt; do
        disabled $opt || return 1
    done
}

544 545 546 547 548 549
enabled_any(){
    for opt; do
        enabled $opt && return 0
    done
}

550 551 552 553
disabled_any(){
    for opt; do
        disabled $opt && return 0
    done
554
    return 1
555 556
}

557 558
set_default(){
    for opt; do
559
        eval : \${$opt:=\$${opt}_default}
560 561 562
    done
}

563 564 565 566 567 568 569 570 571
is_in(){
    value=$1
    shift
    for var in $*; do
        [ $var = $value ] && return 0
    done
    return 1
}

572
do_check_deps(){
573
    for cfg; do
574
        cfg="${cfg#!}"
575 576 577
        enabled ${cfg}_checking && die "Circular dependency for $cfg."
        disabled ${cfg}_checking && continue
        enable ${cfg}_checking
578
        append allopts $cfg
579

580 581
        eval dep_all="\$${cfg}_deps"
        eval dep_any="\$${cfg}_deps_any"
582
        eval dep_sel="\$${cfg}_select"
583
        eval dep_sgs="\$${cfg}_suggest"
584 585
        eval dep_ifa="\$${cfg}_if"
        eval dep_ifn="\$${cfg}_if_any"
586

587
        pushvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
588
        do_check_deps $dep_all $dep_any $dep_sel $dep_sgs $dep_ifa $dep_ifn
589
        popvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
590

591 592
        [ -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
593 594
        enabled_all  $dep_all || disable $cfg
        enabled_any  $dep_any || disable $cfg
595
        disabled_any $dep_sel && disable $cfg
596

597
        if enabled $cfg; then
598
            enable_deep $dep_sel
599
            enable_deep_weak $dep_sgs
600 601
        fi

602
        disable ${cfg}_checking
603 604 605
    done
}

606 607 608 609 610 611 612 613 614 615 616 617
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
}

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

643 644 645 646
print_enabled(){
    suf=$1
    shift
    for v; do
647
        enabled $v && printf "%s\n" ${v%$suf};
648 649 650
    done
}

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

657 658 659 660 661 662
prepend(){
    var=$1
    shift
    eval "$var=\"$* \$$var\""
}

663 664 665 666 667 668 669 670 671
unique(){
    var=$1
    uniq_list=""
    for tok in $(eval echo \$$var); do
        uniq_list="$(filter_out $tok $uniq_list) $tok"
    done
    eval "$var=\"${uniq_list}\""
}

672
add_cppflags(){
673
    append CPPFLAGS "$@"
674 675
}

676
add_cflags(){
677
    append CFLAGS $($cflags_filter "$@")
678 679
}

680
add_asflags(){
681
    append ASFLAGS $($asflags_filter "$@")
682 683
}

684
add_ldflags(){
685
    append LDFLAGS $($ldflags_filter "$@")
686 687
}

688 689 690 691
add_ldexeflags(){
    append LDEXEFLAGS $($ldflags_filter "$@")
}

692 693 694 695
add_stripflags(){
    append STRIPFLAGS "$@"
}

696
add_extralibs(){
697
    prepend extralibs $($ldflags_filter "$@")
698 699
}

700 701 702 703
add_host_cppflags(){
    append host_cppflags "$@"
}

704 705 706 707 708 709 710 711
add_host_cflags(){
    append host_cflags $($host_cflags_filter "$@")
}

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

712 713 714 715 716 717
add_compat(){
    append compat_objs $1
    shift
    map 'add_cppflags -D$v' "$@"
}

718
check_cmd(){
719
    log "$@"
720
    "$@" >> $logfile 2>&1
721 722
}

723 724 725 726
cc_o(){
    eval printf '%s\\n' $CC_O
}

727 728 729 730
cc_e(){
    eval printf '%s\\n' $CC_E
}

731
check_cc(){
732
    log check_cc "$@"
733
    cat > $TMPC
734
    log_file $TMPC
735
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
736 737 738 739
}

check_cpp(){
    log check_cpp "$@"
740
    cat > $TMPC
741
    log_file $TMPC
742
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
743 744
}

745 746 747 748
as_o(){
    eval printf '%s\\n' $AS_O
}

749 750
check_as(){
    log check_as "$@"
751 752 753
    cat > $TMPS
    log_file $TMPS
    check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
754 755
}

756 757
check_inline_asm(){
    log check_inline_asm "$@"
758
    name="$1"
759
    code="$2"
760
    shift 2
761
    disable $name
762
    check_cc "$@" <<EOF && enable $name
763
void foo(void){ __asm__ volatile($code); }
764 765 766
EOF
}

767 768 769 770 771 772
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
773 774 775 776 777 778 779 780
check_yasm(){
    log check_yasm "$@"
    echo "$1" > $TMPS
    log_file $TMPS
    shift 1
    check_cmd $yasmexe $YASMFLAGS "$@" -o $TMPO $TMPS
}

781 782 783 784
ld_o(){
    eval printf '%s\\n' $LD_O
}

785
check_ld(){
786
    log check_ld "$@"
787 788
    flags=$(filter_out '-l*' "$@")
    libs=$(filter '-l*' "$@")
789
    check_cc $($cflags_filter $flags) || return
790 791
    flags=$($ldflags_filter $flags)
    libs=$($ldflags_filter $libs)
792
    check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
793 794
}

795 796 797 798 799 800 801
print_include(){
    hdr=$1
    test "${hdr%.h}" = "${hdr}" &&
        echo "#include $hdr"    ||
        echo "#include <$hdr>"
}

802 803 804 805 806 807 808 809
check_code(){
    log check_code "$@"
    check=$1
    headers=$2
    code=$3
    shift 3
    {
        for hdr in $headers; do
810
            print_include $hdr
811 812 813 814 815
        done
        echo "int main(void) { $code; return 0; }"
    } | check_$check "$@"
}

816 817
check_cppflags(){
    log check_cppflags "$@"
818
    check_cc "$@" <<EOF && append CPPFLAGS "$@"
819 820 821 822
int x;
EOF
}

823 824
test_cflags(){
    log test_cflags "$@"
825
    set -- $($cflags_filter "$@")
826
    check_cc "$@" <<EOF
827 828 829 830
int x;
EOF
}

831 832 833 834 835
check_cflags(){
    log check_cflags "$@"
    test_cflags "$@" && add_cflags "$@"
}

836 837 838
test_ldflags(){
    log test_ldflags "$@"
    check_ld "$@" <<EOF
839
int main(void){ return 0; }
840 841 842
EOF
}

843 844 845 846 847
check_ldflags(){
    log check_ldflags "$@"
    test_ldflags "$@" && add_ldflags "$@"
}

848 849 850 851 852 853 854 855 856 857 858 859 860 861
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 "$@"
}

862
check_header(){
863
    log check_header "$@"
864 865
    header=$1
    shift
866 867
    disable_safe $header
    check_cpp "$@" <<EOF && enable_safe $header
868 869 870 871 872 873
#include <$header>
int x;
EOF
}

check_func(){
874
    log check_func "$@"
875 876
    func=$1
    shift
Måns Rullgård's avatar
Måns Rullgård committed
877 878
    disable $func
    check_ld "$@" <<EOF && enable $func
879
extern int $func();
880
int main(void){ $func(); }
881 882 883
EOF
}

884
check_mathfunc(){
885
    log check_mathfunc "$@"
886
    func=$1
887 888 889
    narg=$2
    shift 2
    test $narg = 2 && args="f, g" || args="f"
890 891 892
    disable $func
    check_ld "$@" <<EOF && enable $func
#include <math.h>
893
float foo(float f, float g) { return $func($args); }
894
int main(void){ return 0; }
895 896 897
EOF
}

898 899
check_func_headers(){
    log check_func_headers "$@"
900
    headers=$1
901
    funcs=$2
902
    shift 2
903 904
    {
        for hdr in $headers; do
905
            print_include $hdr
906 907 908 909 910 911
        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
912 913
}

914 915 916 917
check_cpp_condition(){
    log check_cpp_condition "$@"
    header=$1
    condition=$2
918
    shift 2
919
    check_cpp "$@" <<EOF
920 921 922 923 924 925 926
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

927 928 929 930 931
check_lib(){
    log check_lib "$@"
    header="$1"
    func="$2"
    shift 2
932
    check_header $header && check_func $func "$@" && add_extralibs "$@"
933 934
}

935 936 937
check_lib2(){
    log check_lib2 "$@"
    headers="$1"
938
    funcs="$2"
939
    shift 2
940
    check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
941 942
}

943 944 945 946 947 948
check_pkg_config(){
    log check_pkg_config "$@"
    pkg="$1"
    headers="$2"
    funcs="$3"
    shift 3
949
    check_cmd $pkg_config --exists --print-errors $pkg || return
950 951
    pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
    pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
952 953 954 955 956
    check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
        set_safe ${pkg}_cflags $pkg_cflags   &&
        set_safe ${pkg}_libs   $pkg_libs
}

957
check_exec(){
958
    check_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
959 960
}

961
check_exec_crash(){
962
    code=$(cat)
963 964 965 966 967 968 969

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

970
    (check_exec "$@") >> $logfile 2>&1 <<EOF
971 972 973 974
#include <signal.h>
static void sighandler(int sig){
    raise(SIGTERM);
}
975 976 977
int foo(void){
    $code
}
978
int (*func_ptr)(void) = foo;
Diego Biurrun's avatar
Diego Biurrun committed
979
int main(void){
980 981 982 983 984 985
    signal(SIGILL, sighandler);
    signal(SIGFPE, sighandler);
    signal(SIGSEGV, sighandler);
#ifdef SIGBUS
    signal(SIGBUS, sighandler);
#endif
986
    return func_ptr();
987 988 989 990
}
EOF
}

991 992 993 994 995
check_type(){
    log check_type "$@"
    headers=$1
    type=$2
    shift 2
996
    disable_safe "$type"
997
    check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
998 999
}

1000
check_struct(){
1001
    log check_struct "$@"
1002 1003 1004 1005 1006
    headers=$1
    struct=$2
    member=$3
    shift 3
    disable_safe "${struct}_${member}"
1007 1008
    check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
        enable_safe "${struct}_${member}"
1009 1010
}

1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
check_builtin(){
    log check_builtin "$@"
    name=$1
    headers=$2
    builtin=$3
    shift 3
    disable "$name"
    check_code ld "$headers" "$builtin" "$@" && enable "$name"
}

1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
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"
}

1031 1032 1033 1034 1035 1036
require(){
    name="$1"
    header="$2"
    func="$3"
    shift 3
    check_lib $header $func "$@" || die "ERROR: $name not found"
1037 1038
}

1039 1040 1041 1042 1043 1044 1045 1046
require2(){
    name="$1"
    headers="$2"
    func="$3"
    shift 3
    check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
}

1047 1048 1049 1050 1051 1052 1053
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)
}

1054 1055 1056 1057
hostcc_e(){
    eval printf '%s\\n' $HOSTCC_E
}

1058 1059 1060 1061
hostcc_o(){
    eval printf '%s\\n' $HOSTCC_O
}

1062 1063 1064 1065
check_host_cc(){
    log check_host_cc "$@"
    cat > $TMPC
    log_file $TMPC
1066
    check_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
1067 1068
}

1069 1070 1071 1072
check_host_cpp(){
    log check_host_cpp "$@"
    cat > $TMPC
    log_file $TMPC
1073
    check_cmd $host_cc $host_cppflags $host_cflags "$@" $(hostcc_e $TMPO) $TMPC
1074 1075
}

1076 1077 1078 1079 1080 1081 1082
check_host_cppflags(){
    log check_host_cppflags "$@"
    check_host_cc "$@" <<EOF && append host_cppflags "$@"
int x;
EOF
}

1083 1084
check_host_cflags(){
    log check_host_cflags "$@"
1085
    set -- $($host_cflags_filter "$@")
1086 1087 1088 1089 1090
    check_host_cc "$@" <<EOF && append host_cflags "$@"
int x;
EOF
}

1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103
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
}

1104 1105 1106 1107 1108 1109
apply(){
    file=$1
    shift
    "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
}

1110
cp_if_changed(){
1111 1112
    cmp -s "$1" "$2" && echo "$2 is unchanged" && return
    mkdir -p "$(dirname $2)"
Mans Rullgard's avatar
Mans Rullgard committed
1113
    $cp_f "$1" "$2"
1114 1115
}

1116 1117 1118
# CONFIG_LIST contains configurable options, while HAVE_LIST is for
# system-dependent things.

1119 1120 1121 1122 1123
COMPONENT_LIST="
    bsfs
    decoders
    demuxers
    encoders
Vitor Sessak's avatar
Vitor Sessak committed
1124
    filters
1125
    hwaccels
1126
    indevs
1127
    muxers
1128
    outdevs
1129 1130 1131 1132
    parsers
    protocols
"

1133
EXAMPLE_LIST="
1134
    avcodec_example
1135
    filter_audio_example
1136
    metadata_example
1137
    output_example
1138
    transcode_aac_example
1139 1140
"

1141 1142 1143 1144 1145
EXTERNAL_LIBRARY_LIST="
    avisynth
    bzlib
    frei0r
    gnutls
1146
    libbs2b
1147 1148 1149 1150
    libcdio
    libdc1394
    libfaac
    libfdk_aac
1151
    libfontconfig
1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165
    libfreetype
    libgsm
    libilbc
    libmp3lame
    libopencore_amrnb
    libopencore_amrwb
    libopencv
    libopenjpeg
    libopus
    libpulse
    librtmp
    libschroedinger
    libspeex
    libtheora
1166
    libtwolame
1167 1168 1169 1170
    libvo_aacenc
    libvo_amrwbenc
    libvorbis
    libvpx
1171
    libwavpack
Justin Ruggles's avatar
Justin Ruggles committed
1172
    libwebp
1173
    libx264
Derek Buitenhuis's avatar
Derek Buitenhuis committed
1174
    libx265
1175
    libxavs
1176 1177 1178
    libxcb
    libxcb_shm
    libxcb_xfixes
1179 1180 1181 1182 1183 1184
    libxvid
    openssl
    x11grab
    zlib
"

1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196
FEATURE_LIST="
    gray
    hardcoded_tables
    runtime_cpudetect
    safe_bitstream_reader
    shared
    small
    sram
    static
    swscale_alpha
"

1197 1198 1199 1200 1201 1202
HWACCEL_LIST="
    dxva2
    vaapi
    vda
    vdpau
"
1203

1204 1205 1206 1207 1208 1209 1210 1211 1212 1213
LIBRARY_LIST="
    avcodec
    avdevice
    avfilter
    avformat
    avresample
    avutil
    swscale
"

1214 1215 1216 1217 1218 1219
LICENSE_LIST="
    gpl
    nonfree
    version3
"

1220 1221 1222 1223 1224 1225
PROGRAM_LIST="
    avconv
    avplay
    avprobe
"

1226
SUBSYSTEM_LIST="
1227
    dct
1228
    doc
1229
    error_resilience
1230
    faan
1231
    fft
1232
    lsp
1233
    lzo
1234
    mdct
1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248
    network
    rdft
"

CONFIG_LIST="
    $COMPONENT_LIST
    $EXAMPLE_LIST
    $EXTERNAL_LIBRARY_LIST
    $FEATURE_LIST
    $HWACCEL_LIST
    $LICENSE_LIST
    $LIBRARY_LIST
    $PROGRAM_LIST
    $SUBSYSTEM_LIST
1249
    memalign_hack
1250
    neon_clobber_test
1251
    pic
1252
    pod2man
1253
    texi2html
1254
    thumb
1255
    xmm_clobber_test
1256
"
1257

1258
THREADS_LIST="
1259 1260
    pthreads
    w32threads
1261
"
1262

1263
ATOMICS_LIST="
1264 1265
    atomics_gcc
    atomics_suncc
1266
    atomics_win32
1267
"
1268

1269
ARCH_LIST="
1270
    aarch64
1271
    alpha
1272
    arm
1273 1274 1275
    avr32
    avr32_ap
    avr32_uc
1276 1277 1278 1279
    bfin
    ia64
    m68k
    mips
1280
    mips64
1281
    parisc
1282
    ppc
1283
    ppc64
1284 1285 1286 1287
    s390
    sh4
    sparc
    sparc64
1288 1289
    tilegx
    tilepro
1290
    tomi
1291 1292 1293
    x86
    x86_32
    x86_64
1294
"
1295

1296
ARCH_EXT_LIST_ARM="
1297 1298 1299
    armv5te
    armv6
    armv6t2
1300
    armv8
1301
    neon
1302
    vfp
1303
    vfpv3
1304
"
1305

1306
ARCH_EXT_LIST_X86_SIMD="
1307
    amd3dnow
1308
    amd3dnowext
1309
    avx
1310
    avx2
1311
    fma3
1312 1313 1314 1315 1316 1317 1318 1319 1320
    fma4
    mmx
    mmxext
    sse
    sse2
    sse3
    sse4
    sse42
    ssse3
1321 1322
    xop
"
1323

1324 1325 1326 1327 1328 1329 1330
ARCH_EXT_LIST_PPC="
    altivec
    dcbzl
    ldbrx
    ppc4xx
"

1331 1332 1333 1334 1335 1336
ARCH_EXT_LIST_X86="
    $ARCH_EXT_LIST_X86_SIMD
    cpunop
    i686
"

1337
ARCH_EXT_LIST="
1338
    $ARCH_EXT_LIST_ARM
1339
    $ARCH_EXT_LIST_PPC
1340
    $ARCH_EXT_LIST_X86
1341 1342
    loongson
    vis
1343
"
1344

1345 1346 1347 1348 1349 1350 1351
ARCH_FEATURES="
    aligned_stack
    fast_64bit
    fast_clz
    fast_cmov
    local_aligned_8
    local_aligned_16
1352
    simd_align_16
1353 1354 1355 1356 1357 1358 1359 1360 1361 1362
"

BUILTIN_LIST="
    atomic_cas_ptr
    machine_rw_barrier
    MemoryBarrier
    mm_empty
    rdtsc
    sync_val_compare_and_swap
"
1363
HAVE_LIST_CMDLINE="
1364 1365 1366
    inline_asm
    symver
    yasm
1367
"
1368

1369
HAVE_LIST_PUB="
1370
    bigendian
1371
    fast_unaligned
1372
"
1373

1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409
HEADERS_LIST="
    alsa_asoundlib_h
    altivec_h
    arpa_inet_h
    cdio_paranoia_h
    cdio_paranoia_paranoia_h
    dev_bktr_ioctl_bt848_h
    dev_bktr_ioctl_meteor_h
    dev_ic_bt8xx_h
    dev_video_bktr_ioctl_bt848_h
    dev_video_meteor_ioctl_meteor_h
    direct_h
    dlfcn_h
    dxva_h
    gsm_h
    io_h
    mach_mach_time_h
    machine_ioctl_bt848_h
    machine_ioctl_meteor_h
    malloc_h
    poll_h
    sndio_h
    soundcard_h
    sys_mman_h
    sys_param_h
    sys_resource_h
    sys_select_h
    sys_soundcard_h
    sys_time_h
    sys_un_h
    sys_videoio_h
    unistd_h
    windows_h
    winsock2_h
"

1410 1411 1412 1413
INTRINSICS_LIST="
    intrinsics_neon
"

1414
MATH_FUNCS="
1415 1416
    atanf
    atan2f
1417
    cbrtf
1418
    cosf
1419 1420
    exp2
    exp2f
1421
    expf
1422 1423
    isinf
    isnan
1424
    ldexpf
1425 1426 1427 1428
    llrint
    llrintf
    log2
    log2f
1429
    log10f
1430 1431
    lrint
    lrintf
1432
    powf
1433 1434 1435
    rint
    round
    roundf
1436
    sinf
1437 1438 1439 1440
    trunc
    truncf
"

1441
SYSTEM_FUNCS="
1442
    aligned_malloc
1443
    clock_gettime
Alex Beregszaszi's avatar
Alex Beregszaszi committed
1444
    closesocket
1445
    CommandLineToArgvW
1446
    CoTaskMemFree
1447
    CryptGenRandom
1448
    dlopen
Måns Rullgård's avatar
Måns Rullgård committed
1449
    fcntl
1450
    flt_lim
Måns Rullgård's avatar
Måns Rullgård committed
1451
    fork
1452
    getaddrinfo
1453
    gethrtime
1454
    getopt
1455
    GetProcessAffinityMask
1456
    GetProcessMemoryInfo
1457
    GetProcessTimes
Ramiro Polla's avatar
Ramiro Polla committed
1458
    getrusage
1459
    getservbyport
1460
    GetSystemTimeAsFileTime
1461
    gettimeofday
1462
    gmtime_r
1463
    inet_aton
1464
    isatty
1465
    jack_port_get_latency_range
1466
    localtime_r
1467
    mach_absolute_time
1468
    MapViewOfFile
1469
    memalign
1470
    mkstemp
1471
    mmap
1472
    mprotect
1473
    nanosleep
1474
    posix_memalign
1475
    sched_getaffinity
1476
    SetConsoleTextAttribute
1477
    setmode
1478
    setrlimit
1479
    Sleep
1480
    strerror_r
1481
    strptime
1482 1483 1484 1485 1486 1487 1488
    sysconf
    sysctl
    usleep
    VirtualAlloc
"

TOOLCHAIN_FEATURES="
1489
    as_dn_directive
1490
    as_func
1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507
    asm_mod_q
    attribute_may_alias
    attribute_packed
    ebp_available
    ebx_available
    gnu_as
    ibm_asm
    inline_asm_labels
    pragma_deprecated
    symver_asm_label
    symver_gnu_asm
    vfp_args
    xform_asm
    xmm_clobbers
"

TYPES_LIST="
1508
    CONDITION_VARIABLE_Ptr
1509
    socklen_t
1510
    struct_addrinfo
1511 1512
    struct_group_source_req
    struct_ip_mreq_source
1513
    struct_ipv6_mreq
1514
    struct_pollfd
1515
    struct_rusage_ru_maxrss
1516
    struct_sockaddr_in6
1517
    struct_sockaddr_sa_len
1518
    struct_sockaddr_storage
1519
    struct_v4l2_frmivalenum_discrete
1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531
"

HAVE_LIST="
    $ARCH_EXT_LIST
    $(add_suffix _external $ARCH_EXT_LIST)
    $(add_suffix _inline   $ARCH_EXT_LIST)
    $ARCH_FEATURES
    $ATOMICS_LIST
    $BUILTIN_LIST
    $HAVE_LIST_CMDLINE
    $HAVE_LIST_PUB
    $HEADERS_LIST
1532
    $INTRINSICS_LIST
1533 1534 1535 1536 1537 1538 1539
    $MATH_FUNCS
    $SYSTEM_FUNCS
    $THREADS_LIST
    $TOOLCHAIN_FEATURES
    $TYPES_LIST
    atomics_native
    dos_paths
1540
    dxva2_lib
1541 1542 1543 1544
    libc_msvcrt
    libdc1394_1
    libdc1394_2
    sdl
1545
    threads
1546 1547
    vdpau_x11
    xlib
1548
"
1549

Diego Biurrun's avatar
Diego Biurrun committed
1550
# options emitted with CONFIG_ prefix but not available on the command line
1551
CONFIG_EXTRA="
1552
    aandcttables
1553
    ac3dsp
1554
    audio_frame_queue
1555
    audiodsp
1556
    blockdsp
1557
    bswapdsp
1558
    cabac
1559
    dvprofile
1560 1561
    faandct
    faanidct
1562
    fdctdsp
1563
    gcrypt
1564
    golomb
1565
    gplv3
1566
    h263dsp
1567 1568 1569
    h264chroma
    h264dsp
    h264pred
1570
    h264qpel
1571
    hpeldsp
1572
    huffman
1573
    huffyuvdsp
1574
    huffyuvencdsp
1575
    idctdsp
1576
    iirfilter
1577
    intrax8
1578
    lgplv3
1579
    lpc
1580
    me_cmp
1581
    mpeg_er
1582
    mpegaudio
1583
    mpegaudiodsp
1584
    mpegvideo
1585
    mpegvideoenc
1586
    nettle
1587
    pixblockdsp
1588
    qpeldsp
1589
    rangecoder
1590
    riffdec
1591
    riffenc
1592
    rtpdec
1593
    rtpenc_chain
1594
    sinewin
1595
    startcode
1596
    tpeldsp
1597
    videodsp
1598
    vp3dsp
1599
    wma_freqs
1600 1601
"

1602
CMDLINE_SELECT="
1603
    $ARCH_EXT_LIST
1604
    $CONFIG_LIST
1605
    $HAVE_LIST_CMDLINE
1606
    $THREADS_LIST
1607
    asm
1608
    cross_compile
1609 1610
    debug
    extra_warnings
1611
    logging
1612
    lto
1613
    optimizations
1614
    rpath
1615
"
1616

1617
PATHS_LIST="
1618
    bindir
1619
    datadir
1620
    docdir
1621 1622 1623 1624 1625
    incdir
    libdir
    mandir
    prefix
    shlibdir
1626
"
1627 1628 1629

CMDLINE_SET="
    $PATHS_LIST
1630
    ar
1631
    arch
1632
    as
1633 1634 1635 1636
    build_suffix
    cc
    cpu
    cross_prefix
1637
    dep_cc
1638
    extra_version
1639 1640
    host_cc
    host_cflags
1641
    host_ld
1642 1643
    host_ldflags
    host_libs
1644
    host_os
1645
    ld
1646
    logfile
1647
    malloc_prefix
1648
    nm
1649
    optflags
1650
    pkg_config
1651
    pkg_config_flags
1652
    random_seed
Måns Rullgård's avatar
Måns Rullgård committed
1653
    samples
1654 1655
    sysinclude
    sysroot
1656
    target_exec
1657
    target_os
1658
    target_path
1659
    target_samples
1660
    toolchain
1661
"
1662

1663 1664
CMDLINE_APPEND="
    extra_cflags
1665
    host_cppflags
1666 1667
"

1668 1669
# code dependency declarations

1670
# architecture extensions
1671

1672 1673
armv5te_deps="arm"
armv6_deps="arm"
1674
armv6t2_deps="arm"
1675
armv8_deps="aarch64"
1676
neon_deps_any="aarch64 arm"
1677
intrinsics_neon_deps="neon"
1678
vfp_deps_any="aarch64 arm"
1679
vfpv3_deps="vfp"
1680

1681 1682
map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM

1683 1684 1685
altivec_deps="ppc"
ppc4xx_deps="ppc"

1686 1687 1688
cpunop_deps="i686"
x86_64_select="i686"
x86_64_suggest="fast_cmov"
1689

1690 1691
amd3dnow_deps="mmx"
amd3dnowext_deps="amd3dnow"
1692
i686_deps="x86"
1693
mmx_deps="x86"
1694
mmxext_deps="mmx"
1695 1696 1697 1698 1699 1700 1701
sse_deps="mmxext"
sse2_deps="sse"
sse3_deps="sse2"
ssse3_deps="sse3"
sse4_deps="ssse3"
sse42_deps="sse4"
avx_deps="sse42"
1702
xop_deps="avx"
1703
fma3_deps="avx"
1704
fma4_deps="avx"
1705
avx2_deps="avx"
1706

1707 1708 1709 1710
mmx_external_deps="yasm"
mmx_inline_deps="inline_asm"
mmx_suggest="mmx_external mmx_inline"

1711
for ext in $(filter_out mmx $ARCH_EXT_LIST_X86_SIMD); do
1712 1713 1714 1715 1716 1717
    eval dep=\$${ext}_deps
    eval ${ext}_external_deps='"${dep}_external"'
    eval ${ext}_inline_deps='"${dep}_inline"'
    eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
done

1718 1719 1720 1721
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"
1722
simd_align_16_if_any="altivec neon sse"
1723

1724 1725 1726
# system capabilities
log2_deps="!libc_msvcrt"

1727 1728
symver_if_any="symver_asm_label symver_gnu_asm"

1729 1730 1731 1732 1733
# 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"
1734
w32threads_deps="atomics_native"
1735 1736
threads_if_any="$THREADS_LIST"

1737
# subsystems
1738
dct_select="rdft"
1739
error_resilience_select="me_cmp"
1740 1741
faandct_deps="faan fdctdsp"
faanidct_deps="faan idctdsp"
1742
intrax8_select="error_resilience"
1743 1744
mdct_select="fft"
rdft_select="fft"
1745
me_cmp_select="fdctdsp idctdsp pixblockdsp"
1746
mpeg_er_select="error_resilience"
1747
mpegaudio_select="mpegaudiodsp"
1748
mpegaudiodsp_select="dct"
1749 1750
mpegvideo_select="blockdsp hpeldsp idctdsp me_cmp videodsp"
mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
1751

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

1937
# hardware accelerators
1938
dxva2_deps="dxva2api_h"
1939
vaapi_deps="va_va_h"
1940
vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
1941
vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore"
1942 1943
vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"

1944 1945 1946 1947
h263_vaapi_hwaccel_deps="vaapi"
h263_vaapi_hwaccel_select="h263_decoder"
h263_vdpau_hwaccel_deps="vdpau"
h263_vdpau_hwaccel_select="h263_decoder"
1948 1949
h264_dxva2_hwaccel_deps="dxva2"
h264_dxva2_hwaccel_select="h264_decoder"
1950 1951 1952 1953
h264_vaapi_hwaccel_deps="vaapi"
h264_vaapi_hwaccel_select="h264_decoder"
h264_vda_hwaccel_deps="vda"
h264_vda_hwaccel_select="h264_decoder"
1954 1955
h264_vda_old_hwaccel_deps="vda"
h264_vda_old_hwaccel_select="h264_decoder"
1956 1957 1958 1959
h264_vdpau_hwaccel_deps="vdpau"
h264_vdpau_hwaccel_select="h264_decoder"
mpeg1_vdpau_hwaccel_deps="vdpau"
mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
1960 1961
mpeg2_dxva2_hwaccel_deps="dxva2"
mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
1962 1963 1964 1965 1966 1967 1968 1969
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"
1970 1971
vc1_dxva2_hwaccel_deps="dxva2"
vc1_dxva2_hwaccel_select="vc1_decoder"
1972 1973 1974 1975
vc1_vaapi_hwaccel_deps="vaapi"
vc1_vaapi_hwaccel_select="vc1_decoder"
vc1_vdpau_hwaccel_deps="vdpau"
vc1_vdpau_hwaccel_select="vc1_decoder"
1976 1977
wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
1978
wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
1979

1980
# parsers
1981
h264_parser_select="h264_decoder"
1982
mpegvideo_parser_select="mpegvideo"
1983
mpeg4video_parser_select="error_resilience h263dsp mpeg_er mpegvideo qpeldsp"
1984
vc1_parser_select="mpegvideo startcode"
1985

1986
# external libraries
1987
libfaac_encoder_deps="libfaac"
1988
libfaac_encoder_select="audio_frame_queue"
1989
libfdk_aac_decoder_deps="libfdk_aac"
1990
libfdk_aac_encoder_deps="libfdk_aac"
1991
libfdk_aac_encoder_select="audio_frame_queue"
1992 1993
libgsm_decoder_deps="libgsm"
libgsm_encoder_deps="libgsm"
1994 1995
libgsm_ms_decoder_deps="libgsm"
libgsm_ms_encoder_deps="libgsm"
1996 1997
libilbc_decoder_deps="libilbc"
libilbc_encoder_deps="libilbc"
1998
libmp3lame_encoder_deps="libmp3lame"
1999
libmp3lame_encoder_select="audio_frame_queue"
2000 2001
libopencore_amrnb_decoder_deps="libopencore_amrnb"
libopencore_amrnb_encoder_deps="libopencore_amrnb"
2002
libopencore_amrnb_encoder_select="audio_frame_queue"
2003
libopencore_amrwb_decoder_deps="libopencore_amrwb"
2004
libopenjpeg_decoder_deps="libopenjpeg"
2005
libopenjpeg_encoder_deps="libopenjpeg"
2006
libopus_decoder_deps="libopus"
2007
libopus_encoder_deps="libopus"
2008
libopus_encoder_select="audio_frame_queue"
2009 2010
libschroedinger_decoder_deps="libschroedinger"
libschroedinger_encoder_deps="libschroedinger"
2011
libspeex_decoder_deps="libspeex"
2012
libspeex_encoder_deps="libspeex"
2013
libspeex_encoder_select="audio_frame_queue"
2014
libtheora_encoder_deps="libtheora"
2015
libtwolame_encoder_deps="libtwolame"
2016
libvo_aacenc_encoder_deps="libvo_aacenc"
2017
libvo_aacenc_encoder_select="audio_frame_queue"
2018
libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
2019
libvorbis_encoder_deps="libvorbis"
2020
libvorbis_encoder_select="audio_frame_queue"
2021 2022 2023 2024
libvpx_vp8_decoder_deps="libvpx"
libvpx_vp8_encoder_deps="libvpx"
libvpx_vp9_decoder_deps="libvpx"
libvpx_vp9_encoder_deps="libvpx"
2025
libwavpack_encoder_deps="libwavpack"
Justin Ruggles's avatar
Justin Ruggles committed
2026
libwebp_encoder_deps="libwebp"
2027
libx264_encoder_deps="libx264"
Derek Buitenhuis's avatar
Derek Buitenhuis committed
2028
libx265_encoder_deps="libx265"
2029
libxavs_encoder_deps="libxavs"
2030
libxvid_encoder_deps="libxvid"
2031

2032
# demuxers / muxers
2033
ac3_demuxer_select="ac3_parser"
2034
asf_demuxer_select="riffdec"
2035
asf_muxer_select="riffenc"
2036
asf_stream_muxer_select="asf_muxer"
2037
avi_demuxer_select="riffdec"
2038
avi_muxer_select="riffenc"
2039
avisynth_demuxer_deps="avisynth"
2040 2041
avisynth_demuxer_select="riffdec"
caf_demuxer_select="riffdec"
2042
dirac_demuxer_select="dirac_parser"
2043 2044
dv_demuxer_select="dvprofile"
dv_muxer_select="dvprofile"
2045
dxa_demuxer_select="riffdec"
2046
eac3_demuxer_select="ac3_parser"
2047
f4v_muxer_select="mov_muxer"
2048
flac_demuxer_select="flac_parser"
2049
hds_muxer_select="flv_muxer"
2050
hls_muxer_select="mpegts_muxer"
2051
ipod_muxer_select="mov_muxer"
2052
ismv_muxer_select="mov_muxer"
2053
matroska_audio_muxer_select="matroska_muxer"
2054
matroska_demuxer_select="riffdec"
2055
matroska_demuxer_suggest="bzlib lzo zlib"
2056 2057
matroska_muxer_select="riffenc"
mmf_muxer_select="riffenc"
2058
mov_demuxer_select="riffdec"
2059
mov_demuxer_suggest="zlib"
2060
mov_muxer_select="riffenc rtpenc_chain"
2061
mp3_demuxer_select="mpegaudio_parser"
2062
mp4_muxer_select="mov_muxer"
2063
mpegts_muxer_select="adts_muxer latm_muxer"
2064 2065
mpegtsraw_demuxer_select="mpegts_demuxer"
mxf_d10_muxer_select="mxf_muxer"
2066
nut_muxer_select="riffenc"
2067
nuv_demuxer_select="riffdec"
2068
oga_muxer_select="ogg_muxer"
2069
ogg_demuxer_select="golomb"
2070
opus_muxer_select="ogg_muxer"
2071
psp_muxer_select="mov_muxer"
2072
rtp_demuxer_select="sdp_demuxer"
2073 2074
rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
rtsp_demuxer_select="http_protocol rtpdec"
2075
rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
Martin Storsjö's avatar
Martin Storsjö committed
2076
sap_demuxer_select="sdp_demuxer"
2077
sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
2078
sdp_demuxer_select="rtpdec"
2079
smoothstreaming_muxer_select="ismv_muxer"
2080
spdif_muxer_select="aac_parser"
2081
spx_muxer_select="ogg_muxer"
2082
tak_demuxer_select="tak_parser"
2083 2084
tg2_muxer_select="mov_muxer"
tgp_muxer_select="mov_muxer"
2085
w64_demuxer_select="wav_demuxer"
2086
wav_demuxer_select="riffdec"
2087 2088
wav_muxer_select="riffenc"
webm_muxer_select="riffenc"
2089 2090 2091
wtv_demuxer_select="riffdec"
xmv_demuxer_select="riffdec"
xwma_demuxer_select="riffdec"
2092 2093

# indevs / outdevs
2094 2095 2096
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"
2097 2098
dv1394_indev_deps="dv1394"
dv1394_indev_select="dv_demuxer"
2099
fbdev_indev_deps="linux_fb_h"
2100
jack_indev_deps="jack_jack_h pthreads"
2101
libcdio_indev_deps="libcdio"
2102 2103 2104
libdc1394_indev_deps="libdc1394"
oss_indev_deps_any="soundcard_h sys_soundcard_h"
oss_outdev_deps_any="soundcard_h sys_soundcard_h"
2105
pulse_indev_deps="libpulse"
2106 2107
sndio_indev_deps="sndio_h"
sndio_outdev_deps="sndio_h"
2108
v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
2109
vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
2110
vfwcap_indev_extralibs="-lavicap32"
2111 2112
x11grab_indev_deps="x11grab"
x11grab_xcb_indev_deps="libxcb"
2113

2114
# protocols
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2115 2116 2117
ffrtmpcrypt_protocol_deps="!librtmp_protocol"
ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
ffrtmpcrypt_protocol_select="tcp_protocol"
2118 2119
ffrtmphttp_protocol_deps="!librtmp_protocol"
ffrtmphttp_protocol_select="http_protocol"
2120
gopher_protocol_select="network"
2121
http_protocol_select="tcp_protocol"
2122
httpproxy_protocol_select="tcp_protocol"
2123
https_protocol_select="tls_protocol"
Marvin Scholz's avatar
Marvin Scholz committed
2124
icecast_protocol_select="http_protocol"
2125 2126 2127 2128 2129
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
2130
mmsh_protocol_select="http_protocol"
2131
mmst_protocol_select="network"
2132
rtmp_protocol_deps="!librtmp_protocol"
2133
rtmp_protocol_select="tcp_protocol"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2134
rtmpe_protocol_select="ffrtmpcrypt_protocol"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2135 2136
rtmps_protocol_deps="!librtmp_protocol"
rtmps_protocol_select="tls_protocol"
2137
rtmpt_protocol_select="ffrtmphttp_protocol"
2138
rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2139
rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2140
rtp_protocol_select="udp_protocol"
2141 2142
sctp_protocol_deps="struct_sctp_event_subscribe"
sctp_protocol_select="network"
2143
srtp_protocol_select="rtp_protocol"
2144
tcp_protocol_select="network"
2145 2146
tls_protocol_deps_any="openssl gnutls"
tls_protocol_select="tcp_protocol"
2147
udp_protocol_select="network"
2148 2149
unix_protocol_deps="sys_un_h"
unix_protocol_select="network"
2150

2151
# filters
2152
blackframe_filter_deps="gpl"
2153
boxblur_filter_deps="gpl"
2154
bs2b_filter_deps="libbs2b"
2155
cropdetect_filter_deps="gpl"
2156
delogo_filter_deps="gpl"
2157
drawtext_filter_deps="libfreetype"
2158
frei0r_filter_deps="frei0r dlopen"
2159
frei0r_filter_extralibs='$ldl'
2160
frei0r_src_filter_deps="frei0r dlopen"
2161
frei0r_src_filter_extralibs='$ldl'
2162
hqdn3d_filter_deps="gpl"
2163
interlace_filter_deps="gpl"
2164
ocv_filter_deps="libopencv"
2165
resample_filter_deps="avresample"
2166
scale_filter_deps="swscale"
2167

2168
# examples
2169
avcodec_example_deps="avcodec avutil"
2170
filter_audio_example_deps="avfilter avutil"
2171
metadata_example_deps="avformat avutil"
2172
output_example_deps="avcodec avformat avutil swscale"
2173
transcode_aac_example_deps="avcodec avformat avresample"
2174

2175
# libraries, in linking order
2176
avcodec_deps="avutil"
2177
avdevice_deps="avformat avcodec avutil"
2178
avfilter_deps="avutil"
2179
avformat_deps="avcodec avutil"
2180 2181
avresample_deps="avutil"
swscale_deps="avutil"
2182

2183
# programs
2184
avconv_deps="avcodec avfilter avformat avresample swscale"
2185
avconv_select="aformat_filter anull_filter asyncts_filter atrim_filter format_filter
2186
               fps_filter null_filter resample_filter scale_filter
2187
               setpts_filter trim_filter"
2188
avplay_deps="avcodec avformat avresample swscale sdl"
2189
avplay_libs='$sdl_libs'
Anton Khirnov's avatar
Anton Khirnov committed
2190
avplay_select="rdft"
2191
avprobe_deps="avcodec avformat"
Måns Rullgård's avatar
Måns Rullgård committed
2192

2193
# documentation
2194
pod2man_deps="doc"
2195 2196
texi2html_deps="doc"

Fabrice Bellard's avatar
Fabrice Bellard committed
2197
# default parameters
2198

2199
logfile="config.log"
2200 2201

# installation paths
2202 2203
prefix_default="/usr/local"
bindir_default='${prefix}/bin'
2204
datadir_default='${prefix}/share/avconv'
2205
docdir_default='${prefix}/share/doc/libav'
2206 2207 2208 2209
incdir_default='${prefix}/include'
libdir_default='${prefix}/lib'
mandir_default='${prefix}/share/man'
shlibdir_default="$libdir_default"
2210 2211

# toolchain
2212
ar_default="ar"
2213
cc_default="gcc"
2214
host_cc_default="gcc"
Mans Rullgard's avatar
Mans Rullgard committed
2215
cp_f="cp -f"
2216
ln_s="ln -s -f"
2217
nm_default="nm -g"
2218
objformat="elf"
2219
pkg_config_default=pkg-config
Michael Niedermayer's avatar
Michael Niedermayer committed
2220
ranlib="ranlib"
2221
strip="strip"
2222
yasmexe="yasm"
2223 2224

# machine
2225
arch_default=$(uname -m)
2226
cpu="generic"
2227
intrinsics="none"
2228 2229

# OS
2230 2231
target_os_default=$(tolower $(uname -s))
host_os=$target_os_default
2232 2233

# configurable options
2234
enable $EXAMPLE_LIST $LIBRARY_LIST $PROGRAM_LIST
2235 2236 2237 2238

enable asm
enable debug
enable doc
2239
enable faan faandct faanidct
2240
enable optimizations
2241
enable safe_bitstream_reader
2242
enable static
2243
enable swscale_alpha
2244

2245 2246 2247
# By default, enable only those hwaccels that have no external dependencies.
enable dxva2 vdpau

2248
# build settings
2249
SHFLAGS='-shared -Wl,-soname,$$(@F)'
2250 2251
LIBPREF="lib"
LIBSUF=".a"
2252 2253
FULLNAME='$(NAME)$(BUILDSUF)'
LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
2254 2255
SLIBPREF="lib"
SLIBSUF=".so"
2256
SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
2257 2258
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
Måns Rullgård's avatar
Måns Rullgård committed
2259
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2260 2261
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2262

2263 2264
asflags_filter=echo
cflags_filter=echo
2265 2266
ldflags_filter=echo

2267
AS_C='-c'
2268
AS_O='-o $@'
2269
CC_C='-c'
2270
CC_E='-E -o $@'
2271
CC_O='-o $@'
2272
LD_O='-o $@'
2273 2274
LD_LIB='-l%'
LD_PATH='-L'
2275
HOSTCC_C='-c'
2276
HOSTCC_E='-E -o $@'
2277
HOSTCC_O='-o $@'
2278
HOSTLD_O='-o $@'
2279

2280
host_libs='-lm'
2281 2282
host_cflags_filter=echo
host_ldflags_filter=echo
2283

2284
target_path='$(CURDIR)'
2285

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

2291
# find source path
2292
if test -f configure; then
2293
    source_path=.
2294
else
2295
    source_path=$(cd $(dirname "$0"); pwd)
2296
    echo "$source_path" | grep -q '[[:blank:]]' &&
2297
        die "Out of tree builds are impossible with whitespace in source path."
2298 2299
    test -e "$source_path/config.h" &&
        die "Out of tree builds are impossible with config.h in source dir."
2300 2301
fi

2302
for v in "$@"; do
2303 2304 2305
    r=${v#*=}
    l=${v%"$r"}
    r=$(sh_quote "$r")
2306
    LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
2307
done
2308

2309 2310 2311 2312
find_things(){
    thing=$1
    pattern=$2
    file=$source_path/$3
2313
    sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2314 2315 2316 2317
}

ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2318
HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
2319 2320 2321 2322
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)
2323 2324
OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2325
PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
2326
FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2327

2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341
ALL_COMPONENTS="
    $BSF_LIST
    $DECODER_LIST
    $DEMUXER_LIST
    $ENCODER_LIST
    $FILTER_LIST
    $HWACCEL_LIST
    $INDEV_LIST
    $MUXER_LIST
    $OUTDEV_LIST
    $PARSER_LIST
    $PROTOCOL_LIST
"

2342 2343 2344 2345 2346 2347
for n in $COMPONENT_LIST; do
    v=$(toupper ${n%s})_LIST
    eval enable \$$v
    eval ${n}_if_any="\$$v"
done

2348
enable $ARCH_EXT_LIST
2349 2350 2351 2352 2353 2354 2355

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

2356 2357 2358 2359
print_3_columns() {
    cat | tr ' ' '\n' | sort | pr -r -3 -t
}

2360
show_list() {
Ramiro Polla's avatar
Ramiro Polla committed
2361 2362
    suffix=_$1
    shift
2363
    echo $* | sed s/$suffix//g | print_3_columns
2364 2365 2366
    exit 0
}

2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387
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 }")
}

2388
for opt do
2389 2390
    optval="${opt#*=}"
    case "$opt" in
2391 2392
        --extra-ldflags=*)
            add_ldflags $optval
2393
        ;;
2394 2395 2396
        --extra-ldexeflags=*)
            add_ldexeflags $optval
        ;;
2397 2398
        --extra-libs=*)
            add_extralibs $optval
2399
        ;;
2400 2401
        --disable-devices)
            disable $INDEV_LIST $OUTDEV_LIST
2402
        ;;
2403 2404
        --enable-debug=*)
            debuglevel="$optval"
2405 2406 2407 2408 2409 2410 2411
        ;;
        --disable-programs)
            disable $PROGRAM_LIST
        ;;
        --disable-everything)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
        ;;
2412 2413 2414 2415
        --disable-all)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
            disable $LIBRARY_LIST $PROGRAM_LIST doc
        ;;
2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430
        --enable-random|--disable-random)
            action=${opt%%-random}
            do_random ${action#--} $COMPONENT_LIST
        ;;
        --enable-random=*|--disable-random=*)
            action=${opt%%-random=*}
            do_random ${action#--} $optval
        ;;
        --enable-*=*|--disable-*=*)
            eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
            is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
            eval list=\$$(toupper $thing)_LIST
            name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
            $action $(filter "$name" $list)
        ;;
Anton Khirnov's avatar
Anton Khirnov committed
2431 2432 2433 2434
        --enable-avserver|--disable-avserver*)
            warn "avserver has been removed, the ${opt} option is only"\
                 "provided for compatibility and will be removed in the future"
        ;;
2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465
        --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
        ;;
2466
    esac
2467 2468
done

2469 2470
disabled logging && logfile=/dev/null

2471
echo "# $0 $LIBAV_CONFIGURATION" > $logfile
2472 2473
set >> $logfile

2474 2475
test -n "$cross_prefix" && enable cross_compile

2476 2477 2478 2479 2480
if enabled cross_compile; then
    test -n "$arch" && test -n "$target_os" ||
        die "Must specify target arch and OS when cross-compiling"
fi

2481
ar_default="${cross_prefix}${ar_default}"
2482
cc_default="${cross_prefix}${cc_default}"
Måns Rullgård's avatar
Måns Rullgård committed
2483
nm_default="${cross_prefix}${nm_default}"
2484
pkg_config_default="${cross_prefix}${pkg_config_default}"
2485
ranlib="${cross_prefix}${ranlib}"
2486
strip="${cross_prefix}${strip}"
2487

2488 2489
sysinclude_default="${sysroot}/usr/include"

2490
case "$toolchain" in
2491 2492
    clang-asan)
        cc_default="clang"
2493 2494
        add_cflags  -fsanitize=address
        add_ldflags -fsanitize=address
2495 2496 2497
    ;;
    clang-tsan)
        cc_default="clang"
2498 2499
        add_cflags  -fsanitize=thread -pie
        add_ldflags -fsanitize=thread -pie
2500
    ;;
2501 2502
    clang-usan)
        cc_default="clang"
2503
        add_cflags  -fsanitize=undefined -O1
2504 2505
        add_ldflags -fsanitize=undefined
    ;;
2506 2507 2508 2509 2510 2511 2512 2513 2514 2515
    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
    ;;
2516 2517 2518 2519 2520
    gcc-usan)
        cc_default="gcc"
        add_cflags  -fsanitize=undefined
        add_ldflags -fsanitize=undefined
    ;;
2521 2522 2523 2524
    valgrind-massif)
        target_exec_default="valgrind"
        target_exec_args="--alloc-fn=av_malloc --alloc-fn=av_mallocz"
    ;;
2525 2526 2527 2528
    valgrind-memcheck)
        target_exec_default="valgrind"
        target_exec_args="--track-origins=yes --leak-check=full"
    ;;
2529
    msvc)
2530 2531
        # Check whether the current MSVC version needs the C99 converter.
        # From MSVC 2013 (compiler major version 18) onwards, it does actually
2532
        # support enough of C99 to build libav. Default to the new
2533 2534 2535 2536 2537
        # 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
2538
            cc_default="cl"
2539 2540 2541
        else
            cc_default="c99wrap cl"
        fi
2542
        ld_default="link"
2543
        nm_default="dumpbin -symbols"
2544
        ar_default="lib"
2545
        target_os_default="win32"
2546 2547 2548 2549 2550
        # 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=.
2551
    ;;
2552
    icl)
2553 2554
        cc_default="icl"
        ld_default="xilink"
2555 2556 2557
        nm_default="dumpbin -symbols"
        ar_default="xilib"
        target_os_default="win32"
2558
        TMPDIR=.
2559
    ;;
2560 2561 2562 2563
    gcov)
        add_cflags  -fprofile-arcs -ftest-coverage
        add_ldflags -fprofile-arcs -ftest-coverage
    ;;
2564
    hardened)
2565 2566 2567
        add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
        add_cflags   -fno-strict-overflow -fstack-protector-all
        add_ldflags  -Wl,-z,relro -Wl,-z,now
2568
    ;;
2569 2570 2571 2572 2573
    ?*)
        die "Unknown toolchain $toolchain"
    ;;
esac

2574
set_default arch cc pkg_config sysinclude target_exec target_os
2575 2576
enabled cross_compile || host_cc_default=$cc
set_default host_cc
2577

2578 2579 2580 2581 2582
if ! $pkg_config --version >/dev/null 2>&1; then
    warn "$pkg_config not found, library detection may fail."
    pkg_config=false
fi

2583 2584
exesuf() {
    case $1 in
2585
        mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
2586 2587 2588 2589 2590
    esac
}

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

2592
# set temporary file name
2593
: ${TMPDIR:=$TEMPDIR}
2594
: ${TMPDIR:=$TMP}
2595
: ${TMPDIR:=/tmp}
2596

2597
if ! check_cmd mktemp -u XXXXXX; then
2598 2599 2600
    # simple replacement for missing mktemp
    # NOT SAFE FOR GENERAL USE
    mktemp(){
2601
        echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
2602 2603 2604 2605 2606 2607
    }
fi

tmpfile(){
    tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
        (set -C; exec > $tmp) 2>/dev/null ||
2608
        die "Unable to create temporary file in $TMPDIR."
2609 2610 2611 2612 2613 2614
    append TMPFILES $tmp
    eval $1=$tmp
}

trap 'rm -f -- $TMPFILES' EXIT

2615
tmpfile TMPASM .asm
2616 2617 2618 2619 2620 2621 2622
tmpfile TMPC   .c
tmpfile TMPE   $EXESUF
tmpfile TMPH   .h
tmpfile TMPO   .o
tmpfile TMPS   .S
tmpfile TMPSH  .sh
tmpfile TMPV   .ver
2623 2624

unset -f mktemp
2625

2626 2627
chmod +x $TMPE

2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640
# 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

2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651
armasm_flags(){
    for flag; do
        case $flag in
            # Filter out MSVC cl.exe options from cflags that shouldn't
            # be passed to gas-preprocessor
            -M[TD]*)                                            ;;
            *)                  echo $flag                      ;;
        esac
   done
}

2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669
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
2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681
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
}

2682
msvc_common_flags(){
2683 2684
    for flag; do
        case $flag in
2685 2686 2687 2688 2689 2690
            # 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
2691
            -fomit-frame-pointer) ;;
2692 2693 2694 2695
            -g)                   echo -Z7 ;;
            -fno-math-errno)      ;;
            -fno-common)          ;;
            -fno-signed-zeros)    ;;
2696
            -fPIC)                ;;
2697 2698
            -mthumb)              ;;
            -march=*)             ;;
2699
            -lz)                  echo zlib.lib ;;
2700 2701
            -lavifil32)           echo vfw32.lib ;;
            -lavicap32)           echo vfw32.lib user32.lib ;;
2702 2703 2704 2705 2706 2707
            -l*)                  echo ${flag#-l}.lib ;;
            *)                    echo $flag ;;
        esac
    done
}

2708 2709 2710 2711
msvc_flags(){
    msvc_common_flags "$@"
    for flag; do
        case $flag in
2712
            -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
2713 2714
                                       -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
                                       -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
2715
                                       -wd4273 -wd4701 ;;
2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731
        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
}

2732 2733 2734
pgi_flags(){
    for flag; do
        case $flag in
2735
            -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759
            -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   ;;
2760 2761
                    corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
                    corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
2762
                    amdfam10|barcelona|bdver*) echo -xarch=sse4_1        ;;
2763
                    athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
2764
                    k8|opteron|athlon64|athlon-fx)
2765 2766
                                               echo -xarch=sse2a         ;;
                    athlon*)                   echo -xarch=pentium_proa  ;;
2767 2768 2769 2770 2771 2772
                esac
                ;;
            -std=c99)             echo -xc99              ;;
            -fomit-frame-pointer) echo -xregs=frameptr    ;;
            -fPIC)                echo -KPIC -xcode=pic32 ;;
            -W*,*)                echo $flag              ;;
2773 2774
            -f*-*|-W*|-mimpure-text)                      ;;
            -shared)              echo -G                 ;;
2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796
            *)                    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        ;;
2797
            -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
2798 2799 2800 2801
            -msoft-float)   echo --float_support=vfplib       ;;
            -O[0-3]|-mf=*)  echo $flag                        ;;
            -g)             echo -g -mn                       ;;
            -pds=*)         echo $flag                        ;;
2802 2803 2804
            -D*|-I*)        echo $flag                        ;;
            --gcc|--abi=*)  echo $flag                        ;;
            -me)            echo $flag                        ;;
2805 2806 2807 2808
        esac
    done
}

2809 2810 2811 2812
probe_cc(){
    pfx=$1
    _cc=$2

2813 2814
    unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
    unset _ld_o _ldflags _ld_lib _ld_path
2815
    unset _depflags _DEPCMD _DEPFLAGS
2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836
    _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'
2837
    elif $_cc --version 2>/dev/null | grep -q ^icc; then
2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854
        _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'
2855
        _flags_filter=ccc_flags
2856
    elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
2857 2858
        test -d "$sysroot" || die "No valid sysroot specified."
        _type=armcc
2859
        _ident=$($_cc --vsn | grep -i build | head -n1 | sed 's/.*: //')
2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871
        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'
2872
    elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
2873 2874 2875
        _type=tms470
        _ident=$($_cc -version | head -n1 | tr -s ' ')
        _flags='--gcc --abi=eabi -me'
2876
        _cc_e='-ppl -fe=$@'
2877 2878 2879 2880 2881 2882 2883 2884
        _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)
2885
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
2886 2887 2888 2889 2890 2891
        _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)'
2892
        _DEPFLAGS='-xM1 -xc99'
2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913
        _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 }')"
2914
        opt_common='-alias=ansi -Mdse -Mlre -Mpre'
2915 2916 2917 2918
        _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
        _cflags_size="-O2 -Munroll=c:1 $opt_common"
        _cflags_noopt="-O1"
        _flags_filter=pgi_flags
2919 2920 2921 2922 2923
    elif $_cc 2>&1 | grep -q 'Microsoft.*ARM.*Assembler'; then
        _type=armasm
        _ident=$($_cc | head -n1)
        # 4509: "This form of conditional instruction is deprecated"
        _flags="-nologo -ignore 4509"
2924
        _flags_filter=armasm_flags
2925 2926 2927 2928 2929 2930 2931 2932
    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
2933
            _ld_o='-out:$@'
2934 2935 2936
        else
            _ld_o='-Fe$@'
        fi
2937 2938
        _cc_o='-Fo$@'
        _cc_e='-P -Fi$@'
2939 2940 2941 2942
        _flags_filter=msvc_flags
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
        _flags='-nologo'
2943
        _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
2944
        if [ $pfx = hostcc ]; then
2945
            append _cflags -Dsnprintf=_snprintf
2946
        fi
2947 2948 2949 2950
    elif $_cc 2>&1 | grep -q Intel; then
        _type=icl
        _ident=$($cc 2>&1 | head -n1)
        _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
2951 2952
        # Not only is O3 broken on 13.x+ but it is slower on all previous
        # versions (tested) as well.
2953 2954 2955
        _cflags_speed="-O2"
        _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
        if $_cc 2>&1 | grep -q Linker; then
2956
            _ld_o='-out:$@'
2957 2958 2959
        else
            _ld_o='-Fe$@'
        fi
2960
        _cc_o='-Fo$@'
2961
        _cc_e='-P'
2962
        _flags_filter=icl_flags
2963 2964
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
2965
        # -Qdiag-error to make icl error when seeing certain unknown arguments
2966
        _flags='-nologo -Qdiag-error:4044,10157'
2967 2968
        # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency
        # with MSVC which enables it by default.
2969
        _cflags='-D_USE_MATH_DEFINES -FIstdlib.h -Dstrtoll=_strtoi64 -Qms0 -Qvec- -Qsimd- -GS'
2970 2971 2972
        if [ $pfx = hostcc ]; then
            append _cflags -Dsnprintf=_snprintf
        fi
Luca Barbato's avatar
Luca Barbato committed
2973 2974 2975 2976 2977 2978 2979
    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
2980
    fi
2981 2982 2983 2984 2985 2986

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

set_ccvars(){
2987
    eval ${1}_C=\${_cc_c-\${${1}_C}}
2988
    eval ${1}_E=\${_cc_e-\${${1}_E}}
2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012
    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
3013

3014 3015
test -n "$cc_type" && enable $cc_type ||
    warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
3016

3017
: ${as_default:=$cc}
3018
: ${dep_cc_default:=$cc}
3019
: ${ld_default:=$cc}
3020 3021
: ${host_ld_default:=$host_cc}
set_default ar as dep_cc ld host_ld
3022

3023 3024 3025 3026 3027 3028 3029 3030 3031
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
3032
LD_O=${_ld_o-$LD_O}
3033 3034
LD_LIB=${_ld_lib-$LD_LIB}
LD_PATH=${_ld_path-$LD_PATH}
3035

3036 3037 3038 3039 3040
probe_cc hostld "$host_ld"
host_ldflags_filter=$_flags_filter
add_host_ldflags $_flags $_ldflags
HOSTLD_O=${_ld_o-$HOSTLD_O}

3041 3042 3043 3044 3045 3046
if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
    probe_cc depcc "$dep_cc"
    CCDEP=${_DEPCMD:-$DEPCMD}
    CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
    DEPCCFLAGS=$_flags
fi
3047

3048 3049 3050 3051 3052 3053
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='$@'
3054 3055 3056
elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then
    arflags='-Xany -r -c'
    ar_o='$@'
3057 3058 3059 3060 3061
else
    arflags="rc"
    ar_o='$@'
fi

3062
add_cflags $extra_cflags
3063
add_asflags $extra_cflags
3064

3065 3066
if test -n "$sysroot"; then
    case "$cc_type" in
3067
        gcc|llvm_gcc|clang)
3068
            add_cppflags --sysroot="$sysroot"
3069 3070
            add_ldflags --sysroot="$sysroot"
        ;;
3071 3072 3073 3074
        tms470)
            add_cppflags -I"$sysinclude"
            add_ldflags  --sysroot="$sysroot"
        ;;
3075 3076 3077
    esac
fi

3078
if test "$cpu" = host; then
3079 3080
    enabled cross_compile &&
        die "--cpu=host makes no sense when cross-compiling."
3081 3082

    case "$cc_type" in
3083
        gcc|llvm_gcc)
3084 3085
            check_native(){
                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
3086
                sed -n "/cc1.*$1=/{
3087 3088 3089 3090
                            s/.*$1=\\([^ ]*\\).*/\\1/
                            p
                            q
                        }" $TMPE
3091 3092 3093 3094 3095
            }
            cpu=$(check_native -march || check_native -mcpu)
        ;;
    esac

3096 3097
    test "${cpu:-host}" = host &&
        die "--cpu=host not supported with compiler $cc"
3098 3099
fi

3100 3101
# Deal with common $arch aliases
case "$arch" in
3102 3103 3104
    aarch64|arm64)
        arch="aarch64"
    ;;
3105 3106 3107
    arm*)
        arch="arm"
    ;;
3108
    mips*|IP*)
3109 3110
        arch="mips"
    ;;
3111
    parisc*|hppa*)
3112 3113
        arch="parisc"
    ;;
3114
    "Power Macintosh"|ppc*|powerpc*)
3115 3116 3117 3118 3119 3120 3121 3122
        arch="ppc"
    ;;
    s390|s390x)
        arch="s390"
    ;;
    sh4|sh)
        arch="sh4"
    ;;
3123
    sun4u|sparc*)
3124 3125
        arch="sparc"
    ;;
3126 3127 3128
    tilegx|tile-gx)
        arch="tilegx"
    ;;
3129
    i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
3130 3131 3132 3133
        arch="x86"
    ;;
esac

3134
is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
3135
enable $arch
3136

3137
# Add processor-specific flags
3138
if enabled aarch64; then
3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154

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

elif enabled alpha; then

    cpuflags="-mcpu=$cpu"

elif enabled arm; then

3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185
    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)

3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199
    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   ;;
3200
                *)                             subarch=$(probe_arm_arch) ;;
3201 3202 3203 3204
            esac
        ;;
    esac

3205 3206 3207 3208 3209
    case "$subarch" in
        armv5t*)    enable fast_clz                ;;
        armv[6-8]*) enable fast_clz fast_unaligned ;;
    esac

3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238
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"

3239
elif enabled ppc; then
3240

3241 3242
    disable ldbrx

3243 3244
    case $(tolower $cpu) in
        601|ppc601|powerpc601)
Måns Rullgård's avatar
Måns Rullgård committed
3245
            cpuflags="-mcpu=601"
3246
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3247
        ;;
3248
        603*|ppc603*|powerpc603*)
Måns Rullgård's avatar
Måns Rullgård committed
3249
            cpuflags="-mcpu=603"
3250
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3251
        ;;
3252
        604*|ppc604*|powerpc604*)
Måns Rullgård's avatar
Måns Rullgård committed
3253
            cpuflags="-mcpu=604"
3254
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3255
        ;;
3256
        g3|75*|ppc75*|powerpc75*)
3257
            cpuflags="-mcpu=750"
3258
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3259
        ;;
3260
        g4|745*|ppc745*|powerpc745*)
3261
            cpuflags="-mcpu=7450"
Måns Rullgård's avatar
Måns Rullgård committed
3262
        ;;
3263
        74*|ppc74*|powerpc74*)
3264
            cpuflags="-mcpu=7400"
Måns Rullgård's avatar
Måns Rullgård committed
3265
        ;;
3266
        g5|970|ppc970|powerpc970)
3267
            cpuflags="-mcpu=970"
Måns Rullgård's avatar
Måns Rullgård committed
3268
        ;;
3269
        power[3-7]*)
3270
            cpuflags="-mcpu=$cpu"
3271
        ;;
3272
        cell)
Måns Rullgård's avatar
Måns Rullgård committed
3273 3274 3275
            cpuflags="-mcpu=cell"
            enable ldbrx
        ;;
3276 3277 3278 3279
        e500mc)
            cpuflags="-mcpu=e500mc"
            disable altivec
        ;;
3280 3281 3282
        e500v2)
            cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
            disable altivec
3283
            disable dcbzl
3284 3285 3286 3287
        ;;
        e500)
            cpuflags="-mcpu=8540 -mhard-float"
            disable altivec
3288
            disable dcbzl
3289
        ;;
Måns Rullgård's avatar
Måns Rullgård committed
3290
    esac
3291

3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302
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

3303 3304
elif enabled x86; then

Måns Rullgård's avatar
Måns Rullgård committed
3305 3306 3307
    case $cpu in
        i[345]86|pentium)
            cpuflags="-march=$cpu"
3308
            disable i686
Måns Rullgård's avatar
Måns Rullgård committed
3309 3310
            disable mmx
        ;;
3311
        # targets that do NOT support nopl and conditional mov (cmov)
Måns Rullgård's avatar
Måns Rullgård committed
3312 3313
        pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
            cpuflags="-march=$cpu"
3314
            disable i686
Måns Rullgård's avatar
Måns Rullgård committed
3315
        ;;
3316
        # targets that do support nopl and conditional mov (cmov)
3317
        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
3318
            cpuflags="-march=$cpu"
3319
            enable i686
Måns Rullgård's avatar
Måns Rullgård committed
3320 3321 3322 3323 3324
            enable fast_cmov
        ;;
        # targets that do support conditional mov but on which it's slow
        pentium4|pentium4m|prescott|nocona)
            cpuflags="-march=$cpu"
3325
            enable i686
Måns Rullgård's avatar
Måns Rullgård committed
3326 3327 3328
            disable fast_cmov
        ;;
    esac
3329 3330 3331

fi

3332 3333 3334 3335
if [ "$cpu" != generic ]; then
    add_cflags  $cpuflags
    add_asflags $cpuflags
fi
3336

3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349
# 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

3350
add_cppflags -D_ISOC99_SOURCE
3351
check_cflags -std=c99
3352
check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
3353 3354
#include <stdlib.h>
EOF
3355
check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
3356 3357
#include <stdlib.h>
EOF
3358

3359
add_host_cppflags -D_ISOC99_SOURCE
3360
check_host_cflags -std=c99
3361
check_host_cflags -Wall
3362
check_host_cflags -O3
3363

3364 3365 3366 3367 3368 3369 3370 3371
check_64bit(){
    arch32=$1
    arch64=$2
    expr=$3
    check_code cc "" "int test[2*($expr) - 1]" &&
        subarch=$arch64 || subarch=$arch32
}

3372
case "$arch" in
3373
    aarch64|alpha|ia64)
3374 3375 3376 3377
        spic=$shared
    ;;
    mips)
        check_64bit mips mips64 '_MIPS_SIM > 1'
3378
        spic=$shared
3379
    ;;
3380 3381 3382 3383
    parisc)
        check_64bit parisc parisc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
3384 3385
    ppc)
        check_64bit ppc ppc64 'sizeof(void *) > 4'
3386
        spic=$shared
3387
    ;;
3388 3389 3390 3391
    s390)
        check_64bit s390 s390x 'sizeof(void *) > 4'
        spic=$shared
    ;;
3392 3393 3394 3395
    sparc)
        check_64bit sparc sparc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
3396
    x86)
3397
        check_64bit x86_32 x86_64 'sizeof(void *) > 4'
3398
        if test "$subarch" = "x86_64"; then
3399
            spic=$shared
3400
        fi
3401 3402 3403
    ;;
esac

3404
enable $subarch
3405
enabled spic && enable_weak pic
3406

3407
# OS specific
3408
case $target_os in
3409
    aix)
3410
        SHFLAGS=-shared
3411
        add_cppflags '-I\$(SRC_PATH)/compat/aix'
3412
        enabled shared && add_ldflags -Wl,-brtl
3413
        ;;
3414 3415 3416 3417 3418 3419 3420
    android)
        disable symver
        SLIB_INSTALL_NAME='$(SLIBNAME)'
        SLIB_INSTALL_LINKS=
        # soname not set on purpose
        SHFLAGS=-shared
        ;;
3421
    haiku)
3422
        prefix_default="/boot/common"
3423
        network_extralibs="-lnetwork"
François Revol's avatar
François Revol committed
3424
        host_libs=
3425
        ;;
3426
    sunos)
3427
        SHFLAGS='-shared -Wl,-h,$$(@F)'
3428
        enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
3429
        network_extralibs="-lsocket -lnsl"
3430 3431 3432 3433 3434
        # 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.
3435 3436 3437
        enabled_all suncc x86 &&
            echo "hwcap_1 = OVERRIDE;" > mapfile &&
            add_ldflags -Wl,-M,mapfile
3438
        nm_default='nm -P -g'
3439 3440
        ;;
    netbsd)
3441
        disable symver
3442 3443
        oss_indev_extralibs="-lossaudio"
        oss_outdev_extralibs="-lossaudio"
3444
        ;;
3445
    openbsd|bitrig)
3446
        disable symver
3447
        SHFLAGS='-shared'
3448
        SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
3449
        SLIB_INSTALL_LINKS=
3450 3451
        oss_indev_extralibs="-lossaudio"
        oss_outdev_extralibs="-lossaudio"
3452
        ;;
3453 3454 3455 3456
    dragonfly)
        disable symver
        ;;
    freebsd)
3457 3458
        ;;
    bsd/os)
3459
        add_extralibs -lpoll -lgnugetopt
3460 3461
        ;;
    darwin)
3462
        enabled ppc && add_asflags -force_cpusubtype_ALL
3463
        SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
3464
        enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
3465
        add_ldflags -Wl,-dynamic,-search_paths_first
3466 3467 3468
        SLIBSUF=".dylib"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
Loren Merritt's avatar
Loren Merritt committed
3469
        objformat="macho"
3470
        enabled x86_64 && objformat="macho64"
3471
        enabled_any pic shared ||
3472
            { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
3473 3474
        ;;
    mingw32*)
3475
        if test $target_os = "mingw32ce"; then
3476 3477 3478 3479
            disable network
        else
            target_os=mingw32
        fi
3480
        LIBTARGET=i386
3481
        if enabled x86_64; then
3482
            LIBTARGET="i386:x86-64"
3483
        elif enabled arm; then
3484
            LIBTARGET=arm-wince
3485
        fi
3486 3487
        check_ldflags -Wl,--nxcompat
        check_ldflags -Wl,--dynamicbase
3488
        shlibdir_default="$bindir_default"
3489 3490 3491 3492
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3493
        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)'
3494 3495 3496 3497
        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)'
3498
        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
3499
        objformat="win32"
3500
        dlltool="${cross_prefix}dlltool"
3501
        ranlib=:
3502
        enable dos_paths
3503
        ;;
3504
    win32|win64)
3505
        disable symver
3506 3507 3508 3509
        if enabled shared; then
            # Link to the import library instead of the normal static library
            # for shared libs.
            LD_LIB='%.lib'
3510
            # Cannot build both shared and static libs with MSVC or icl.
3511 3512 3513 3514 3515 3516 3517
            disable static
        fi
        shlibdir_default="$bindir_default"
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3518
        SLIB_CREATE_DEF_CMD='$(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
3519 3520 3521 3522 3523
        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)'
3524 3525 3526 3527
        objformat="win32"
        ranlib=:
        enable dos_paths
        ;;
3528
    cygwin*)
3529
        target_os=cygwin
3530
        shlibdir_default="$bindir_default"
3531 3532 3533 3534
        SLIBPREF="cyg"
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
3535 3536 3537 3538
        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
3539
        objformat="win32"
3540
        enable dos_paths
3541
        ;;
3542 3543
    *-dos|freedos|opendos)
        network_extralibs="-lsocket"
3544
        objformat="coff"
3545
        enable dos_paths
3546
        add_cppflags -U__STRICT_ANSI__
3547
        ;;
3548 3549 3550 3551
    linux)
        enable dv1394
        ;;
    irix*)
3552
        target_os=irix
3553 3554
        ranlib="echo ignoring ranlib"
        ;;
3555 3556
    os/2*)
        ln_s="cp -f"
3557
        objformat="aout"
3558
        add_cppflags -D_GNU_SOURCE
3559
        add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
3560
        SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
3561
        LIBSUF="_s.a"
3562 3563 3564 3565
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
3566
        SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
3567 3568 3569 3570 3571
            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'
3572
        SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
3573
            emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
3574
        SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
3575
        enable dos_paths
3576
        ;;
3577
    gnu/kfreebsd)
3578
        add_cppflags -D_BSD_SOURCE
3579
        ;;
3580 3581
    gnu)
        ;;
3582 3583 3584 3585
    qnx)
        add_cppflags -D_QNX_SOURCE
        network_extralibs="-lsocket"
        ;;
3586 3587 3588
    symbian)
        SLIBSUF=".dll"
        enable dos_paths
3589 3590 3591 3592 3593 3594 3595 3596
        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
3597
        ;;
3598 3599 3600
    osf1)
        add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
        ;;
3601 3602
    minix)
        ;;
Mans Rullgard's avatar
Mans Rullgard committed
3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613
    plan9)
        add_cppflags -D_C99_SNPRINTF_EXTENSION  \
                     -D_REENTRANT_SOURCE        \
                     -D_RESEARCH_SOURCE         \
                     -DFD_SETSIZE=96            \
                     -DHAVE_SOCK_OPTS
        add_compat strtod.o strtod=avpriv_strtod
        network_extralibs='-lbsd'
        exeobjs=compat/plan9/main.o
        cp_f='cp'
        ;;
3614 3615
    none)
        ;;
3616
    *)
3617
        die "Unknown OS '$target_os'."
3618 3619 3620
        ;;
esac

3621 3622
# determine libc flavour

3623 3624
probe_libc(){
    pfx=$1
3625
    pfx_no_=${pfx%_}
3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639
    # 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
3640
        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3641 3642
        eval test \$${pfx_no_}cc_type = "gcc" &&
            add_${pfx}cppflags -D__printf__=__gnu_printf__
3643 3644
    elif check_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
         check_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
3645 3646 3647 3648
        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."
3649
        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
3650 3651
        eval test \$${pfx_no_}cc_type = "gcc" &&
            add_${pfx}cppflags -D__printf__=__gnu_printf__
3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665
    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
3666
    elif check_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
3667 3668
        eval ${pfx}libc_type=solaris
        add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
3669
    else
3670 3671
        eval ${pfx}libc_type=default
        add_${pfx}cppflags -D_DEFAULT_SOURCE
3672 3673
    fi
}
3674

3675
probe_libc
3676
test -n "$libc_type" && enable libc_$libc_type
3677 3678
probe_libc host_
test -n "$host_libc_type" && enable host_libc_$host_libc_type
3679

3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691
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

3692 3693
# hacks for compiler/libc/os combinations

3694
if enabled_all tms470 libc_glibc; then
3695
    CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
3696 3697 3698 3699 3700 3701
    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

3702
if enabled_all ccc libc_glibc; then
3703 3704 3705
    add_ldflags -Wl,-z,now  # calls to libots crash without this
fi

3706 3707 3708
check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
    add_cppflags '-I\$(SRC_PATH)/compat/float'

3709 3710 3711 3712 3713
esc(){
    echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
}

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

3715
check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
3716

3717
set_default $PATHS_LIST
3718
set_default nm
3719

3720
# we need to build at least one lib type
3721
if ! enabled_any static shared; then
3722 3723 3724 3725 3726 3727 3728 3729 3730
    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

3731
die_license_disabled() {
3732
    enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
3733 3734
}

3735
die_license_disabled gpl libcdio
3736
die_license_disabled gpl libx264
Derek Buitenhuis's avatar
Derek Buitenhuis committed
3737
die_license_disabled gpl libx265
3738
die_license_disabled gpl libxavs
3739 3740 3741
die_license_disabled gpl libxvid
die_license_disabled gpl x11grab

3742
die_license_disabled nonfree libfaac
3743
die_license_disabled nonfree libfdk_aac
3744
die_license_disabled nonfree openssl
3745

3746 3747
die_license_disabled version3 libopencore_amrnb
die_license_disabled version3 libopencore_amrwb
3748
die_license_disabled version3 libvo_aacenc
3749
die_license_disabled version3 libvo_amrwbenc
3750

3751
enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
3752

3753
disabled optimizations || check_cflags -fomit-frame-pointer
3754

3755 3756
enable_weak_pic() {
    disabled pic && return
3757
    enable pic
3758
    add_cppflags -DPIC
3759 3760 3761 3762 3763 3764 3765
    case "$target_os" in
    mingw*|cygwin*)
        ;;
    *)
        add_cflags -fPIC
        ;;
    esac
3766
    add_asflags  -fPIC
3767 3768
}

3769
enabled pic && enable_weak_pic
3770

3771 3772 3773
check_cc <<EOF || die "Symbol mangling check failed."
int ff_extern;
EOF
3774
sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
3775 3776
extern_prefix=${sym%%ff_extern*}

3777
check_cc <<EOF && enable_weak inline_asm
3778 3779
void foo(void) { __asm__ volatile ("" ::); }
EOF
3780

3781 3782 3783 3784 3785 3786 3787
_restrict=
for restrict_keyword in restrict __restrict__ __restrict; do
    check_cc <<EOF && _restrict=$restrict_keyword && break
void foo(char * $restrict_keyword p);
EOF
done

3788
check_cc <<EOF && enable pragma_deprecated
3789
void foo(void) { _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") }
3790 3791
EOF

3792 3793 3794 3795
check_cc <<EOF && enable attribute_packed
struct { int x; } __attribute__((packed)) x;
EOF

3796 3797 3798 3799
check_cc <<EOF && enable attribute_may_alias
union { int x; } __attribute__((may_alias)) x;
EOF

3800 3801 3802
check_cc <<EOF || die "endian test failed"
unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
EOF
3803
od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
3804

3805 3806 3807 3808 3809 3810
check_gas() {
    log "check_gas using '$as' as AS"
    # :vararg is used on aarch64, arm and ppc altivec
    check_as <<EOF || return 1
.macro m n, y:vararg=0
\n: .int \y
3811 3812
.endm
m x
3813
EOF
3814 3815
    # .altmacro is only used in arm asm
    ! enabled arm || check_as <<EOF || return 1
3816
.altmacro
3817
EOF
3818 3819 3820 3821
    enable gnu_as
    return 0
}

3822
if enabled_any arm aarch64 || enabled_all ppc altivec && enabled asm; then
3823
    nogas=:
3824
    enabled_any arm aarch64 && nogas=die
3825
    enabled_all ppc altivec && nogas=warn
3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837
    as_noop=-v

    case $as_type in
        arm*) gaspp_as_type=armasm; as_noop=-h ;;
        gcc)  gaspp_as_type=gas ;;
        *)    gaspp_as_type=$as_type ;;
    esac

    [ $target_os = "darwin" ] && gaspp_as_type="apple-$gaspp_as_type"

    check_cmd gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- $as $as_noop &&
        gas="gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- $as"
3838 3839 3840 3841

    if ! check_gas ; then
        as=${gas:=$as}
        check_gas || \
3842
            $nogas "GNU assembler not found, install/update gas-preprocessor"
3843
    fi
3844 3845 3846 3847

    check_as <<EOF && enable as_func
.func test
.endfunc
3848 3849 3850
EOF
fi

3851 3852
check_inline_asm inline_asm_labels '"1:\n"'

3853
if enabled aarch64; then
3854
    enabled armv8 && check_insn armv8 'prfm   pldl1strm, [x0]'
3855 3856 3857 3858 3859 3860 3861
    # 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
3862 3863 3864 3865

    check_cflags -mieee

elif enabled arm; then
3866

3867
    check_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb
3868
    enabled thumb && check_cflags -mthumb || check_cflags -marm
3869

3870 3871 3872 3873 3874 3875
    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 ;;
3876 3877 3878
__asm__ (".eabi_attribute 28, 1");
int main(void) { return 0; }
EOF
3879 3880 3881
        esac
        warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
    fi
3882

3883 3884 3885 3886
    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'
3887
    enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
3888 3889
    enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'

3890
    [ $target_os = linux ] || [ $target_os = android ] ||
3891 3892
        map 'enabled_any ${v}_external ${v}_inline || disable $v' \
            $ARCH_EXT_LIST_ARM
3893

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

3896 3897 3898 3899 3900
    check_as <<EOF && enable as_dn_directive
ra .dn d0.i16
.unreq ra
EOF

3901
    [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
3902

3903
elif enabled mips; then
3904

3905
    check_inline_asm loongson '"dmult.g $1, $2, $3"'
3906

3907 3908 3909 3910 3911 3912 3913 3914
elif enabled parisc; then

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

3915
elif enabled ppc; then
3916

3917 3918
    enable local_aligned_8 local_aligned_16

3919 3920 3921 3922
    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)'
3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933

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

        # check if our compiler supports Motorola AltiVec C API
        check_cc <<EOF || disable altivec
$inc_altivec_h
int main(void) {
3934 3935 3936
    vector signed int v1 = (vector signed int) { 0 };
    vector signed int v2 = (vector signed int) { 1 };
    v1 = vec_add(v1, v2);
3937 3938 3939 3940
    return 0;
}
EOF

3941
        enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
3942
    fi
3943

3944
elif enabled x86; then
3945

3946 3947
    check_builtin rdtsc    intrin.h   "__rdtsc()"
    check_builtin mm_empty mmintrin.h "_mm_empty()"
3948

3949 3950
    enable local_aligned_8 local_aligned_16

3951 3952 3953 3954
    # 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.
3955
    check_exec_crash <<EOF && enable ebp_available
3956 3957 3958
volatile int i=0;
__asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
return i;
3959 3960
EOF

Reimar Döffinger's avatar
Reimar Döffinger committed
3961
    # check whether EBX is available on x86
3962 3963
    check_inline_asm ebx_available '""::"b"(0)' &&
        check_inline_asm ebx_available '"":::"%ebx"'
3964

3965
    # check whether xmm clobbers are supported
3966
    check_inline_asm xmm_clobbers '"":::"%xmm0"'
3967

3968
    # check whether binutils is new enough to compile SSSE3/MMXEXT
3969 3970
    enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
    enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
3971

3972
    if ! disabled_any asm mmx yasm; then
3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988
        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

3989 3990
        check_yasm "movbe ecx, [5]" && enable yasm ||
            die "yasm/nasm not found or too old. Use --disable-yasm for a crippled build."
3991
        check_yasm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
3992
        check_yasm "vfmadd132ps ymm0, ymm1, ymm2"    || disable fma3_external
3993
        check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
3994
        check_yasm "CPU amdnop" || disable cpunop
3995
    fi
3996

3997 3998 3999 4000 4001 4002
    case "$cpu" in
        athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
            disable fast_clz
        ;;
    esac

4003 4004
fi

4005
check_code cc arm_neon.h "int16x8_t test = vdupq_n_s16(0)" && enable intrinsics_neon
4006

4007 4008
check_ldflags -Wl,--as-needed

4009 4010 4011 4012
if check_func dlopen; then
    ldl=
elif check_func dlopen -ldl; then
    ldl=-ldl
4013 4014
fi

4015
if ! disabled network; then
4016 4017 4018 4019
    check_func getaddrinfo $network_extralibs
    check_func getservbyport $network_extralibs
    check_func inet_aton $network_extralibs

4020
    check_type netdb.h "struct addrinfo"
4021 4022
    check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
    check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
4023
    check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
4024
    check_type poll.h "struct pollfd"
4025
    check_type netinet/sctp.h "struct sctp_event_subscribe"
4026 4027 4028 4029 4030
    check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
    check_type netinet/in.h "struct sockaddr_in6"
    check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
    check_type "sys/types.h sys/socket.h" socklen_t

4031 4032 4033 4034
    # Prefer arpa/inet.h over winsock2
    if check_header arpa/inet.h ; then
        check_func closesocket
    elif check_header winsock2.h ; then
4035 4036 4037
        check_func_headers winsock2.h closesocket -lws2 &&
            network_extralibs="-lws2" ||
        { check_func_headers winsock2.h closesocket -lws2_32 &&
4038
            network_extralibs="-lws2_32"; } || disable winsock2_h network
4039
        check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
4040

4041 4042
        check_type ws2tcpip.h socklen_t
        check_type ws2tcpip.h "struct addrinfo"
4043 4044
        check_type ws2tcpip.h "struct group_source_req"
        check_type ws2tcpip.h "struct ip_mreq_source"
4045
        check_type ws2tcpip.h "struct ipv6_mreq"
4046
        check_type winsock2.h "struct pollfd"
4047
        check_struct winsock2.h "struct sockaddr" sa_len
4048 4049 4050 4051 4052 4053 4054
        check_type ws2tcpip.h "struct sockaddr_in6"
        check_type ws2tcpip.h "struct sockaddr_storage"
    else
        disable network
    fi
fi

4055 4056 4057 4058 4059 4060 4061 4062
check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
check_builtin MemoryBarrier windows.h "MemoryBarrier()"
check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"

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

4064
check_cpp_condition unistd.h "defined(_POSIX_MONOTONIC_CLOCK)" &&
4065
    check_func_headers time.h clock_gettime || { check_func_headers time.h clock_gettime -lrt && add_extralibs -lrt && LIBRT="-lrt"; }
4066

Måns Rullgård's avatar
Måns Rullgård committed
4067
check_func  fcntl
4068 4069
check_func  fork
check_func  gethrtime
4070
check_func  getopt
4071
check_func  getrusage
4072
check_func  gettimeofday
4073
check_func  gmtime_r
4074
check_func  isatty
4075
check_func  localtime_r
4076
check_func  mach_absolute_time
4077
check_func  mkstemp
4078
check_func  mmap
4079
check_func  mprotect
4080
# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
4081
check_func_headers time.h nanosleep || { check_func_headers time.h nanosleep -lrt && add_extralibs -lrt; }
4082
check_func  sched_getaffinity
Måns Rullgård's avatar
Måns Rullgård committed
4083
check_func  setrlimit
4084
check_func  strerror_r
4085
check_func  strptime
4086
check_func  sysconf
4087
check_func  sysctl
4088
check_func  usleep
4089

4090
check_func_headers io.h setmode
4091 4092
check_func_headers stdlib.h getenv

4093
check_func_headers windows.h CoTaskMemFree -lole32
4094
check_func_headers windows.h GetProcessAffinityMask
4095
check_func_headers windows.h GetProcessTimes
4096
check_func_headers windows.h GetSystemTimeAsFileTime
4097
check_func_headers windows.h MapViewOfFile
4098
check_func_headers windows.h SetConsoleTextAttribute
4099
check_func_headers windows.h Sleep
4100
check_func_headers windows.h VirtualAlloc
4101
check_struct windows.h "CONDITION_VARIABLE" Ptr
4102

4103
check_header direct.h
4104
check_header dlfcn.h
4105
check_header dxva.h
4106
check_header dxva2api.h
4107
check_header io.h
4108
check_header mach/mach_time.h
4109
check_header malloc.h
4110
check_header poll.h
4111
check_header sys/mman.h
4112
check_header sys/param.h
4113
check_header sys/resource.h
4114
check_header sys/select.h
4115
check_header sys/time.h
4116
check_header sys/un.h
4117
check_header unistd.h
4118 4119
check_header vdpau/vdpau.h
check_header vdpau/vdpau_x11.h
4120
check_header VideoDecodeAcceleration/VDADecoder.h
4121
check_header windows.h
4122
check_header X11/extensions/XvMClib.h
4123

4124 4125 4126 4127 4128 4129
check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi

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

4130
if ! disabled w32threads && ! enabled pthreads; then
4131 4132
    check_func_headers "windows.h process.h" _beginthreadex &&
        enable w32threads || disable w32threads
4133 4134
fi

4135 4136
# check for some common methods of building with pthread support
# do this before the optional library checks as some of them require pthreads
4137 4138
if ! disabled pthreads && ! enabled w32threads; then
    enable pthreads
4139
    if check_func pthread_join -pthread; then
Måns Rullgård's avatar
Måns Rullgård committed
4140
        add_cflags -pthread
4141
        add_extralibs -pthread
4142
    elif check_func pthread_join -pthreads; then
Måns Rullgård's avatar
Måns Rullgård committed
4143
        add_cflags -pthreads
4144
        add_extralibs -pthreads
4145
    elif check_func pthread_join -lpthreadGC2; then
4146
        add_extralibs -lpthreadGC2
4147 4148 4149
    elif check_lib pthread.h pthread_join -lpthread; then
        :
    elif ! check_func pthread_join; then
4150
        disable pthreads
Måns Rullgård's avatar
Måns Rullgård committed
4151
    fi
4152 4153
fi

4154 4155 4156
disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib

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

4160 4161 4162 4163
atan2f_args=2
ldexpf_args=2
powf_args=2

4164
for func in $MATH_FUNCS; do
4165
    eval check_mathfunc $func \${${func}_args:-1}
4166
done
4167

4168
# these are off by default, so fail if requested and not available
d s's avatar
d s committed
4169 4170 4171
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"; }
4172 4173
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
4174
enabled libbs2b           && require_pkg_config libbs2b bs2b.h bs2b_open
4175 4176
enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
enabled libfdk_aac        && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
4177
enabled libfontconfig     && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
4178
enabled libfreetype       && require_pkg_config freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
4179 4180 4181 4182 4183 4184 4185 4186
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
4187 4188
enabled libopenjpeg       && { { check_header openjpeg.h && check_lib2 openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC; } ||
                               { require_pkg_config libopenjpeg1 openjpeg.h opj_version -DOPJ_STATIC; } }
4189 4190 4191 4192
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
4193
enabled libspeex          && require_pkg_config speex speex/speex.h speex_decoder_init -lspeex
4194
enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
4195
enabled libtwolame        && require libtwolame twolame.h twolame_init -ltwolame
4196 4197 4198 4199
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            && {
4200
    enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
4201
                                    die "ERROR: libvpx decoder version must be >=0.9.1"; }
4202
    enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VPX_CQ" -lvpx ||
4203 4204
                                    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; }
4205
    enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } }
4206
enabled libwavpack        && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput  -lwavpack
Justin Ruggles's avatar
Justin Ruggles committed
4207
enabled libwebp           && require_pkg_config libwebp webp/encode.h WebPGetEncoderVersion
4208
enabled libx264           && require_pkg_config x264 "stdint.h x264.h" x264_encoder_encode &&
4209 4210
                             { check_cpp_condition x264.h "X264_BUILD >= 118" ||
                               die "ERROR: libx264 version must be >= 0.118."; }
Derek Buitenhuis's avatar
Derek Buitenhuis committed
4211
enabled libx265           && require_pkg_config x265 x265.h x265_encoder_encode &&
4212 4213
                             { check_cpp_condition x265.h "X265_BUILD >= 17" ||
                               die "ERROR: libx265 version must be >= 17."; }
4214 4215 4216 4217 4218 4219
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"; }
4220

Samuel Pitoiset's avatar
Samuel Pitoiset committed
4221 4222 4223 4224 4225
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

4226 4227 4228 4229 4230 4231 4232 4233 4234
# 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

4235
if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
4236
    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
4237 4238
    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
    enable sdl
4239
fi
4240

4241
pod2man --help     > /dev/null 2>&1 && enable pod2man   || disable pod2man
4242
texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html
4243

4244
check_header linux/fb.h
4245
check_header linux/videodev2.h
4246 4247
check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete

4248
check_header sys/videoio.h
4249

4250
check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
4251 4252 4253
# 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
4254

4255
# check for ioctl_meteor.h, ioctl_bt848.h and alternatives
Ramiro Polla's avatar
Ramiro Polla committed
4256 4257 4258 4259 4260 4261 4262
{ 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
4263

4264
check_header sndio.h
4265 4266
check_header sys/soundcard.h
check_header soundcard.h
Måns Rullgård's avatar
Måns Rullgård committed
4267

4268 4269
enabled_any alsa_indev alsa_outdev &&
    check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound
4270

4271 4272
enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack &&
    check_func jack_port_get_latency_range -ljack
4273

4274 4275
enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio

4276
if enabled libcdio; then
4277 4278
    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
4279
fi
4280

4281 4282
check_lib X11/Xlib.h XOpenDisplay -lX11 && enable xlib

4283
if enabled libxcb || enabled x11grab && ! disabled libxcb; then
4284
    check_pkg_config xcb xcb/xcb.h xcb_connect || {
4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306
        enabled libxcb && die "ERROR: libxcb not found";
    } && disable x11grab && enable libxcb

    disabled libxcb_shm ||
        check_pkg_config xcb-shm xcb/shm.h xcb_shm_attach || {
            enabled libxcb_shm && die "ERROR: libxcb_shm not found";
        } && check_header sys/shm.h && enable libxcb_shm

    disabled libxcb_xfixes ||
        check_pkg_config xcb-xfixes xcb/xfixes.h xcb_xfixes_get_cursor_image || {
            enabled libxcb_xfixes && die "ERROR: libxcb_xfixes not found";
        } && enable libxcb_xfixes

    add_cflags "$xcb_event_cflags $xcb_shm_cflags $xcb_xfixes_cflags"
    add_extralibs "$xcb_event_libs $xcb_shm_libs $xcb_xfixes_libs"
fi

if enabled x11grab; then
    enabled xlib || die "ERROR: Xlib not found"
    require Xext X11/extensions/XShm.h XShmCreateImage -lXext
    require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes
fi
4307

4308
enabled vdpau &&
4309
    check_cpp_condition vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" ||
4310
    disable vdpau
4311

4312
enabled vdpau && enabled xlib &&
4313 4314
    check_func_headers "vdpau/vdpau.h vdpau/vdpau_x11.h" vdp_device_create_x11 -lvdpau &&
    prepend avconv_libs $($ldflags_filter "-lvdpau") &&
4315 4316
    enable vdpau_x11

4317
enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
4318 4319 4320

# add some useful compiler flags if supported
check_cflags -Wdeclaration-after-statement
4321
check_cflags -Wall
Michael Niedermayer's avatar
Michael Niedermayer committed
4322 4323 4324
check_cflags -Wdisabled-optimization
check_cflags -Wpointer-arith
check_cflags -Wredundant-decls
4325
check_cflags -Wcast-qual
4326
check_cflags -Wwrite-strings
4327
check_cflags -Wtype-limits
4328
check_cflags -Wundef
4329
check_cflags -Wmissing-prototypes
4330
check_cflags -Wstrict-prototypes
4331
enabled extra_warnings && check_cflags -Winline
4332

4333 4334 4335 4336 4337 4338 4339 4340 4341 4342
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

4343
# add some linker flags
4344
check_ldflags -Wl,--warn-common
4345
check_ldflags -Wl,-rpath-link=libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
4346
enabled rpath && add_ldexeflags -Wl,-rpath,$libdir
4347
test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
4348

4349 4350 4351 4352
# add some strip flags
# -wN '..@*' is more selective than -x, but not available everywhere.
check_stripflags -wN \'..@*\' || check_stripflags -x || strip='true'

4353 4354 4355 4356 4357 4358 4359
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      \
4360 4361
                  -Wl,--wrap,avcodec_encode_subtitle    \
                  -Wl,--wrap,avresample_convert ||
4362 4363
    disable neon_clobber_test

4364
enabled xmm_clobber_test &&
4365 4366 4367 4368 4369
    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      \
4370
                  -Wl,--wrap,avcodec_encode_video2      \
4371
                  -Wl,--wrap,avcodec_encode_subtitle    \
4372
                  -Wl,--wrap,avresample_convert         \
4373
                  -Wl,--wrap,sws_scale ||
4374 4375
    disable xmm_clobber_test

4376
echo "X{};" > $TMPV
4377
if test_ldflags -Wl,--version-script,$TMPV; then
4378
    append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
4379 4380
    check_cc <<EOF && enable symver_asm_label
void ff_foo(void) __asm__ ("av_foo@VERSION");
4381
void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
4382 4383 4384 4385 4386 4387
EOF
    check_cc <<EOF && enable symver_gnu_asm
__asm__(".symver ff_foo,av_foo@VERSION");
void ff_foo(void) {}
EOF
fi
4388

4389 4390 4391 4392 4393 4394 4395 4396
if [ -z "$optflags" ]; then
    if enabled small; then
        optflags=$cflags_size
    elif enabled optimizations; then
        optflags=$cflags_speed
    else
        optflags=$cflags_noopt
    fi
4397
fi
4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413

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
4414

4415
if enabled icc; then
Måns Rullgård's avatar
Måns Rullgård committed
4416 4417 4418 4419
    # Just warnings, no remarks
    check_cflags -w1
    # -wd: Disable following warnings
    # 144, 167, 556: -Wno-pointer-sign
4420
    # 1292: attribute "foo" ignored
4421
    # 1419: external declaration in primary source file
Måns Rullgård's avatar
Måns Rullgård committed
4422
    # 10006: ignoring unknown option -fno-signed-zeros
4423
    # 10148: ignoring unknown option -Wno-parentheses
Måns Rullgård's avatar
Måns Rullgård committed
4424
    # 10156: ignoring option '-W'; no argument required
4425
    check_cflags -wd144,167,556,1292,1419,10006,10148,10156
Måns Rullgård's avatar
Måns Rullgård committed
4426 4427 4428
    # 11030: Warning unknown option --as-needed
    # 10156: ignoring option '-export'; no argument required
    check_ldflags -wd10156,11030
4429 4430
    # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
    enable ebp_available
4431
    if enabled x86_32; then
4432
        icc_version=$($cc -dumpversion)
4433 4434
        test ${icc_version%%.*} -ge 11 &&
            check_cflags -falign-stack=maintain-16-byte ||
4435 4436
            disable aligned_stack
    fi
4437 4438
elif enabled ccc; then
    # disable some annoying warnings
4439 4440 4441 4442
    add_cflags -msg_disable bitnotint
    add_cflags -msg_disable mixfuncvoid
    add_cflags -msg_disable nonstandcast
    add_cflags -msg_disable unsupieee
4443
elif enabled gcc; then
4444
    check_optflags -fno-tree-vectorize
4445
    check_cflags -Werror=implicit-function-declaration
4446
    check_cflags -Werror=missing-prototypes
4447
    check_cflags -Werror=return-type
4448
    check_cflags -Werror=declaration-after-statement
4449
    check_cflags -Werror=vla
4450
    enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
4451 4452
elif enabled llvm_gcc; then
    check_cflags -mllvm -stack-alignment=16
4453
elif enabled clang; then
4454
    check_cflags -mllvm -stack-alignment=16
4455
    check_cflags -Qunused-arguments
4456 4457
    check_cflags -Werror=implicit-function-declaration
    check_cflags -Werror=missing-prototypes
4458
    check_cflags -Werror=return-type
Luca Barbato's avatar
Luca Barbato committed
4459 4460 4461
elif enabled cparser; then
    add_cflags -Wno-missing-variable-declarations
    add_cflags -Wno-empty-statement
4462
elif enabled armcc; then
4463 4464
    add_cflags -W${armcc_opt},--diag_suppress=4343 # hardfp compat
    add_cflags -W${armcc_opt},--diag_suppress=3036 # using . as system include dir
4465
    # 2523: use of inline assembly is deprecated
4466 4467
    add_cflags -W${armcc_opt},--diag_suppress=2523
    add_cflags -W${armcc_opt},--diag_suppress=1207
4468
    add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
4469
    add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
4470 4471
    add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
    add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
4472 4473
elif enabled tms470; then
    add_cflags -pds=824 -pds=837
4474
    disable inline_asm
4475 4476
elif enabled pathscale; then
    add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
4477
elif enabled_any msvc icl; then
4478
    enabled x86_32 && disable aligned_stack
4479
    enabled_all x86_32 debug && add_cflags -Oy-
4480
    enabled debug && add_ldflags -debug
4481
    enable pragma_deprecated
4482
    if enabled icl; then
4483 4484 4485 4486
        # -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
4487 4488
        # icl will pass the inline asm tests but inline asm is currently
        # not supported (build will fail)
4489 4490
        disable inline_asm
    fi
4491 4492
fi

4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504
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
4505
case $target_os in
4506 4507 4508
    osf1)
        enabled ccc && add_ldflags '-Wl,-expect_unresolved,*'
    ;;
Mans Rullgard's avatar
Mans Rullgard committed
4509 4510 4511 4512 4513
    plan9)
        add_cppflags -Dmain=plan9_main
    ;;
esac

4514 4515
enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }

4516
check_deps $CONFIG_LIST       \
4517
           $CONFIG_EXTRA      \
4518
           $HAVE_LIST         \
4519
           $ALL_COMPONENTS    \
4520

4521 4522 4523 4524
enabled_all dxva2 CoTaskMemFree &&
    prepend avconv_libs $($ldflags_filter "-lole32") &&
    enable dxva2_lib

4525
! enabled_any memalign posix_memalign aligned_malloc &&
4526
    enabled $simd_align_16 && enable memalign_hack
4527

4528 4529
map 'enabled $v && intrinsics=${v#intrinsics_}' $INTRINSICS_LIST

4530 4531 4532 4533 4534 4535 4536 4537
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

4538 4539
enabled zlib && add_cppflags -DZLIB_CONST

4540 4541 4542 4543 4544
# conditional library dependencies, in linking order
enabled movie_filter    && prepend avfilter_deps "avformat avcodec"
enabled resample_filter && prepend avfilter_deps "avresample"
enabled scale_filter    && prepend avfilter_deps "swscale"

4545 4546
enabled opus_decoder    && prepend avcodec_deps "avresample"

4547 4548 4549 4550 4551 4552 4553 4554 4555
expand_deps(){
    lib_deps=${1}_deps
    eval "deps=\$$lib_deps"
    append $lib_deps $(map 'eval echo \$${v}_deps' $deps)
    unique $lib_deps
}

map 'expand_deps $v' $LIBRARY_LIST

4556
echo "install prefix            $prefix"
Diego Biurrun's avatar
Diego Biurrun committed
4557 4558
echo "source path               $source_path"
echo "C compiler                $cc"
4559
echo "C library                 $libc_type"
4560 4561
if test "$host_cc" != "$cc"; then
    echo "host C compiler           $host_cc"
4562
    echo "host C library            $host_libc_type"
4563
fi
Diego Biurrun's avatar
Diego Biurrun committed
4564
echo "ARCH                      $arch ($cpu)"
4565 4566
if test "$build_suffix" != ""; then
    echo "build suffix              $build_suffix"
4567
fi
4568 4569 4570
if test "$extra_version" != ""; then
    echo "version string suffix     $extra_version"
fi
4571
echo "big-endian                ${bigendian-no}"
4572
echo "runtime cpu detection     ${runtime_cpudetect-no}"
4573
if enabled x86; then
4574
    echo "${yasmexe}                      ${yasm-no}"
4575
    echo "MMX enabled               ${mmx-no}"
4576
    echo "MMXEXT enabled            ${mmxext-no}"
4577
    echo "3DNow! enabled            ${amd3dnow-no}"
4578
    echo "3DNow! extended enabled   ${amd3dnowext-no}"
4579
    echo "SSE enabled               ${sse-no}"
4580
    echo "SSSE3 enabled             ${ssse3-no}"
4581
    echo "AVX enabled               ${avx-no}"
4582
    echo "XOP enabled               ${xop-no}"
4583
    echo "FMA3 enabled              ${fma3-no}"
4584
    echo "FMA4 enabled              ${fma4-no}"
4585
    echo "i686 features enabled     ${i686-no}"
4586
    echo "CMOV is fast              ${fast_cmov-no}"
4587 4588
    echo "EBX available             ${ebx_available-no}"
    echo "EBP available             ${ebp_available-no}"
4589
fi
4590 4591 4592 4593
if enabled aarch64; then
    echo "NEON enabled              ${neon-no}"
    echo "VFP enabled               ${vfp-no}"
fi
4594
if enabled arm; then
4595 4596
    echo "ARMv5TE enabled           ${armv5te-no}"
    echo "ARMv6 enabled             ${armv6-no}"
4597
    echo "ARMv6T2 enabled           ${armv6t2-no}"
4598
    echo "VFP enabled               ${vfp-no}"
4599
    echo "NEON enabled              ${neon-no}"
4600
fi
4601
if enabled ppc; then
4602
    echo "AltiVec enabled           ${altivec-no}"
4603
    echo "PPC 4xx optimizations     ${ppc4xx-no}"
4604
    echo "dcbzl available           ${dcbzl-no}"
4605
fi
4606
echo "debug symbols             ${debug-no}"
4607
echo "optimize for size         ${small-no}"
4608
echo "optimizations             ${optimizations-no}"
4609 4610
echo "static                    ${static-no}"
echo "shared                    ${shared-no}"
4611
echo "new filter support        ${avfilter-no}"
4612 4613
echo "network support           ${network-no}"
echo "threading support         ${thread_type-no}"
4614
echo "safe bitstream reader     ${safe_bitstream_reader-no}"
4615
echo "SDL support               ${sdl-no}"
4616 4617
test -n "$random_seed" &&
    echo "random seed               ${random_seed}"
4618
echo
Fabrice Bellard's avatar
Fabrice Bellard committed
4619

4620 4621 4622 4623
echo "External libraries:"
print_enabled '' $EXTERNAL_LIBRARY_LIST | print_3_columns
echo

4624
for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
4625
    echo "Enabled ${type}s:"
4626
    eval list=\$$(toupper $type)_LIST
4627
    print_enabled '_*' $list | print_3_columns
4628
    echo
4629 4630
done

4631
license="LGPL version 2.1 or later"
4632
if enabled nonfree; then
4633
    license="nonfree and unredistributable"
4634 4635 4636 4637
elif enabled gplv3; then
    license="GPL version 3 or later"
elif enabled lgplv3; then
    license="LGPL version 3 or later"
4638
elif enabled gpl; then
4639
    license="GPL version 2 or later"
4640 4641 4642
fi

echo "License: $license"
4643

4644 4645
echo "Creating config.mak and config.h..."

4646
test -e Makefile || echo "include $source_path/Makefile" > Makefile
4647

4648 4649
config_files="$TMPH config.mak"

4650 4651
cat > config.mak <<EOF
# Automatically generated by configure - do not modify!
4652
LIBAV_CONFIGURATION=$LIBAV_CONFIGURATION
4653 4654 4655 4656 4657 4658
prefix=$prefix
LIBDIR=\$(DESTDIR)$libdir
SHLIBDIR=\$(DESTDIR)$shlibdir
INCDIR=\$(DESTDIR)$incdir
BINDIR=\$(DESTDIR)$bindir
DATADIR=\$(DESTDIR)$datadir
4659
DOCDIR=\$(DESTDIR)$docdir
4660
MANDIR=\$(DESTDIR)$mandir
4661
SRC_PATH=$source_path
4662
CC_IDENT=$cc_ident
4663
ARCH=$arch
4664
INTRINSICS=$intrinsics
4665 4666 4667 4668
CC=$cc
AS=$as
LD=$ld
DEPCC=$dep_cc
4669 4670 4671
DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
DEPAS=$as
DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
4672
YASM=$yasmexe
4673
DEPYASM=$yasmexe
4674
AR=$ar
4675 4676
ARFLAGS=$arflags
AR_O=$ar_o
4677
RANLIB=$ranlib
4678
STRIP=$strip
4679 4680 4681 4682
LN_S=$ln_s
CPPFLAGS=$CPPFLAGS
CFLAGS=$CFLAGS
ASFLAGS=$ASFLAGS
4683
AS_C=$AS_C
4684
AS_O=$AS_O
4685
CC_C=$CC_C
4686
CC_E=$CC_E
4687
CC_O=$CC_O
4688
LD_O=$LD_O
4689 4690
LD_LIB=$LD_LIB
LD_PATH=$LD_PATH
4691
DLLTOOL=$dlltool
4692
LDFLAGS=$LDFLAGS
4693
LDEXEFLAGS=$LDEXEFLAGS
4694
SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
4695
STRIPFLAGS=$STRIPFLAGS
4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706
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
4707
CCDEP_FLAGS=$CCDEP_FLAGS
4708
ASDEP=$ASDEP
4709
ASDEP_FLAGS=$ASDEP_FLAGS
4710 4711 4712
CC_DEPFLAGS=$CC_DEPFLAGS
AS_DEPFLAGS=$AS_DEPFLAGS
HOSTCC=$host_cc
4713
HOSTLD=$host_ld
4714
HOSTCFLAGS=$host_cflags
4715
HOSTCPPFLAGS=$host_cppflags
4716 4717 4718
HOSTEXESUF=$HOSTEXESUF
HOSTLDFLAGS=$host_ldflags
HOSTLIBS=$host_libs
4719 4720 4721 4722 4723
DEPHOSTCC=$host_cc
DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
HOSTCCDEP=$HOSTCCDEP
HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
4724
HOSTCC_C=$HOSTCC_C
4725
HOSTCC_O=$HOSTCC_O
4726
HOSTLD_O=$HOSTLD_O
4727
TARGET_EXEC=$target_exec $target_exec_args
4728
TARGET_PATH=$target_path
4729
TARGET_SAMPLES=${target_samples:-\$(SAMPLES)}
4730
CFLAGS-avplay=$sdl_cflags
4731
ZLIB=$($ldflags_filter -lz)
4732 4733
LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
EXTRALIBS=$extralibs
4734
COMPAT_OBJS=$compat_objs
4735
EXEOBJS=$exeobjs
4736
INSTALL=install
4737 4738 4739 4740 4741 4742
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}
4743 4744 4745 4746
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}
4747
SAMPLES:=${samples:-\$(LIBAV_SAMPLES)}
4748
EOF
4749

4750
get_version(){
4751
    lcname=lib${1}
4752 4753
    name=$(toupper $lcname)
    file=$source_path/$lcname/version.h
4754
    eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file")
4755
    eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
4756 4757
    eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
    eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
4758
    eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> config.mak
4759 4760
}

4761
map 'get_version $v' $LIBRARY_LIST
4762

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

4765 4766 4767 4768 4769 4770 4771
print_program_libs(){
    eval "program_libs=\$${1}_libs"
    eval echo "LIBS-${1}=${program_libs}" >> config.mak
}

map 'print_program_libs $v' $PROGRAM_LIST

4772 4773
cat > $TMPH <<EOF
/* Automatically generated by configure - do not modify! */
4774 4775 4776
#ifndef LIBAV_CONFIG_H
#define LIBAV_CONFIG_H
#define LIBAV_CONFIGURATION "$(c_escape $LIBAV_CONFIGURATION)"
4777
#define LIBAV_LICENSE "$(c_escape $license)"
4778
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
4779
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
4780 4781 4782
#define restrict $_restrict
#define EXTERN_PREFIX "${extern_prefix}"
#define EXTERN_ASM ${extern_prefix}
4783
#define SLIBSUF "$SLIBSUF"
4784
EOF
4785

4786 4787 4788
test -n "$malloc_prefix" &&
    echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH

4789 4790 4791 4792 4793
if enabled yasm; then
    append config_files $TMPASM
    printf '' >$TMPASM
fi

4794 4795
enabled getenv || echo "#define getenv(x) NULL" >> $TMPH

4796 4797 4798
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
4799
                                     $CONFIG_EXTRA      \
4800
                                     $ALL_COMPONENTS    \
4801

4802
echo "#endif /* LIBAV_CONFIG_H */" >> $TMPH
4803

Diego Biurrun's avatar
Diego Biurrun committed
4804
# Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
4805
cp_if_changed $TMPH config.h
4806
touch .config
Nick Kurshev's avatar
Nick Kurshev committed
4807

4808 4809
enabled yasm && cp_if_changed $TMPASM config.asm

4810 4811 4812 4813 4814 4815
cat > $TMPH <<EOF
/* Generated by ffconf */
#ifndef AVUTIL_AVCONFIG_H
#define AVUTIL_AVCONFIG_H
EOF

4816
print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
4817 4818 4819 4820 4821

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

cp_if_changed $TMPH libavutil/avconfig.h

4822 4823
test -n "$WARNINGS" && printf "\n$WARNINGS"

4824
# build pkg-config files
4825

4826 4827 4828 4829
lib_version(){
    eval printf "\"lib${1} >= \$LIB$(toupper ${1})_VERSION, \""
}

4830
pkgconfig_generate(){
4831 4832 4833 4834 4835
    name=$1
    shortname=${name#lib}${build_suffix}
    comment=$2
    version=$3
    libs=$4
4836 4837
    requires=$(map 'lib_version $v' $(eval echo \$${name#lib}_deps))
    requires=${requires%, }
4838 4839 4840
    enabled ${name#lib} || return 0
    mkdir -p $name
    cat <<EOF > $name/$name.pc
4841
prefix=$prefix
4842
exec_prefix=\${prefix}
4843
libdir=$libdir
4844
includedir=$incdir
4845

4846 4847 4848
Name: $name
Description: $comment
Version: $version
4849
Requires: $(enabled shared || echo $requires)
4850
Requires.private: $(enabled shared && echo $requires)
4851
Conflicts:
4852
Libs: -L\${libdir} -l${shortname} $(enabled shared || echo $libs)
4853
Libs.private: $(enabled shared && echo $libs)
4854
Cflags: -I\${includedir}
4855
EOF
4856
    cat <<EOF > $name/$name-uninstalled.pc
4857 4858
prefix=
exec_prefix=
4859
libdir=\${pcfiledir}
4860
includedir=${source_path}
4861

4862 4863 4864 4865
Name: $name
Description: $comment
Version: $version
Requires: $requires
4866
Conflicts:
4867
Libs: \${libdir}/${LIBPREF}${shortname}${LIBSUF} $libs
4868 4869
Cflags: -I\${includedir}
EOF
4870
}
4871

4872
pkgconfig_generate libavutil     "Libav utility library"          "$LIBAVUTIL_VERSION"     "$LIBRT $LIBM"
4873 4874 4875 4876
pkgconfig_generate libavcodec    "Libav codec library"            "$LIBAVCODEC_VERSION"    "$extralibs"
pkgconfig_generate libavformat   "Libav container format library" "$LIBAVFORMAT_VERSION"   "$extralibs"
pkgconfig_generate libavdevice   "Libav device handling library"  "$LIBAVDEVICE_VERSION"   "$extralibs"
pkgconfig_generate libavfilter   "Libav video filtering library"  "$LIBAVFILTER_VERSION"   "$extralibs"
4877
pkgconfig_generate libavresample "Libav audio resampling library" "$LIBAVRESAMPLE_VERSION" "$LIBM"
4878
pkgconfig_generate libswscale    "Libav image rescaling library"  "$LIBSWSCALE_VERSION"    "$LIBM"