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

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

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

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

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

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

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

57 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
  --disable-logging        do not log configure debug information
81
  --fatal-warnings         fail if any configure warning is generated
82 83
  --prefix=PREFIX          install in PREFIX [$prefix]
  --bindir=DIR             install binaries in DIR [PREFIX/bin]
84
  --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]
85 86 87 88 89
  --libdir=DIR             install libs in DIR [PREFIX/lib]
  --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
  --incdir=DIR             install includes in DIR [PREFIX/include]
  --mandir=DIR             install man page in DIR [PREFIX/share/man]

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

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

106 107
Program options:
  --disable-programs       do not build command line programs
108 109 110 111
  --disable-ffmpeg         disable ffmpeg build
  --disable-ffplay         disable ffplay build
  --disable-ffprobe        disable ffprobe build
  --disable-ffserver       disable ffserver build
112

113
Documentation options:
114
  --disable-doc            do not build documentation
115 116 117 118 119 120
  --disable-htmlpages      do not build HTML documentation pages
  --disable-manpages       do not build man documentation pages
  --disable-podpages       do not build POD documentation pages
  --disable-txtpages       do not build text documentation pages

Component options:
121 122 123
  --disable-avdevice       disable libavdevice build
  --disable-avcodec        disable libavcodec build
  --disable-avformat       disable libavformat build
124
  --disable-avutil         disable libavutil build
Michael Niedermayer's avatar
Michael Niedermayer committed
125
  --disable-swresample     disable libswresample build
126
  --disable-swscale        disable libswscale build
127
  --disable-postproc       disable libpostproc build
128
  --disable-avfilter       disable libavfilter build
129
  --enable-avresample      enable libavresample build [no]
130
  --disable-pthreads       disable pthreads [auto]
131
  --disable-w32threads     disable Win32 threads [auto]
132
  --disable-os2threads     disable OS/2 threads [auto]
133
  --disable-network        disable network support [no]
134
  --disable-dct            disable DCT code
135
  --disable-dwt            disable DWT code
136
  --disable-error-resilience disable error resilience code
137
  --disable-lsp            disable LSP code
138
  --disable-lzo            disable LZO decoder code
139 140
  --disable-mdct           disable MDCT code
  --disable-rdft           disable RDFT code
141
  --disable-fft            disable FFT code
142 143

Hardware accelerators:
144
  --disable-dxva2          disable DXVA2 code [autodetect]
145
  --disable-vaapi          disable VAAPI code [autodetect]
146
  --enable-vda             enable VDA code
147
  --disable-vdpau          disable VDPAU code [autodetect]
148 149

Individual component options:
150
  --disable-everything     disable all components listed below
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
  --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
175
  --enable-indev=NAME      enable input device NAME
176 177
  --disable-indev=NAME     disable input device NAME
  --disable-indevs         disable input devices
178 179
  --enable-outdev=NAME     enable output device NAME
  --disable-outdev=NAME    disable output device NAME
180 181 182 183 184 185 186 187
  --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:
  --enable-avisynth        enable reading of AVISynth script files [no]
188
  --disable-bzlib          disable bzlib [autodetect]
189
  --enable-fontconfig      enable fontconfig
Stefano Sabatini's avatar
Stefano Sabatini committed
190
  --enable-frei0r          enable frei0r video filtering
191
  --enable-gnutls          enable gnutls [no]
192
  --disable-iconv          disable iconv [autodetect]
193
  --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
194
  --enable-libass          enable libass subtitles rendering [no]
Petri Hintukainen's avatar
Petri Hintukainen committed
195
  --enable-libbluray       enable BluRay reading using libbluray [no]
Paul B Mahol's avatar
Paul B Mahol committed
196
  --enable-libcaca         enable textual display using libcaca
197
  --enable-libcelt         enable CELT decoding via libcelt [no]
198
  --enable-libcdio         enable audio CD grabbing with libcdio
199 200
  --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                           and libraw1394 [no]
201 202
  --enable-libfaac         enable AAC encoding via libfaac [no]
  --enable-libfdk-aac      enable AAC encoding via libfdk-aac [no]
203
  --enable-libflite        enable flite (voice synthesis) support via libflite [no]
204
  --enable-libfreetype     enable libfreetype [no]
205
  --enable-libgsm          enable GSM de/encoding via libgsm [no]
206
  --enable-libiec61883     enable iec61883 via libiec61883 [no]
207
  --enable-libilbc         enable iLBC de/encoding via libilbc [no]
208
  --enable-libmodplug      enable ModPlug via libmodplug [no]
209 210 211
  --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
  --enable-libnut          enable NUT (de)muxing via libnut,
                           native (de)muxer exists [no]
212 213 214
  --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]
215
  --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
216
  --enable-libopus         enable Opus decoding via libopus [no]
217
  --enable-libpulse        enable Pulseaudio input via libpulse [no]
218
  --enable-libquvi         enable quvi input via libquvi [no]
219
  --enable-librtmp         enable RTMP[E] support via librtmp [no]
220
  --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
221
  --enable-libshine        enable fixed-point MP3 encoding via libshine [no]
222
  --enable-libsoxr         enable Include libsoxr resampling [no]
223
  --enable-libspeex        enable Speex de/encoding via libspeex [no]
Mohamed Naufal's avatar
Mohamed Naufal committed
224
  --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
225
  --enable-libtheora       enable Theora encoding via libtheora [no]
226
  --enable-libtwolame      enable MP2 encoding via libtwolame [no]
227
  --enable-libutvideo      enable Ut Video encoding and decoding via libutvideo [no]
228
  --enable-libv4l2         enable libv4l2/v4l-utils [no]
229
  --enable-libvidstab      enable video stabilization using vid.stab [no]
230
  --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
231
  --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
232
  --enable-libvorbis       enable Vorbis en/decoding via libvorbis,
233
                           native implementation exists [no]
234
  --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
235
  --enable-libwavpack      enable wavpack encoding via libwavpack [no]
236
  --enable-libx264         enable H.264 encoding via x264 [no]
237
  --enable-libxavs         enable AVS encoding via xavs [no]
238 239
  --enable-libxvid         enable Xvid encoding via xvidcore,
                           native MPEG-4/Xvid encoder exists [no]
240
  --enable-libzmq          enable message passing via libzmq [no]
241
  --enable-openal          enable OpenAL 1.1 capture support [no]
242
  --enable-opencl          enable OpenCL code
243
  --enable-openssl         enable openssl [no]
244
  --enable-x11grab         enable X11 grabbing [no]
245
  --disable-zlib           disable zlib [autodetect]
246 247 248 249 250 251 252 253 254

Advanced options (experts only):
  --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
  --enable-cross-compile   assume a cross-compiler is used
  --sysroot=PATH           root of cross-build tree
  --sysinclude=PATH        location of cross-build system headers
  --target-os=OS           compiler targets OS [$target_os]
  --target-exec=CMD        command to run executables on target
  --target-path=DIR        path to view of build directory on target
255
  --target-samples=DIR     path to samples directory on target
256
  --toolchain=NAME         set tool defaults according to NAME
257
  --nm=NM                  use nm tool NM [$nm_default]
258
  --ar=AR                  use archive tool AR [$ar_default]
259
  --as=AS                  use assembler AS [$as_default]
260
  --yasmexe=EXE            use yasm-compatible assembler EXE [$yasmexe_default]
261
  --cc=CC                  use C compiler CC [$cc_default]
Mohamed Naufal's avatar
Mohamed Naufal committed
262
  --cxx=CXX                use C compiler CXX [$cxx_default]
263
  --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
264
  --ld=LD                  use linker LD [$ld_default]
265 266
  --host-cc=HOSTCC         use host C compiler HOSTCC
  --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
267
  --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
268
  --host-ld=HOSTLD         use host linker HOSTLD
269 270
  --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
  --host-libs=HLIBS        use libs HLIBS when linking for host
271
  --host-os=OS             compiler host OS [$target_os]
272
  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
Mohamed Naufal's avatar
Mohamed Naufal committed
273
  --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
274 275 276
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
  --extra-libs=ELIBS       add ELIBS [$ELIBS]
  --extra-version=STRING   version string suffix []
277
  --optflags=OPTFLAGS      override optimization-related compiler flags
278
  --build-suffix=SUFFIX    library name suffix []
279
  --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
280
  --progs-suffix=SUFFIX    program name suffix []
281 282 283
  --arch=ARCH              select architecture [$arch]
  --cpu=CPU                select the minimum required CPU (affects
                           instruction selection, may crash on older CPUs)
284 285
  --enable-pic             build position-independent code
  --enable-sram            allow use of on-chip SRAM
286
  --enable-thumb           compile for Thumb instruction set
287 288 289 290 291 292
  --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
293
  --enable-lto             use link-time optimization
294 295

Optimization options (experts only):
296
  --disable-asm            disable all assembler optimizations
297 298 299 300
  --disable-altivec        disable AltiVec optimizations
  --disable-amd3dnow       disable 3DNow! optimizations
  --disable-amd3dnowext    disable 3DNow! extended optimizations
  --disable-mmx            disable MMX optimizations
301
  --disable-mmxext         disable MMXEXT optimizations
302
  --disable-sse            disable SSE optimizations
303 304
  --disable-sse2           disable SSE2 optimizations
  --disable-sse3           disable SSE3 optimizations
305
  --disable-ssse3          disable SSSE3 optimizations
306 307
  --disable-sse4           disable SSE4 optimizations
  --disable-sse42          disable SSE4.2 optimizations
308
  --disable-avx            disable AVX optimizations
309
  --disable-fma4           disable FMA4 optimizations
310 311 312
  --disable-armv5te        disable armv5te optimizations
  --disable-armv6          disable armv6 optimizations
  --disable-armv6t2        disable armv6t2 optimizations
313
  --disable-vfp            disable VFP optimizations
314
  --disable-neon           disable NEON optimizations
315
  --disable-vis            disable VIS optimizations
316
  --disable-inline-asm     disable use of inline assembler
317
  --disable-yasm           disable use of yasm assembler
318 319 320 321
  --disable-mips32r2       disable MIPS32R2 optimizations
  --disable-mipsdspr1      disable MIPS DSP ASE R1 optimizations
  --disable-mipsdspr2      disable MIPS DSP ASE R2 optimizations
  --disable-mipsfpu        disable floating point MIPS optimizations
322
  --disable-fast-unaligned consider unaligned accesses slow
323

324
Developer options (useful when working on FFmpeg itself):
325 326 327 328
  --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
329
  --disable-stripping      disable stripping of executables and shared libraries
330
  --assert-level=level     0(default), 1 or 2, amount of assertion testing,
331
                           2 causes a slowdown at runtime.
332
  --enable-memory-poisoning fill heap uninitialized allocated space with arbitrary data
333 334 335
  --valgrind=VALGRIND      run "make fate" tests through valgrind to detect memory
                           leaks and errors, using the specified valgrind binary.
                           Cannot be combined with --target-exec
336
  --enable-ftrapv          Trap arithmetic overflows
337 338
  --samples=PATH           location of test samples for FATE, if not set use
                           \$FATE_SAMPLES at make invocation time.
339 340
  --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
                           should be used only for debugging purposes)
341 342 343 344 345 346 347 348
  --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
349 350 351

NOTE: Object files are built at the place where configure is launched.
EOF
352
  exit 0
353
}
354

355 356
quotes='""'

357
log(){
358
    echo "$@" >> $logfile
359 360
}

361
log_file(){
Måns Rullgård's avatar
Måns Rullgård committed
362
    log BEGIN $1
363
    pr -n -t $1 >> $logfile
Måns Rullgård's avatar
Måns Rullgård committed
364 365 366
    log END $1
}

367
echolog(){
Måns Rullgård's avatar
Måns Rullgård committed
368
    log "$@"
369
    echo "$@"
370 371
}

372 373 374 375 376
warn(){
    log "WARNING: $*"
    WARNINGS="${WARNINGS}WARNING: $*\n"
}

377 378 379
die(){
    echolog "$@"
    cat <<EOF
380

381
If you think configure made a mistake, make sure you are using the latest
382
version from Git.  If the latest version fails, report the problem to the
383
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
384
EOF
385
    if disabled logging; then
386
        cat <<EOF
387 388
Rerun configure with logging enabled (do not use --disable-logging), and
include the log this produces with your report.
389 390
EOF
    else
391
        cat <<EOF
392 393
Include the log file "$logfile" produced by configure as this will help
solving the problem.
394 395
EOF
    fi
396 397 398
    exit 1
}

399
# Avoid locale weirdness, besides we really just want to translate ASCII.
400
toupper(){
401
    echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
402 403
}

404
tolower(){
405
    echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
406 407
}

408 409 410 411
c_escape(){
    echo "$*" | sed 's/["\\]/\\\0/g'
}

412 413
sh_quote(){
    v=$(echo "$1" | sed "s/'/'\\\\''/g")
414
    test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
415 416 417
    echo "$v"
}

418 419 420 421
cleanws(){
    echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//'
}

422 423 424 425
filter(){
    pat=$1
    shift
    for v; do
426
        eval "case $v in $pat) echo $v ;; esac"
427 428 429
    done
}

430 431 432 433 434 435 436 437
filter_out(){
    pat=$1
    shift
    for v; do
        eval "case $v in $pat) ;; *) echo $v ;; esac"
    done
}

438 439 440
map(){
    m=$1
    shift
441
    for v; do eval $m; done
442 443
}

444 445 446 447 448 449
add_suffix(){
    suffix=$1
    shift
    for v; do echo ${v}${suffix}; done
}

450 451 452 453 454 455 456 457
set_all(){
    value=$1
    shift
    for var in $*; do
        eval $var=$value
    done
}

458 459 460 461 462 463 464 465
set_weak(){
    value=$1
    shift
    for var; do
        eval : \${$var:=$value}
    done
}

466 467 468 469
sanitize_var_name(){
    echo $@ | sed 's/[^A-Za-z0-9_]/_/g'
}

470 471 472
set_safe(){
    var=$1
    shift
473
    eval $(sanitize_var_name "$var")='$*'
474 475 476
}

get_safe(){
477
    eval echo \$$(sanitize_var_name "$1")
478 479
}

480
pushvar(){
481 482 483 484
    for pvar in $*; do
        eval level=\${${pvar}_level:=0}
        eval ${pvar}_${level}="\$$pvar"
        eval ${pvar}_level=$(($level+1))
485 486 487 488
    done
}

popvar(){
489 490
    for pvar in $*; do
        eval level=\${${pvar}_level:-0}
491 492
        test $level = 0 && continue
        eval level=$(($level-1))
493 494 495
        eval $pvar="\${${pvar}_${level}}"
        eval ${pvar}_level=$level
        eval unset ${pvar}_${level}
496 497 498
    done
}

499 500 501 502 503 504 505 506
enable(){
    set_all yes $*
}

disable(){
    set_all no $*
}

507 508 509 510 511 512 513 514
enable_weak(){
    set_weak yes $*
}

disable_weak(){
    set_weak no $*
}

515
enable_safe(){
516 517 518
    for var; do
        enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
519 520 521
}

disable_safe(){
522 523 524
    for var; do
        disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
525 526
}

527 528 529 530
do_enable_deep(){
    for var; do
        enabled $var && continue
        eval sel="\$${var}_select"
531 532
        eval sgs="\$${var}_suggest"
        pushvar var sgs
533
        enable_deep $sel
534 535
        popvar sgs
        enable_deep_weak $sgs
536 537 538 539 540 541 542 543 544
        popvar var
    done
}

enable_deep(){
    do_enable_deep $*
    enable $*
}

545
enable_deep_weak(){
546 547 548 549 550 551 552
    for var; do
        disabled $var && continue
        pushvar var
        do_enable_deep $var
        popvar var
        enable_weak $var
    done
553 554
}

555
enabled(){
556 557
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xyes"
558 559
}

560
disabled(){
561 562
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xno"
563 564
}

565 566 567 568 569 570
enabled_all(){
    for opt; do
        enabled $opt || return 1
    done
}

571 572 573 574 575 576
disabled_all(){
    for opt; do
        disabled $opt || return 1
    done
}

577 578 579 580 581 582
enabled_any(){
    for opt; do
        enabled $opt && return 0
    done
}

583 584 585 586
disabled_any(){
    for opt; do
        disabled $opt && return 0
    done
587
    return 1
588 589
}

590 591
set_default(){
    for opt; do
592
        eval : \${$opt:=\$${opt}_default}
593 594 595
    done
}

596 597 598 599 600 601 602 603 604
is_in(){
    value=$1
    shift
    for var in $*; do
        [ $var = $value ] && return 0
    done
    return 1
}

605
do_check_deps(){
606
    for cfg; do
607
        cfg="${cfg#!}"
608 609 610
        enabled ${cfg}_checking && die "Circular dependency for $cfg."
        disabled ${cfg}_checking && continue
        enable ${cfg}_checking
611
        append allopts $cfg
612

613 614
        eval dep_all="\$${cfg}_deps"
        eval dep_any="\$${cfg}_deps_any"
615
        eval dep_sel="\$${cfg}_select"
616
        eval dep_sgs="\$${cfg}_suggest"
617 618
        eval dep_ifa="\$${cfg}_if"
        eval dep_ifn="\$${cfg}_if_any"
619

620
        pushvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
621
        do_check_deps $dep_all $dep_any $dep_sel $dep_sgs $dep_ifa $dep_ifn
622
        popvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
623

624 625
        [ -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
626 627
        enabled_all  $dep_all || disable $cfg
        enabled_any  $dep_any || disable $cfg
628
        disabled_any $dep_sel && disable $cfg
629

630
        if enabled $cfg; then
631
            enable_deep $dep_sel
632
            enable_deep_weak $dep_sgs
633 634
        fi

635
        disable ${cfg}_checking
636 637 638
    done
}

639 640 641 642 643 644 645 646 647 648 649 650
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
}

651 652
print_config(){
    pfx=$1
653 654
    files=$2
    shift 2
655 656 657 658 659 660 661 662 663 664 665 666 667 668
    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\$/) {
669
                    n = -v ? \"\" : \"!\";
670
                    printf(\"%s%s=yes\\n\", n, c) >>file;
671 672 673 674 675 676
                } else if (file ~ /\\.texi\$/) {
                    pre = -v ? \"\" : \"@c \";
                    yesno = \$2;
                    c2 = tolower(c);
                    gsub(/_/, \"-\", c2);
                    printf(\"%s@set %s %s\\n\", pre, c2, yesno) >>file;
677 678 679
                }
            }
        }"
680 681
}

682 683 684 685
print_enabled(){
    suf=$1
    shift
    for v; do
686
        enabled $v && printf "%s\n" ${v%$suf};
687 688 689
    done
}

690 691 692 693 694 695
append(){
    var=$1
    shift
    eval "$var=\"\$$var $*\""
}

696 697 698 699 700 701
prepend(){
    var=$1
    shift
    eval "$var=\"$* \$$var\""
}

702
add_cppflags(){
703
    append CPPFLAGS "$@"
704 705
}

706
add_cflags(){
707
    append CFLAGS $($cflags_filter "$@")
708 709
}

Mohamed Naufal's avatar
Mohamed Naufal committed
710
add_cxxflags(){
711
    append CXXFLAGS $($cflags_filter "$@")
Mohamed Naufal's avatar
Mohamed Naufal committed
712 713
}

714
add_asflags(){
715
    append ASFLAGS $($asflags_filter "$@")
716 717
}

718
add_ldflags(){
719
    append LDFLAGS $($ldflags_filter "$@")
720 721 722
}

add_extralibs(){
723
    prepend extralibs $($ldflags_filter "$@")
724 725
}

726 727 728 729
add_host_cppflags(){
    append host_cppflags "$@"
}

730 731 732 733 734 735
add_host_cflags(){
    append host_cflags $($host_cflags_filter "$@")
}

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

738 739 740 741 742 743
add_compat(){
    append compat_objs $1
    shift
    map 'add_cppflags -D$v' "$@"
}

744
check_cmd(){
745
    log "$@"
746
    "$@" >> $logfile 2>&1
747 748
}

749 750 751 752
cc_o(){
    eval printf '%s\\n' $CC_O
}

753 754 755 756
cc_e(){
    eval printf '%s\\n' $CC_E
}

757
check_cc(){
758
    log check_cc "$@"
759
    cat > $TMPC
760
    log_file $TMPC
761
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
762 763
}

Mohamed Naufal's avatar
Mohamed Naufal committed
764 765 766 767
check_cxx(){
    log check_cxx "$@"
    cat > $TMPCPP
    log_file $TMPCPP
768
    check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
Mohamed Naufal's avatar
Mohamed Naufal committed
769 770
}

771 772
check_cpp(){
    log check_cpp "$@"
773
    cat > $TMPC
774
    log_file $TMPC
775
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
776 777
}

778 779 780 781
as_o(){
    eval printf '%s\\n' $AS_O
}

782 783
check_as(){
    log check_as "$@"
784 785 786
    cat > $TMPS
    log_file $TMPS
    check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
787 788
}

789 790
check_inline_asm(){
    log check_inline_asm "$@"
791
    name="$1"
792
    code="$2"
793
    shift 2
794
    disable $name
795
    check_cc "$@" <<EOF && enable $name
796
void foo(void){ __asm__ volatile($code); }
797 798 799
EOF
}

800 801 802 803 804 805
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
806 807 808 809 810
check_yasm(){
    log check_yasm "$@"
    echo "$1" > $TMPS
    log_file $TMPS
    shift 1
811
    check_cmd $yasmexe $YASMFLAGS -Werror "$@" -o $TMPO $TMPS
Loren Merritt's avatar
Loren Merritt committed
812 813
}

814 815 816 817
ld_o(){
    eval printf '%s\\n' $LD_O
}

818
check_ld(){
819
    log check_ld "$@"
Mohamed Naufal's avatar
Mohamed Naufal committed
820 821
    type=$1
    shift 1
Jonas Bechtel's avatar
Jonas Bechtel committed
822 823
    flags=$(filter_out '-l*|*.so' $@)
    libs=$(filter '-l*|*.so' $@)
824
    check_$type $($cflags_filter $flags) || return
825 826
    flags=$($ldflags_filter $flags)
    libs=$($ldflags_filter $libs)
827
    check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
828 829
}

830 831 832 833 834 835 836 837 838 839 840 841 842 843
check_code(){
    log check_code "$@"
    check=$1
    headers=$2
    code=$3
    shift 3
    {
        for hdr in $headers; do
            echo "#include <$hdr>"
        done
        echo "int main(void) { $code; return 0; }"
    } | check_$check "$@"
}

844 845
check_cppflags(){
    log check_cppflags "$@"
846
    check_cc "$@" <<EOF && append CPPFLAGS "$@"
847 848 849 850
int x;
EOF
}

851
check_cflags(){
852
    log check_cflags "$@"
853
    set -- $($cflags_filter "$@")
854
    check_cc "$@" <<EOF && append CFLAGS "$@"
855 856 857 858
int x;
EOF
}

Mohamed Naufal's avatar
Mohamed Naufal committed
859 860
check_cxxflags(){
    log check_cxxflags "$@"
861
    set -- $($cflags_filter "$@")
Mohamed Naufal's avatar
Mohamed Naufal committed
862 863 864 865 866
    check_cxx "$@" <<EOF && append CXXFLAGS "$@"
int x;
EOF
}

867 868
test_ldflags(){
    log test_ldflags "$@"
Mohamed Naufal's avatar
Mohamed Naufal committed
869
    check_ld "cc" "$@" <<EOF
870
int main(void){ return 0; }
871 872 873
EOF
}

874 875 876 877 878
check_ldflags(){
    log check_ldflags "$@"
    test_ldflags "$@" && add_ldflags "$@"
}

879
check_header(){
880
    log check_header "$@"
881 882
    header=$1
    shift
883 884
    disable_safe $header
    check_cpp "$@" <<EOF && enable_safe $header
885 886 887 888 889 890
#include <$header>
int x;
EOF
}

check_func(){
891
    log check_func "$@"
892 893
    func=$1
    shift
Måns Rullgård's avatar
Måns Rullgård committed
894
    disable $func
Mohamed Naufal's avatar
Mohamed Naufal committed
895
    check_ld "cc" "$@" <<EOF && enable $func
896
extern int $func();
897
int main(void){ $func(); }
898 899 900
EOF
}

901
check_mathfunc(){
902
    log check_mathfunc "$@"
903
    func=$1
904 905 906
    narg=$2
    shift 2
    test $narg = 2 && args="f, g" || args="f"
907 908 909
    disable $func
    check_ld "cc" "$@" <<EOF && enable $func
#include <math.h>
910
float foo(float f, float g) { return $func($args); }
911 912 913 914
int main(void){ return (int) foo; }
EOF
}

915 916
check_func_headers(){
    log check_func_headers "$@"
917
    headers=$1
918
    funcs=$2
919
    shift 2
920 921 922 923 924 925 926 927
    {
        for hdr in $headers; do
            echo "#include <$hdr>"
        done
        for func in $funcs; do
            echo "long check_$func(void) { return (long) $func; }"
        done
        echo "int main(void) { return 0; }"
Mohamed Naufal's avatar
Mohamed Naufal committed
928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947
    } | check_ld "cc" "$@" && enable $funcs && enable_safe $headers
}

check_class_headers_cpp(){
    log check_class_headers_cpp "$@"
    headers=$1
    classes=$2
    shift 2
    {
        for hdr in $headers; do
            echo "#include <$hdr>"
        done
        echo "int main(void) { "
        i=1
        for class in $classes; do
            echo "$class obj$i;"
            i=$(expr $i + 1)
        done
        echo "return 0; }"
    } | check_ld "cxx" "$@" && enable $funcs && enable_safe $headers
948 949
}

950 951 952 953
check_cpp_condition(){
    log check_cpp_condition "$@"
    header=$1
    condition=$2
954
    shift 2
955
    check_cpp "$@" <<EOF
956 957 958 959 960 961 962
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

963 964 965 966 967
check_lib(){
    log check_lib "$@"
    header="$1"
    func="$2"
    shift 2
968
    check_header $header && check_func $func "$@" && add_extralibs "$@"
969 970
}

971 972 973
check_lib2(){
    log check_lib2 "$@"
    headers="$1"
974
    funcs="$2"
975
    shift 2
976
    check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
977 978
}

Mohamed Naufal's avatar
Mohamed Naufal committed
979 980 981 982 983 984 985 986
check_lib_cpp(){
    log check_lib_cpp "$@"
    headers="$1"
    classes="$2"
    shift 2
    check_class_headers_cpp "$headers" "$classes" "$@" && add_extralibs "$@"
}

987 988 989 990 991 992
check_pkg_config(){
    log check_pkg_config "$@"
    pkg="$1"
    headers="$2"
    funcs="$3"
    shift 3
993
    $pkg_config --exists $pkg 2>/dev/null || return
994 995 996 997 998 999 1000
    pkg_cflags=$($pkg_config --cflags $pkg)
    pkg_libs=$($pkg_config --libs $pkg)
    check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
        set_safe ${pkg}_cflags $pkg_cflags   &&
        set_safe ${pkg}_libs   $pkg_libs
}

1001
check_exec(){
Mohamed Naufal's avatar
Mohamed Naufal committed
1002
    check_ld "cc" "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
1003 1004
}

1005
check_exec_crash(){
1006
    code=$(cat)
1007 1008 1009 1010 1011 1012 1013

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

1014
    (check_exec "$@") >> $logfile 2>&1 <<EOF
1015 1016 1017 1018
#include <signal.h>
static void sighandler(int sig){
    raise(SIGTERM);
}
1019
int foo(void){
1020 1021
    $code
}
1022
int (*func_ptr)(void) = foo;
Diego Biurrun's avatar
Diego Biurrun committed
1023
int main(void){
1024 1025 1026 1027 1028 1029
    signal(SIGILL, sighandler);
    signal(SIGFPE, sighandler);
    signal(SIGSEGV, sighandler);
#ifdef SIGBUS
    signal(SIGBUS, sighandler);
#endif
1030
    return func_ptr();
1031 1032 1033 1034
}
EOF
}

1035 1036 1037 1038 1039
check_type(){
    log check_type "$@"
    headers=$1
    type=$2
    shift 2
1040
    disable_safe "$type"
1041
    check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
1042 1043
}

1044
check_struct(){
1045
    log check_struct "$@"
1046 1047 1048 1049 1050
    headers=$1
    struct=$2
    member=$3
    shift 3
    disable_safe "${struct}_${member}"
1051 1052
    check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
        enable_safe "${struct}_${member}"
1053 1054
}

1055 1056 1057 1058 1059 1060 1061
check_builtin(){
    log check_builtin "$@"
    name=$1
    headers=$2
    builtin=$3
    shift 3
    disable "$name"
1062
    check_code ld "$headers" "$builtin" "cc" "$@" && enable "$name"
1063 1064
}

1065 1066 1067 1068 1069 1070
require(){
    name="$1"
    header="$2"
    func="$3"
    shift 3
    check_lib $header $func "$@" || die "ERROR: $name not found"
1071 1072
}

1073 1074 1075 1076 1077 1078 1079 1080
require2(){
    name="$1"
    headers="$2"
    func="$3"
    shift 3
    check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
}

Mohamed Naufal's avatar
Mohamed Naufal committed
1081 1082 1083 1084 1085 1086 1087 1088
require_cpp(){
    name="$1"
    headers="$2"
    classes="$3"
    shift 3
    check_lib_cpp "$headers" "$classes" "$@" || die "ERROR: $name not found"
}

1089 1090 1091 1092 1093 1094 1095
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)
}

1096 1097 1098 1099
hostcc_o(){
    eval printf '%s\\n' $HOSTCC_O
}

1100 1101 1102 1103
check_host_cc(){
    log check_host_cc "$@"
    cat > $TMPC
    log_file $TMPC
1104
    check_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
1105 1106
}

1107 1108 1109 1110 1111 1112 1113
check_host_cppflags(){
    log check_host_cppflags "$@"
    check_host_cc "$@" <<EOF && append host_cppflags "$@"
int x;
EOF
}

1114 1115
check_host_cflags(){
    log check_host_cflags "$@"
1116
    set -- $($host_cflags_filter "$@")
1117 1118 1119 1120 1121
    check_host_cc "$@" <<EOF && append host_cflags "$@"
int x;
EOF
}

1122 1123 1124 1125 1126 1127
apply(){
    file=$1
    shift
    "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
}

1128
cp_if_changed(){
1129 1130
    cmp -s "$1" "$2" && echo "$2 is unchanged" && return
    mkdir -p "$(dirname $2)"
Mans Rullgard's avatar
Mans Rullgard committed
1131
    $cp_f "$1" "$2"
1132 1133
}

1134 1135 1136
# CONFIG_LIST contains configurable options, while HAVE_LIST is for
# system-dependent things.

1137 1138 1139 1140 1141
COMPONENT_LIST="
    bsfs
    decoders
    demuxers
    encoders
Vitor Sessak's avatar
Vitor Sessak committed
1142
    filters
1143
    hwaccels
1144
    indevs
1145
    muxers
1146
    outdevs
1147 1148 1149 1150
    parsers
    protocols
"

1151 1152 1153
EXTERNAL_LIBRARY_LIST="
    avisynth
    bzlib
1154 1155
    crystalhd
    fontconfig
1156 1157
    frei0r
    gnutls
1158
    iconv
1159 1160 1161 1162
    libaacplus
    libass
    libbluray
    libcaca
1163
    libcdio
1164
    libcelt
1165 1166 1167
    libdc1394
    libfaac
    libfdk_aac
1168
    libflite
1169 1170
    libfreetype
    libgsm
1171
    libiec61883
1172
    libilbc
1173
    libmodplug
1174
    libmp3lame
1175
    libnut
1176 1177 1178 1179 1180 1181
    libopencore_amrnb
    libopencore_amrwb
    libopencv
    libopenjpeg
    libopus
    libpulse
1182
    libquvi
1183 1184
    librtmp
    libschroedinger
1185
    libshine
1186
    libsoxr
1187
    libspeex
1188
    libstagefright_h264
1189
    libtheora
1190 1191 1192
    libtwolame
    libutvideo
    libv4l2
1193
    libvidstab
1194 1195 1196 1197
    libvo_aacenc
    libvo_amrwbenc
    libvorbis
    libvpx
1198
    libwavpack
1199 1200 1201
    libx264
    libxavs
    libxvid
1202
    libzmq
1203
    openal
1204
    opencl
1205 1206 1207 1208 1209
    openssl
    x11grab
    zlib
"

1210 1211 1212 1213 1214 1215 1216 1217
DOCUMENT_LIST="
    doc
    htmlpages
    manpages
    podpages
    txtpages
"

1218 1219 1220 1221 1222 1223
HWACCEL_LIST="
    dxva2
    vaapi
    vda
    vdpau
"
1224

1225 1226 1227 1228 1229 1230 1231
LIBRARY_LIST="
    avcodec
    avdevice
    avfilter
    avformat
    avresample
    avutil
1232
    postproc
1233
    swresample
1234 1235 1236
    swscale
"

1237
PROGRAM_LIST="
1238 1239 1240
    ffplay
    ffprobe
    ffserver
1241 1242 1243
    ffmpeg
"

1244 1245
CONFIG_LIST="
    $COMPONENT_LIST
1246
    $DOCUMENT_LIST
1247
    $EXTERNAL_LIBRARY_LIST
1248
    $HWACCEL_LIST
1249
    $LIBRARY_LIST
1250
    $PROGRAM_LIST
1251
    dct
1252
    dwt
1253
    error_resilience
1254
    fast_unaligned
1255
    fft
1256
    ftrapv
1257
    gpl
1258
    gray
Aurelien Jacobs's avatar
Aurelien Jacobs committed
1259
    hardcoded_tables
1260
    incompatible_fork_abi
1261
    lsp
1262
    lzo
1263
    mdct
1264
    memalign_hack
1265
    memory_poisoning
1266
    network
1267
    nonfree
1268
    pic
1269
    rdft
1270
    runtime_cpudetect
1271
    safe_bitstream_reader
1272
    shared
1273
    small
1274
    sram
1275
    static
1276
    swscale_alpha
1277
    thumb
1278
    version3
1279
    xmm_clobber_test
1280
"
1281

1282 1283 1284
THREADS_LIST='
    pthreads
    w32threads
1285
    os2threads
1286 1287
'

1288 1289 1290
ATOMICS_LIST='
    atomics_gcc
    atomics_suncc
1291
    atomics_win32
1292 1293
'

1294
ARCH_LIST='
1295
    aarch64
1296
    alpha
1297
    arm
1298 1299 1300
    avr32
    avr32_ap
    avr32_uc
1301 1302 1303 1304
    bfin
    ia64
    m68k
    mips
1305
    mips64
1306
    parisc
1307
    ppc
1308
    ppc64
1309 1310 1311 1312
    s390
    sh4
    sparc
    sparc64
1313 1314
    tilegx
    tilepro
1315
    tomi
1316 1317 1318 1319 1320
    x86
    x86_32
    x86_64
'

1321 1322 1323 1324 1325
ARCH_EXT_LIST_ARM='
    armv5te
    armv6
    armv6t2
    neon
1326
    vfp
1327 1328 1329
    vfpv3
'

1330
ARCH_EXT_LIST_X86='
1331
    amd3dnow
1332
    amd3dnowext
1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345
    avx
    fma4
    mmx
    mmxext
    sse
    sse2
    sse3
    sse4
    sse42
    ssse3
'

ARCH_EXT_LIST="
1346
    $ARCH_EXT_LIST_ARM
1347 1348
    $ARCH_EXT_LIST_X86
    altivec
1349
    ppc4xx
1350
    vis
1351 1352 1353 1354
    mipsfpu
    mips32r2
    mipsdspr1
    mipsdspr2
1355
"
1356

1357 1358 1359 1360 1361 1362
HAVE_LIST_CMDLINE='
    inline_asm
    symver
    yasm
'

1363 1364
HAVE_LIST_PUB='
    bigendian
1365
    fast_unaligned
1366
    incompatible_fork_abi
1367 1368
'

1369
MATH_FUNCS="
1370 1371
    atanf
    atan2f
1372
    cbrt
1373
    cbrtf
1374
    cosf
1375 1376
    exp2
    exp2f
1377
    expf
1378 1379
    isinf
    isnan
1380
    ldexpf
1381 1382 1383 1384
    llrint
    llrintf
    log2
    log2f
1385
    log10f
1386 1387
    lrint
    lrintf
1388
    powf
1389 1390 1391
    rint
    round
    roundf
1392
    sinf
1393 1394 1395 1396
    trunc
    truncf
"

1397 1398
HAVE_LIST="
    $ARCH_EXT_LIST
1399 1400
    $(add_suffix _external $ARCH_EXT_LIST)
    $(add_suffix _inline   $ARCH_EXT_LIST)
1401
    $HAVE_LIST_CMDLINE
1402
    $HAVE_LIST_PUB
1403
    $THREADS_LIST
1404
    $ATOMICS_LIST
1405
    $MATH_FUNCS
1406
    access
1407
    aligned_malloc
1408
    aligned_stack
1409
    alsa_asoundlib_h
1410
    altivec_h
1411
    arpa_inet_h
1412
    asm_mod_q
1413
    asm_mod_y
1414
    asm_types_h
1415
    atomic_cas_ptr
1416
    atomics_native
1417
    attribute_may_alias
1418
    attribute_packed
1419 1420
    cdio_paranoia_h
    cdio_paranoia_paranoia_h
1421
    CL_cl_h
1422
    clock_gettime
Alex Beregszaszi's avatar
Alex Beregszaszi committed
1423
    closesocket
1424
    CommandLineToArgvW
1425
    cpunop
1426
    CryptGenRandom
1427
    dcbzl
1428 1429 1430 1431
    dev_bktr_ioctl_bt848_h
    dev_bktr_ioctl_meteor_h
    dev_ic_bt8xx_h
    dev_video_bktr_ioctl_bt848_h
1432
    dev_video_meteor_ioctl_meteor_h
1433
    direct_h
1434
    dlfcn_h
1435
    dlopen
1436
    dos_paths
1437
    dxva_h
1438 1439
    ebp_available
    ebx_available
1440
    fast_64bit
1441
    fast_clz
1442
    fast_cmov
Måns Rullgård's avatar
Måns Rullgård committed
1443
    fcntl
Måns Rullgård's avatar
Måns Rullgård committed
1444
    fork
1445
    getaddrinfo
1446
    gethrtime
1447
    getopt
1448
    GetProcessAffinityMask
1449
    GetProcessMemoryInfo
1450
    GetProcessTimes
1451
    GetSystemTimeAsFileTime
Ramiro Polla's avatar
Ramiro Polla committed
1452
    getrusage
1453
    getservbyport
1454
    gettimeofday
1455
    glob
1456
    gnu_as
1457
    gsm_h
1458
    i686
1459
    ibm_asm
1460
    inet_aton
1461
    io_h
1462
    isatty
1463
    jack_port_get_latency_range
1464
    kbhit
Måns Rullgård's avatar
Måns Rullgård committed
1465
    ldbrx
1466 1467
    libdc1394_1
    libdc1394_2
1468 1469
    local_aligned_16
    local_aligned_8
1470
    localtime_r
1471
    loongson
1472
    lzo1x_999_compress
1473 1474
    machine_ioctl_bt848_h
    machine_ioctl_meteor_h
1475
    machine_rw_barrier
1476
    makeinfo
1477
    malloc_h
1478
    MapViewOfFile
1479
    memalign
1480
    MemoryBarrier
1481
    mkstemp
1482
    mm_empty
1483
    mmap
1484
    mprotect
1485
    msvcrt
1486
    nanosleep
1487
    openjpeg_1_5_openjpeg_h
1488
    PeekNamedPipe
1489
    perl
1490
    pod2man
1491
    poll_h
1492
    posix_memalign
1493
    pthread_cancel
1494
    rdtsc
1495
    rsync_contimeout
1496
    sched_getaffinity
1497
    sdl
1498
    SetConsoleTextAttribute
1499
    setmode
1500
    setrlimit
1501
    Sleep
1502
    sndio_h
1503
    socklen_t
Måns Rullgård's avatar
Måns Rullgård committed
1504
    soundcard_h
1505
    strerror_r
1506
    struct_addrinfo
1507 1508
    struct_group_source_req
    struct_ip_mreq_source
1509
    struct_ipv6_mreq
1510
    struct_pollfd
1511
    struct_rusage_ru_maxrss
1512
    struct_sctp_event_subscribe
1513
    struct_sockaddr_in6
1514
    struct_sockaddr_sa_len
1515
    struct_sockaddr_storage
1516
    struct_stat_st_mtim_tv_nsec
1517
    struct_v4l2_frmivalenum_discrete
1518
    symver_asm_label
1519
    symver_gnu_asm
1520
    sync_val_compare_and_swap
1521
    sysconf
1522
    sysctl
1523
    sys_mman_h
1524
    sys_param_h
1525
    sys_resource_h
1526
    sys_select_h
Måns Rullgård's avatar
Måns Rullgård committed
1527
    sys_soundcard_h
1528
    sys_time_h
1529
    sys_videoio_h
1530
    termios_h
1531
    texi2html
1532
    threads
1533
    unistd_h
1534
    usleep
1535
    vfp_args
1536
    VirtualAlloc
1537
    windows_h
1538
    winsock2_h
1539
    xform_asm
1540
    xmm_clobbers
1541
"
1542

Diego Biurrun's avatar
Diego Biurrun committed
1543
# options emitted with CONFIG_ prefix but not available on the command line
1544
CONFIG_EXTRA="
1545
    aandcttables
1546
    ac3dsp
1547
    audio_frame_queue
1548
    dsputil
1549
    frame_thread_encoder
1550
    gcrypt
1551
    golomb
1552
    gplv3
1553 1554 1555
    h264chroma
    h264dsp
    h264pred
1556
    h264qpel
1557
    hpeldsp
1558
    huffman
1559
    lgplv3
1560
    lpc
1561
    mpegaudio
1562
    mpegaudiodsp
1563
    mpegvideo
1564
    mpegvideoenc
1565
    nettle
1566
    rangecoder
1567
    rtpdec
1568
    rtpenc_chain
1569
    sinewin
1570
    videodsp
1571
    vp3dsp
1572 1573
"

1574
CMDLINE_SELECT="
1575
    $ARCH_EXT_LIST
1576
    $CONFIG_LIST
1577
    $HAVE_LIST_CMDLINE
1578
    $THREADS_LIST
1579
    asm
1580
    cross_compile
1581 1582
    debug
    extra_warnings
1583
    logging
1584
    lto
1585
    optimizations
1586
    stripping
1587
"
1588 1589

PATHS_LIST='
1590
    bindir
1591
    datadir
1592 1593 1594 1595 1596
    incdir
    libdir
    mandir
    prefix
    shlibdir
1597 1598 1599 1600
'

CMDLINE_SET="
    $PATHS_LIST
1601
    ar
1602
    arch
1603
    as
1604
    assert_level
1605 1606 1607 1608
    build_suffix
    cc
    cpu
    cross_prefix
Mohamed Naufal's avatar
Mohamed Naufal committed
1609
    cxx
1610
    dep_cc
1611
    extra_version
1612 1613
    host_cc
    host_cflags
1614
    host_ld
1615 1616
    host_ldflags
    host_libs
1617
    host_os
1618
    install
1619
    ld
1620
    logfile
1621
    malloc_prefix
1622
    nm
1623
    optflags
1624
    pkg_config
1625
    progs_suffix
1626
    random_seed
Måns Rullgård's avatar
Måns Rullgård committed
1627
    samples
1628
    strip
1629 1630
    sysinclude
    sysroot
1631
    target_exec
1632
    target_os
1633
    target_path
1634
    target_samples
1635
    toolchain
1636
    valgrind
1637
    yasmexe
1638
"
1639

1640 1641
CMDLINE_APPEND="
    extra_cflags
Mohamed Naufal's avatar
Mohamed Naufal committed
1642
    extra_cxxflags
1643
    host_cppflags
1644 1645
"

1646 1647
# code dependency declarations

1648
# architecture extensions
1649

1650 1651
armv5te_deps="arm"
armv6_deps="arm"
1652
armv6t2_deps="arm"
1653
neon_deps="arm"
1654 1655
vfp_deps="arm"
vfpv3_deps="vfp"
1656

1657 1658
map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM

1659 1660 1661 1662
mipsfpu_deps="mips"
mips32r2_deps="mips"
mipsdspr1_deps="mips"
mipsdspr2_deps="mips"
1663 1664 1665 1666 1667 1668

altivec_deps="ppc"
ppc4xx_deps="ppc"

vis_deps="sparc"

1669
x86_64_suggest="fast_cmov i686"
1670

1671 1672
amd3dnow_deps="mmx"
amd3dnowext_deps="amd3dnow"
1673
mmx_deps="x86"
1674
mmxext_deps="mmx"
1675 1676 1677 1678 1679 1680 1681
sse_deps="mmxext"
sse2_deps="sse"
sse3_deps="sse2"
ssse3_deps="sse3"
sse4_deps="ssse3"
sse42_deps="sse4"
avx_deps="sse42"
1682
fma4_deps="avx"
1683

1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694
mmx_external_deps="yasm"
mmx_inline_deps="inline_asm"
mmx_suggest="mmx_external mmx_inline"

for ext in $(filter_out mmx $ARCH_EXT_LIST_X86); do
    eval dep=\$${ext}_deps
    eval ${ext}_external_deps='"${dep}_external"'
    eval ${ext}_inline_deps='"${dep}_inline"'
    eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
done

1695
aligned_stack_if_any="ppc x86"
1696
fast_64bit_if_any="alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
1697 1698
fast_clz_if_any="alpha avr32 mips ppc x86"
fast_unaligned_if_any="ppc x86"
1699

1700
inline_asm_deps="!tms470"
1701
need_memalign="altivec neon sse"
1702

1703 1704
symver_if_any="symver_asm_label symver_gnu_asm"

1705 1706
log2_deps="!msvcrt"

1707
# subsystems
1708
dct_select="rdft"
1709
error_resilience_select="dsputil"
1710
frame_thread_encoder_deps="encoders threads"
1711
lpc_select="dsputil"
1712 1713
mdct_select="fft"
rdft_select="fft"
1714
mpegaudio_select="mpegaudiodsp"
1715
mpegaudiodsp_select="dct"
1716
mpegvideo_select="dsputil h264chroma hpeldsp videodsp"
1717
mpegvideoenc_select="mpegvideo"
1718

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

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

1911 1912 1913 1914
h263_vaapi_hwaccel_deps="vaapi"
h263_vaapi_hwaccel_select="h263_decoder"
h263_vdpau_hwaccel_deps="vdpau"
h263_vdpau_hwaccel_select="h263_decoder"
1915
h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser"
1916 1917
h264_dxva2_hwaccel_deps="dxva2"
h264_dxva2_hwaccel_select="h264_decoder"
1918 1919
h264_vaapi_hwaccel_deps="vaapi"
h264_vaapi_hwaccel_select="h264_decoder"
1920 1921
h264_vda_decoder_deps="vda"
h264_vda_decoder_select="h264_decoder"
1922 1923 1924 1925 1926 1927 1928
h264_vda_hwaccel_deps="vda"
h264_vda_hwaccel_select="h264_decoder"
h264_vdpau_decoder_deps="vdpau"
h264_vdpau_decoder_select="h264_decoder"
h264_vdpau_hwaccel_deps="vdpau"
h264_vdpau_hwaccel_select="h264_decoder"
mpeg_vdpau_decoder_deps="vdpau"
1929
mpeg_vdpau_decoder_select="mpeg2video_decoder"
1930 1931 1932 1933
mpeg1_vdpau_decoder_deps="vdpau"
mpeg1_vdpau_decoder_select="mpeg1video_decoder"
mpeg1_vdpau_hwaccel_deps="vdpau"
mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
1934
mpeg2_crystalhd_decoder_select="crystalhd"
1935 1936
mpeg2_dxva2_hwaccel_deps="dxva2"
mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
1937 1938 1939 1940
mpeg2_vaapi_hwaccel_deps="vaapi"
mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
mpeg2_vdpau_hwaccel_deps="vdpau"
mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
1941
mpeg4_crystalhd_decoder_select="crystalhd"
1942 1943 1944 1945 1946 1947
mpeg4_vaapi_hwaccel_deps="vaapi"
mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
mpeg4_vdpau_decoder_deps="vdpau"
mpeg4_vdpau_decoder_select="mpeg4_decoder"
mpeg4_vdpau_hwaccel_deps="vdpau"
mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
1948 1949
msmpeg4_crystalhd_decoder_select="crystalhd"
vc1_crystalhd_decoder_select="crystalhd"
1950 1951
vc1_dxva2_hwaccel_deps="dxva2"
vc1_dxva2_hwaccel_select="vc1_decoder"
1952 1953 1954 1955 1956 1957
vc1_vaapi_hwaccel_deps="vaapi"
vc1_vaapi_hwaccel_select="vc1_decoder"
vc1_vdpau_decoder_deps="vdpau"
vc1_vdpau_decoder_select="vc1_decoder"
vc1_vdpau_hwaccel_deps="vdpau"
vc1_vdpau_hwaccel_select="vc1_decoder"
1958
wmv3_crystalhd_decoder_select="crystalhd"
1959 1960 1961
wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
wmv3_vdpau_decoder_select="vc1_vdpau_decoder"
1962
wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
1963

1964
# parsers
1965
h264_parser_select="golomb h264chroma h264dsp h264pred h264qpel videodsp"
1966 1967
mpeg4video_parser_select="error_resilience mpegvideo"
mpegvideo_parser_select="error_resilience mpegvideo"
1968
vc1_parser_select="mpegvideo"
1969

1970
# external libraries
tipok's avatar
tipok committed
1971
libaacplus_encoder_deps="libaacplus"
1972
libcelt_decoder_deps="libcelt"
1973
libfaac_encoder_deps="libfaac"
1974
libfaac_encoder_select="audio_frame_queue"
1975
libfdk_aac_encoder_deps="libfdk_aac"
1976
libfdk_aac_encoder_select="audio_frame_queue"
1977 1978
libgsm_decoder_deps="libgsm"
libgsm_encoder_deps="libgsm"
1979 1980
libgsm_ms_decoder_deps="libgsm"
libgsm_ms_encoder_deps="libgsm"
1981 1982
libilbc_decoder_deps="libilbc"
libilbc_encoder_deps="libilbc"
1983
libmodplug_demuxer_deps="libmodplug"
1984
libmp3lame_encoder_deps="libmp3lame"
1985
libmp3lame_encoder_select="audio_frame_queue"
1986 1987
libopencore_amrnb_decoder_deps="libopencore_amrnb"
libopencore_amrnb_encoder_deps="libopencore_amrnb"
1988
libopencore_amrnb_encoder_select="audio_frame_queue"
1989
libopencore_amrwb_decoder_deps="libopencore_amrwb"
1990
libopenjpeg_decoder_deps="libopenjpeg"
1991
libopenjpeg_encoder_deps="libopenjpeg"
1992
libopus_decoder_deps="libopus"
1993
libopus_encoder_deps="libopus"
1994
libopus_encoder_select="audio_frame_queue"
1995
libquvi_demuxer_deps="libquvi"
1996 1997
libschroedinger_decoder_deps="libschroedinger"
libschroedinger_encoder_deps="libschroedinger"
1998 1999
libshine_encoder_deps="libshine"
libshine_encoder_select="audio_frame_queue"
2000
libspeex_decoder_deps="libspeex"
Art Clarke's avatar
Art Clarke committed
2001
libspeex_encoder_deps="libspeex"
2002
libspeex_encoder_select="audio_frame_queue"
Mohamed Naufal's avatar
Mohamed Naufal committed
2003
libstagefright_h264_decoder_deps="libstagefright_h264"
2004
libtheora_encoder_deps="libtheora"
2005
libtwolame_encoder_deps="libtwolame"
2006
libvo_aacenc_encoder_deps="libvo_aacenc"
2007
libvo_aacenc_encoder_select="audio_frame_queue"
2008
libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
2009
libvorbis_decoder_deps="libvorbis"
2010
libvorbis_encoder_deps="libvorbis"
2011
libvorbis_encoder_select="audio_frame_queue"
2012 2013 2014 2015
libvpx_vp8_decoder_deps="libvpx"
libvpx_vp8_encoder_deps="libvpx"
libvpx_vp9_decoder_deps="libvpx"
libvpx_vp9_encoder_deps="libvpx"
2016
libwavpack_encoder_deps="libwavpack"
2017
libx264_encoder_deps="libx264"
2018
libx264rgb_encoder_deps="libx264"
2019
libxavs_encoder_deps="libxavs"
2020
libxvid_encoder_deps="libxvid"
2021 2022
libutvideo_decoder_deps="libutvideo"
libutvideo_encoder_deps="libutvideo"
2023

2024
# demuxers / muxers
2025
ac3_demuxer_select="ac3_parser"
2026
asf_stream_muxer_select="asf_muxer"
2027
avisynth_demuxer_deps="avisynth"
2028
dirac_demuxer_select="dirac_parser"
2029
dts_demuxer_select="dca_parser"
Paul B Mahol's avatar
Paul B Mahol committed
2030
dtshd_demuxer_select="dca_parser"
2031
eac3_demuxer_select="ac3_parser"
2032
f4v_muxer_select="mov_muxer"
2033
flac_demuxer_select="flac_parser"
2034
ipod_muxer_select="mov_muxer"
2035
ismv_muxer_select="mov_muxer"
2036 2037
libnut_demuxer_deps="libnut"
libnut_muxer_deps="libnut"
2038
matroska_audio_muxer_select="matroska_muxer"
2039
matroska_demuxer_suggest="bzlib lzo zlib"
2040
mov_demuxer_suggest="zlib"
2041
mov_muxer_select="rtpenc_chain"
2042
mp3_demuxer_select="mpegaudio_parser"
2043
mp4_muxer_select="mov_muxer"
2044
mpegts_muxer_select="adts_muxer latm_muxer"
2045 2046
mpegtsraw_demuxer_select="mpegts_demuxer"
mxf_d10_muxer_select="mxf_muxer"
2047
ogg_demuxer_select="golomb"
2048
psp_muxer_select="mov_muxer"
2049
rtp_demuxer_select="sdp_demuxer"
2050 2051
rtpdec_select="asf_demuxer rm_demuxer rtp_protocol mpegts_demuxer mov_demuxer"
rtsp_demuxer_select="http_protocol rtpdec"
2052
rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
Martin Storsjö's avatar
Martin Storsjö committed
2053
sap_demuxer_select="sdp_demuxer"
2054
sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
2055
sdp_demuxer_select="rtpdec"
2056
smoothstreaming_muxer_select="ismv_muxer"
2057
spdif_muxer_select="aac_parser"
2058
tak_demuxer_select="tak_parser"
2059 2060
tg2_muxer_select="mov_muxer"
tgp_muxer_select="mov_muxer"
Clément Bœsch's avatar
Clément Bœsch committed
2061
vobsub_demuxer_select="mpegps_demuxer"
2062
w64_demuxer_deps="wav_demuxer"
Paul B Mahol's avatar
Paul B Mahol committed
2063
w64_muxer_deps="wav_muxer"
2064 2065

# indevs / outdevs
2066 2067 2068
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"
Paul B Mahol's avatar
Paul B Mahol committed
2069
caca_outdev_deps="libcaca"
2070 2071
dshow_indev_deps="IBaseFilter"
dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
2072
dv1394_indev_deps="dv1394 dv_demuxer"
2073
fbdev_indev_deps="linux_fb_h"
2074
iec61883_indev_deps="libiec61883"
2075
jack_indev_deps="jack_jack_h sem_timedwait"
2076
lavfi_indev_deps="avfilter"
2077
libcdio_indev_deps="libcdio"
2078
libdc1394_indev_deps="libdc1394"
2079
libv4l2_indev_deps="libv4l2"
2080
openal_indev_deps="openal"
2081 2082
oss_indev_deps_any="soundcard_h sys_soundcard_h"
oss_outdev_deps_any="soundcard_h sys_soundcard_h"
2083
pulse_indev_deps="libpulse"
2084
sdl_outdev_deps="sdl"
2085 2086
sndio_indev_deps="sndio_h"
sndio_outdev_deps="sndio_h"
2087 2088
v4l_indev_deps="linux_videodev_h"
v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
Clément Bœsch's avatar
Clément Bœsch committed
2089
v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h"
2090
vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
2091
vfwcap_indev_extralibs="-lavicap32"
2092
xv_outdev_deps="X11_extensions_Xvlib_h XvGetPortAttribute"
2093
xv_outdev_extralibs="-lXv -lX11 -lXext"
2094
x11grab_indev_deps="x11grab"
2095

2096
# protocols
Petri Hintukainen's avatar
Petri Hintukainen committed
2097
bluray_protocol_deps="libbluray"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2098 2099 2100
ffrtmpcrypt_protocol_deps="!librtmp_protocol"
ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
ffrtmpcrypt_protocol_select="tcp_protocol"
2101 2102
ffrtmphttp_protocol_deps="!librtmp_protocol"
ffrtmphttp_protocol_select="http_protocol"
Lukasz Marek's avatar
Lukasz Marek committed
2103
ftp_protocol_select="tcp_protocol"
2104
gopher_protocol_select="network"
2105
httpproxy_protocol_select="tcp_protocol"
2106
http_protocol_select="tcp_protocol"
2107
https_protocol_select="tls_protocol"
2108 2109 2110 2111 2112
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
2113
mmsh_protocol_select="http_protocol"
2114
mmst_protocol_select="network"
2115
rtmp_protocol_deps="!librtmp_protocol"
2116
rtmp_protocol_select="tcp_protocol"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2117
rtmpe_protocol_select="ffrtmpcrypt_protocol"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2118 2119
rtmps_protocol_deps="!librtmp_protocol"
rtmps_protocol_select="tls_protocol"
2120
rtmpt_protocol_select="ffrtmphttp_protocol"
2121
rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2122
rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2123
rtp_protocol_select="udp_protocol"
2124 2125
sctp_protocol_deps="struct_sctp_event_subscribe"
sctp_protocol_select="network"
2126
srtp_protocol_select="rtp_protocol"
2127
tcp_protocol_select="network"
2128 2129
tls_protocol_deps_any="openssl gnutls"
tls_protocol_select="tcp_protocol"
2130
udp_protocol_select="network"
2131

2132
# filters
2133
aconvert_filter_deps="swresample"
2134
amovie_filter_deps="avcodec avformat"
2135
aresample_filter_deps="swresample"
2136
ass_filter_deps="libass"
2137
asyncts_filter_deps="avresample"
2138
atempo_filter_deps="avcodec rdft"
2139
azmq_filter_deps="libzmq"
2140
blackframe_filter_deps="gpl"
2141
boxblur_filter_deps="gpl"
2142
colormatrix_filter_deps="gpl"
2143
cropdetect_filter_deps="gpl"
2144
dctdnoiz_filter_deps="avcodec fft"
2145
delogo_filter_deps="gpl"
2146
deshake_filter_deps="avcodec"
2147
deshake_filter_select="dsputil"
2148
drawtext_filter_deps="libfreetype"
2149
ebur128_filter_deps="gpl"
2150
flite_filter_deps="libflite"
Stefano Sabatini's avatar
Stefano Sabatini committed
2151
frei0r_filter_deps="frei0r dlopen"
2152
frei0r_filter_extralibs='$ldl'
Stefano Sabatini's avatar
Stefano Sabatini committed
2153
frei0r_src_filter_deps="frei0r dlopen"
2154
frei0r_src_filter_extralibs='$ldl'
Clément Bœsch's avatar
Clément Bœsch committed
2155
geq_filter_deps="gpl"
2156
histeq_filter_deps="gpl"
2157
hqdn3d_filter_deps="gpl"
2158
hue_filter_deps="gpl"
2159
interlace_filter_deps="gpl"
2160
kerndeint_filter_deps="gpl"
2161
mcdeint_filter_deps="avcodec gpl"
2162
movie_filter_deps="avcodec avformat"
2163
mp_filter_deps="gpl avcodec swscale inline_asm"
2164
mpdecimate_filter_deps="gpl avcodec"
2165
mptestsrc_filter_deps="gpl"
2166
negate_filter_deps="lut_filter"
2167
noise_filter_deps="gpl"
2168
resample_filter_deps="avresample"
2169
ocv_filter_deps="libopencv"
2170
owdenoise_filter_deps="gpl"
2171
pan_filter_deps="swresample"
Clément Bœsch's avatar
Clément Bœsch committed
2172
pp_filter_deps="gpl postproc"
2173
removelogo_filter_deps="avcodec avformat swscale"
2174
sab_filter_deps="gpl swscale"
2175
scale_filter_deps="swscale"
2176
smartblur_filter_deps="gpl swscale"
2177
showspectrum_filter_deps="avcodec rdft"
Clément Bœsch's avatar
Clément Bœsch committed
2178
spp_filter_deps="gpl avcodec fft"
2179
stereo3d_filter_deps="gpl"
2180
subtitles_filter_deps="avformat avcodec libass"
2181
super2xsai_filter_deps="gpl"
2182
tinterlace_filter_deps="gpl"
2183 2184
vidstabdetect_filter_deps="libvidstab"
vidstabtransform_filter_deps="libvidstab"
2185
yadif_filter_deps="gpl"
2186 2187 2188
pixfmts_super2xsai_test_deps="super2xsai_filter"
tinterlace_merge_test_deps="tinterlace_filter"
tinterlace_pad_test_deps="tinterlace_filter"
2189
zmq_filter_deps="libzmq"
2190

2191
# libraries
2192 2193 2194 2195 2196
avcodec_deps="avutil"
avdevice_deps="avutil avcodec avformat"
avfilter_deps="avutil"
avformat_deps="avutil avcodec"
avresample_deps="avutil"
2197
postproc_deps="avutil gpl"
2198
swscale_deps="avutil"
2199

2200
# programs
2201
ffmpeg_deps="avcodec avfilter avformat swscale swresample"
2202 2203
ffmpeg_select="aformat_filter anull_filter atrim_filter format_filter
               null_filter
2204
               setpts_filter trim_filter"
2205
ffplay_deps="avcodec avformat swscale swresample sdl"
2206
ffplay_select="rdft crop_filter"
2207
ffprobe_deps="avcodec avformat"
2208
ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer"
2209
ffserver_extralibs='$ldl'
Måns Rullgård's avatar
Måns Rullgård committed
2210

2211 2212 2213 2214 2215 2216
# documentation
podpages_deps="perl"
manpages_deps="perl pod2man"
htmlpages_deps="texi2html"
txtpages_deps="makeinfo"
doc_deps_any="manpages htmlpages podpages txtpages"
2217

Fabrice Bellard's avatar
Fabrice Bellard committed
2218
# default parameters
2219

2220
logfile="config.log"
2221 2222

# installation paths
2223 2224
prefix_default="/usr/local"
bindir_default='${prefix}/bin'
2225
datadir_default='${prefix}/share/ffmpeg'
2226 2227 2228 2229
incdir_default='${prefix}/include'
libdir_default='${prefix}/lib'
mandir_default='${prefix}/share/man'
shlibdir_default="$libdir_default"
2230 2231

# toolchain
2232
ar_default="ar"
2233
cc_default="gcc"
Mohamed Naufal's avatar
Mohamed Naufal committed
2234
cxx_default="g++"
2235
host_cc_default="gcc"
Mans Rullgard's avatar
Mans Rullgard committed
2236
cp_f="cp -f"
2237
install="install"
2238
ln_s="ln -s -f"
2239
nm_default="nm -g"
2240
objformat="elf"
2241
pkg_config_default=pkg-config
Michael Niedermayer's avatar
Michael Niedermayer committed
2242
ranlib="ranlib"
2243
strip_default="strip"
2244
yasmexe_default="yasm"
2245

2246
nogas=":"
2247

2248
# machine
2249
arch_default=$(uname -m)
2250
cpu="generic"
2251 2252

# OS
2253 2254
target_os_default=$(tolower $(uname -s))
host_os=$target_os_default
2255 2256

# configurable options
2257
enable $PROGRAM_LIST
2258
enable $DOCUMENT_LIST
2259
enable $(filter_out avresample $LIBRARY_LIST)
2260
enable stripping
2261 2262 2263 2264

enable asm
enable debug
enable doc
2265
enable optimizations
2266
enable runtime_cpudetect
2267
enable safe_bitstream_reader
2268
enable static
2269
enable swscale_alpha
2270

2271 2272
# Enable hwaccels by default.
enable dxva2 vaapi vdpau
2273

2274
# build settings
2275
SHFLAGS='-shared -Wl,-soname,$$(@F)'
2276
FFSERVERLDFLAGS=-Wl,-E
2277 2278
LIBPREF="lib"
LIBSUF=".a"
2279 2280
FULLNAME='$(NAME)$(BUILDSUF)'
LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
2281 2282
SLIBPREF="lib"
SLIBSUF=".so"
2283
SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
2284 2285
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
Måns Rullgård's avatar
Måns Rullgård committed
2286
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2287 2288
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2289

2290 2291
asflags_filter=echo
cflags_filter=echo
2292 2293
ldflags_filter=echo

2294
AS_C='-c'
2295
AS_O='-o $@'
2296
CC_C='-c'
2297
CC_E='-E -o $@'
2298
CC_O='-o $@'
2299
CXX_C='-c'
Mohamed Naufal's avatar
Mohamed Naufal committed
2300
CXX_O='-o $@'
2301
LD_O='-o $@'
2302 2303
LD_LIB='-l%'
LD_PATH='-L'
2304
HOSTCC_C='-c'
2305
HOSTCC_O='-o $@'
2306
HOSTLD_O='-o $@'
2307

2308 2309
host_cflags='-O3 -g'
host_cppflags='-D_ISOC99_SOURCE -D_XOPEN_SOURCE=600'
2310
host_libs='-lm'
2311 2312
host_cflags_filter=echo
host_ldflags_filter=echo
2313

2314
target_path='$(CURDIR)'
2315

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

2321
# find source path
2322
if test -f configure; then
2323
    source_path=.
2324
else
2325
    source_path=$(cd $(dirname "$0"); pwd)
2326
    echo "$source_path" | grep -q '[[:blank:]]' &&
2327
        die "Out of tree builds are impossible with whitespace in source path."
2328 2329
    test -e "$source_path/config.h" &&
        die "Out of tree builds are impossible with config.h in source dir."
2330 2331
fi

2332
for v in "$@"; do
2333 2334 2335
    r=${v#*=}
    l=${v%"$r"}
    r=$(sh_quote "$r")
2336
    FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}"
2337
done
2338

2339 2340 2341 2342
find_things(){
    thing=$1
    pattern=$2
    file=$source_path/$3
2343
    sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2344 2345 2346 2347
}

ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2348
HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
2349 2350 2351 2352
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)
2353 2354
OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2355
PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
2356
FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2357

2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371
ALL_COMPONENTS="
    $BSF_LIST
    $DECODER_LIST
    $DEMUXER_LIST
    $ENCODER_LIST
    $FILTER_LIST
    $HWACCEL_LIST
    $INDEV_LIST
    $MUXER_LIST
    $OUTDEV_LIST
    $PARSER_LIST
    $PROTOCOL_LIST
"

2372 2373 2374 2375 2376 2377
for n in $COMPONENT_LIST; do
    v=$(toupper ${n%s})_LIST
    eval enable \$$v
    eval ${n}_if_any="\$$v"
done

2378
enable $ARCH_EXT_LIST
2379 2380 2381 2382 2383 2384 2385

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

2386 2387 2388 2389
print_3_columns() {
    cat | tr ' ' '\n' | sort | pr -r -3 -t
}

2390
show_list() {
Ramiro Polla's avatar
Ramiro Polla committed
2391 2392
    suffix=_$1
    shift
2393
    echo $* | sed s/$suffix//g | print_3_columns
2394 2395 2396
    exit 0
}

2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417
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 }")
}

2418
for opt do
2419 2420
    optval="${opt#*=}"
    case "$opt" in
2421 2422
        --extra-ldflags=*)
            add_ldflags $optval
2423
        ;;
2424 2425
        --extra-libs=*)
            add_extralibs $optval
2426
        ;;
2427 2428
        --disable-devices)
            disable $INDEV_LIST $OUTDEV_LIST
2429
        ;;
2430 2431
        --enable-debug=*)
            debuglevel="$optval"
2432 2433 2434 2435 2436 2437 2438
        ;;
        --disable-programs)
            disable $PROGRAM_LIST
        ;;
        --disable-everything)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
        ;;
2439 2440 2441 2442
        --disable-all)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
            disable $LIBRARY_LIST $PROGRAM_LIST doc
        ;;
2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455
        --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}
2456 2457 2458
            list=$(filter "$name" $list)
            [ "$list" = "" ] && warn "Option $opt did not match anything"
            $action $list
2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478
        ;;
        --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
        ;;
2479 2480
        --fatal-warnings) enable fatal_warnings
        ;;
2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492
        *)
            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
        ;;
2493
    esac
2494 2495
done

2496 2497
disabled logging && logfile=/dev/null

2498
echo "# $0 $FFMPEG_CONFIGURATION" > $logfile
2499 2500
set >> $logfile

2501 2502
test -n "$cross_prefix" && enable cross_compile

2503 2504 2505 2506 2507
if enabled cross_compile; then
    test -n "$arch" && test -n "$target_os" ||
        die "Must specify target arch and OS when cross-compiling"
fi

2508
ar_default="${cross_prefix}${ar_default}"
2509
cc_default="${cross_prefix}${cc_default}"
Mohamed Naufal's avatar
Mohamed Naufal committed
2510
cxx_default="${cross_prefix}${cxx_default}"
Måns Rullgård's avatar
Måns Rullgård committed
2511
nm_default="${cross_prefix}${nm_default}"
2512
pkg_config_default="${cross_prefix}${pkg_config_default}"
2513
ranlib="${cross_prefix}${ranlib}"
2514
strip_default="${cross_prefix}${strip_default}"
2515

2516 2517
sysinclude_default="${sysroot}/usr/include"

2518 2519
test -n "$valgrind" && toolchain="valgrind-memcheck"

2520
case "$toolchain" in
2521 2522
    clang-asan)
        cc_default="clang"
2523 2524
        add_cflags  -fsanitize=address
        add_ldflags -fsanitize=address
2525 2526 2527
    ;;
    clang-tsan)
        cc_default="clang"
2528 2529
        add_cflags  -fsanitize=thread -pie
        add_ldflags -fsanitize=thread -pie
2530
    ;;
2531 2532 2533 2534 2535 2536 2537 2538 2539 2540
    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
    ;;
2541
    valgrind-massif)
2542
        target_exec_default=${valgrind:-"valgrind"}
2543
        target_exec_args="--tool=massif --alloc-fn=av_malloc --alloc-fn=av_mallocz --alloc-fn=av_calloc --alloc-fn=av_fast_padded_malloc --alloc-fn=av_fast_malloc --alloc-fn=av_realloc_f --alloc-fn=av_fast_realloc --alloc-fn=av_realloc"
2544
    ;;
2545
    valgrind-memcheck)
2546
        target_exec_default=${valgrind:-"valgrind"}
2547
        target_exec_args="--error-exitcode=1 --malloc-fill=0x2a --track-origins=yes --leak-check=full --gen-suppressions=all --suppressions=$source_path/tests/fate-valgrind.supp"
2548
    ;;
2549 2550 2551 2552
    msvc)
        cc_default="c99wrap cl"
        ld_default="c99wrap link"
        nm_default="dumpbin -symbols"
2553
        ar_default="lib"
2554
        target_os_default="win32"
2555
    ;;
2556 2557 2558 2559 2560 2561 2562
    icl)
        cc_default="c99wrap -noconv icl"
        ld_default="c99wrap xilink"
        nm_default="dumpbin -symbols"
        ar_default="xilib"
        target_os_default="win32"
    ;;
2563 2564 2565 2566
    gcov)
        add_cflags  -fprofile-arcs -ftest-coverage
        add_ldflags -fprofile-arcs -ftest-coverage
    ;;
2567 2568 2569 2570 2571
    ?*)
        die "Unknown toolchain $toolchain"
    ;;
esac

2572
set_default arch cc cxx pkg_config strip sysinclude target_exec target_os yasmexe
2573 2574
enabled cross_compile || host_cc_default=$cc
set_default host_cc
2575

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

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

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

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

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

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

trap 'rm -f -- $TMPFILES' EXIT

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

unset -f mktemp
2624

2625 2626
chmod +x $TMPE

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

2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657
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
}

2658
msvc_common_flags(){
2659 2660
    for flag; do
        case $flag in
2661 2662 2663 2664 2665 2666
            # 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
2667
            -fomit-frame-pointer) ;;
2668 2669 2670 2671
            -g)                   echo -Z7 ;;
            -fno-math-errno)      ;;
            -fno-common)          ;;
            -fno-signed-zeros)    ;;
2672
            -fPIC)                ;;
2673 2674
            -mthumb)              ;;
            -march=*)             ;;
2675
            -lz)                  echo zlib.lib ;;
2676 2677
            -lavifil32)           echo vfw32.lib ;;
            -lavicap32)           echo vfw32.lib user32.lib ;;
2678 2679 2680 2681 2682 2683
            -l*)                  echo ${flag#-l}.lib ;;
            *)                    echo $flag ;;
        esac
    done
}

2684 2685 2686 2687
msvc_flags(){
    msvc_common_flags "$@"
    for flag; do
        case $flag in
2688
            -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
2689 2690
                                       -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
                                       -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
2691
                                       -wd4554 \
2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708
                                       -wd4996 -wd4273 ;;
        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
}

2709 2710 2711
pgi_flags(){
    for flag; do
        case $flag in
2712
            -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736
            -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   ;;
2737 2738
                    corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
                    corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
2739 2740
                    amdfam10|barcelona)        echo -xtarget=barcelona   ;;
                    bdver*)                    echo -xarch=avx           ;;
2741
                    athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
2742
                    k8|opteron|athlon64|athlon-fx)
2743 2744
                                               echo -xarch=sse2a         ;;
                    athlon*)                   echo -xarch=pentium_proa  ;;
2745 2746 2747 2748 2749 2750
                esac
                ;;
            -std=c99)             echo -xc99              ;;
            -fomit-frame-pointer) echo -xregs=frameptr    ;;
            -fPIC)                echo -KPIC -xcode=pic32 ;;
            -W*,*)                echo $flag              ;;
2751 2752
            -f*-*|-W*|-mimpure-text)                      ;;
            -shared)              echo -G                 ;;
2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774
            *)                    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        ;;
2775
            -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
2776 2777 2778 2779
            -msoft-float)   echo --float_support=vfplib       ;;
            -O[0-3]|-mf=*)  echo $flag                        ;;
            -g)             echo -g -mn                       ;;
            -pds=*)         echo $flag                        ;;
2780 2781 2782
            -D*|-I*)        echo $flag                        ;;
            --gcc|--abi=*)  echo $flag                        ;;
            -me)            echo $flag                        ;;
2783 2784 2785 2786
        esac
    done
}

2787 2788 2789 2790
probe_cc(){
    pfx=$1
    _cc=$2

2791 2792
    unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
    unset _ld_o _ldflags _ld_lib _ld_path
2793
    unset _depflags _DEPCMD _DEPFLAGS
2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814
    _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'
2815
    elif $_cc --version 2>/dev/null | grep -q ^icc; then
2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832
        _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'
2833
        _flags_filter=ccc_flags
2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849
    elif $_cc --vsn 2>/dev/null | grep -q "ARM C/C++ Compiler"; then
        test -d "$sysroot" || die "No valid sysroot specified."
        _type=armcc
        _ident=$($_cc --vsn | head -n1)
        armcc_conf="$PWD/armcc.conf"
        $_cc --arm_linux_configure                 \
             --arm_linux_config_file="$armcc_conf" \
             --configure_sysroot="$sysroot"        \
             --configure_cpp_headers="$sysinclude" >>$logfile 2>&1 ||
             die "Error creating armcc configuration file."
        $_cc --vsn | grep -q RVCT && armcc_opt=rvct || armcc_opt=armcc
        _flags="--arm_linux_config_file=$armcc_conf --translate_gcc"
        as_default="${cross_prefix}gcc"
        _depflags='-MMD'
        _cflags_speed='-O3'
        _cflags_size='-Os'
2850
    elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
2851 2852 2853
        _type=tms470
        _ident=$($_cc -version | head -n1 | tr -s ' ')
        _flags='--gcc --abi=eabi -me'
2854
        _cc_e='-ppl -fe=$@'
2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869
        _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)
        _depflags='-MMD'
        _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)'
2870
        _DEPFLAGS='-xM1 -xc99'
2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891
        _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 }')"
2892
        opt_common='-alias=ansi -Mdse -Mlre -Mpre'
2893 2894
        _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
        _cflags_size="-O2 -Munroll=c:1 $opt_common"
2895
        _cflags_noopt="-O"
2896
        _flags_filter=pgi_flags
2897 2898 2899 2900 2901 2902 2903
    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"
2904 2905
        # Nonstandard output options, to avoid msys path conversion issues.
        # Relies on wrapper to remap it.
2906 2907 2908 2909 2910 2911
        if $_cc 2>&1 | grep -q Linker; then
            _ld_o='-out $@'
        else
            _ld_o='-Fe$@'
        fi
        _cc_o='-Fo $@'
2912
        _cc_e='-P -Fi $@'
2913 2914 2915 2916 2917 2918
        _flags_filter=msvc_flags
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
        _flags='-nologo'
        _cflags='-D_USE_MATH_DEFINES -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
        if [ $pfx = hostcc ]; then
2919
            append _cflags -Dsnprintf=_snprintf
2920
        fi
2921
        disable stripping
2922 2923 2924 2925
    elif $_cc 2>&1 | grep -q Intel; then
        _type=icl
        _ident=$($cc 2>&1 | head -n1)
        _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
2926 2927
        # Not only is O3 broken on 13.x+ but it is slower on all previous
        # versions (tested) as well.
2928 2929
        _cflags_speed="-O2"
        _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
2930 2931
        # Nonstandard output options, to avoid msys path conversion issues.
        # Relies on wrapper to remap it.
2932 2933 2934 2935 2936 2937 2938
        if $_cc 2>&1 | grep -q Linker; then
            _ld_o='-out $@'
        else
            _ld_o='-Fe$@'
        fi
        _cc_o='-Fo $@'
        _cc_e='-P'
2939
        _flags_filter=icl_flags
2940 2941
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
2942
        # -Qdiag-error to make icl error when seeing certain unknown arguments
2943
        _flags='-nologo -Qdiag-error:4044,10157'
2944 2945
        # -Qvec- -Qsimd- to prevent miscompilation, -GS for consistency
        # with MSVC which enables it by default.
2946
        _cflags='-D_USE_MATH_DEFINES -FIstdlib.h -Dstrtoll=_strtoi64 -Qms0 -Qvec- -Qsimd- -GS'
2947 2948 2949
        if [ $pfx = hostcc ]; then
            append _cflags -Dsnprintf=_snprintf
        fi
2950
    fi
2951 2952 2953 2954 2955 2956

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

set_ccvars(){
2957
    eval ${1}_C=\${_cc_c-\${${1}_C}}
2958
    eval ${1}_E=\${_cc_e-\${${1}_E}}
2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982
    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
2983

2984 2985
test -n "$cc_type" && enable $cc_type ||
    warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
2986

2987
: ${as_default:=$cc}
2988
: ${dep_cc_default:=$cc}
2989
: ${ld_default:=$cc}
2990 2991
: ${host_ld_default:=$host_cc}
set_default ar as dep_cc ld host_ld
2992

2993 2994 2995 2996 2997 2998 2999 3000 3001
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
3002
LD_O=${_ld_o-$LD_O}
3003 3004
LD_LIB=${_ld_lib-$LD_LIB}
LD_PATH=${_ld_path-$LD_PATH}
3005

3006 3007 3008 3009
probe_cc hostld "$host_ld"
host_ldflags_filter=$_flags_filter
add_host_ldflags $_flags $_ldflags
HOSTLD_O=${_ld_o-$HOSTLD_O}
3010 3011 3012 3013 3014 3015 3016

if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc" != "$cc" ]; then
    probe_cc depcc "$dep_cc"
    CCDEP=${_DEPCMD:-$DEPCMD}
    CCDEP_FLAGS=${_DEPFLAGS:=$DEPFLAGS}
    DEPCCFLAGS=$_flags
fi
3017

3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028
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='$@'
else
    arflags="rc"
    ar_o='$@'
fi

3029
add_cflags $extra_cflags
Mohamed Naufal's avatar
Mohamed Naufal committed
3030
add_cxxflags $extra_cxxflags
3031
add_asflags $extra_cflags
3032

3033 3034
if test -n "$sysroot"; then
    case "$cc_type" in
3035
        gcc|llvm_gcc|clang)
3036
            add_cppflags --sysroot="$sysroot"
3037 3038
            add_ldflags --sysroot="$sysroot"
        ;;
3039 3040 3041 3042
        tms470)
            add_cppflags -I"$sysinclude"
            add_ldflags  --sysroot="$sysroot"
        ;;
3043 3044 3045
    esac
fi

3046
if test "$cpu" = host; then
3047 3048
    enabled cross_compile &&
        die "--cpu=host makes no sense when cross-compiling."
3049 3050

    case "$cc_type" in
3051
        gcc|llvm_gcc)
3052 3053
            check_native(){
                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
3054
                sed -n "/cc1.*$1=/{
3055 3056 3057 3058
                            s/.*$1=\\([^ ]*\\).*/\\1/
                            p
                            q
                        }" $TMPE
3059 3060 3061 3062 3063
            }
            cpu=$(check_native -march || check_native -mcpu)
        ;;
    esac

3064 3065
    test "${cpu:-host}" = host &&
        die "--cpu=host not supported with compiler $cc"
3066 3067
fi

3068 3069
# Deal with common $arch aliases
case "$arch" in
3070 3071 3072
    aarch64|arm64)
        arch="aarch64"
    ;;
3073
    arm*|iPad*)
3074 3075
        arch="arm"
    ;;
3076
    mips*|IP*)
3077 3078
        arch="mips"
    ;;
3079
    parisc*|hppa*)
3080 3081
        arch="parisc"
    ;;
3082
    "Power Macintosh"|ppc*|powerpc*)
3083 3084 3085 3086 3087 3088 3089 3090
        arch="ppc"
    ;;
    s390|s390x)
        arch="s390"
    ;;
    sh4|sh)
        arch="sh4"
    ;;
3091
    sun4u|sparc*)
3092 3093
        arch="sparc"
    ;;
3094 3095 3096
    tilegx|tile-gx)
        arch="tilegx"
    ;;
3097
    i[3-6]86|i86pc|BePC|x86pc|x86_64|x86_32|amd64)
3098 3099 3100 3101
        arch="x86"
    ;;
esac

3102
is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
3103
enable $arch
3104

3105
# Add processor-specific flags
3106
if enabled aarch64; then
3107

Måns Rullgård's avatar
Måns Rullgård committed
3108
    case $cpu in
3109
        armv*)
Måns Rullgård's avatar
Måns Rullgård committed
3110 3111
            cpuflags="-march=$cpu"
        ;;
3112 3113
        *)
            cpuflags="-mcpu=$cpu"
Måns Rullgård's avatar
Måns Rullgård committed
3114 3115
        ;;
    esac
3116

3117
elif enabled alpha; then
3118

3119
    cpuflags="-mcpu=$cpu"
3120 3121 3122

elif enabled arm; then

3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153
    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)

3154 3155 3156
    case $cpu in
        armv*)
            cpuflags="-march=$cpu"
3157
            subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
3158 3159 3160
        ;;
        *)
            cpuflags="-mcpu=$cpu"
3161 3162 3163
            case $cpu in
                cortex-a*)                               subarch=armv7a  ;;
                cortex-r*)                               subarch=armv7r  ;;
3164
                cortex-m*)                 enable thumb; subarch=armv7m  ;;
3165 3166 3167
                arm11*)                                  subarch=armv6   ;;
                arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
                armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
3168
                *)                             subarch=$(probe_arm_arch) ;;
3169
            esac
3170 3171
        ;;
    esac
3172

3173 3174 3175 3176 3177
    case "$subarch" in
        armv5t*)    enable fast_clz                ;;
        armv[6-8]*) enable fast_clz fast_unaligned ;;
    esac

3178
elif enabled avr32; then
3179

3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197
    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
3198 3199 3200

elif enabled bfin; then

3201
    cpuflags="-mcpu=$cpu"
3202 3203 3204

elif enabled mips; then

3205
    cpuflags="-march=$cpu"
3206

3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228
    case $cpu in
        24kc)
            disable mipsfpu
            disable mipsdspr1
            disable mipsdspr2
        ;;
        24kf*)
            disable mipsdspr1
            disable mipsdspr2
        ;;
        24kec|34kc|1004kc)
            disable mipsfpu
            disable mipsdspr2
        ;;
        24kef*|34kf*|1004kf*)
            disable mipsdspr2
        ;;
        74kc)
            disable mipsfpu
        ;;
    esac

3229
elif enabled ppc; then
3230

3231 3232
    case $(tolower $cpu) in
        601|ppc601|powerpc601)
Måns Rullgård's avatar
Måns Rullgård committed
3233
            cpuflags="-mcpu=601"
3234
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3235
        ;;
3236
        603*|ppc603*|powerpc603*)
Måns Rullgård's avatar
Måns Rullgård committed
3237
            cpuflags="-mcpu=603"
3238
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3239
        ;;
3240
        604*|ppc604*|powerpc604*)
Måns Rullgård's avatar
Måns Rullgård committed
3241
            cpuflags="-mcpu=604"
3242
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3243
        ;;
3244
        g3|75*|ppc75*|powerpc75*)
3245
            cpuflags="-mcpu=750"
3246
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3247
        ;;
3248
        g4|745*|ppc745*|powerpc745*)
3249
            cpuflags="-mcpu=7450"
Måns Rullgård's avatar
Måns Rullgård committed
3250
        ;;
3251
        74*|ppc74*|powerpc74*)
3252
            cpuflags="-mcpu=7400"
Måns Rullgård's avatar
Måns Rullgård committed
3253
        ;;
3254
        g5|970|ppc970|powerpc970)
3255
            cpuflags="-mcpu=970"
Måns Rullgård's avatar
Måns Rullgård committed
3256
        ;;
3257
        power[3-7]*)
Måns Rullgård's avatar
Måns Rullgård committed
3258 3259
            cpuflags="-mcpu=$cpu"
        ;;
3260
        cell)
Måns Rullgård's avatar
Måns Rullgård committed
3261 3262 3263
            cpuflags="-mcpu=cell"
            enable ldbrx
        ;;
3264 3265 3266 3267
        e500mc)
            cpuflags="-mcpu=e500mc"
            disable altivec
        ;;
3268 3269 3270 3271 3272 3273 3274
        e500v2)
            cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
            disable altivec
        ;;
        e500)
            cpuflags="-mcpu=8540 -mhard-float"
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3275 3276
        ;;
    esac
3277

3278
elif enabled sparc; then
3279 3280

    case $cpu in
3281 3282 3283
        cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
            cpuflags="-mcpu=$cpu"
            disable vis
3284
        ;;
3285
        ultrasparc*|niagara[234])
3286 3287 3288 3289
            cpuflags="-mcpu=$cpu"
        ;;
    esac

3290 3291
elif enabled x86; then

Måns Rullgård's avatar
Måns Rullgård committed
3292 3293 3294 3295 3296
    case $cpu in
        i[345]86|pentium)
            cpuflags="-march=$cpu"
            disable mmx
        ;;
3297
        # targets that do NOT support nopl and conditional mov (cmov)
Måns Rullgård's avatar
Måns Rullgård committed
3298 3299
        pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
            cpuflags="-march=$cpu"
3300
            disable i686
Måns Rullgård's avatar
Måns Rullgård committed
3301
        ;;
3302
        # targets that do support nopl and conditional mov (cmov)
3303
        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
3304
            cpuflags="-march=$cpu"
3305
            enable i686
Måns Rullgård's avatar
Måns Rullgård committed
3306 3307 3308 3309 3310
            enable fast_cmov
        ;;
        # targets that do support conditional mov but on which it's slow
        pentium4|pentium4m|prescott|nocona)
            cpuflags="-march=$cpu"
3311
            enable i686
Måns Rullgård's avatar
Måns Rullgård committed
3312 3313 3314
            disable fast_cmov
        ;;
    esac
3315 3316 3317

fi

3318 3319 3320 3321
if [ "$cpu" != generic ]; then
    add_cflags  $cpuflags
    add_asflags $cpuflags
fi
3322

3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335
# 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

3336
add_cppflags -D_ISOC99_SOURCE
Mohamed Naufal's avatar
Mohamed Naufal committed
3337
add_cxxflags -D__STDC_CONSTANT_MACROS
3338
check_cflags -std=c99
3339
check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
3340 3341
#include <stdlib.h>
EOF
3342
check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
3343 3344
#include <stdlib.h>
EOF
3345

3346
check_host_cflags -std=c99
3347
check_host_cflags -Wall
3348

3349 3350 3351 3352 3353 3354 3355 3356
check_64bit(){
    arch32=$1
    arch64=$2
    expr=$3
    check_code cc "" "int test[2*($expr) - 1]" &&
        subarch=$arch64 || subarch=$arch32
}

3357
case "$arch" in
3358
    aarch64|alpha|ia64)
3359
        spic=$shared
3360
    ;;
3361 3362
    mips)
        check_64bit mips mips64 '_MIPS_SIM > 1'
3363
        spic=$shared
3364
    ;;
3365 3366 3367 3368
    parisc)
        check_64bit parisc parisc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
3369 3370
    ppc)
        check_64bit ppc ppc64 'sizeof(void *) > 4'
3371
        spic=$shared
3372
    ;;
3373 3374 3375 3376
    sparc)
        check_64bit sparc sparc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
3377
    x86)
3378
        check_64bit x86_32 x86_64 'sizeof(void *) > 4'
3379
        if test "$subarch" = "x86_64"; then
3380
            spic=$shared
3381
        fi
3382
    ;;
3383 3384 3385 3386 3387
    ppc)
        check_cc <<EOF && subarch="ppc64"
        int test[(int)sizeof(char*) - 7];
EOF
    ;;
3388 3389
esac

3390
enable $subarch
3391
enabled spic && enable_weak pic
3392

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

3613 3614
# determine libc flavour

3615
# uclibc defines __GLIBC__, so it needs to be checked before glibc.
3616 3617
if check_cpp_condition features.h "defined __UCLIBC__"; then
    libc_type=uclibc
3618
    add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3619 3620
elif check_cpp_condition features.h "defined __GLIBC__"; then
    libc_type=glibc
3621
    add_cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
3622 3623 3624 3625
# MinGW headers can be installed on Cygwin, so check for newlib first.
elif check_cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
    libc_type=newlib
    add_cppflags -U__STRICT_ANSI__
3626 3627 3628 3629 3630 3631
elif check_header _mingw.h; then
    libc_type=mingw
    check_cpp_condition _mingw.h \
        "defined (__MINGW64_VERSION_MAJOR) || (__MINGW32_MAJOR_VERSION > 3) || \
            (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
        die "ERROR: MinGW runtime version must be >= 3.15."
3632
    add_cppflags -U__STRICT_ANSI__
3633
    if check_cpp_condition _mingw.h "defined(__MINGW64_VERSION_MAJOR) && \
3634
            __MINGW64_VERSION_MAJOR < 3"; then
3635
        add_compat msvcrt/snprintf.o
3636
        add_cflags "-include $source_path/compat/msvcrt/snprintf.h"
3637 3638
    else
        add_cppflags -D__USE_MINGW_ANSI_STDIO=1
3639
    fi
3640 3641
elif check_func_headers stdlib.h _get_doserrno; then
    libc_type=msvcrt
3642 3643 3644 3645
    add_compat strtod.o strtod=avpriv_strtod
    add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
                                 _snprintf=avpriv_snprintf  \
                                 vsnprintf=avpriv_vsnprintf
3646 3647 3648 3649 3650 3651 3652
    # 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_cpp_condition stdlib.h "defined(_WIN32_WINNT)" || add_cppflags -D_WIN32_WINNT=0x0502
3653 3654
elif check_cpp_condition stddef.h "defined __KLIBC__"; then
    libc_type=klibc
3655 3656 3657
elif check_cpp_condition sys/cdefs.h "defined __BIONIC__"; then
    libc_type=bionic
    add_compat strtod.o strtod=avpriv_strtod
3658 3659 3660 3661
fi

test -n "$libc_type" && enable $libc_type

3662 3663 3664
# hacks for compiler/libc/os combinations

if enabled_all tms470 glibc; then
3665
    CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
3666 3667 3668 3669 3670 3671
    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

3672 3673 3674 3675
if enabled_all ccc glibc; then
    add_ldflags -Wl,-z,now  # calls to libots crash without this
fi

3676 3677 3678 3679
esc(){
    echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
}

3680
echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFIGURATION)" >config.fate
3681

3682
check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
3683

3684
set_default $PATHS_LIST
3685
set_default nm
3686

3687
# we need to build at least one lib type
3688
if ! enabled_any static shared; then
3689 3690 3691 3692 3693 3694 3695 3696 3697
    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

3698
die_license_disabled() {
3699
    enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
3700 3701
}

3702 3703 3704 3705
die_license_disabled_gpl() {
    enabled $1 || { enabled $2 && die "$2 is incompatible with the gpl and --enable-$1 is not specified."; }
}

3706
die_license_disabled gpl frei0r
3707
die_license_disabled gpl libcdio
3708
die_license_disabled gpl libutvideo
3709
die_license_disabled gpl libvidstab
3710
die_license_disabled gpl libx264
3711
die_license_disabled gpl libxavs
3712 3713 3714
die_license_disabled gpl libxvid
die_license_disabled gpl x11grab

tipok's avatar
tipok committed
3715
die_license_disabled nonfree libaacplus
3716
die_license_disabled nonfree libfaac
3717
enabled gpl && die_license_disabled_gpl nonfree libfdk_aac
3718
enabled gpl && die_license_disabled_gpl nonfree openssl
3719

3720 3721
die_license_disabled version3 libopencore_amrnb
die_license_disabled version3 libopencore_amrwb
3722
die_license_disabled version3 libvo_aacenc
3723
die_license_disabled version3 libvo_amrwbenc
3724

3725
enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
3726

3727
disabled optimizations || check_cflags -fomit-frame-pointer
3728

3729 3730
enable_weak_pic() {
    disabled pic && return
3731
    enable pic
3732
    add_cppflags -DPIC
3733 3734 3735 3736 3737 3738 3739
    case "$target_os" in
    mingw*|cygwin*)
        ;;
    *)
        add_cflags -fPIC
        ;;
    esac
3740
    add_asflags  -fPIC
3741 3742
}

3743
enabled pic && enable_weak_pic
3744

3745 3746 3747
check_cc <<EOF || die "Symbol mangling check failed."
int ff_extern;
EOF
3748
sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
3749 3750
extern_prefix=${sym%%ff_extern*}

3751
check_cc <<EOF && enable_weak inline_asm
3752 3753
void foo(void) { __asm__ volatile ("" ::); }
EOF
3754

3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765
_restrict=
for restrict_keyword in restrict __restrict__ __restrict; do
    check_cc <<EOF && _restrict=$restrict_keyword && break
void foo(char * $restrict_keyword p);
EOF
done

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

3766 3767 3768 3769
check_cc <<EOF && enable attribute_may_alias
union { int x; } __attribute__((may_alias)) x;
EOF

3770 3771 3772
check_cc <<EOF || die "endian test failed"
unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
EOF
3773
od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
3774

3775 3776 3777 3778 3779
if enabled alpha; then

    check_cflags -mieee

elif enabled arm; then
3780

3781 3782 3783 3784
    check_cpp_condition stddef.h "defined __thumb__" && check_cc <<EOF && enable_weak thumb
float func(float a, float b){ return a+b; }
EOF

3785
    enabled thumb && check_cflags -mthumb || check_cflags -marm
3786
    nogas=die
3787

3788 3789 3790 3791 3792
    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 ;;
Mohamed Naufal's avatar
Mohamed Naufal committed
3793
            *) check_ld "cc" <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
3794 3795 3796
__asm__ (".eabi_attribute 28, 1");
int main(void) { return 0; }
EOF
3797 3798 3799
        esac
        warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
    fi
3800

3801 3802 3803 3804
    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'
3805
    enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
3806 3807
    enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'

3808 3809 3810
    [ $target_os = linux ] ||
        map 'enabled_any ${v}_external ${v}_inline || disable $v' \
            $ARCH_EXT_LIST_ARM
3811

3812 3813
    check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
    check_inline_asm asm_mod_y '"vmul.i32 d0, d0, %y0" :: "x"(0)'
3814

3815
    [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
3816

3817
elif enabled mips; then
3818

3819
    check_inline_asm loongson '"dmult.g $1, $2, $3"'
3820
    enabled mips32r2  && add_cflags "-mips32r2" && add_asflags "-mips32r2" &&
3821
     check_inline_asm mips32r2  '"rotr $t0, $t1, 1"'
3822
    enabled mipsdspr1 && add_cflags "-mdsp" && add_asflags "-mdsp" &&
3823
     check_inline_asm mipsdspr1 '"addu.qb $t0, $t1, $t2"'
3824
    enabled mipsdspr2 && add_cflags "-mdspr2" && add_asflags "-mdspr2" &&
3825
     check_inline_asm mipsdspr2 '"absq_s.qb $t0, $t1"'
3826
    enabled mipsfpu   && add_cflags "-mhard-float" && add_asflags "-mhard-float" &&
3827
     check_inline_asm mipsfpu   '"madd.d $f0, $f2, $f4, $f6"'
3828

3829 3830 3831 3832 3833 3834 3835 3836
elif enabled parisc; then

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

3837
elif enabled ppc; then
3838

3839 3840
    enable local_aligned_8 local_aligned_16

3841 3842 3843 3844
    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)'
3845 3846 3847

    # AltiVec flags: The FSF version of GCC differs from the Apple version
    if enabled altivec; then
3848
        nogas=warn
3849 3850 3851 3852 3853 3854 3855 3856
        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) {
3857 3858 3859
    vector signed int v1 = (vector signed int) { 0 };
    vector signed int v2 = (vector signed int) { 1 };
    v1 = vec_add(v1, v2);
3860 3861 3862 3863
    return 0;
}
EOF

3864
        enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
3865
    fi
3866

3867
elif enabled sparc; then
3868

3869
    enabled vis && check_inline_asm vis '"pdist %f0, %f0, %f0"'
3870

3871
elif enabled x86; then
3872

3873 3874
    check_builtin rdtsc    intrin.h   "__rdtsc()"
    check_builtin mm_empty mmintrin.h "_mm_empty()"
3875

3876 3877
    enable local_aligned_8 local_aligned_16

3878 3879 3880 3881
    # 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.
3882
    check_exec_crash <<EOF && enable ebp_available
3883 3884 3885
volatile int i=0;
__asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
return i;
3886 3887
EOF

Reimar Döffinger's avatar
Reimar Döffinger committed
3888
    # check whether EBX is available on x86
3889 3890
    check_inline_asm ebx_available '""::"b"(0)' &&
        check_inline_asm ebx_available '"":::"%ebx"'
3891

3892
    # check whether xmm clobbers are supported
3893
    check_inline_asm xmm_clobbers '"":::"%xmm0"'
3894

3895
    # check whether binutils is new enough to compile SSSE3/MMXEXT
3896 3897
    enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
    enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
3898

3899
    if ! disabled_any asm mmx yasm; then
3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915
        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

3916
        check_yasm "pextrd [eax], xmm0, 1" && enable yasm ||
3917
            die "yasm not found, use --disable-yasm for a crippled build"
3918 3919
        check_yasm "vextractf128 xmm0, ymm0, 0"      || disable avx_external
        check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
3920
        check_yasm "CPU amdnop" && enabled i686 && enable cpunop
3921
    fi
3922

3923 3924 3925 3926 3927 3928
    case "$cpu" in
        athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
            disable fast_clz
        ;;
    esac

3929 3930
fi

3931 3932
if enabled asm; then
    as=${gas:=$as}
3933
    check_as <<EOF && enable gnu_as || \
3934
        $nogas "GNU assembler not found, install gas-preprocessor"
3935 3936 3937 3938 3939
.macro m n
\n: .int 0
.endm
m x
EOF
3940 3941
fi

3942 3943
check_ldflags -Wl,--as-needed

3944 3945 3946 3947
if check_func dlopen; then
    ldl=
elif check_func dlopen -ldl; then
    ldl=-ldl
3948 3949
fi

3950
if ! disabled network; then
3951 3952
    check_type "sys/types.h sys/socket.h" socklen_t
    check_type netdb.h "struct addrinfo"
3953 3954
    check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
    check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
3955 3956
    check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
    check_type netinet/in.h "struct sockaddr_in6"
3957
    check_type poll.h "struct pollfd"
3958 3959
    check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
    check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
3960
    check_type netinet/sctp.h "struct sctp_event_subscribe"
3961
    check_func getaddrinfo $network_extralibs
3962
    check_func getservbyport $network_extralibs
3963 3964 3965 3966
    # Prefer arpa/inet.h over winsock2
    if check_header arpa/inet.h ; then
        check_func closesocket
    elif check_header winsock2.h ; then
3967 3968 3969
        check_func_headers winsock2.h closesocket -lws2 &&
            network_extralibs="-lws2" ||
        { check_func_headers winsock2.h closesocket -lws2_32 &&
3970
            network_extralibs="-lws2_32"; }
3971
        check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
3972 3973
        check_type ws2tcpip.h socklen_t
        check_type ws2tcpip.h "struct addrinfo"
3974 3975
        check_type ws2tcpip.h "struct group_source_req"
        check_type ws2tcpip.h "struct ip_mreq_source"
3976
        check_type ws2tcpip.h "struct ipv6_mreq"
3977
        check_type winsock2.h "struct pollfd"
3978 3979 3980 3981 3982 3983 3984 3985
        check_type ws2tcpip.h "struct sockaddr_in6"
        check_type ws2tcpip.h "struct sockaddr_storage"
        check_struct winsock2.h "struct sockaddr" sa_len
    else
        disable network
    fi
fi

3986 3987 3988
# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
check_func nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }

3989
check_func  access
3990
check_func  clock_gettime || { check_func clock_gettime -lrt && add_extralibs -lrt; }
Måns Rullgård's avatar
Måns Rullgård committed
3991
check_func  fcntl
3992
check_func  fork
3993
check_func_headers stdlib.h getenv
3994
check_func  gethrtime
3995
check_func  getopt
3996
check_func  getrusage
3997
check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
3998
check_func  gettimeofday
3999
check_func  inet_aton $network_extralibs
4000
check_func  isatty
4001
check_func  localtime_r
4002
check_func  ${malloc_prefix}memalign            && enable memalign
4003
check_func  mkstemp
4004
check_func  mmap
4005
check_func  mprotect
4006
check_func  ${malloc_prefix}posix_memalign      && enable posix_memalign
4007
check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
Måns Rullgård's avatar
Måns Rullgård committed
4008
check_func  setrlimit
4009
check_struct "sys/stat.h" "struct stat" st_mtim.tv_nsec -D_BSD_SOURCE
4010
check_func  strerror_r
4011
check_func  sched_getaffinity
4012
check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
4013
check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
4014
check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
4015
check_builtin MemoryBarrier windows.h "MemoryBarrier()"
4016
check_func  sysconf
4017
check_func  sysctl
4018
check_func  usleep
4019
check_func_headers conio.h kbhit
4020
check_func_headers windows.h PeekNamedPipe
4021
check_func_headers io.h setmode
4022
check_func_headers lzo/lzo1x.h lzo1x_999_compress
4023
check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
4024
check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
4025
check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
4026
check_func_headers windows.h GetProcessAffinityMask
4027
check_func_headers windows.h GetProcessTimes
4028
check_func_headers windows.h GetSystemTimeAsFileTime
4029
check_func_headers windows.h MapViewOfFile
4030
check_func_headers windows.h SetConsoleTextAttribute
4031
check_func_headers windows.h Sleep
4032
check_func_headers windows.h VirtualAlloc
4033
check_func_headers glob.h glob
4034
check_func_headers "X11/Xlib.h X11/extensions/Xvlib.h" XvGetPortAttribute -lXv -lX11 -lXext
4035

4036
check_header cl/cl.h
4037
check_header direct.h
4038
check_header dlfcn.h
4039
check_header dxva.h
4040
check_header dxva2api.h -D_WIN32_WINNT=0x0600
4041
check_header io.h
4042
check_header libcrystalhd/libcrystalhd_if.h
4043
check_header malloc.h
4044
check_header poll.h
4045
check_header sys/mman.h
4046
check_header sys/param.h
4047
check_header sys/resource.h
4048
check_header sys/select.h
4049
check_header sys/time.h
4050
check_header termios.h
4051
check_header unistd.h
4052 4053
check_header vdpau/vdpau.h
check_header vdpau/vdpau_x11.h
4054
check_header VideoDecodeAcceleration/VDADecoder.h
4055
check_header windows.h
4056
check_header X11/extensions/XvMClib.h
4057
check_header asm/types.h
4058

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

4062
if ! disabled w32threads && ! enabled pthreads; then
4063
    check_func_headers "windows.h process.h" _beginthreadex && enable w32threads
4064 4065
fi

4066 4067
# check for some common methods of building with pthread support
# do this before the optional library checks as some of them require pthreads
4068
if ! disabled pthreads && ! enabled w32threads && ! enabled os2threads; then
4069
    enable pthreads
Måns Rullgård's avatar
Måns Rullgård committed
4070 4071 4072 4073
    if check_func pthread_create; then
        :
    elif check_func pthread_create -pthread; then
        add_cflags -pthread
4074
        add_extralibs -pthread
Måns Rullgård's avatar
Måns Rullgård committed
4075 4076
    elif check_func pthread_create -pthreads; then
        add_cflags -pthreads
4077
        add_extralibs -pthreads
4078 4079
    elif check_func pthread_create -lpthreadGC2; then
        add_extralibs -lpthreadGC2
Måns Rullgård's avatar
Måns Rullgård committed
4080
    elif ! check_lib pthread.h pthread_create -lpthread; then
4081
        disable pthreads
Måns Rullgård's avatar
Måns Rullgård committed
4082
    fi
4083 4084
fi

4085
for thread in $THREADS_LIST; do
4086
    if enabled $thread; then
4087 4088
        test -n "$thread_type" &&
            die "ERROR: Only one thread type must be selected." ||
4089 4090 4091 4092
            thread_type="$thread"
    fi
done

4093 4094 4095 4096
if enabled pthreads; then
  check_func pthread_cancel
fi

4097
enabled sync_val_compare_and_swap && enable atomics_gcc
4098
enabled_all atomic_cas_ptr machine_rw_barrier && enable atomics_suncc
4099 4100
enabled MemoryBarrier && enable atomics_win32

4101
check_lib math.h sin -lm && LIBM="-lm"
4102
disabled crystalhd || check_lib libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersion -lcrystalhd || disable crystalhd
Måns Rullgård's avatar
Måns Rullgård committed
4103

4104 4105 4106
atan2f_args=2
ldexpf_args=2
powf_args=2
4107

4108
for func in $MATH_FUNCS; do
4109
    eval check_mathfunc $func \${${func}_args:-1}
4110 4111
done

4112
# these are off by default, so fail if requested and not available
4113 4114 4115 4116
enabled avisynth          && { { check_lib2 "windows.h" LoadLibrary; } ||
                               { check_lib2 "dlfcn.h" dlopen -ldl; } ||
                               die "ERROR: LoadLibrary/dlopen not found for avisynth"; }
enabled fontconfig        && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
4117 4118
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
4119 4120 4121 4122 4123 4124 4125 4126
enabled libiec61883       && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883
enabled libaacplus        && require "libaacplus >= 2.0.0" aacplus.h aacplusEncOpen -laacplus
enabled libass            && require_pkg_config libass ass/ass.h ass_library_init
enabled libbluray         && require libbluray libbluray/bluray.h bd_open -lbluray
enabled libcelt           && require libcelt celt/celt.h celt_decode -lcelt0 &&
                             { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
                               die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
enabled libcaca           && require_pkg_config caca caca.h caca_create_canvas
4127 4128
enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
enabled libfdk_aac        && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
4129
flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
4130
enabled libflite          && require2 libflite "flite/flite.h" flite_init $flite_libs
4131 4132 4133 4134 4135
enabled libfreetype       && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType
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
4136
enabled libmodplug        && require libmodplug libmodplug/modplug.h ModPlug_Load -lmodplug
4137
enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
4138
enabled libnut            && require libnut libnut.h nut_demuxer_init -lnut
4139 4140
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
4141 4142 4143 4144
enabled libopencv         && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader
enabled libopenjpeg       && { check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg ||
                               check_lib openjpeg.h opj_version -lopenjpeg ||
                               die "ERROR: libopenjpeg not found"; }
4145 4146
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
4147
enabled libquvi           && require_pkg_config libquvi quvi/quvi.h quvi_init
4148 4149
enabled librtmp           && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
enabled libschroedinger   && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
4150 4151
enabled libshine          && require_pkg_config shine shine/layer3.h shine_encode_frame
enabled libsoxr           && require libsoxr soxr.h soxr_create -lsoxr
4152
enabled libspeex          && require libspeex speex/speex.h speex_decoder_init -lspeex
4153
enabled libstagefright_h264 && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h
4154
    media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h
4155
    media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder -lgnustl_static
4156
enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
4157 4158 4159 4160 4161 4162
enabled libtwolame        && require libtwolame twolame.h twolame_init -ltwolame &&
                             { check_lib twolame.h twolame_encode_buffer_float32_interleaved -ltwolame ||
                               die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; }
enabled libutvideo        && require_cpp utvideo "stdint.h stdlib.h utvideo/utvideo.h utvideo/Codec.h" 'CCodec*' -lutvideo -lstdc++
enabled libv4l2           && require_pkg_config libv4l2 libv4l2.h v4l2_ioctl
enabled libvidstab        && require_pkg_config vidstab vid.stab/libvidstab.h vsMotionDetectInit
4163 4164 4165 4166
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            && {
4167
    enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
4168
                                    die "ERROR: libvpx decoder version must be >=0.9.1"; }
4169
    enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx ||
4170
                                    die "ERROR: libvpx encoder version must be >=0.9.7"; }
4171
    enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder; }
4172
    enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } }
4173 4174 4175
enabled libwavpack        && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput  -lwavpack
enabled libx264           && require libx264 x264.h x264_encoder_encode -lx264 &&
                             { check_cpp_condition x264.h "X264_BUILD >= 118" ||
4176
                               die "ERROR: libx264 must be installed and version must be >= 0.118."; }
4177 4178
enabled libxavs           && require libxavs xavs.h xavs_encoder_encode -lxavs
enabled libxvid           && require libxvid xvid.h xvid_global -lxvidcore
4179 4180 4181 4182 4183 4184 4185 4186 4187
enabled libzmq            && require_pkg_config libzmq zmq.h zmq_ctx_new
enabled openal            && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do
                               check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } ||
                               die "ERROR: openal not found"; } &&
                             { check_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" ||
                               die "ERROR: openal must be installed and version must be 1.1 or compatible"; }
enabled opencl            && { check_lib2 OpenCL/cl.h clEnqueueNDRangeKernel -Wl,-framework,OpenCL ||
                               check_lib2 CL/cl.h clEnqueueNDRangeKernel -lOpenCL ||
                               die "ERROR: opencl not found"; } &&
4188 4189
                             { enabled_any w32threads os2threads &&
                               die "opencl currently needs --enable-pthreads or --disable-w32threads"; } &&
4190 4191 4192
                             { check_cpp_condition "OpenCL/cl.h" "defined(CL_VERSION_1_2)" ||
                               check_cpp_condition "CL/cl.h" "defined(CL_VERSION_1_2)" ||
                               die "ERROR: opencl must be installed and version must be 1.2 or compatible"; }
4193 4194 4195 4196
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"; }
4197

Samuel Pitoiset's avatar
Samuel Pitoiset committed
4198 4199 4200 4201 4202
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

4203 4204 4205 4206 4207 4208 4209 4210 4211
# 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

4212
SDL_CONFIG="${cross_prefix}sdl-config"
4213
if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
4214
    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
4215 4216
    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
    enable sdl
4217 4218
else
  if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
4219 4220
    sdl_cflags=$("${SDL_CONFIG}" --cflags)
    sdl_libs=$("${SDL_CONFIG}" --libs)
4221
    check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
4222
    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
4223 4224
    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
    enable sdl
4225
  fi
4226
fi
4227
enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
4228

4229
texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
4230
makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
4231
perl --version > /dev/null 2>&1 && enable perl || disable perl
4232
pod2man --help > /dev/null 2>&1 && enable pod2man || disable pod2man
4233
rsync --help 2> /dev/null | grep -q 'contimeout' && enable rsync_contimeout || disable rsync_contimeout
4234

4235
check_header linux/fb.h
4236 4237
check_header linux/videodev.h
check_header linux/videodev2.h
4238
check_code cc linux/videodev2.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_safe struct_v4l2_frmivalenum_discrete
4239

4240
check_header sys/videoio.h
4241

4242
check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
4243 4244 4245
# 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
4246

4247 4248
check_type "dshow.h" IBaseFilter

4249
# check for ioctl_meteor.h, ioctl_bt848.h and alternatives
Ramiro Polla's avatar
Ramiro Polla committed
4250 4251 4252 4253 4254 4255 4256
{ 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
4257

4258
check_header sndio.h
4259 4260 4261 4262 4263 4264 4265 4266
if check_struct sys/soundcard.h audio_buf_info bytes; then
    enable_safe sys/soundcard.h
else
    check_cc -D__BSD_VISIBLE -D__XSI_VISIBLE <<EOF && add_cppflags -D__BSD_VISIBLE -D__XSI_VISIBLE && enable_safe sys/soundcard.h
    #include <sys/soundcard.h>
    audio_buf_info abc;
EOF
fi
4267
check_header soundcard.h
Måns Rullgård's avatar
Måns Rullgård committed
4268

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

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

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

4277
if enabled libcdio; then
4278 4279 4280
    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 ||
    die "ERROR: libcdio-paranoia not found"
4281
fi
4282

4283 4284 4285 4286
enabled x11grab                                           &&
require X11 X11/Xlib.h XOpenDisplay -lX11                 &&
require Xext X11/extensions/XShm.h XShmCreateImage -lXext &&
require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes
4287

4288 4289 4290
enabled vaapi &&
    check_lib va/va.h vaInitialize -lva ||
    disable vaapi
4291

4292
enabled vdpau &&
4293
    check_cpp_condition vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" ||
4294
    disable vdpau
4295

4296
# Funny iconv installations are not unusual, so check it after all flags have been set
4297
disabled iconv || check_func_headers iconv.h iconv || check_lib2 iconv.h iconv -liconv || disable iconv
4298

4299
enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
4300 4301 4302

# add some useful compiler flags if supported
check_cflags -Wdeclaration-after-statement
4303
check_cflags -Wall
4304
check_cflags -Wno-parentheses
4305
check_cflags -Wno-switch
4306
check_cflags -Wno-format-zero-length
Michael Niedermayer's avatar
Michael Niedermayer committed
4307 4308 4309
check_cflags -Wdisabled-optimization
check_cflags -Wpointer-arith
check_cflags -Wredundant-decls
4310
check_cflags -Wno-pointer-sign
4311
check_cflags -Wwrite-strings
4312
check_cflags -Wtype-limits
4313
check_cflags -Wundef
4314
check_cflags -Wmissing-prototypes
4315
check_cflags -Wno-pointer-to-int-cast
4316
check_cflags -Wstrict-prototypes
4317
enabled extra_warnings && check_cflags -Winline
4318

4319
# add some linker flags
4320
check_ldflags -Wl,--warn-common
4321
check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
4322
test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
4323

4324
enabled xmm_clobber_test &&
4325 4326 4327 4328 4329 4330 4331
    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_video       \
                  -Wl,--wrap,avcodec_encode_subtitle    \
4332
                  -Wl,--wrap,sws_scale ||
4333 4334
    disable xmm_clobber_test

4335
echo "X{};" > $TMPV
4336
if test_ldflags -Wl,--version-script,$TMPV; then
4337
    append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
4338 4339
    check_cc <<EOF && enable symver_asm_label
void ff_foo(void) __asm__ ("av_foo@VERSION");
4340
void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
4341 4342 4343 4344 4345 4346
EOF
    check_cc <<EOF && enable symver_gnu_asm
__asm__(".symver ff_foo,av_foo@VERSION");
void ff_foo(void) {}
EOF
fi
4347

4348 4349 4350 4351 4352 4353 4354 4355
if [ -z "$optflags" ]; then
    if enabled small; then
        optflags=$cflags_size
    elif enabled optimizations; then
        optflags=$cflags_speed
    else
        optflags=$cflags_noopt
    fi
4356
fi
4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367

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
4368
fi
4369 4370 4371 4372

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

4374 4375
enabled ftrapv && check_cflags -ftrapv

4376 4377 4378 4379
check_cc -mno-red-zone <<EOF && noredzone_flags="-mno-red-zone"
int x;
EOF

4380

4381
if enabled icc; then
Måns Rullgård's avatar
Måns Rullgård committed
4382 4383 4384 4385
    # Just warnings, no remarks
    check_cflags -w1
    # -wd: Disable following warnings
    # 144, 167, 556: -Wno-pointer-sign
4386
    # 188: enumerated type mixed with another type
4387
    # 1292: attribute "foo" ignored
4388
    # 1419: external declaration in primary source file
Måns Rullgård's avatar
Måns Rullgård committed
4389
    # 10006: ignoring unknown option -fno-signed-zeros
4390
    # 10148: ignoring unknown option -Wno-parentheses
Måns Rullgård's avatar
Måns Rullgård committed
4391
    # 10156: ignoring option '-W'; no argument required
4392
    check_cflags -wd144,167,188,556,1292,1419,10006,10148,10156
Måns Rullgård's avatar
Måns Rullgård committed
4393 4394 4395
    # 11030: Warning unknown option --as-needed
    # 10156: ignoring option '-export'; no argument required
    check_ldflags -wd10156,11030
4396 4397
    # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
    enable ebp_available
4398
    if enabled x86_32; then
4399
        icc_version=$($cc -dumpversion)
4400 4401
        test ${icc_version%%.*} -ge 11 &&
            check_cflags -falign-stack=maintain-16-byte ||
4402 4403
            disable aligned_stack
    fi
4404 4405
elif enabled ccc; then
    # disable some annoying warnings
4406 4407 4408 4409
    add_cflags -msg_disable bitnotint
    add_cflags -msg_disable mixfuncvoid
    add_cflags -msg_disable nonstandcast
    add_cflags -msg_disable unsupieee
4410
elif enabled gcc; then
4411
    check_optflags -fno-tree-vectorize
4412
    check_cflags -Werror=implicit-function-declaration
4413
    check_cflags -Werror=missing-prototypes
4414
    check_cflags -Werror=return-type
4415
    check_cflags -Werror=vla
4416 4417
elif enabled llvm_gcc; then
    check_cflags -mllvm -stack-alignment=16
4418
elif enabled clang; then
4419
    check_cflags -mllvm -stack-alignment=16
4420
    check_cflags -Qunused-arguments
4421 4422
    check_cflags -Werror=implicit-function-declaration
    check_cflags -Werror=missing-prototypes
4423
    check_cflags -Werror=return-type
4424 4425
elif enabled armcc; then
    # 2523: use of inline assembler is deprecated
4426 4427
    add_cflags -W${armcc_opt},--diag_suppress=2523
    add_cflags -W${armcc_opt},--diag_suppress=1207
4428
    add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
4429
    add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
4430 4431
    add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
    add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
4432 4433
elif enabled tms470; then
    add_cflags -pds=824 -pds=837
4434 4435
elif enabled pathscale; then
    add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
4436
elif enabled_any msvc icl; then
4437
    enabled x86_32 && disable aligned_stack
4438
    enabled_all x86_32 debug && add_cflags -Oy-
4439
    if enabled icl; then
4440
        # basically -fstrict-aliasing that does not work (correctly) on icl 13.x
4441
        check_cpp_condition "windows.h" "__ICL < 1300" && add_cflags -Qansi-alias
4442 4443
        # icl will pass the inline asm tests but inline asm is currently
        # not supported (build will fail)
4444 4445
        disable inline_asm
    fi
4446 4447
fi

Mans Rullgard's avatar
Mans Rullgard committed
4448
case $target_os in
4449 4450 4451
    osf1)
        enabled ccc && add_ldflags '-Wl,-expect_unresolved,*'
    ;;
Mans Rullgard's avatar
Mans Rullgard committed
4452 4453 4454 4455 4456
    plan9)
        add_cppflags -Dmain=plan9_main
    ;;
esac

4457
enable frame_thread_encoder
4458
enabled_any $THREADS_LIST      && enable threads
4459
enabled_any $ATOMICS_LIST      && enable atomics_native
4460

4461 4462
enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }

4463
check_deps $CONFIG_LIST       \
4464
           $CONFIG_EXTRA      \
4465
           $HAVE_LIST         \
4466
           $ALL_COMPONENTS    \
4467

4468

4469
if test $target_os = "haiku"; then
4470 4471 4472 4473
    disable memalign
    disable posix_memalign
fi

4474
! enabled_any memalign posix_memalign aligned_malloc &&
4475 4476
    enabled_any $need_memalign && enable memalign_hack

4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503
# add_dep lib dep
# -> enable ${lib}_deps_${dep}
# -> add $dep to ${lib}_deps only once
add_dep() {
    lib=$1
    dep=$2
    enabled "${lib}_deps_${dep}" && return 0
    enable  "${lib}_deps_${dep}"
    prepend "${lib}_deps" $dep
}

# merge deps lib components
# merge all ${component}_deps into ${lib}_deps and ${lib}_deps_*
merge_deps() {
    lib=$1
    shift
    for comp in $*; do
        enabled $comp || continue
        eval "dep=\"\$${comp}_deps\""
        for d in $dep; do
            add_dep $lib $d
        done
    done
}

merge_deps libavfilter $FILTER_LIST

4504
echo "install prefix            $prefix"
Diego Biurrun's avatar
Diego Biurrun committed
4505 4506 4507
echo "source path               $source_path"
echo "C compiler                $cc"
echo "ARCH                      $arch ($cpu)"
4508 4509
if test "$build_suffix" != ""; then
    echo "build suffix              $build_suffix"
4510
fi
4511 4512 4513
if test "$progs_suffix" != ""; then
    echo "progs suffix              $progs_suffix"
fi
4514 4515 4516
if test "$extra_version" != ""; then
    echo "version string suffix     $extra_version"
fi
4517
echo "big-endian                ${bigendian-no}"
4518
echo "runtime cpu detection     ${runtime_cpudetect-no}"
4519
if enabled x86; then
4520
    echo "${yasmexe}                      ${yasm-no}"
4521
    echo "MMX enabled               ${mmx-no}"
4522
    echo "MMXEXT enabled            ${mmxext-no}"
4523
    echo "3DNow! enabled            ${amd3dnow-no}"
4524
    echo "3DNow! extended enabled   ${amd3dnowext-no}"
4525
    echo "SSE enabled               ${sse-no}"
4526
    echo "SSSE3 enabled             ${ssse3-no}"
4527
    echo "AVX enabled               ${avx-no}"
4528
    echo "FMA4 enabled              ${fma4-no}"
4529
    echo "i686 features enabled     ${i686-no}"
4530
    echo "CMOV is fast              ${fast_cmov-no}"
4531 4532
    echo "EBX available             ${ebx_available-no}"
    echo "EBP available             ${ebp_available-no}"
4533
fi
4534
if enabled arm; then
4535 4536
    echo "ARMv5TE enabled           ${armv5te-no}"
    echo "ARMv6 enabled             ${armv6-no}"
4537
    echo "ARMv6T2 enabled           ${armv6t2-no}"
4538
    echo "VFP enabled               ${vfp-no}"
4539
    echo "NEON enabled              ${neon-no}"
4540
    echo "THUMB enabled             ${thumb-no}"
4541
fi
4542
if enabled mips; then
4543 4544 4545 4546
    echo "MIPS FPU enabled          ${mipsfpu-no}"
    echo "MIPS32R2 enabled          ${mips32r2-no}"
    echo "MIPS DSP R1 enabled       ${mipsdspr1-no}"
    echo "MIPS DSP R2 enabled       ${mipsdspr2-no}"
4547
fi
4548
if enabled ppc; then
4549
    echo "AltiVec enabled           ${altivec-no}"
4550
    echo "PPC 4xx optimizations     ${ppc4xx-no}"
4551
    echo "dcbzl available           ${dcbzl-no}"
4552 4553 4554
fi
if enabled sparc; then
    echo "VIS enabled               ${vis-no}"
4555
fi
4556
echo "debug symbols             ${debug-no}"
4557
echo "strip symbols             ${stripping-no}"
4558
echo "optimize for size         ${small-no}"
4559
echo "optimizations             ${optimizations-no}"
4560 4561
echo "static                    ${static-no}"
echo "shared                    ${shared-no}"
4562
echo "postprocessing support    ${postproc-no}"
4563
echo "new filter support        ${avfilter-no}"
4564 4565
echo "network support           ${network-no}"
echo "threading support         ${thread_type-no}"
4566
echo "safe bitstream reader     ${safe_bitstream_reader-no}"
4567
echo "SDL support               ${sdl-no}"
4568
echo "opencl enabled            ${opencl-no}"
4569
echo "texi2html enabled         ${texi2html-no}"
4570
echo "perl enabled              ${perl-no}"
4571 4572
echo "pod2man enabled           ${pod2man-no}"
echo "makeinfo enabled          ${makeinfo-no}"
4573 4574
test -n "$random_seed" &&
    echo "random seed               ${random_seed}"
4575
echo
Fabrice Bellard's avatar
Fabrice Bellard committed
4576

4577 4578 4579 4580
echo "External libraries:"
print_enabled '' $EXTERNAL_LIBRARY_LIST | print_3_columns
echo

4581
for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
4582
    echo "Enabled ${type}s:"
4583
    eval list=\$$(toupper $type)_LIST
4584
    print_enabled '_*' $list | print_3_columns
4585
    echo
4586 4587
done

4588
license="LGPL version 2.1 or later"
4589
if enabled nonfree; then
4590
    license="nonfree and unredistributable"
4591 4592 4593 4594
elif enabled gplv3; then
    license="GPL version 3 or later"
elif enabled lgplv3; then
    license="LGPL version 3 or later"
4595
elif enabled gpl; then
4596
    license="GPL version 2 or later"
4597 4598 4599
fi

echo "License: $license"
4600

4601
echo "Creating config.mak, config.h, and doc/config.texi..."
4602

4603
test -e Makefile || $ln_s "$source_path/Makefile" .
4604

4605 4606
enabled stripping || strip="echo skipping strip"

4607
config_files="$TMPH config.mak doc/config.texi"
4608

4609 4610
cat > config.mak <<EOF
# Automatically generated by configure - do not modify!
4611 4612
ifndef FFMPEG_CONFIG_MAK
FFMPEG_CONFIG_MAK=1
4613
FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
4614 4615 4616 4617 4618 4619 4620
prefix=$prefix
LIBDIR=\$(DESTDIR)$libdir
SHLIBDIR=\$(DESTDIR)$shlibdir
INCDIR=\$(DESTDIR)$incdir
BINDIR=\$(DESTDIR)$bindir
DATADIR=\$(DESTDIR)$datadir
MANDIR=\$(DESTDIR)$mandir
4621
SRC_PATH=$source_path
4622 4623 4624
ifndef MAIN_MAKEFILE
SRC_PATH:=\$(SRC_PATH:.%=..%)
endif
4625
CC_IDENT=$cc_ident
4626 4627
ARCH=$arch
CC=$cc
Mohamed Naufal's avatar
Mohamed Naufal committed
4628
CXX=$cxx
4629 4630 4631
AS=$as
LD=$ld
DEPCC=$dep_cc
4632 4633 4634
DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
DEPAS=$as
DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
4635
YASM=$yasmexe
4636
DEPYASM=$yasmexe
4637
AR=$ar
4638 4639
ARFLAGS=$arflags
AR_O=$ar_o
4640
RANLIB=$ranlib
4641
CP=cp -p
4642
LN_S=$ln_s
4643
STRIP=$strip
4644 4645
CPPFLAGS=$CPPFLAGS
CFLAGS=$CFLAGS
Mohamed Naufal's avatar
Mohamed Naufal committed
4646
CXXFLAGS=$CXXFLAGS
4647
ASFLAGS=$ASFLAGS
4648
AS_C=$AS_C
4649
AS_O=$AS_O
4650
CC_C=$CC_C
4651
CC_E=$CC_E
4652
CC_O=$CC_O
4653
CXX_C=$CXX_C
Mohamed Naufal's avatar
Mohamed Naufal committed
4654
CXX_O=$CXX_O
4655
LD_O=$LD_O
4656 4657
LD_LIB=$LD_LIB
LD_PATH=$LD_PATH
4658
DLLTOOL=$dlltool
4659
LDFLAGS=$LDFLAGS
4660
LDFLAGS-ffserver=$FFSERVERLDFLAGS
4661
SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
4662 4663
YASMFLAGS=$YASMFLAGS
BUILDSUF=$build_suffix
4664
PROGSSUF=$progs_suffix
4665 4666 4667 4668 4669 4670 4671 4672 4673
FULLNAME=$FULLNAME
LIBPREF=$LIBPREF
LIBSUF=$LIBSUF
LIBNAME=$LIBNAME
SLIBPREF=$SLIBPREF
SLIBSUF=$SLIBSUF
EXESUF=$EXESUF
EXTRA_VERSION=$extra_version
CCDEP=$CCDEP
Mohamed Naufal's avatar
Mohamed Naufal committed
4674
CXXDEP=$CXXDEP
4675
CCDEP_FLAGS=$CCDEP_FLAGS
4676
ASDEP=$ASDEP
4677
ASDEP_FLAGS=$ASDEP_FLAGS
4678 4679 4680
CC_DEPFLAGS=$CC_DEPFLAGS
AS_DEPFLAGS=$AS_DEPFLAGS
HOSTCC=$host_cc
4681
HOSTLD=$host_ld
4682
HOSTCFLAGS=$host_cflags
4683
HOSTCPPFLAGS=$host_cppflags
4684 4685 4686
HOSTEXESUF=$HOSTEXESUF
HOSTLDFLAGS=$host_ldflags
HOSTLIBS=$host_libs
4687 4688 4689 4690 4691
DEPHOSTCC=$host_cc
DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
HOSTCCDEP=$HOSTCCDEP
HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
4692
HOSTCC_C=$HOSTCC_C
4693
HOSTCC_O=$HOSTCC_O
4694
HOSTLD_O=$HOSTLD_O
4695
TARGET_EXEC=$target_exec $target_exec_args
4696
TARGET_PATH=$target_path
4697
TARGET_SAMPLES=${target_samples:-\$(SAMPLES)}
4698 4699
LIBS-ffplay=$sdl_libs
CFLAGS-ffplay=$sdl_cflags
4700
ZLIB=$($ldflags_filter -lz)
4701 4702
LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
EXTRALIBS=$extralibs
4703
COMPAT_OBJS=$compat_objs
4704
EXEOBJS=$exeobjs
4705
INSTALL=$install
4706 4707 4708 4709 4710 4711
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}
4712 4713 4714 4715
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}
4716
SAMPLES:=${samples:-\$(FATE_SAMPLES)}
4717
NOREDZONE_FLAGS=$noredzone_flags
4718
EOF
4719

4720
get_version(){
4721
    lcname=lib${1}
4722 4723
    name=$(toupper $lcname)
    file=$source_path/$lcname/version.h
4724
    eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file")
4725
    eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
4726 4727
    eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
    eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
4728
    eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> config.mak
4729 4730
}

4731
map 'get_version $v' $LIBRARY_LIST
4732

4733 4734
cat > $TMPH <<EOF
/* Automatically generated by configure - do not modify! */
4735 4736 4737
#ifndef FFMPEG_CONFIG_H
#define FFMPEG_CONFIG_H
#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
4738
#define FFMPEG_LICENSE "$(c_escape $license)"
4739
#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
4740
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
4741
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
4742
#define av_restrict $_restrict
4743 4744
#define EXTERN_PREFIX "${extern_prefix}"
#define EXTERN_ASM ${extern_prefix}
4745
#define SLIBSUF "$SLIBSUF"
4746
#define HAVE_MMX2 HAVE_MMXEXT
4747
EOF
4748

4749 4750 4751
test -n "$assert_level" &&
    echo "#define ASSERT_LEVEL $assert_level" >>$TMPH

4752 4753 4754
test -n "$malloc_prefix" &&
    echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH

4755 4756 4757 4758 4759
if enabled yasm; then
    append config_files $TMPASM
    printf '' >$TMPASM
fi

4760 4761
enabled getenv || echo "#define getenv(x) NULL" >> $TMPH

4762

4763 4764 4765
mkdir -p doc
echo "@c auto-generated by configure" > doc/config.texi

4766 4767 4768
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
4769
                                     $CONFIG_EXTRA      \
4770
                                     $ALL_COMPONENTS    \
4771

4772
echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH
4773
echo "endif # FFMPEG_CONFIG_MAK" >> config.mak
4774

Diego Biurrun's avatar
Diego Biurrun committed
4775
# Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
4776
cp_if_changed $TMPH config.h
4777
touch .config
Nick Kurshev's avatar
Nick Kurshev committed
4778

4779 4780
enabled yasm && cp_if_changed $TMPASM config.asm

4781 4782 4783 4784 4785 4786
cat > $TMPH <<EOF
/* Generated by ffconf */
#ifndef AVUTIL_AVCONFIG_H
#define AVUTIL_AVCONFIG_H
EOF

4787
print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
4788 4789 4790 4791 4792

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

cp_if_changed $TMPH libavutil/avconfig.h

4793 4794 4795 4796
if test -n "$WARNINGS"; then
    printf "\n$WARNINGS"
    enabled fatal_warnings && exit 1
fi
4797

4798
# build pkg-config files
4799

4800
pkgconfig_generate(){
4801 4802 4803 4804 4805 4806 4807 4808
    name=$1
    shortname=${name#lib}${build_suffix}
    comment=$2
    version=$3
    libs=$4
    requires=$5
    enabled ${name#lib} || return 0
    mkdir -p $name
4809
    cat <<EOF > $name/$name${build_suffix}.pc
4810
prefix=$prefix
4811
exec_prefix=\${prefix}
4812
libdir=$libdir
4813
includedir=$incdir
4814

4815 4816 4817
Name: $name
Description: $comment
Version: $version
4818
Requires: $(enabled shared || echo $requires)
4819
Requires.private: $(enabled shared && echo $requires)
4820
Conflicts:
4821
Libs: -L\${libdir} -l${shortname} $(enabled shared || echo $libs)
4822
Libs.private: $(enabled shared && echo $libs)
4823
Cflags: -I\${includedir}
4824
EOF
4825 4826 4827 4828

mkdir -p doc/examples/pc-uninstalled
includedir=${source_path}
[ "$includedir" = . ] && includedir="\${pcfiledir}/../../.."
4829
    cat <<EOF > doc/examples/pc-uninstalled/$name.pc
4830 4831
prefix=
exec_prefix=
4832 4833
libdir=\${pcfiledir}/../../../$name
includedir=${includedir}
4834

4835 4836 4837 4838
Name: $name
Description: $comment
Version: $version
Requires: $requires
4839
Conflicts:
4840
Libs: -L\${libdir} -l${shortname} $(enabled shared || echo $libs)
4841 4842
Cflags: -I\${includedir}
EOF
4843
}
4844

4845 4846 4847 4848 4849 4850 4851 4852
lavfi_libs="libavutil${build_suffix} = $LIBAVUTIL_VERSION"
enabled libavfilter_deps_avcodec    && prepend lavfi_libs "libavcodec${build_suffix} = $LIBAVCODEC_VERSION,"
enabled libavfilter_deps_avformat   && prepend lavfi_libs "libavformat${build_suffix} = $LIBAVFORMAT_VERSION,"
enabled libavfilter_deps_avresample && prepend lavfi_libs "libavresample${build_suffix} = $LIBAVRESAMPLE_VERSION,"
enabled libavfilter_deps_swscale    && prepend lavfi_libs "libswscale${build_suffix} = $LIBSWSCALE_VERSION,"
enabled libavfilter_deps_swresample && prepend lavfi_libs "libswresample${build_suffix} = $LIBSWRESAMPLE_VERSION,"
enabled libavfilter_deps_postproc   && prepend lavfi_libs "libpostproc${build_suffix} = $LIBPOSTPROC_VERSION,"
lavfi_libs=${lavfi_libs%, }
4853

4854 4855
lavd_libs="libavformat${build_suffix} = $LIBAVFORMAT_VERSION"
enabled lavfi_indev && prepend lavd_libs "libavfilter${build_suffix} = $LIBAVFILTER_VERSION,"
4856

4857 4858 4859 4860 4861 4862 4863 4864 4865
pkgconfig_generate libavutil     "FFmpeg utility library"               "$LIBAVUTIL_VERSION"     "$LIBM"
pkgconfig_generate libavcodec    "FFmpeg codec library"                 "$LIBAVCODEC_VERSION"    "$extralibs" "libavutil${build_suffix} = $LIBAVUTIL_VERSION"
pkgconfig_generate libavformat   "FFmpeg container format library"      "$LIBAVFORMAT_VERSION"   "$extralibs" "libavcodec${build_suffix} = $LIBAVCODEC_VERSION"
pkgconfig_generate libavdevice   "FFmpeg device handling library"       "$LIBAVDEVICE_VERSION"   "$extralibs" "$lavd_libs"
pkgconfig_generate libavfilter   "FFmpeg audio/video filtering library" "$LIBAVFILTER_VERSION"   "$extralibs" "$lavfi_libs"
pkgconfig_generate libpostproc   "FFmpeg postprocessing library"        "$LIBPOSTPROC_VERSION"   ""           "libavutil${build_suffix} = $LIBAVUTIL_VERSION"
pkgconfig_generate libavresample "Libav audio resampling library"       "$LIBAVRESAMPLE_VERSION" "$extralibs" "libavutil${build_suffix} = $LIBAVUTIL_VERSION"
pkgconfig_generate libswscale    "FFmpeg image rescaling library"       "$LIBSWSCALE_VERSION"    "$LIBM"      "libavutil${build_suffix} = $LIBAVUTIL_VERSION"
pkgconfig_generate libswresample "FFmpeg audio resampling library"      "$LIBSWRESAMPLE_VERSION" "$LIBM"      "libavutil${build_suffix} = $LIBAVUTIL_VERSION"
4866 4867 4868 4869

fix_ffmpeg_remote(){
    git_remote_from=$1
    git_remote_to=$2
4870
    fixme_remote=$(git --git-dir=$source_path/.git --work-tree=$source_path remote -v | grep $git_remote_from | cut -f 1 | sort | uniq)
4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888
    if [ "$fixme_remote" != "" ]; then
        echolog "
Outdated domain in git config, the official domain for ffmpeg git is since
November 2011, source.ffmpeg.org, both the old and the new point to the same
repository and server. To update it enter the following commands:
"
        for remote in $fixme_remote; do
            echolog "git remote set-url $remote $git_remote_to"
        done
    fi
}

if test -f "$source_path/.git/config"; then
    remote_from=git.videolan.org
    remote_to=source.ffmpeg.org
    fix_ffmpeg_remote git@$remote_from:ffmpeg   git@$remote_to:ffmpeg
    fix_ffmpeg_remote git://$remote_from/ffmpeg git://$remote_to/ffmpeg
fi