configure 192 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
  --docdir=DIR             install documentation in DIR [PREFIX/share/doc/ffmpeg]
86
  --libdir=DIR             install libs in DIR [PREFIX/lib]
87
  --shlibdir=DIR           install shared libs in DIR [LIBDIR]
88 89
  --incdir=DIR             install includes in DIR [PREFIX/include]
  --mandir=DIR             install man page in DIR [PREFIX/share/man]
90
  --pkgconfigdir=DIR       install pkg-config files in DIR [LIBDIR/pkgconfig]
91 92
  --enable-rpath           use rpath to allow installing libraries in paths
                           not part of the dynamic linker search path
93
                           use rpath when linking programs [USE WITH CARE]
94

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

Configuration options:
  --disable-static         do not build static libraries [no]
  --enable-shared          build shared libraries [no]
  --enable-small           optimize for size instead of speed
106
  --disable-runtime-cpudetect disable detecting cpu capabilities at runtime (smaller binary)
107 108
  --enable-gray            enable full grayscale support (slower color)
  --disable-swscale-alpha  disable alpha channel support in swscale
109
  --disable-all            disable building components, libraries and programs
110
  --enable-incompatible-libav-abi enable incompatible Libav fork ABI [no]
111
  --enable-raise-major     increase major version numbers in sonames [no]
112

113 114
Program options:
  --disable-programs       do not build command line programs
115 116 117 118
  --disable-ffmpeg         disable ffmpeg build
  --disable-ffplay         disable ffplay build
  --disable-ffprobe        disable ffprobe build
  --disable-ffserver       disable ffserver build
119

120
Documentation options:
121
  --disable-doc            do not build documentation
122 123 124 125 126 127
  --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:
128 129 130
  --disable-avdevice       disable libavdevice build
  --disable-avcodec        disable libavcodec build
  --disable-avformat       disable libavformat build
131
  --disable-avutil         disable libavutil build
Michael Niedermayer's avatar
Michael Niedermayer committed
132
  --disable-swresample     disable libswresample build
133
  --disable-swscale        disable libswscale build
134
  --disable-postproc       disable libpostproc build
135
  --disable-avfilter       disable libavfilter build
136
  --enable-avresample      enable libavresample build [no]
137 138 139
  --disable-pthreads       disable pthreads [autodetect]
  --disable-w32threads     disable Win32 threads [autodetect]
  --disable-os2threads     disable OS/2 threads [autodetect]
140
  --disable-network        disable network support [no]
141
  --disable-dct            disable DCT code
142
  --disable-dwt            disable DWT code
143
  --disable-error-resilience disable error resilience code
144
  --disable-lsp            disable LSP code
145
  --disable-lzo            disable LZO decoder code
146 147
  --disable-mdct           disable MDCT code
  --disable-rdft           disable RDFT code
148
  --disable-fft            disable FFT code
149
  --disable-faan           disable floating point AAN (I)DCT code
150
  --disable-pixelutils     disable pixel utils in libavutil
151 152

Hardware accelerators:
153
  --disable-d3d11va        disable D3D11VA code [autodetect]
154
  --disable-dxva2          disable DXVA2 code [autodetect]
155
  --disable-vaapi          disable VAAPI code [autodetect]
156
  --disable-vda            disable VDA code [autodetect]
157
  --disable-vdpau          disable VDPAU code [autodetect]
158 159

Individual component options:
160
  --disable-everything     disable all components listed below
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
  --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
185
  --enable-indev=NAME      enable input device NAME
186 187
  --disable-indev=NAME     disable input device NAME
  --disable-indevs         disable input devices
188 189
  --enable-outdev=NAME     enable output device NAME
  --disable-outdev=NAME    disable output device NAME
190 191 192 193 194 195 196
  --disable-outdevs        disable output devices
  --disable-devices        disable all devices
  --enable-filter=NAME     enable filter NAME
  --disable-filter=NAME    disable filter NAME
  --disable-filters        disable all filters

External library support:
Diego Biurrun's avatar
Diego Biurrun committed
197
  --enable-avisynth        enable reading of AviSynth script files [no]
198
  --disable-bzlib          disable bzlib [autodetect]
199 200 201 202
  --enable-fontconfig      enable fontconfig, useful for drawtext filter [no]
  --enable-frei0r          enable frei0r video filtering [no]
  --enable-gnutls          enable gnutls, needed for https support
                           if openssl is not used [no]
203
  --disable-iconv          disable iconv [autodetect]
204
  --enable-ladspa          enable LADSPA audio filtering [no]
205
  --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
206 207
  --enable-libass          enable libass subtitles rendering,
                           needed for subtitles and ass filter [no]
Petri Hintukainen's avatar
Petri Hintukainen committed
208
  --enable-libbluray       enable BluRay reading using libbluray [no]
209
  --enable-libbs2b         enable bs2b DSP library [no]
210
  --enable-libcaca         enable textual display using libcaca [no]
211
  --enable-libcelt         enable CELT decoding via libcelt [no]
212
  --enable-libcdio         enable audio CD grabbing with libcdio [no]
213 214
  --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                           and libraw1394 [no]
215
  --enable-libdcadec       enable DCA decoding via libdcadec [no]
216
  --enable-libfaac         enable AAC encoding via libfaac [no]
217
  --enable-libfdk-aac      enable AAC de/encoding via libfdk-aac [no]
218
  --enable-libflite        enable flite (voice synthesis) support via libflite [no]
219 220
  --enable-libfreetype     enable libfreetype, needed for drawtext filter [no]
  --enable-libfribidi      enable libfribidi, improves drawtext filter [no]
wm4's avatar
wm4 committed
221
  --enable-libgme          enable Game Music Emu via libgme [no]
222
  --enable-libgsm          enable GSM de/encoding via libgsm [no]
223
  --enable-libiec61883     enable iec61883 via libiec61883 [no]
224
  --enable-libilbc         enable iLBC de/encoding via libilbc [no]
225
  --enable-libmfx          enable HW acceleration through libmfx
226
  --enable-libmodplug      enable ModPlug via libmodplug [no]
227 228 229
  --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
  --enable-libnut          enable NUT (de)muxing via libnut,
                           native (de)muxer exists [no]
230 231 232
  --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]
233
  --enable-libopenh264     enable H.264 encoding via OpenH264 [no]
234
  --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
235
  --enable-libopus         enable Opus de/encoding via libopus [no]
236
  --enable-libpulse        enable Pulseaudio input via libpulse [no]
237
  --enable-libquvi         enable quvi input via libquvi [no]
238
  --enable-librtmp         enable RTMP[E] support via librtmp [no]
239
  --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
240
  --enable-libshine        enable fixed-point MP3 encoding via libshine [no]
241
  --enable-libsmbclient    enable Samba protocol via libsmbclient [no]
242
  --enable-libsnappy       enable Snappy compression [no]
243
  --enable-libsoxr         enable Include libsoxr resampling [no]
244
  --enable-libspeex        enable Speex de/encoding via libspeex [no]
245
  --enable-libssh          enable SFTP protocol via libssh [no]
Mohamed Naufal's avatar
Mohamed Naufal committed
246
  --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
247
  --enable-libtheora       enable Theora encoding via libtheora [no]
248
  --enable-libtwolame      enable MP2 encoding via libtwolame [no]
249
  --enable-libutvideo      enable Ut Video encoding and decoding via libutvideo [no]
250
  --enable-libv4l2         enable libv4l2/v4l-utils [no]
251
  --enable-libvidstab      enable video stabilization using vid.stab [no]
252
  --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
253
  --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
254
  --enable-libvorbis       enable Vorbis en/decoding via libvorbis,
255
                           native implementation exists [no]
256
  --enable-libvpx          enable VP8 and VP9 de/encoding via libvpx [no]
257
  --enable-libwavpack      enable wavpack encoding via libwavpack [no]
Justin Ruggles's avatar
Justin Ruggles committed
258
  --enable-libwebp         enable WebP encoding via libwebp [no]
259
  --enable-libx264         enable H.264 encoding via x264 [no]
Derek Buitenhuis's avatar
Derek Buitenhuis committed
260
  --enable-libx265         enable HEVC encoding via x265 [no]
261
  --enable-libxavs         enable AVS encoding via xavs [no]
262 263 264 265
  --enable-libxcb          enable X11 grabbing using XCB [autodetect]
  --enable-libxcb-shm      enable X11 grabbing shm communication [autodetect]
  --enable-libxcb-xfixes   enable X11 grabbing mouse rendering [autodetect]
  --enable-libxcb-shape    enable X11 grabbing shape rendering [autodetect]
266 267
  --enable-libxvid         enable Xvid encoding via xvidcore,
                           native MPEG-4/Xvid encoder exists [no]
268
  --enable-libzmq          enable message passing via libzmq [no]
269
  --enable-libzvbi         enable teletext support via libzvbi [no]
270
  --disable-lzma           disable lzma [autodetect]
271
  --enable-decklink        enable Blackmagick DeckLink I/O support [no]
272
  --enable-mmal            enable decoding via MMAL [no]
273
  --enable-nvenc           enable NVIDIA NVENC support [no]
274
  --enable-openal          enable OpenAL 1.1 capture support [no]
275
  --enable-opencl          enable OpenCL code
Lukasz Marek's avatar
Lukasz Marek committed
276
  --enable-opengl          enable OpenGL rendering [no]
277 278
  --enable-openssl         enable openssl, needed for https support
                           if gnutls is not used [no]
279
  --disable-sdl            disable sdl [autodetect]
280 281
  --disable-securetransport disable Secure Transport, needed for TLS support
                           on OSX if openssl and gnutls are not used [autodetect]
282
  --enable-x11grab         enable X11 grabbing (legacy) [no]
283
  --disable-xlib           disable xlib [autodetect]
284
  --disable-zlib           disable zlib [autodetect]
285

286 287 288 289
Toolchain options:
  --arch=ARCH              select architecture [$arch]
  --cpu=CPU                select the minimum required CPU (affects
                           instruction selection, may crash on older CPUs)
290
  --cross-prefix=PREFIX    use PREFIX for compilation tools [$cross_prefix]
291
  --progs-suffix=SUFFIX    program name suffix []
292 293 294 295 296 297
  --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
298
  --target-samples=DIR     path to samples directory on target
299
  --tempprefix=PATH        force fixed dir/prefix instead of mktemp for checks
300
  --toolchain=NAME         set tool defaults according to NAME
301
  --nm=NM                  use nm tool NM [$nm_default]
302
  --ar=AR                  use archive tool AR [$ar_default]
303
  --as=AS                  use assembler AS [$as_default]
304
  --windres=WINDRES        use windows resource compiler WINDRES [$windres_default]
305
  --yasmexe=EXE            use yasm-compatible assembler EXE [$yasmexe_default]
306
  --cc=CC                  use C compiler CC [$cc_default]
Mohamed Naufal's avatar
Mohamed Naufal committed
307
  --cxx=CXX                use C compiler CXX [$cxx_default]
308
  --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
309
  --ld=LD                  use linker LD [$ld_default]
310
  --pkg-config=PKGCONFIG   use pkg-config tool PKGCONFIG [$pkg_config_default]
311
  --pkg-config-flags=FLAGS pass additional flags to pkgconf []
312
  --ranlib=RANLIB          use ranlib RANLIB [$ranlib_default]
313
  --doxygen=DOXYGEN        use DOXYGEN to generate API doc [$doxygen_default]
314 315
  --host-cc=HOSTCC         use host C compiler HOSTCC
  --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
316
  --host-cppflags=HCPPFLAGS use HCPPFLAGS when compiling for host
317
  --host-ld=HOSTLD         use host linker HOSTLD
318 319
  --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
  --host-libs=HLIBS        use libs HLIBS when linking for host
320
  --host-os=OS             compiler host OS [$target_os]
321
  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
Mohamed Naufal's avatar
Mohamed Naufal committed
322
  --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
323
  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
324
  --extra-ldexeflags=ELDFLAGS add ELDFLAGS to LDEXEFLAGS [$LDEXEFLAGS]
325 326
  --extra-libs=ELIBS       add ELIBS [$ELIBS]
  --extra-version=STRING   version string suffix []
327
  --optflags=OPTFLAGS      override optimization-related compiler flags
328
  --build-suffix=SUFFIX    library name suffix []
329
  --enable-pic             build position-independent code
330
  --enable-thumb           compile for Thumb instruction set
331
  --enable-lto             use link-time optimization
332
  --env="ENV=override"     override the environment variables
333 334 335

Advanced options (experts only):
  --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
336 337 338 339 340 341
  --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
342
  --sws-max-filter-size=N  the max filter size swscale uses [$sws_max_filter_size_default]
343 344

Optimization options (experts only):
345
  --disable-asm            disable all assembly optimizations
346
  --disable-altivec        disable AltiVec optimizations
347 348
  --disable-vsx            disable VSX optimizations
  --disable-power8         disable POWER8 optimizations
349 350 351
  --disable-amd3dnow       disable 3DNow! optimizations
  --disable-amd3dnowext    disable 3DNow! extended optimizations
  --disable-mmx            disable MMX optimizations
352
  --disable-mmxext         disable MMXEXT optimizations
353
  --disable-sse            disable SSE optimizations
354 355
  --disable-sse2           disable SSE2 optimizations
  --disable-sse3           disable SSE3 optimizations
356
  --disable-ssse3          disable SSSE3 optimizations
357 358
  --disable-sse4           disable SSE4 optimizations
  --disable-sse42          disable SSE4.2 optimizations
359
  --disable-avx            disable AVX optimizations
360
  --disable-xop            disable XOP optimizations
361
  --disable-fma3           disable FMA3 optimizations
362
  --disable-fma4           disable FMA4 optimizations
363
  --disable-avx2           disable AVX2 optimizations
364 365 366
  --disable-armv5te        disable armv5te optimizations
  --disable-armv6          disable armv6 optimizations
  --disable-armv6t2        disable armv6t2 optimizations
367
  --disable-vfp            disable VFP optimizations
368
  --disable-neon           disable NEON optimizations
369 370
  --disable-inline-asm     disable use of inline assembly
  --disable-yasm           disable use of nasm/yasm assembly
371
  --disable-mips32r5       disable MIPS32R5 optimizations
372
  --disable-mips64r6       disable MIPS64R6 optimizations
373 374
  --disable-mipsdspr1      disable MIPS DSP ASE R1 optimizations
  --disable-mipsdspr2      disable MIPS DSP ASE R2 optimizations
375
  --disable-msa            disable MSA optimizations
376
  --disable-mipsfpu        disable floating point MIPS optimizations
377
  --disable-loongson3      disable Loongson-3 SIMD optimizations
378
  --disable-fast-unaligned consider unaligned accesses slow
379

380
Developer options (useful when working on FFmpeg itself):
381 382 383 384
  --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
385
  --disable-stripping      disable stripping of executables and shared libraries
386
  --assert-level=level     0(default), 1 or 2, amount of assertion testing,
387
                           2 causes a slowdown at runtime.
388
  --enable-memory-poisoning fill heap uninitialized allocated space with arbitrary data
389 390 391
  --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
392
  --enable-ftrapv          Trap arithmetic overflows
393 394
  --samples=PATH           location of test samples for FATE, if not set use
                           \$FATE_SAMPLES at make invocation time.
395 396
  --enable-neon-clobber-test check NEON registers for clobbering (should be
                           used only for debugging purposes)
397 398
  --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
                           should be used only for debugging purposes)
399 400 401 402 403 404 405 406
  --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
407 408
  --disable-valgrind-backtrace do not print a backtrace under Valgrind
                           (only applies to --disable-optimizations builds)
409 410 411

NOTE: Object files are built at the place where configure is launched.
EOF
412
  exit 0
413
}
414

415 416
quotes='""'

417
log(){
418
    echo "$@" >> $logfile
419 420
}

421
log_file(){
Måns Rullgård's avatar
Måns Rullgård committed
422
    log BEGIN $1
423
    pr -n -t $1 >> $logfile
Måns Rullgård's avatar
Måns Rullgård committed
424 425 426
    log END $1
}

427
echolog(){
Måns Rullgård's avatar
Måns Rullgård committed
428
    log "$@"
429
    echo "$@"
430 431
}

432 433 434 435 436
warn(){
    log "WARNING: $*"
    WARNINGS="${WARNINGS}WARNING: $*\n"
}

437 438 439
die(){
    echolog "$@"
    cat <<EOF
440

441
If you think configure made a mistake, make sure you are using the latest
442
version from Git.  If the latest version fails, report the problem to the
443
ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
444
EOF
445
    if disabled logging; then
446
        cat <<EOF
447 448
Rerun configure with logging enabled (do not use --disable-logging), and
include the log this produces with your report.
449 450
EOF
    else
451
        cat <<EOF
452
Include the log file "$logfile" produced by configure as this will help
Lou Logan's avatar
Lou Logan committed
453
solve the problem.
454 455
EOF
    fi
456 457 458
    exit 1
}

459
# Avoid locale weirdness, besides we really just want to translate ASCII.
460
toupper(){
461
    echo "$@" | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
462 463
}

464
tolower(){
465
    echo "$@" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
466 467
}

468 469 470 471
c_escape(){
    echo "$*" | sed 's/["\\]/\\\0/g'
}

472 473
sh_quote(){
    v=$(echo "$1" | sed "s/'/'\\\\''/g")
474
    test "x$v" = "x${v#*[!A-Za-z0-9_/.+-]}" || v="'$v'"
475 476 477
    echo "$v"
}

478
cleanws(){
479
    echo "$@" | sed 's/^ *//;s/  */ /g;s/ *$//;s/\\r//g'
480 481
}

482 483 484 485
filter(){
    pat=$1
    shift
    for v; do
486
        eval "case $v in $pat) echo $v ;; esac"
487 488 489
    done
}

490 491 492 493 494 495 496 497
filter_out(){
    pat=$1
    shift
    for v; do
        eval "case $v in $pat) ;; *) echo $v ;; esac"
    done
}

498 499 500
map(){
    m=$1
    shift
501
    for v; do eval $m; done
502 503
}

504 505 506 507 508 509
add_suffix(){
    suffix=$1
    shift
    for v; do echo ${v}${suffix}; done
}

510 511 512 513 514 515 516 517
set_all(){
    value=$1
    shift
    for var in $*; do
        eval $var=$value
    done
}

518 519 520 521 522 523 524 525
set_weak(){
    value=$1
    shift
    for var; do
        eval : \${$var:=$value}
    done
}

526 527 528 529
sanitize_var_name(){
    echo $@ | sed 's/[^A-Za-z0-9_]/_/g'
}

530 531 532
set_safe(){
    var=$1
    shift
533
    eval $(sanitize_var_name "$var")='$*'
534 535 536
}

get_safe(){
537
    eval echo \$$(sanitize_var_name "$1")
538 539
}

540
pushvar(){
541 542 543 544
    for pvar in $*; do
        eval level=\${${pvar}_level:=0}
        eval ${pvar}_${level}="\$$pvar"
        eval ${pvar}_level=$(($level+1))
545 546 547 548
    done
}

popvar(){
549 550
    for pvar in $*; do
        eval level=\${${pvar}_level:-0}
551 552
        test $level = 0 && continue
        eval level=$(($level-1))
553 554 555
        eval $pvar="\${${pvar}_${level}}"
        eval ${pvar}_level=$level
        eval unset ${pvar}_${level}
556 557 558
    done
}

559 560 561 562 563 564 565 566
enable(){
    set_all yes $*
}

disable(){
    set_all no $*
}

567 568 569 570 571 572 573 574
enable_weak(){
    set_weak yes $*
}

disable_weak(){
    set_weak no $*
}

575
enable_safe(){
576 577 578
    for var; do
        enable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
579 580 581
}

disable_safe(){
582 583 584
    for var; do
        disable $(echo "$var" | sed 's/[^A-Za-z0-9_]/_/g')
    done
585 586
}

587 588 589 590
do_enable_deep(){
    for var; do
        enabled $var && continue
        eval sel="\$${var}_select"
591 592
        eval sgs="\$${var}_suggest"
        pushvar var sgs
593
        enable_deep $sel
594 595
        popvar sgs
        enable_deep_weak $sgs
596 597 598 599 600 601 602 603 604
        popvar var
    done
}

enable_deep(){
    do_enable_deep $*
    enable $*
}

605
enable_deep_weak(){
606 607 608 609 610 611 612
    for var; do
        disabled $var && continue
        pushvar var
        do_enable_deep $var
        popvar var
        enable_weak $var
    done
613 614
}

615
enabled(){
616 617
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xyes"
618 619
}

620
disabled(){
621 622
    test "${1#!}" = "$1" && op== || op=!=
    eval test "x\$${1#!}" $op "xno"
623 624
}

625 626 627 628 629 630
enabled_all(){
    for opt; do
        enabled $opt || return 1
    done
}

631 632 633 634 635 636
disabled_all(){
    for opt; do
        disabled $opt || return 1
    done
}

637 638 639 640 641 642
enabled_any(){
    for opt; do
        enabled $opt && return 0
    done
}

643 644 645 646
disabled_any(){
    for opt; do
        disabled $opt && return 0
    done
647
    return 1
648 649
}

650 651
set_default(){
    for opt; do
652
        eval : \${$opt:=\$${opt}_default}
653 654 655
    done
}

656 657 658 659 660 661 662 663 664
is_in(){
    value=$1
    shift
    for var in $*; do
        [ $var = $value ] && return 0
    done
    return 1
}

665
do_check_deps(){
666
    for cfg; do
667
        cfg="${cfg#!}"
668 669 670
        enabled ${cfg}_checking && die "Circular dependency for $cfg."
        disabled ${cfg}_checking && continue
        enable ${cfg}_checking
671
        append allopts $cfg
672

673 674
        eval dep_all="\$${cfg}_deps"
        eval dep_any="\$${cfg}_deps_any"
675
        eval dep_sel="\$${cfg}_select"
676
        eval dep_sgs="\$${cfg}_suggest"
677 678
        eval dep_ifa="\$${cfg}_if"
        eval dep_ifn="\$${cfg}_if_any"
679

680
        pushvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
681
        do_check_deps $dep_all $dep_any $dep_sel $dep_sgs $dep_ifa $dep_ifn
682
        popvar cfg dep_all dep_any dep_sel dep_sgs dep_ifa dep_ifn
683

684 685
        [ -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
686 687
        enabled_all  $dep_all || disable $cfg
        enabled_any  $dep_any || disable $cfg
688
        disabled_any $dep_sel && disable $cfg
689

690
        if enabled $cfg; then
691
            enable_deep $dep_sel
692
            enable_deep_weak $dep_sgs
693 694
        fi

695
        disable ${cfg}_checking
696 697 698
    done
}

699 700 701 702 703 704 705 706 707 708 709 710
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
}

711 712
print_config(){
    pfx=$1
713 714
    files=$2
    shift 2
715 716 717 718 719 720 721 722 723 724 725 726 727 728
    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\$/) {
729
                    n = -v ? \"\" : \"!\";
730
                    printf(\"%s%s=yes\\n\", n, c) >>file;
731 732 733 734 735 736
                } else if (file ~ /\\.texi\$/) {
                    pre = -v ? \"\" : \"@c \";
                    yesno = \$2;
                    c2 = tolower(c);
                    gsub(/_/, \"-\", c2);
                    printf(\"%s@set %s %s\\n\", pre, c2, yesno) >>file;
737 738 739
                }
            }
        }"
740 741
}

742 743 744 745
print_enabled(){
    suf=$1
    shift
    for v; do
746
        enabled $v && printf "%s\n" ${v%$suf};
747 748 749
    done
}

750 751 752 753 754 755
append(){
    var=$1
    shift
    eval "$var=\"\$$var $*\""
}

756 757 758 759 760 761
prepend(){
    var=$1
    shift
    eval "$var=\"$* \$$var\""
}

762 763 764 765 766 767 768 769 770
unique(){
    var=$1
    uniq_list=""
    for tok in $(eval echo \$$var); do
        uniq_list="$(filter_out $tok $uniq_list) $tok"
    done
    eval "$var=\"${uniq_list}\""
}

771
add_cppflags(){
772
    append CPPFLAGS "$@"
773 774
}

775
add_cflags(){
776
    append CFLAGS $($cflags_filter "$@")
777 778
}

Mohamed Naufal's avatar
Mohamed Naufal committed
779
add_cxxflags(){
780
    append CXXFLAGS $($cflags_filter "$@")
Mohamed Naufal's avatar
Mohamed Naufal committed
781 782
}

783
add_asflags(){
784
    append ASFLAGS $($asflags_filter "$@")
785 786
}

787
add_ldflags(){
788
    append LDFLAGS $($ldflags_filter "$@")
789 790
}

791 792 793 794
add_ldexeflags(){
    append LDEXEFLAGS $($ldflags_filter "$@")
}

795
add_stripflags(){
796
    append ASMSTRIPFLAGS "$@"
797 798
}

799
add_extralibs(){
800
    prepend extralibs $($ldflags_filter "$@")
801 802
}

803 804 805 806
add_host_cppflags(){
    append host_cppflags "$@"
}

807 808 809 810 811 812
add_host_cflags(){
    append host_cflags $($host_cflags_filter "$@")
}

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

815 816 817 818 819 820
add_compat(){
    append compat_objs $1
    shift
    map 'add_cppflags -D$v' "$@"
}

821
check_cmd(){
822
    log "$@"
823
    "$@" >> $logfile 2>&1
824 825
}

826 827 828 829 830
check_stat(){
    log check_stat "$@"
    stat "$1" >> $logfile 2>&1
}

831 832 833 834
cc_o(){
    eval printf '%s\\n' $CC_O
}

835 836 837 838
cc_e(){
    eval printf '%s\\n' $CC_E
}

839
check_cc(){
840
    log check_cc "$@"
841
    cat > $TMPC
842
    log_file $TMPC
843
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
844 845
}

Mohamed Naufal's avatar
Mohamed Naufal committed
846 847 848 849
check_cxx(){
    log check_cxx "$@"
    cat > $TMPCPP
    log_file $TMPCPP
850
    check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
Mohamed Naufal's avatar
Mohamed Naufal committed
851 852
}

853 854 855 856
check_oc(){
    log check_oc "$@"
    cat > $TMPM
    log_file $TMPM
857
    check_cmd $cc -Werror=missing-prototypes $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPM
858 859
}

860 861
check_cpp(){
    log check_cpp "$@"
862
    cat > $TMPC
863
    log_file $TMPC
864
    check_cmd $cc $CPPFLAGS $CFLAGS "$@" $(cc_e $TMPO) $TMPC
865 866
}

867 868 869 870
as_o(){
    eval printf '%s\\n' $AS_O
}

871 872
check_as(){
    log check_as "$@"
873 874 875
    cat > $TMPS
    log_file $TMPS
    check_cmd $as $CPPFLAGS $ASFLAGS "$@" $AS_C $(as_o $TMPO) $TMPS
876 877
}

878 879
check_inline_asm(){
    log check_inline_asm "$@"
880
    name="$1"
881
    code="$2"
882
    shift 2
883
    disable $name
884
    check_cc "$@" <<EOF && enable $name
885
void foo(void){ __asm__ volatile($code); }
886 887 888
EOF
}

889 890 891 892 893 894
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
895 896 897 898 899
check_yasm(){
    log check_yasm "$@"
    echo "$1" > $TMPS
    log_file $TMPS
    shift 1
900
    check_cmd $yasmexe $YASMFLAGS -Werror "$@" -o $TMPO $TMPS
Loren Merritt's avatar
Loren Merritt committed
901 902
}

903 904 905 906
ld_o(){
    eval printf '%s\\n' $LD_O
}

907
check_ld(){
908
    log check_ld "$@"
Mohamed Naufal's avatar
Mohamed Naufal committed
909 910
    type=$1
    shift 1
Jonas Bechtel's avatar
Jonas Bechtel committed
911 912
    flags=$(filter_out '-l*|*.so' $@)
    libs=$(filter '-l*|*.so' $@)
913
    check_$type $($cflags_filter $flags) || return
914 915
    flags=$($ldflags_filter $flags)
    libs=$($ldflags_filter $libs)
916
    check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
917 918
}

919 920 921 922 923 924 925
print_include(){
    hdr=$1
    test "${hdr%.h}" = "${hdr}" &&
        echo "#include $hdr"    ||
        echo "#include <$hdr>"
}

926 927 928 929 930 931 932 933
check_code(){
    log check_code "$@"
    check=$1
    headers=$2
    code=$3
    shift 3
    {
        for hdr in $headers; do
934
            print_include $hdr
935 936 937 938 939
        done
        echo "int main(void) { $code; return 0; }"
    } | check_$check "$@"
}

940 941
check_cppflags(){
    log check_cppflags "$@"
942
    check_cc "$@" <<EOF && append CPPFLAGS "$@"
943 944 945 946
int x;
EOF
}

947 948
test_cflags(){
    log test_cflags "$@"
949
    set -- $($cflags_filter "$@")
950
    check_cc "$@" <<EOF
951 952 953 954
int x;
EOF
}

955 956 957 958 959
check_cflags(){
    log check_cflags "$@"
    test_cflags "$@" && add_cflags "$@"
}

Mohamed Naufal's avatar
Mohamed Naufal committed
960 961
check_cxxflags(){
    log check_cxxflags "$@"
962
    set -- $($cflags_filter "$@")
Mohamed Naufal's avatar
Mohamed Naufal committed
963 964 965 966 967
    check_cxx "$@" <<EOF && append CXXFLAGS "$@"
int x;
EOF
}

968 969
test_ldflags(){
    log test_ldflags "$@"
Mohamed Naufal's avatar
Mohamed Naufal committed
970
    check_ld "cc" "$@" <<EOF
971
int main(void){ return 0; }
972 973 974
EOF
}

975 976 977 978 979
check_ldflags(){
    log check_ldflags "$@"
    test_ldflags "$@" && add_ldflags "$@"
}

980 981 982 983 984 985
test_stripflags(){
    log test_stripflags "$@"
    # call check_cc to get a fresh TMPO
    check_cc <<EOF
int main(void) { return 0; }
EOF
986
    check_cmd $strip $ASMSTRIPFLAGS "$@" $TMPO
987 988 989 990 991 992 993
}

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

994
check_header(){
995
    log check_header "$@"
996 997
    header=$1
    shift
998 999
    disable_safe $header
    check_cpp "$@" <<EOF && enable_safe $header
1000 1001 1002 1003 1004
#include <$header>
int x;
EOF
}

1005 1006
check_header_oc(){
    log check_header_oc "$@"
1007
    rm -f -- "$TMPO"
1008 1009
    header=$1
    shift
1010
    disable_safe $header
1011 1012 1013
    {
       echo "#include <$header>"
       echo "int main(void) { return 0; }"
1014
    } | check_oc && check_stat "$TMPO" && enable_safe $headers
1015 1016
}

1017
check_func(){
1018
    log check_func "$@"
1019 1020
    func=$1
    shift
Måns Rullgård's avatar
Måns Rullgård committed
1021
    disable $func
Mohamed Naufal's avatar
Mohamed Naufal committed
1022
    check_ld "cc" "$@" <<EOF && enable $func
1023
extern int $func();
1024
int main(void){ $func(); }
1025 1026 1027
EOF
}

1028
check_mathfunc(){
1029
    log check_mathfunc "$@"
1030
    func=$1
1031 1032 1033
    narg=$2
    shift 2
    test $narg = 2 && args="f, g" || args="f"
1034 1035 1036
    disable $func
    check_ld "cc" "$@" <<EOF && enable $func
#include <math.h>
1037
float foo(float f, float g) { return $func($args); }
1038 1039 1040 1041
int main(void){ return (int) foo; }
EOF
}

1042 1043
check_func_headers(){
    log check_func_headers "$@"
1044
    headers=$1
1045
    funcs=$2
1046
    shift 2
1047 1048
    {
        for hdr in $headers; do
1049
            print_include $hdr
1050 1051 1052 1053 1054
        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
1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074
    } | 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
1075 1076
}

1077 1078 1079 1080
check_cpp_condition(){
    log check_cpp_condition "$@"
    header=$1
    condition=$2
1081
    shift 2
1082
    check_cpp "$@" <<EOF
1083 1084 1085 1086 1087 1088 1089
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

1090 1091 1092 1093 1094
check_lib(){
    log check_lib "$@"
    header="$1"
    func="$2"
    shift 2
1095
    check_header $header && check_func $func "$@" && add_extralibs "$@"
1096 1097
}

1098 1099 1100
check_lib2(){
    log check_lib2 "$@"
    headers="$1"
1101
    funcs="$2"
1102
    shift 2
1103
    check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
1104 1105
}

Mohamed Naufal's avatar
Mohamed Naufal committed
1106 1107 1108 1109 1110 1111 1112 1113
check_lib_cpp(){
    log check_lib_cpp "$@"
    headers="$1"
    classes="$2"
    shift 2
    check_class_headers_cpp "$headers" "$classes" "$@" && add_extralibs "$@"
}

1114 1115
check_pkg_config(){
    log check_pkg_config "$@"
1116 1117
    pkgandversion="$1"
    pkg="${1%% *}"
1118 1119 1120
    headers="$2"
    funcs="$3"
    shift 3
1121
    check_cmd $pkg_config --exists --print-errors $pkgandversion || return
1122 1123
    pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
    pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
1124
    check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
1125 1126
        set_safe "${pkg}_cflags" $pkg_cflags   &&
        set_safe "${pkg}_libs"   $pkg_libs
1127 1128
}

1129
check_exec(){
Mohamed Naufal's avatar
Mohamed Naufal committed
1130
    check_ld "cc" "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
1131 1132
}

1133
check_exec_crash(){
1134
    code=$(cat)
1135 1136 1137 1138 1139 1140 1141

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

1142
    (check_exec "$@") >> $logfile 2>&1 <<EOF
1143 1144 1145 1146
#include <signal.h>
static void sighandler(int sig){
    raise(SIGTERM);
}
1147
int foo(void){
1148 1149
    $code
}
1150
int (*func_ptr)(void) = foo;
Diego Biurrun's avatar
Diego Biurrun committed
1151
int main(void){
1152 1153 1154 1155 1156 1157
    signal(SIGILL, sighandler);
    signal(SIGFPE, sighandler);
    signal(SIGSEGV, sighandler);
#ifdef SIGBUS
    signal(SIGBUS, sighandler);
#endif
1158
    return func_ptr();
1159 1160 1161 1162
}
EOF
}

1163 1164 1165 1166 1167
check_type(){
    log check_type "$@"
    headers=$1
    type=$2
    shift 2
1168
    disable_safe "$type"
1169
    check_code cc "$headers" "$type v" "$@" && enable_safe "$type"
1170 1171
}

1172
check_struct(){
1173
    log check_struct "$@"
1174 1175 1176 1177 1178
    headers=$1
    struct=$2
    member=$3
    shift 3
    disable_safe "${struct}_${member}"
1179 1180
    check_code cc "$headers" "const void *p = &(($struct *)0)->$member" "$@" &&
        enable_safe "${struct}_${member}"
1181 1182
}

1183 1184 1185 1186 1187 1188 1189
check_builtin(){
    log check_builtin "$@"
    name=$1
    headers=$2
    builtin=$3
    shift 3
    disable "$name"
1190
    check_code ld "$headers" "$builtin" "cc" "$@" && enable "$name"
1191 1192
}

1193 1194 1195 1196 1197 1198 1199 1200 1201 1202
check_compile_assert(){
    log check_compile_assert "$@"
    name=$1
    headers=$2
    condition=$3
    shift 3
    disable "$name"
    check_code cc "$headers" "char c[2 * !!($condition) - 1]" "$@" && enable "$name"
}

1203 1204 1205 1206 1207 1208
require(){
    name="$1"
    header="$2"
    func="$3"
    shift 3
    check_lib $header $func "$@" || die "ERROR: $name not found"
1209 1210
}

1211 1212 1213 1214 1215 1216 1217 1218
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
1219 1220 1221 1222 1223 1224 1225 1226
require_cpp(){
    name="$1"
    headers="$2"
    classes="$3"
    shift 3
    check_lib_cpp "$headers" "$classes" "$@" || die "ERROR: $name not found"
}

1227
use_pkg_config(){
1228
    pkg="$1"
1229
    check_pkg_config "$@" || return 1
1230 1231
    add_cflags    $(get_safe "${pkg}_cflags")
    add_extralibs $(get_safe "${pkg}_libs")
1232 1233
}

1234
require_pkg_config(){
1235
    use_pkg_config "$@" || die "ERROR: $pkg not found using pkg-config$pkg_config_fail_message"
1236 1237
}

1238 1239 1240 1241 1242
require_libfreetype(){
    log require_libfreetype "$@"
    pkg="freetype2"
    check_cmd $pkg_config --exists --print-errors $pkg \
      || die "ERROR: $pkg not found"
1243 1244
    pkg_cflags=$($pkg_config --cflags $pkg_config_flags $pkg)
    pkg_libs=$($pkg_config --libs $pkg_config_flags $pkg)
1245 1246 1247 1248 1249 1250
    {
        echo "#include <ft2build.h>"
        echo "#include FT_FREETYPE_H"
        echo "long check_func(void) { return (long) FT_Init_FreeType; }"
        echo "int main(void) { return 0; }"
    } | check_ld "cc" $pkg_cflags $pkg_libs \
1251 1252
      && set_safe "${pkg}_cflags" $pkg_cflags \
      && set_safe "${pkg}_libs"   $pkg_libs \
1253
      || die "ERROR: $pkg not found"
1254 1255
    add_cflags    $(get_safe "${pkg}_cflags")
    add_extralibs $(get_safe "${pkg}_libs")
1256 1257
}

1258 1259 1260 1261
hostcc_e(){
    eval printf '%s\\n' $HOSTCC_E
}

1262 1263 1264 1265
hostcc_o(){
    eval printf '%s\\n' $HOSTCC_O
}

1266 1267 1268 1269
check_host_cc(){
    log check_host_cc "$@"
    cat > $TMPC
    log_file $TMPC
1270
    check_cmd $host_cc $host_cflags "$@" $HOSTCC_C $(hostcc_o $TMPO) $TMPC
1271 1272
}

1273 1274 1275 1276
check_host_cpp(){
    log check_host_cpp "$@"
    cat > $TMPC
    log_file $TMPC
1277
    check_cmd $host_cc $host_cppflags $host_cflags "$@" $(hostcc_e $TMPO) $TMPC
1278 1279
}

1280 1281 1282 1283 1284 1285 1286
check_host_cppflags(){
    log check_host_cppflags "$@"
    check_host_cc "$@" <<EOF && append host_cppflags "$@"
int x;
EOF
}

1287 1288
check_host_cflags(){
    log check_host_cflags "$@"
1289
    set -- $($host_cflags_filter "$@")
1290 1291 1292 1293 1294
    check_host_cc "$@" <<EOF && append host_cflags "$@"
int x;
EOF
}

1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307
check_host_cpp_condition(){
    log check_host_cpp_condition "$@"
    header=$1
    condition=$2
    shift 2
    check_host_cpp "$@" <<EOF
#include <$header>
#if !($condition)
#error "unsatisfied condition: $condition"
#endif
EOF
}

1308 1309 1310 1311 1312 1313
apply(){
    file=$1
    shift
    "$@" < "$file" > "$file.tmp" && mv "$file.tmp" "$file" || rm "$file.tmp"
}

1314
cp_if_changed(){
1315 1316
    cmp -s "$1" "$2" && echo "$2 is unchanged" && return
    mkdir -p "$(dirname $2)"
Mans Rullgard's avatar
Mans Rullgard committed
1317
    $cp_f "$1" "$2"
1318 1319
}

1320 1321 1322
# CONFIG_LIST contains configurable options, while HAVE_LIST is for
# system-dependent things.

1323 1324 1325 1326 1327
COMPONENT_LIST="
    bsfs
    decoders
    demuxers
    encoders
Vitor Sessak's avatar
Vitor Sessak committed
1328
    filters
1329
    hwaccels
1330
    indevs
1331
    muxers
1332
    outdevs
1333 1334 1335 1336
    parsers
    protocols
"

1337
EXAMPLE_LIST="
1338
    avio_reading_example
1339
    avio_list_dir_example
1340
    decoding_encoding_example
1341
    demuxing_decoding_example
1342
    extract_mvs_example
1343
    filter_audio_example
1344 1345 1346
    filtering_audio_example
    filtering_video_example
    metadata_example
1347
    muxing_example
1348
    qsvdec_example
1349
    remuxing_example
1350 1351
    resampling_audio_example
    scaling_video_example
1352
    transcode_aac_example
1353
    transcoding_example
1354 1355
"

1356 1357 1358
EXTERNAL_LIBRARY_LIST="
    avisynth
    bzlib
1359
    crystalhd
1360
    decklink
1361 1362
    frei0r
    gnutls
1363
    iconv
1364
    ladspa
1365 1366 1367
    libaacplus
    libass
    libbluray
1368
    libbs2b
1369
    libcaca
1370
    libcdio
1371
    libcelt
1372
    libdc1394
1373
    libdcadec
1374 1375
    libfaac
    libfdk_aac
1376
    libflite
1377
    libfontconfig
1378
    libfreetype
1379
    libfribidi
wm4's avatar
wm4 committed
1380
    libgme
1381
    libgsm
1382
    libiec61883
1383
    libilbc
1384
    libmfx
1385
    libmodplug
1386
    libmp3lame
1387
    libnut
1388 1389 1390
    libopencore_amrnb
    libopencore_amrwb
    libopencv
1391
    libopenh264
1392 1393 1394
    libopenjpeg
    libopus
    libpulse
1395
    libquvi
1396 1397
    librtmp
    libschroedinger
1398
    libshine
1399
    libsmbclient
1400
    libsnappy
1401
    libsoxr
1402
    libspeex
1403
    libssh
1404
    libstagefright_h264
1405
    libtheora
1406 1407 1408
    libtwolame
    libutvideo
    libv4l2
1409
    libvidstab
1410 1411 1412 1413
    libvo_aacenc
    libvo_amrwbenc
    libvorbis
    libvpx
1414
    libwavpack
Justin Ruggles's avatar
Justin Ruggles committed
1415
    libwebp
1416
    libx264
Derek Buitenhuis's avatar
Derek Buitenhuis committed
1417
    libx265
1418
    libxavs
1419 1420
    libxcb
    libxcb_shm
1421
    libxcb_shape
1422
    libxcb_xfixes
1423
    libxvid
1424
    libzmq
1425
    libzvbi
1426
    lzma
1427
    mmal
1428
    nvenc
1429
    openal
1430
    opencl
Lukasz Marek's avatar
Lukasz Marek committed
1431
    opengl
1432
    openssl
1433
    sdl
1434
    securetransport
1435
    x11grab
1436
    xlib
1437 1438 1439
    zlib
"

1440
DOCUMENT_LIST="
1441
    doc
1442 1443 1444 1445 1446 1447
    htmlpages
    manpages
    podpages
    txtpages
"

1448
FEATURE_LIST="
1449
    ftrapv
1450 1451 1452 1453 1454 1455 1456 1457 1458 1459
    gray
    hardcoded_tables
    runtime_cpudetect
    safe_bitstream_reader
    shared
    small
    static
    swscale_alpha
"

1460
HWACCEL_LIST="
1461
    d3d11va
1462 1463 1464 1465
    dxva2
    vaapi
    vda
    vdpau
1466
    xvmc
1467
"
1468

1469 1470 1471 1472 1473 1474 1475
LIBRARY_LIST="
    avcodec
    avdevice
    avfilter
    avformat
    avresample
    avutil
1476
    postproc
1477
    swresample
1478 1479 1480
    swscale
"

1481 1482 1483 1484 1485 1486
LICENSE_LIST="
    gpl
    nonfree
    version3
"

1487
PROGRAM_LIST="
1488 1489 1490
    ffplay
    ffprobe
    ffserver
1491 1492 1493
    ffmpeg
"

1494
SUBSYSTEM_LIST="
1495
    dct
1496
    dwt
1497
    error_resilience
1498
    faan
1499
    fast_unaligned
1500
    fft
1501
    lsp
1502
    lzo
1503
    mdct
1504
    pixelutils
1505 1506 1507 1508
    network
    rdft
"

1509 1510
CONFIG_LIST="
    $COMPONENT_LIST
1511
    $DOCUMENT_LIST
1512
    $EXAMPLE_LIST
1513
    $EXTERNAL_LIBRARY_LIST
1514
    $FEATURE_LIST
1515
    $HWACCEL_LIST
1516
    $LICENSE_LIST
1517
    $LIBRARY_LIST
1518
    $PROGRAM_LIST
1519
    $SUBSYSTEM_LIST
1520
    fontconfig
1521
    incompatible_libav_abi
1522
    memalign_hack
1523
    memory_poisoning
1524
    neon_clobber_test
1525
    pic
1526
    pod2man
1527
    raise_major
1528
    thumb
1529
    valgrind_backtrace
1530
    xmm_clobber_test
1531
"
1532

1533
THREADS_LIST="
1534
    pthreads
1535
    os2threads
1536
    w32threads
1537
"
1538

1539
ATOMICS_LIST="
1540 1541
    atomics_gcc
    atomics_suncc
1542
    atomics_win32
1543
"
1544

1545
ARCH_LIST="
1546
    aarch64
1547
    alpha
1548
    arm
1549 1550 1551
    avr32
    avr32_ap
    avr32_uc
1552 1553 1554 1555
    bfin
    ia64
    m68k
    mips
1556
    mips64
1557
    parisc
1558
    ppc
1559
    ppc64
1560 1561 1562 1563
    s390
    sh4
    sparc
    sparc64
1564 1565
    tilegx
    tilepro
1566
    tomi
1567 1568 1569
    x86
    x86_32
    x86_64
1570
"
1571

1572
ARCH_EXT_LIST_ARM="
1573 1574 1575
    armv5te
    armv6
    armv6t2
1576
    armv8
1577
    neon
1578
    vfp
1579
    vfpv3
1580
    setend
1581
"
1582

1583 1584 1585
ARCH_EXT_LIST_MIPS="
    mipsfpu
    mips32r2
1586
    mips32r5
1587
    mips64r6
1588 1589
    mipsdspr1
    mipsdspr2
1590
    msa
1591 1592 1593
"

ARCH_EXT_LIST_LOONGSON="
1594
    loongson3
1595 1596
"

1597
ARCH_EXT_LIST_X86_SIMD="
1598
    amd3dnow
1599
    amd3dnowext
1600
    avx
1601
    avx2
1602
    fma3
1603 1604 1605 1606 1607 1608 1609 1610 1611
    fma4
    mmx
    mmxext
    sse
    sse2
    sse3
    sse4
    sse42
    ssse3
1612
    xop
1613
"
1614

1615 1616 1617 1618
ARCH_EXT_LIST_PPC="
    altivec
    dcbzl
    ldbrx
1619
    power8
1620
    ppc4xx
1621
    vsx
1622 1623
"

1624 1625 1626 1627 1628 1629
ARCH_EXT_LIST_X86="
    $ARCH_EXT_LIST_X86_SIMD
    cpunop
    i686
"

1630
ARCH_EXT_LIST="
1631
    $ARCH_EXT_LIST_ARM
1632
    $ARCH_EXT_LIST_PPC
1633
    $ARCH_EXT_LIST_X86
1634
    $ARCH_EXT_LIST_MIPS
1635
    $ARCH_EXT_LIST_LOONGSON
1636
"
1637

1638 1639 1640 1641 1642 1643 1644
ARCH_FEATURES="
    aligned_stack
    fast_64bit
    fast_clz
    fast_cmov
    local_aligned_8
    local_aligned_16
James Almer's avatar
James Almer committed
1645
    local_aligned_32
1646
    simd_align_16
1647
"
1648

1649 1650
BUILTIN_LIST="
    atomic_cas_ptr
1651
    atomic_compare_exchange
1652 1653 1654 1655
    machine_rw_barrier
    MemoryBarrier
    mm_empty
    rdtsc
1656
    sarestart
1657 1658
    sync_val_compare_and_swap
"
1659
HAVE_LIST_CMDLINE="
1660 1661 1662
    inline_asm
    symver
    yasm
1663
"
1664

1665
HAVE_LIST_PUB="
1666
    bigendian
1667
    fast_unaligned
1668
    incompatible_libav_abi
1669
"
1670

1671 1672 1673 1674
HEADERS_LIST="
    alsa_asoundlib_h
    altivec_h
    arpa_inet_h
1675
    asm_types_h
1676 1677 1678 1679 1680 1681 1682 1683 1684
    cdio_paranoia_h
    cdio_paranoia_paranoia_h
    dev_bktr_ioctl_bt848_h
    dev_bktr_ioctl_meteor_h
    dev_ic_bt8xx_h
    dev_video_bktr_ioctl_bt848_h
    dev_video_meteor_ioctl_meteor_h
    direct_h
    dlfcn_h
1685
    d3d11_h
1686
    dxva_h
1687
    ES2_gl_h
1688 1689 1690 1691 1692 1693
    gsm_h
    io_h
    mach_mach_time_h
    machine_ioctl_bt848_h
    machine_ioctl_meteor_h
    malloc_h
1694 1695
    openjpeg_1_5_openjpeg_h
    OpenGL_gl3_h
1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706
    poll_h
    sndio_h
    soundcard_h
    sys_mman_h
    sys_param_h
    sys_resource_h
    sys_select_h
    sys_soundcard_h
    sys_time_h
    sys_un_h
    sys_videoio_h
1707
    termios_h
1708
    udplite_h
1709
    unistd_h
1710
    valgrind_valgrind_h
1711 1712 1713 1714
    windows_h
    winsock2_h
"

1715 1716 1717 1718
INTRINSICS_LIST="
    intrinsics_neon
"

1719
MATH_FUNCS="
1720 1721
    atanf
    atan2f
1722
    cbrt
1723
    cbrtf
1724
    cosf
1725 1726
    exp2
    exp2f
1727
    expf
1728 1729
    isinf
    isnan
1730
    ldexpf
1731 1732 1733 1734
    llrint
    llrintf
    log2
    log2f
1735
    log10f
1736 1737
    lrint
    lrintf
1738
    powf
1739 1740 1741
    rint
    round
    roundf
1742
    sinf
1743 1744 1745 1746
    trunc
    truncf
"

1747
SYSTEM_FUNCS="
1748
    access
1749
    aligned_malloc
1750
    clock_gettime
Alex Beregszaszi's avatar
Alex Beregszaszi committed
1751
    closesocket
1752
    CommandLineToArgvW
1753
    CoTaskMemFree
1754
    CryptGenRandom
1755
    dlopen
Måns Rullgård's avatar
Måns Rullgård committed
1756
    fcntl
1757
    flt_lim
Måns Rullgård's avatar
Måns Rullgård committed
1758
    fork
1759
    getaddrinfo
1760
    gethrtime
1761
    getopt
1762
    GetProcessAffinityMask
1763
    GetProcessMemoryInfo
1764
    GetProcessTimes
Ramiro Polla's avatar
Ramiro Polla committed
1765
    getrusage
1766
    getservbyport
1767
    GetSystemTimeAsFileTime
1768
    gettimeofday
1769
    glob
Lukasz Marek's avatar
Lukasz Marek committed
1770
    glXGetProcAddress
1771
    gmtime_r
1772
    inet_aton
1773
    isatty
1774
    jack_port_get_latency_range
1775
    kbhit
1776
    localtime_r
1777
    lzo1x_999_compress
1778
    mach_absolute_time
1779
    MapViewOfFile
1780
    memalign
1781
    mkstemp
1782
    mmap
1783
    mprotect
1784
    nanosleep
1785
    PeekNamedPipe
1786
    posix_memalign
1787
    pthread_cancel
1788
    sched_getaffinity
1789
    SetConsoleTextAttribute
1790
    setmode
1791
    setrlimit
1792
    Sleep
1793
    strerror_r
1794 1795 1796 1797
    sysconf
    sysctl
    usleep
    VirtualAlloc
1798
    wglGetProcAddress
1799 1800 1801
"

TOOLCHAIN_FEATURES="
1802
    as_dn_directive
1803
    as_func
1804
    as_object_arch
1805 1806 1807 1808 1809 1810
    asm_mod_q
    attribute_may_alias
    attribute_packed
    ebp_available
    ebx_available
    gnu_as
1811
    gnu_windres
1812 1813
    ibm_asm
    inline_asm_labels
1814
    inline_asm_nonlocal_labels
1815
    inline_asm_direct_symbol_refs
1816
    pragma_deprecated
1817
    rsync_contimeout
1818 1819 1820 1821 1822 1823 1824 1825
    symver_asm_label
    symver_gnu_asm
    vfp_args
    xform_asm
    xmm_clobbers
"

TYPES_LIST="
1826
    CONDITION_VARIABLE_Ptr
1827
    socklen_t
1828
    struct_addrinfo
1829 1830
    struct_group_source_req
    struct_ip_mreq_source
1831
    struct_ipv6_mreq
1832
    struct_pollfd
1833
    struct_rusage_ru_maxrss
1834
    struct_sctp_event_subscribe
1835
    struct_sockaddr_in6
1836
    struct_sockaddr_sa_len
1837
    struct_sockaddr_storage
1838
    struct_stat_st_mtim_tv_nsec
1839
    struct_v4l2_frmivalenum_discrete
1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851
"

HAVE_LIST="
    $ARCH_EXT_LIST
    $(add_suffix _external $ARCH_EXT_LIST)
    $(add_suffix _inline   $ARCH_EXT_LIST)
    $ARCH_FEATURES
    $ATOMICS_LIST
    $BUILTIN_LIST
    $HAVE_LIST_CMDLINE
    $HAVE_LIST_PUB
    $HEADERS_LIST
1852
    $INTRINSICS_LIST
1853 1854 1855 1856 1857 1858 1859
    $MATH_FUNCS
    $SYSTEM_FUNCS
    $THREADS_LIST
    $TOOLCHAIN_FEATURES
    $TYPES_LIST
    atomics_native
    dos_paths
1860
    dxva2api_cobj
1861
    dxva2_lib
1862 1863 1864
    libc_msvcrt
    libdc1394_1
    libdc1394_2
1865
    makeinfo
1866
    makeinfo_html
1867 1868
    perl
    pod2man
1869
    sdl
1870
    section_data_rel_ro
1871
    texi2html
1872
    threads
1873
    vaapi_x11
1874 1875
    vdpau_x11
    xlib
1876
"
1877

Diego Biurrun's avatar
Diego Biurrun committed
1878
# options emitted with CONFIG_ prefix but not available on the command line
1879
CONFIG_EXTRA="
1880
    aandcttables
1881
    ac3dsp
1882
    audio_frame_queue
1883
    audiodsp
1884
    blockdsp
1885
    bswapdsp
1886
    cabac
1887
    dvprofile
1888
    exif
1889 1890
    faandct
    faanidct
1891
    fdctdsp
1892
    fmtconvert
1893
    frame_thread_encoder
1894
    gcrypt
1895
    gmp
1896
    golomb
1897
    gplv3
1898
    h263dsp
1899 1900 1901
    h264chroma
    h264dsp
    h264pred
1902
    h264qpel
1903
    hpeldsp
1904
    huffman
1905
    huffyuvdsp
1906
    huffyuvencdsp
1907
    idctdsp
1908
    iirfilter
1909
    imdct15
1910
    intrax8
1911
    jpegtables
1912
    lgplv3
1913
    llauddsp
1914
    llviddsp
1915
    lpc
1916
    me_cmp
1917
    mpeg_er
1918
    mpegaudio
1919
    mpegaudiodsp
1920
    mpegvideo
1921
    mpegvideoenc
1922
    pixblockdsp
1923
    qpeldsp
1924
    qsv
Anton Khirnov's avatar
Anton Khirnov committed
1925
    qsvdec
1926
    qsvenc
1927
    rangecoder
1928
    riffdec
1929
    riffenc
1930
    rtpdec
1931
    rtpenc_chain
1932
    sinewin
1933
    snappy
1934
    startcode
1935 1936
    texturedsp
    texturedspenc
1937
    tpeldsp
1938
    videodsp
1939
    vp3dsp
1940
    wma_freqs
1941 1942
"

1943
CMDLINE_SELECT="
1944
    $ARCH_EXT_LIST
1945
    $CONFIG_LIST
1946
    $HAVE_LIST_CMDLINE
1947
    $THREADS_LIST
1948
    asm
1949
    cross_compile
1950 1951
    debug
    extra_warnings
1952
    logging
1953
    lto
1954
    optimizations
1955
    rpath
1956
    stripping
1957
"
1958

1959
PATHS_LIST="
1960
    bindir
1961
    datadir
1962
    docdir
1963 1964 1965
    incdir
    libdir
    mandir
1966
    pkgconfigdir
1967 1968
    prefix
    shlibdir
1969
"
1970 1971 1972

CMDLINE_SET="
    $PATHS_LIST
1973
    ar
1974
    arch
1975
    as
1976
    assert_level
1977 1978 1979 1980
    build_suffix
    cc
    cpu
    cross_prefix
Mohamed Naufal's avatar
Mohamed Naufal committed
1981
    cxx
1982
    dep_cc
1983
    doxygen
1984
    env
1985
    extra_version
1986
    gas
1987 1988
    host_cc
    host_cflags
1989
    host_ld
1990 1991
    host_ldflags
    host_libs
1992
    host_os
1993
    install
1994
    ld
1995
    logfile
1996
    malloc_prefix
1997
    nm
1998
    optflags
1999
    pkg_config
2000
    pkg_config_flags
2001
    progs_suffix
2002
    random_seed
2003
    ranlib
Måns Rullgård's avatar
Måns Rullgård committed
2004
    samples
2005
    strip
2006
    sws_max_filter_size
2007 2008
    sysinclude
    sysroot
2009
    target_exec
2010
    target_os
2011
    target_path
2012
    target_samples
2013
    tempprefix
2014
    toolchain
2015
    valgrind
2016
    yasmexe
2017
"
2018

2019 2020
CMDLINE_APPEND="
    extra_cflags
Mohamed Naufal's avatar
Mohamed Naufal committed
2021
    extra_cxxflags
2022
    host_cppflags
2023 2024
"

2025 2026
# code dependency declarations

2027
# architecture extensions
2028

2029 2030
armv5te_deps="arm"
armv6_deps="arm"
2031
armv6t2_deps="arm"
2032
armv8_deps="aarch64"
2033
neon_deps_any="aarch64 arm"
2034
intrinsics_neon_deps="neon"
2035
vfp_deps_any="aarch64 arm"
2036
vfpv3_deps="vfp"
2037
setend_deps="arm"
2038

2039 2040
map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM

2041 2042 2043
mipsfpu_deps="mips"
mipsdspr1_deps="mips"
mipsdspr2_deps="mips"
2044
mips32r2_deps="mips"
2045
mips32r5_deps="mips"
2046
mips64r6_deps="mips"
2047
msa_deps="mips"
2048
loongson3_deps="mips"
2049 2050

altivec_deps="ppc"
2051 2052
dcbzl_deps="ppc"
ldbrx_deps="ppc"
2053
ppc4xx_deps="ppc"
2054 2055
vsx_deps="altivec"
power8_deps="vsx"
2056

2057 2058 2059
cpunop_deps="i686"
x86_64_select="i686"
x86_64_suggest="fast_cmov"
2060

2061 2062
amd3dnow_deps="mmx"
amd3dnowext_deps="amd3dnow"
2063
i686_deps="x86"
2064
mmx_deps="x86"
2065
mmxext_deps="mmx"
2066 2067 2068 2069 2070 2071 2072
sse_deps="mmxext"
sse2_deps="sse"
sse3_deps="sse2"
ssse3_deps="sse3"
sse4_deps="ssse3"
sse42_deps="sse4"
avx_deps="sse42"
2073
xop_deps="avx"
2074
fma3_deps="avx"
2075
fma4_deps="avx"
2076
avx2_deps="avx"
2077

2078 2079 2080 2081
mmx_external_deps="yasm"
mmx_inline_deps="inline_asm"
mmx_suggest="mmx_external mmx_inline"

2082
for ext in $(filter_out mmx $ARCH_EXT_LIST_X86_SIMD); do
2083 2084 2085 2086 2087 2088
    eval dep=\$${ext}_deps
    eval ${ext}_external_deps='"${dep}_external"'
    eval ${ext}_inline_deps='"${dep}_inline"'
    eval ${ext}_suggest='"${ext}_external ${ext}_inline"'
done

2089 2090 2091 2092
aligned_stack_if_any="aarch64 ppc x86"
fast_64bit_if_any="aarch64 alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
fast_clz_if_any="aarch64 alpha avr32 mips ppc x86"
fast_unaligned_if_any="aarch64 ppc x86"
2093
simd_align_16_if_any="altivec neon sse"
2094

2095
# system capabilities
2096
symver_if_any="symver_asm_label symver_gnu_asm"
2097
valgrind_backtrace_deps="!optimizations valgrind_valgrind_h"
2098

2099
# threading support
2100
atomics_gcc_if_any="sync_val_compare_and_swap atomic_compare_exchange"
2101 2102 2103
atomics_suncc_if="atomic_cas_ptr machine_rw_barrier"
atomics_win32_if="MemoryBarrier"
atomics_native_if_any="$ATOMICS_LIST"
2104
w32threads_deps="atomics_native"
2105 2106
threads_if_any="$THREADS_LIST"

2107
# subsystems
2108
dct_select="rdft"
2109
error_resilience_select="me_cmp"
2110 2111
faandct_deps="faan fdctdsp"
faanidct_deps="faan idctdsp"
2112
frame_thread_encoder_deps="encoders threads"
2113
intrax8_select="error_resilience"
2114 2115
mdct_select="fft"
rdft_select="fft"
2116
me_cmp_select="fdctdsp idctdsp pixblockdsp"
2117
mpeg_er_select="error_resilience"
2118
mpegaudio_select="mpegaudiodsp"
2119
mpegaudiodsp_select="dct"
2120
mpegvideo_select="blockdsp h264chroma hpeldsp idctdsp me_cmp videodsp"
2121
mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
2122
qsvdec_select="qsv"
2123
qsvenc_select="qsv"
2124

2125
# decoders / encoders
2126
aac_decoder_select="imdct15 mdct sinewin"
2127
aac_encoder_select="audio_frame_queue iirfilter mdct sinewin"
2128
aac_latm_decoder_select="aac_decoder aac_latm_parser"
2129
ac3_decoder_select="ac3_parser ac3dsp bswapdsp fmtconvert mdct"
2130
ac3_fixed_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
2131 2132
ac3_encoder_select="ac3dsp audiodsp mdct me_cmp"
ac3_fixed_encoder_select="ac3dsp audiodsp mdct me_cmp"
2133
aic_decoder_select="golomb idctdsp"
2134
alac_encoder_select="lpc"
2135
als_decoder_select="bswapdsp"
2136
amrnb_decoder_select="lsp"
2137
amrwb_decoder_select="lsp"
2138
amv_decoder_select="sp5x_decoder exif"
2139
amv_encoder_select="aandcttables jpegtables mpegvideoenc"
2140
ape_decoder_select="bswapdsp llauddsp"
2141
apng_decoder_select="zlib"
2142
apng_encoder_select="huffyuvencdsp zlib"
2143
asv1_decoder_select="blockdsp bswapdsp idctdsp"
2144
asv1_encoder_select="bswapdsp fdctdsp pixblockdsp"
2145
asv2_decoder_select="blockdsp bswapdsp idctdsp"
2146
asv2_encoder_select="bswapdsp fdctdsp pixblockdsp"
2147
atrac1_decoder_select="mdct sinewin"
2148
atrac3_decoder_select="mdct"
Maxim Poliakovski's avatar
Maxim Poliakovski committed
2149
atrac3p_decoder_select="mdct sinewin"
2150
avrn_decoder_select="exif jpegtables"
2151
bink_decoder_select="blockdsp hpeldsp"
2152 2153
binkaudio_dct_decoder_select="mdct rdft dct sinewin wma_freqs"
binkaudio_rdft_decoder_select="mdct rdft sinewin wma_freqs"
2154
cavs_decoder_select="blockdsp golomb h264chroma idctdsp qpeldsp videodsp"
2155
cllc_decoder_select="bswapdsp"
2156
comfortnoise_encoder_select="lpc"
2157
cook_decoder_select="audiodsp mdct sinewin"
2158
cscd_decoder_select="lzo"
2159
cscd_decoder_suggest="zlib"
2160
dca_decoder_select="fmtconvert mdct"
2161
dds_decoder_select="texturedsp"
2162
dirac_decoder_select="dwt golomb videodsp mpegvideoenc"
2163
dnxhd_decoder_select="blockdsp idctdsp"
2164
dnxhd_encoder_select="aandcttables blockdsp fdctdsp idctdsp mpegvideoenc pixblockdsp"
2165
dvvideo_decoder_select="dvprofile idctdsp"
2166
dvvideo_encoder_select="dvprofile fdctdsp me_cmp pixblockdsp"
2167
dxa_decoder_select="zlib"
2168
eac3_decoder_select="ac3_decoder"
2169
eac3_encoder_select="ac3_encoder"
2170
eamad_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpegvideo"
2171
eatgq_decoder_select="aandcttables"
2172
eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpeg1video_decoder"
2173
exr_decoder_select="zlib"
2174 2175
ffv1_decoder_select="golomb rangecoder"
ffv1_encoder_select="rangecoder"
2176 2177
ffvhuff_decoder_select="huffyuv_decoder"
ffvhuff_encoder_select="huffyuv_encoder"
Kostya Shishkov's avatar
Kostya Shishkov committed
2178
fic_decoder_select="golomb"
2179
flac_decoder_select="golomb"
2180
flac_encoder_select="bswapdsp golomb lpc"
2181 2182 2183 2184
flashsv_decoder_select="zlib"
flashsv_encoder_select="zlib"
flashsv2_encoder_select="zlib"
flashsv2_decoder_select="zlib"
2185
flv_decoder_select="h263_decoder"
2186
flv_encoder_select="h263_encoder"
2187 2188
fourxm_decoder_select="blockdsp bswapdsp"
fraps_decoder_select="bswapdsp huffman"
2189
g2m_decoder_select="blockdsp idctdsp jpegtables zlib"
2190
g729_decoder_select="audiodsp"
2191
h261_decoder_select="mpeg_er mpegvideo"
2192
h261_encoder_select="aandcttables mpegvideoenc"
2193
h263_decoder_select="error_resilience h263_parser h263dsp mpeg_er mpegvideo qpeldsp"
2194
h263_encoder_select="aandcttables h263dsp mpegvideoenc"
2195
h263i_decoder_select="h263_decoder"
2196
h263p_decoder_select="h263_decoder"
2197
h263p_encoder_select="h263_encoder"
2198
h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel startcode videodsp"
2199
h264_decoder_suggest="error_resilience"
2200
h264_qsv_decoder_deps="libmfx"
Anton Khirnov's avatar
Anton Khirnov committed
2201
h264_qsv_decoder_select="h264_mp4toannexb_bsf h264_parser qsvdec h264_qsv_hwaccel"
2202 2203
h264_qsv_encoder_deps="libmfx"
h264_qsv_encoder_select="qsvenc"
2204 2205 2206
hap_decoder_select="snappy texturedsp"
hap_encoder_deps="libsnappy"
hap_encoder_select="texturedspenc"
2207
hevc_decoder_select="bswapdsp cabac golomb videodsp"
2208 2209
huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp"
huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llviddsp"
2210
iac_decoder_select="imc_decoder"
2211
imc_decoder_select="bswapdsp fft mdct sinewin"
2212
indeo3_decoder_select="hpeldsp"
2213
interplay_video_decoder_select="hpeldsp"
2214
jpegls_decoder_select="golomb mjpeg_decoder"
2215
jpegls_encoder_select="golomb"
2216
jv_decoder_select="blockdsp"
2217
lagarith_decoder_select="huffyuvdsp"
2218
ljpeg_encoder_select="aandcttables idctdsp jpegtables"
2219
loco_decoder_select="golomb"
2220
mdec_decoder_select="blockdsp idctdsp mpegvideo"
2221
metasound_decoder_select="lsp mdct sinewin"
2222
mimic_decoder_select="blockdsp bswapdsp hpeldsp idctdsp"
2223
mjpeg_decoder_select="blockdsp hpeldsp exif idctdsp jpegtables"
2224
mjpeg_encoder_select="aandcttables jpegtables mpegvideoenc"
2225
mjpegb_decoder_select="mjpeg_decoder"
2226
mlp_decoder_select="mlp_parser"
2227
motionpixels_decoder_select="bswapdsp"
2228 2229 2230 2231 2232 2233 2234 2235 2236 2237
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"
2238
mpc7_decoder_select="bswapdsp mpegaudiodsp"
2239
mpc8_decoder_select="mpegaudiodsp"
2240
mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
2241
mpeg_xvmc_decoder_select="mpeg2video_decoder"
2242
mpegvideo_decoder_select="error_resilience mpeg_er mpegvideo"
2243
mpeg1video_decoder_select="error_resilience mpeg_er mpegvideo"
2244
mpeg1video_encoder_select="aandcttables mpegvideoenc h263dsp"
2245
mpeg2video_decoder_select="error_resilience mpeg_er mpegvideo"
2246
mpeg2video_encoder_select="aandcttables mpegvideoenc h263dsp"
2247 2248
mpeg4_decoder_select="h263_decoder mpeg4video_parser"
mpeg4_encoder_select="h263_encoder"
2249 2250
msmpeg4v1_decoder_select="h263_decoder"
msmpeg4v2_decoder_select="h263_decoder"
2251
msmpeg4v2_encoder_select="h263_encoder"
2252
msmpeg4v3_decoder_select="h263_decoder"
2253
msmpeg4v3_encoder_select="h263_encoder"
2254
mss2_decoder_select="error_resilience mpeg_er qpeldsp vc1_decoder"
2255
mxpeg_decoder_select="mjpeg_decoder"
2256
nellymoser_decoder_select="mdct sinewin"
2257
nellymoser_encoder_select="audio_frame_queue mdct sinewin"
2258
nuv_decoder_select="idctdsp lzo"
Kostya Shishkov's avatar
Kostya Shishkov committed
2259
on2avc_decoder_select="mdct"
2260
opus_decoder_deps="swresample"
2261
opus_decoder_select="imdct15"
2262
png_decoder_select="zlib"
2263
png_encoder_select="huffyuvencdsp zlib"
2264
prores_decoder_select="blockdsp idctdsp"
2265
prores_encoder_select="fdctdsp"
2266
qcelp_decoder_select="lsp"
2267
qdm2_decoder_select="mdct rdft mpegaudiodsp"
2268 2269
ra_144_encoder_select="audio_frame_queue lpc audiodsp"
ra_144_decoder_select="audiodsp"
2270
ralf_decoder_select="golomb"
2271 2272
rawvideo_decoder_select="bswapdsp"
rtjpeg_decoder_select="me_cmp"
2273
rv10_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
2274
rv10_encoder_select="h263_encoder"
2275
rv20_decoder_select="error_resilience h263_decoder h263dsp mpeg_er"
2276
rv20_encoder_select="h263_encoder"
2277 2278
rv30_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo videodsp"
rv40_decoder_select="error_resilience golomb h264chroma h264pred h264qpel mpeg_er mpegvideo videodsp"
2279
shorten_decoder_select="golomb"
2280
sipr_decoder_select="lsp"
2281
snow_decoder_select="dwt h264qpel hpeldsp me_cmp rangecoder videodsp"
2282
snow_encoder_select="aandcttables dwt h264qpel hpeldsp me_cmp mpegvideoenc rangecoder"
2283 2284
sonic_decoder_select="golomb rangecoder"
sonic_encoder_select="golomb rangecoder"
2285
sonic_ls_encoder_select="golomb rangecoder"
2286
sp5x_decoder_select="mjpeg_decoder"
2287
svq1_decoder_select="hpeldsp"
2288
svq1_encoder_select="aandcttables hpeldsp me_cmp mpegvideoenc"
2289
svq3_decoder_select="h264_decoder hpeldsp tpeldsp"
2290
svq3_decoder_suggest="zlib"
2291
tak_decoder_select="audiodsp"
2292
tdsc_decoder_select="zlib mjpeg_decoder"
2293
theora_decoder_select="vp3_decoder"
2294
thp_decoder_select="mjpeg_decoder"
2295
tiff_decoder_suggest="zlib lzma"
2296
tiff_encoder_suggest="zlib"
2297
truehd_decoder_select="mlp_parser"
2298 2299
truemotion2_decoder_select="bswapdsp"
truespeech_decoder_select="bswapdsp"
2300
tscc_decoder_select="zlib"
2301
twinvq_decoder_select="mdct lsp sinewin"
2302
txd_decoder_select="texturedsp"
2303 2304
utvideo_decoder_select="bswapdsp"
utvideo_encoder_select="bswapdsp huffman huffyuvencdsp"
2305
vble_decoder_select="huffyuvdsp"
2306
vc1_decoder_select="blockdsp error_resilience h263_decoder h264chroma h264qpel intrax8 mpeg_er qpeldsp startcode"
2307
vc1image_decoder_select="vc1_decoder"
2308 2309
vorbis_decoder_select="mdct"
vorbis_encoder_select="mdct"
2310
vp3_decoder_select="hpeldsp vp3dsp videodsp"
2311 2312
vp5_decoder_select="h264chroma hpeldsp videodsp vp3dsp"
vp6_decoder_select="h264chroma hpeldsp huffman videodsp vp3dsp"
2313 2314
vp6a_decoder_select="vp6_decoder"
vp6f_decoder_select="vp6_decoder"
2315
vp7_decoder_select="h264pred videodsp"
2316
vp8_decoder_select="h264pred videodsp"
2317
vp9_decoder_select="videodsp vp9_parser"
2318
webp_decoder_select="vp8_decoder"
2319
wmalossless_decoder_select="llauddsp"
2320 2321 2322 2323 2324
wmapro_decoder_select="mdct sinewin wma_freqs"
wmav1_decoder_select="mdct sinewin wma_freqs"
wmav1_encoder_select="mdct sinewin wma_freqs"
wmav2_decoder_select="mdct sinewin wma_freqs"
wmav2_encoder_select="mdct sinewin wma_freqs"
2325
wmavoice_decoder_select="lsp rdft dct mdct sinewin"
2326
wmv1_decoder_select="h263_decoder"
2327
wmv1_encoder_select="h263_encoder"
2328
wmv2_decoder_select="blockdsp h263_decoder idctdsp intrax8 videodsp"
2329
wmv2_encoder_select="h263_encoder"
2330
wmv3_decoder_select="vc1_decoder"
2331
wmv3image_decoder_select="wmv3_decoder"
2332 2333 2334 2335 2336
zerocodec_decoder_select="zlib"
zlib_decoder_select="zlib"
zlib_encoder_select="zlib"
zmbv_decoder_select="zlib"
zmbv_encoder_select="zlib"
2337

2338
# hardware accelerators
2339
crystalhd_deps="libcrystalhd_libcrystalhd_if_h"
2340
d3d11va_deps="d3d11_h dxva_h ID3D11VideoDecoder"
2341
dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode"
2342
vaapi_deps="va_va_h"
2343
vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
2344
vda_extralibs="-framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore"
2345
vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"
2346
xvmc_deps="X11_extensions_XvMClib_h"
2347

2348 2349 2350 2351
h263_vaapi_hwaccel_deps="vaapi"
h263_vaapi_hwaccel_select="h263_decoder"
h263_vdpau_hwaccel_deps="vdpau"
h263_vdpau_hwaccel_select="h263_decoder"
2352
h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser"
2353 2354
h264_d3d11va_hwaccel_deps="d3d11va"
h264_d3d11va_hwaccel_select="h264_decoder"
2355 2356
h264_dxva2_hwaccel_deps="dxva2"
h264_dxva2_hwaccel_select="h264_decoder"
2357 2358 2359 2360
h264_mmal_decoder_deps="mmal"
h264_mmal_hwaccel_deps="mmal"
h264_mmal_decoder_select="h264_decoder"
h264_mmal_encoder_deps="mmal"
2361
h264_qsv_hwaccel_deps="libmfx"
2362 2363
h264_vaapi_hwaccel_deps="vaapi"
h264_vaapi_hwaccel_select="h264_decoder"
2364 2365
h264_vda_decoder_deps="vda"
h264_vda_decoder_select="h264_decoder"
2366 2367
h264_vda_hwaccel_deps="vda"
h264_vda_hwaccel_select="h264_decoder"
2368 2369
h264_vda_old_hwaccel_deps="vda"
h264_vda_old_hwaccel_select="h264_decoder"
2370 2371
h264_vdpau_decoder_deps="vdpau"
h264_vdpau_decoder_select="h264_decoder"
2372 2373
h264_vdpau_hwaccel_deps="vdpau"
h264_vdpau_hwaccel_select="h264_decoder"
2374 2375
hevc_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_HEVC"
hevc_d3d11va_hwaccel_select="hevc_decoder"
2376 2377
hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC"
hevc_dxva2_hwaccel_select="hevc_decoder"
2378 2379
mpeg_vdpau_decoder_deps="vdpau"
mpeg_vdpau_decoder_select="mpeg2video_decoder"
2380 2381
mpeg_xvmc_hwaccel_deps="xvmc"
mpeg_xvmc_hwaccel_select="mpeg2video_decoder"
2382 2383
mpeg1_vdpau_decoder_deps="vdpau"
mpeg1_vdpau_decoder_select="mpeg1video_decoder"
2384 2385
mpeg1_vdpau_hwaccel_deps="vdpau"
mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
2386 2387
mpeg1_xvmc_hwaccel_deps="xvmc"
mpeg1_xvmc_hwaccel_select="mpeg1video_decoder"
2388
mpeg2_crystalhd_decoder_select="crystalhd"
2389 2390
mpeg2_d3d11va_hwaccel_deps="d3d11va"
mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder"
2391 2392
mpeg2_dxva2_hwaccel_deps="dxva2"
mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
2393 2394 2395 2396
mpeg2_vaapi_hwaccel_deps="vaapi"
mpeg2_vaapi_hwaccel_select="mpeg2video_decoder"
mpeg2_vdpau_hwaccel_deps="vdpau"
mpeg2_vdpau_hwaccel_select="mpeg2video_decoder"
2397 2398
mpeg2_xvmc_hwaccel_deps="xvmc"
mpeg2_xvmc_hwaccel_select="mpeg2video_decoder"
2399
mpeg4_crystalhd_decoder_select="crystalhd"
2400 2401
mpeg4_vaapi_hwaccel_deps="vaapi"
mpeg4_vaapi_hwaccel_select="mpeg4_decoder"
2402 2403
mpeg4_vdpau_decoder_deps="vdpau"
mpeg4_vdpau_decoder_select="mpeg4_decoder"
2404 2405
mpeg4_vdpau_hwaccel_deps="vdpau"
mpeg4_vdpau_hwaccel_select="mpeg4_decoder"
2406 2407
msmpeg4_crystalhd_decoder_select="crystalhd"
vc1_crystalhd_decoder_select="crystalhd"
2408 2409
vc1_d3d11va_hwaccel_deps="d3d11va"
vc1_d3d11va_hwaccel_select="vc1_decoder"
2410 2411
vc1_dxva2_hwaccel_deps="dxva2"
vc1_dxva2_hwaccel_select="vc1_decoder"
2412 2413
vc1_vaapi_hwaccel_deps="vaapi"
vc1_vaapi_hwaccel_select="vc1_decoder"
2414 2415
vc1_vdpau_decoder_deps="vdpau"
vc1_vdpau_decoder_select="vc1_decoder"
2416 2417
vc1_vdpau_hwaccel_deps="vdpau"
vc1_vdpau_hwaccel_select="vc1_decoder"
2418
wmv3_crystalhd_decoder_select="crystalhd"
2419
wmv3_d3d11va_hwaccel_select="vc1_d3d11va_hwaccel"
2420 2421
wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
2422
wmv3_vdpau_decoder_select="vc1_vdpau_decoder"
2423
wmv3_vdpau_hwaccel_select="vc1_vdpau_hwaccel"
2424

2425
# parsers
2426
h264_parser_select="h264_decoder"
2427
hevc_parser_select="hevc_decoder"
2428
mpegvideo_parser_select="mpegvideo"
2429
mpeg4video_parser_select="error_resilience h263dsp mpeg_er mpegvideo qpeldsp"
2430
vc1_parser_select="mpegvideo startcode vc1_decoder"
2431

2432 2433 2434
# bitstream_filters
mjpeg2jpeg_bsf_select="jpegtables"

2435
# external libraries
tipok's avatar
tipok committed
2436
libaacplus_encoder_deps="libaacplus"
2437
libcelt_decoder_deps="libcelt"
2438
libdcadec_decoder_deps="libdcadec"
2439
libfaac_encoder_deps="libfaac"
2440
libfaac_encoder_select="audio_frame_queue"
2441
libfdk_aac_decoder_deps="libfdk_aac"
2442
libfdk_aac_encoder_deps="libfdk_aac"
2443
libfdk_aac_encoder_select="audio_frame_queue"
wm4's avatar
wm4 committed
2444
libgme_demuxer_deps="libgme"
2445 2446
libgsm_decoder_deps="libgsm"
libgsm_encoder_deps="libgsm"
2447 2448
libgsm_ms_decoder_deps="libgsm"
libgsm_ms_encoder_deps="libgsm"
2449 2450
libilbc_decoder_deps="libilbc"
libilbc_encoder_deps="libilbc"
2451
libmodplug_demuxer_deps="libmodplug"
2452
libmp3lame_encoder_deps="libmp3lame"
2453
libmp3lame_encoder_select="audio_frame_queue"
2454 2455
libopencore_amrnb_decoder_deps="libopencore_amrnb"
libopencore_amrnb_encoder_deps="libopencore_amrnb"
2456
libopencore_amrnb_encoder_select="audio_frame_queue"
2457
libopencore_amrwb_decoder_deps="libopencore_amrwb"
2458
libopenh264_encoder_deps="libopenh264"
2459
libopenjpeg_decoder_deps="libopenjpeg"
2460
libopenjpeg_encoder_deps="libopenjpeg"
2461
libopus_decoder_deps="libopus"
2462
libopus_encoder_deps="libopus"
2463
libopus_encoder_select="audio_frame_queue"
2464
libquvi_demuxer_deps="libquvi"
2465 2466
libschroedinger_decoder_deps="libschroedinger"
libschroedinger_encoder_deps="libschroedinger"
2467 2468
libshine_encoder_deps="libshine"
libshine_encoder_select="audio_frame_queue"
2469
libspeex_decoder_deps="libspeex"
Art Clarke's avatar
Art Clarke committed
2470
libspeex_encoder_deps="libspeex"
2471
libspeex_encoder_select="audio_frame_queue"
Mohamed Naufal's avatar
Mohamed Naufal committed
2472
libstagefright_h264_decoder_deps="libstagefright_h264"
2473
libtheora_encoder_deps="libtheora"
2474
libtwolame_encoder_deps="libtwolame"
2475
libvo_aacenc_encoder_deps="libvo_aacenc"
2476
libvo_aacenc_encoder_select="audio_frame_queue"
2477
libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
2478
libvorbis_decoder_deps="libvorbis"
2479
libvorbis_encoder_deps="libvorbis"
2480
libvorbis_encoder_select="audio_frame_queue"
2481 2482 2483 2484
libvpx_vp8_decoder_deps="libvpx"
libvpx_vp8_encoder_deps="libvpx"
libvpx_vp9_decoder_deps="libvpx"
libvpx_vp9_encoder_deps="libvpx"
2485
libwavpack_encoder_deps="libwavpack"
Justin Ruggles's avatar
Justin Ruggles committed
2486
libwebp_encoder_deps="libwebp"
2487
libwebp_anim_encoder_deps="libwebp"
2488
libx264_encoder_deps="libx264"
2489
libx264rgb_encoder_deps="libx264"
2490
libx264rgb_encoder_select="libx264_encoder"
Derek Buitenhuis's avatar
Derek Buitenhuis committed
2491
libx265_encoder_deps="libx265"
2492
libxavs_encoder_deps="libxavs"
2493
libxvid_encoder_deps="libxvid"
2494 2495
libutvideo_decoder_deps="libutvideo"
libutvideo_encoder_deps="libutvideo"
2496
libzvbi_teletext_decoder_deps="libzvbi"
2497
nvenc_encoder_deps="nvenc"
2498
nvenc_h264_encoder_deps="nvenc"
2499
nvenc_hevc_encoder_deps="nvenc"
2500

2501
# demuxers / muxers
2502
ac3_demuxer_select="ac3_parser"
2503
asf_demuxer_select="riffdec"
2504
asf_muxer_select="riffenc"
2505
asf_stream_muxer_select="asf_muxer"
2506
avi_demuxer_select="riffdec exif"
2507
avi_muxer_select="riffenc"
2508
avisynth_demuxer_deps="avisynth"
2509 2510
avisynth_demuxer_select="riffdec"
caf_demuxer_select="riffdec"
2511
dash_muxer_select="mp4_muxer"
2512
dirac_demuxer_select="dirac_parser"
2513
dts_demuxer_select="dca_parser"
Paul B Mahol's avatar
Paul B Mahol committed
2514
dtshd_demuxer_select="dca_parser"
2515 2516
dv_demuxer_select="dvprofile"
dv_muxer_select="dvprofile"
2517
dxa_demuxer_select="riffdec"
2518
eac3_demuxer_select="ac3_parser"
2519
f4v_muxer_select="mov_muxer"
2520
flac_demuxer_select="flac_parser"
2521
hds_muxer_select="flv_muxer"
2522
hls_muxer_select="mpegts_muxer"
2523 2524
image2_alias_pix_demuxer_select="image2_demuxer"
image2_brender_pix_demuxer_select="image2_demuxer"
2525
ipod_muxer_select="mov_muxer"
2526
ismv_muxer_select="mov_muxer"
2527 2528
libnut_demuxer_deps="libnut"
libnut_muxer_deps="libnut"
2529
matroska_audio_muxer_select="matroska_muxer"
2530
matroska_demuxer_select="riffdec"
2531
matroska_demuxer_suggest="bzlib lzo zlib"
2532 2533
matroska_muxer_select="riffenc"
mmf_muxer_select="riffenc"
2534
mov_demuxer_select="riffdec"
2535
mov_demuxer_suggest="zlib"
2536
mov_muxer_select="riffenc rtpenc_chain"
2537
mp3_demuxer_select="mpegaudio_parser"
2538
mp4_muxer_select="mov_muxer"
2539
mpegts_muxer_select="adts_muxer latm_muxer"
2540 2541
mpegtsraw_demuxer_select="mpegts_demuxer"
mxf_d10_muxer_select="mxf_muxer"
2542
mxf_opatom_muxer_select="mxf_muxer"
2543
nut_muxer_select="riffenc"
2544
nuv_demuxer_select="riffdec"
2545
oga_muxer_select="ogg_muxer"
2546
ogg_demuxer_select="golomb"
2547
opus_muxer_select="ogg_muxer"
2548
psp_muxer_select="mov_muxer"
2549
rtp_demuxer_select="sdp_demuxer"
2550
rtpdec_select="asf_demuxer jpegtables mov_demuxer mpegts_demuxer rm_demuxer rtp_protocol"
2551
rtsp_demuxer_select="http_protocol rtpdec"
2552
rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
Martin Storsjö's avatar
Martin Storsjö committed
2553
sap_demuxer_select="sdp_demuxer"
2554
sap_muxer_select="rtp_muxer rtp_protocol rtpenc_chain"
2555
sdp_demuxer_select="rtpdec"
2556
smoothstreaming_muxer_select="ismv_muxer"
2557
spdif_muxer_select="aac_parser"
2558
spx_muxer_select="ogg_muxer"
2559
tak_demuxer_select="tak_parser"
2560 2561
tg2_muxer_select="mov_muxer"
tgp_muxer_select="mov_muxer"
Clément Bœsch's avatar
Clément Bœsch committed
2562
vobsub_demuxer_select="mpegps_demuxer"
2563
w64_demuxer_select="wav_demuxer"
2564
w64_muxer_select="wav_muxer"
2565
wav_demuxer_select="riffdec"
2566 2567
wav_muxer_select="riffenc"
webm_muxer_select="riffenc"
2568
wtv_demuxer_select="riffdec"
2569
wtv_muxer_select="riffenc"
2570 2571
xmv_demuxer_select="riffdec"
xwma_demuxer_select="riffdec"
2572 2573

# indevs / outdevs
2574 2575
alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
alsa_outdev_deps="alsa_asoundlib_h"
2576
avfoundation_indev_extralibs="-framework CoreVideo -framework Foundation -framework AVFoundation -framework CoreMedia"
2577
avfoundation_indev_select="avfoundation"
2578
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
2579
caca_outdev_deps="libcaca"
2580 2581
decklink_outdev_deps="decklink pthreads"
decklink_outdev_extralibs="-lstdc++"
2582 2583
decklink_indev_deps="decklink pthreads"
decklink_indev_extralibs="-lstdc++"
2584
dshow_indev_deps="IBaseFilter"
2585
dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid -loleaut32 -lshlwapi"
2586 2587
dv1394_indev_deps="dv1394"
dv1394_indev_select="dv_demuxer"
2588
fbdev_indev_deps="linux_fb_h"
2589
fbdev_outdev_deps="linux_fb_h"
2590 2591 2592
gdigrab_indev_deps="CreateDIBSection"
gdigrab_indev_extralibs="-lgdi32"
gdigrab_indev_select="bmp_decoder"
2593
iec61883_indev_deps="libiec61883"
2594
jack_indev_deps="jack_jack_h sem_timedwait"
2595
lavfi_indev_deps="avfilter"
2596
libcdio_indev_deps="libcdio"
2597
libdc1394_indev_deps="libdc1394"
2598
libv4l2_indev_deps="libv4l2"
2599
openal_indev_deps="openal"
Lukasz Marek's avatar
Lukasz Marek committed
2600
opengl_outdev_deps="opengl"
2601 2602
oss_indev_deps_any="soundcard_h sys_soundcard_h"
oss_outdev_deps_any="soundcard_h sys_soundcard_h"
2603
pulse_indev_deps="libpulse"
Lukasz Marek's avatar
Lukasz Marek committed
2604
pulse_outdev_deps="libpulse"
2605 2606
qtkit_indev_extralibs="-framework QTKit -framework Foundation -framework QuartzCore"
qtkit_indev_select="qtkit"
2607
sdl_outdev_deps="sdl"
2608 2609
sndio_indev_deps="sndio_h"
sndio_outdev_deps="sndio_h"
2610 2611
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
2612
v4l2_outdev_deps_any="linux_videodev2_h sys_videoio_h"
2613
vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
2614
vfwcap_indev_extralibs="-lavicap32"
2615
xv_outdev_deps="X11_extensions_Xvlib_h XvGetPortAttribute"
2616
xv_outdev_extralibs="-lXv -lX11 -lXext"
2617
x11grab_indev_deps="x11grab"
2618
x11grab_xcb_indev_deps="libxcb"
2619

2620
# protocols
Petri Hintukainen's avatar
Petri Hintukainen committed
2621
bluray_protocol_deps="libbluray"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2622
ffrtmpcrypt_protocol_deps="!librtmp_protocol"
2623
ffrtmpcrypt_protocol_deps_any="gcrypt gmp openssl"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2624
ffrtmpcrypt_protocol_select="tcp_protocol"
2625 2626
ffrtmphttp_protocol_deps="!librtmp_protocol"
ffrtmphttp_protocol_select="http_protocol"
Lukasz Marek's avatar
Lukasz Marek committed
2627
ftp_protocol_select="tcp_protocol"
2628
gopher_protocol_select="network"
2629
http_protocol_select="tcp_protocol"
2630
httpproxy_protocol_select="tcp_protocol"
2631
https_protocol_select="tls_protocol"
Marvin Scholz's avatar
Marvin Scholz committed
2632
icecast_protocol_select="http_protocol"
2633 2634 2635 2636 2637
librtmp_protocol_deps="librtmp"
librtmpe_protocol_deps="librtmp"
librtmps_protocol_deps="librtmp"
librtmpt_protocol_deps="librtmp"
librtmpte_protocol_deps="librtmp"
2638
libsmbclient_protocol_deps="libsmbclient gplv3"
2639
libssh_protocol_deps="libssh"
Måns Rullgård's avatar
Måns Rullgård committed
2640
mmsh_protocol_select="http_protocol"
2641
mmst_protocol_select="network"
2642
rtmp_protocol_deps="!librtmp_protocol"
2643
rtmp_protocol_select="tcp_protocol"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2644
rtmpe_protocol_select="ffrtmpcrypt_protocol"
Samuel Pitoiset's avatar
Samuel Pitoiset committed
2645 2646
rtmps_protocol_deps="!librtmp_protocol"
rtmps_protocol_select="tls_protocol"
2647
rtmpt_protocol_select="ffrtmphttp_protocol"
2648
rtmpte_protocol_select="ffrtmpcrypt_protocol ffrtmphttp_protocol"
2649
rtmpts_protocol_select="ffrtmphttp_protocol https_protocol"
2650
rtp_protocol_select="udp_protocol"
2651 2652
sctp_protocol_deps="struct_sctp_event_subscribe"
sctp_protocol_select="network"
2653
srtp_protocol_select="rtp_protocol"
2654
tcp_protocol_select="network"
2655
tls_gnutls_protocol_deps="gnutls !tls_securetransport_protocol"
2656
tls_gnutls_protocol_select="tcp_protocol"
2657
tls_openssl_protocol_deps="openssl !tls_securetransport_protocol !tls_gnutls_protocol"
2658
tls_openssl_protocol_select="tcp_protocol"
2659
tls_securetransport_protocol_deps="securetransport"
2660
tls_securetransport_protocol_select="tcp_protocol"
2661
tls_protocol_deps_any="tls_securetransport_protocol tls_gnutls_protocol tls_openssl_protocol"
2662
udp_protocol_select="network"
2663
udplite_protocol_select="network"
2664 2665
unix_protocol_deps="sys_un_h"
unix_protocol_select="network"
2666

2667
# filters
2668
amovie_filter_deps="avcodec avformat"
2669
aresample_filter_deps="swresample"
2670
ass_filter_deps="libass"
2671
asyncts_filter_deps="avresample"
2672 2673
atempo_filter_deps="avcodec"
atempo_filter_select="rdft"
2674
azmq_filter_deps="libzmq"
2675
blackframe_filter_deps="gpl"
2676
boxblur_filter_deps="gpl"
2677
bs2b_filter_deps="libbs2b"
2678
colormatrix_filter_deps="gpl"
2679
cover_rect_filter_deps="avcodec avformat gpl"
2680
cropdetect_filter_deps="gpl"
2681
delogo_filter_deps="gpl"
2682
deshake_filter_select="pixelutils"
2683
drawtext_filter_deps="libfreetype"
2684
ebur128_filter_deps="gpl"
2685
eq_filter_deps="gpl"
2686 2687
fftfilt_filter_deps="avcodec"
fftfilt_filter_select="rdft"
2688
flite_filter_deps="libflite"
2689
find_rect_filter_deps="avcodec avformat gpl"
Stefano Sabatini's avatar
Stefano Sabatini committed
2690 2691
frei0r_filter_deps="frei0r dlopen"
frei0r_src_filter_deps="frei0r dlopen"
2692
fspp_filter_deps="gpl"
Clément Bœsch's avatar
Clément Bœsch committed
2693
geq_filter_deps="gpl"
2694
histeq_filter_deps="gpl"
2695
hqdn3d_filter_deps="gpl"
2696
interlace_filter_deps="gpl"
2697
kerndeint_filter_deps="gpl"
2698
ladspa_filter_deps="ladspa dlopen"
2699
mcdeint_filter_deps="avcodec gpl"
2700
movie_filter_deps="avcodec avformat"
2701 2702
mpdecimate_filter_deps="gpl"
mpdecimate_filter_select="pixelutils"
2703
mptestsrc_filter_deps="gpl"
2704
negate_filter_deps="lut_filter"
2705
perspective_filter_deps="gpl"
2706
pp7_filter_deps="gpl"
2707
ocv_filter_deps="libopencv"
2708
owdenoise_filter_deps="gpl"
2709
pan_filter_deps="swresample"
2710
phase_filter_deps="gpl"
Clément Bœsch's avatar
Clément Bœsch committed
2711
pp_filter_deps="gpl postproc"
2712
pullup_filter_deps="gpl"
2713
removelogo_filter_deps="avcodec avformat swscale"
2714
repeatfields_filter_deps="gpl"
2715
resample_filter_deps="avresample"
2716
sab_filter_deps="gpl swscale"
2717
scale_filter_deps="swscale"
2718
select_filter_select="pixelutils"
2719
smartblur_filter_deps="gpl swscale"
2720 2721
showcqt_filter_deps="avcodec"
showcqt_filter_select="fft"
2722 2723 2724
showspectrum_filter_deps="avcodec"
showspectrum_filter_select="rdft"
spp_filter_deps="gpl avcodec"
2725
spp_filter_select="fft idctdsp fdctdsp me_cmp pixblockdsp"
2726
stereo3d_filter_deps="gpl"
2727
subtitles_filter_deps="avformat avcodec libass"
2728
super2xsai_filter_deps="gpl"
2729
tinterlace_filter_deps="gpl"
2730 2731
vidstabdetect_filter_deps="libvidstab"
vidstabtransform_filter_deps="libvidstab"
2732 2733 2734
pixfmts_super2xsai_test_deps="super2xsai_filter"
tinterlace_merge_test_deps="tinterlace_filter"
tinterlace_pad_test_deps="tinterlace_filter"
Arwa Arif's avatar
Arwa Arif committed
2735
uspp_filter_deps="gpl avcodec"
2736
zmq_filter_deps="libzmq"
Paul B Mahol's avatar
Paul B Mahol committed
2737
zoompan_filter_deps="swscale"
2738

2739
# examples
2740
avio_reading="avformat avcodec avutil"
2741
avio_list_dir="avformat avutil"
2742
avcodec_example_deps="avcodec avutil"
2743
decoding_encoding_example_deps="avcodec avformat avutil"
2744
demuxing_decoding_example_deps="avcodec avformat avutil"
2745
extract_mvs_example_deps="avcodec avformat avutil"
2746
filter_audio_example_deps="avfilter avutil"
2747 2748 2749
filtering_audio_example_deps="avfilter avcodec avformat avutil"
filtering_video_example_deps="avfilter avcodec avformat avutil"
metadata_example_deps="avformat avutil"
2750
muxing_example_deps="avcodec avformat avutil swscale"
2751
qsvdec_example_deps="avcodec avutil libmfx h264_qsv_decoder vaapi_x11"
2752
remuxing_example_deps="avcodec avformat avutil"
2753 2754
resampling_audio_example_deps="avutil swresample"
scaling_video_example_deps="avutil swscale"
2755
transcode_aac_example_deps="avcodec avformat swresample"
2756
transcoding_example_deps="avfilter avcodec avformat avutil"
2757

2758
# libraries, in linking order
2759
avcodec_deps="avutil"
2760
avdevice_deps="avformat avcodec avutil"
2761
avfilter_deps="avutil"
2762
avformat_deps="avcodec avutil"
2763
avresample_deps="avutil"
2764
postproc_deps="avutil gpl"
2765
swresample_deps="avutil"
2766
swscale_deps="avutil"
2767

2768
# programs
2769
ffmpeg_deps="avcodec avfilter avformat swresample"
2770 2771
ffmpeg_select="aformat_filter anull_filter atrim_filter format_filter
               null_filter
2772
               setpts_filter trim_filter"
2773
ffplay_deps="avcodec avformat swscale swresample sdl"
2774
ffplay_libs='$sdl_libs'
2775
ffplay_select="rdft crop_filter transpose_filter hflip_filter vflip_filter rotate_filter"
2776
ffprobe_deps="avcodec avformat"
2777 2778
ffserver_deps="avformat fork sarestart"
ffserver_select="ffm_muxer rtp_protocol rtsp_demuxer"
Måns Rullgård's avatar
Måns Rullgård committed
2779

2780 2781 2782
# documentation
podpages_deps="perl"
manpages_deps="perl pod2man"
2783 2784
htmlpages_deps="perl"
htmlpages_deps_any="makeinfo_html texi2html"
2785
txtpages_deps="perl makeinfo"
2786
doc_deps_any="manpages htmlpages podpages txtpages"
2787

Fabrice Bellard's avatar
Fabrice Bellard committed
2788
# default parameters
2789

2790
logfile="config.log"
2791 2792

# installation paths
2793 2794
prefix_default="/usr/local"
bindir_default='${prefix}/bin'
2795
datadir_default='${prefix}/share/ffmpeg'
2796
docdir_default='${prefix}/share/doc/ffmpeg'
2797 2798 2799
incdir_default='${prefix}/include'
libdir_default='${prefix}/lib'
mandir_default='${prefix}/share/man'
2800 2801

# toolchain
2802
ar_default="ar"
2803
cc_default="gcc"
Mohamed Naufal's avatar
Mohamed Naufal committed
2804
cxx_default="g++"
2805
host_cc_default="gcc"
Mans Rullgard's avatar
Mans Rullgard committed
2806
cp_f="cp -f"
2807
doxygen_default="doxygen"
2808
install="install"
2809
ln_s="ln -s -f"
2810
nm_default="nm -g"
2811
objformat="elf"
2812
pkg_config_default=pkg-config
2813 2814 2815 2816 2817
if ranlib 2>&1 | grep -q "\-D "; then
    ranlib_default="ranlib -D"
else
    ranlib_default="ranlib"
fi
2818
strip_default="strip"
2819
yasmexe_default="yasm"
2820
windres_default="windres"
2821 2822

# OS
2823 2824
target_os_default=$(tolower $(uname -s))
host_os=$target_os_default
2825

2826 2827 2828
# machine
if test "$target_os_default" = aix; then
    arch_default=$(uname -p)
2829
    strip_default="strip -X32_64"
2830 2831 2832 2833
else
    arch_default=$(uname -m)
fi
cpu="generic"
2834
intrinsics="none"
2835

2836
# configurable options
2837
enable $PROGRAM_LIST
2838
enable $DOCUMENT_LIST
2839
enable $EXAMPLE_LIST
2840
enable $(filter_out avresample $LIBRARY_LIST)
2841
enable stripping
2842 2843 2844 2845

enable asm
enable debug
enable doc
2846
enable faan faandct faanidct
2847
enable optimizations
2848
enable runtime_cpudetect
2849
enable safe_bitstream_reader
2850
enable static
2851
enable swscale_alpha
2852
enable valgrind_backtrace
2853

2854 2855 2856
sws_max_filter_size_default=256
set_default sws_max_filter_size

2857
# Enable hwaccels by default.
2858
enable d3d11va dxva2 vaapi vda vdpau xvmc
2859
enable xlib
2860

2861
# build settings
2862
SHFLAGS='-shared -Wl,-soname,$$(@F)'
2863 2864
LIBPREF="lib"
LIBSUF=".a"
2865 2866
FULLNAME='$(NAME)$(BUILDSUF)'
LIBNAME='$(LIBPREF)$(FULLNAME)$(LIBSUF)'
2867 2868
SLIBPREF="lib"
SLIBSUF=".so"
2869
SLIBNAME='$(SLIBPREF)$(FULLNAME)$(SLIBSUF)'
2870 2871
SLIBNAME_WITH_VERSION='$(SLIBNAME).$(LIBVERSION)'
SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBMAJOR)'
Måns Rullgård's avatar
Måns Rullgård committed
2872
LIB_INSTALL_EXTRA_CMD='$$(RANLIB) "$(LIBDIR)/$(LIBNAME)"'
2873 2874
SLIB_INSTALL_NAME='$(SLIBNAME_WITH_VERSION)'
SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJOR) $(SLIBNAME)'
2875

2876 2877
asflags_filter=echo
cflags_filter=echo
2878 2879
ldflags_filter=echo

2880
AS_C='-c'
2881
AS_O='-o $@'
2882
CC_C='-c'
2883
CC_E='-E -o $@'
2884
CC_O='-o $@'
2885
CXX_C='-c'
Mohamed Naufal's avatar
Mohamed Naufal committed
2886
CXX_O='-o $@'
2887
LD_O='-o $@'
2888 2889
LD_LIB='-l%'
LD_PATH='-L'
2890
HOSTCC_C='-c'
2891
HOSTCC_E='-E -o $@'
2892
HOSTCC_O='-o $@'
2893
HOSTLD_O='-o $@'
2894

2895
host_libs='-lm'
2896 2897
host_cflags_filter=echo
host_ldflags_filter=echo
2898

2899
target_path='$(CURDIR)'
2900

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

2906
# find source path
2907
if test -f configure; then
2908
    source_path=.
2909
else
2910
    source_path=$(cd $(dirname "$0"); pwd)
2911
    echo "$source_path" | grep -q '[[:blank:]]' &&
2912
        die "Out of tree builds are impossible with whitespace in source path."
2913 2914
    test -e "$source_path/config.h" &&
        die "Out of tree builds are impossible with config.h in source dir."
2915 2916
fi

2917
for v in "$@"; do
2918 2919 2920
    r=${v#*=}
    l=${v%"$r"}
    r=$(sh_quote "$r")
2921
    FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}"
2922
done
2923

2924 2925 2926 2927
find_things(){
    thing=$1
    pattern=$2
    file=$source_path/$3
2928
    sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file"
2929 2930 2931 2932
}

ENCODER_LIST=$(find_things  encoder  ENC      libavcodec/allcodecs.c)
DECODER_LIST=$(find_things  decoder  DEC      libavcodec/allcodecs.c)
2933
HWACCEL_LIST=$(find_things  hwaccel  HWACCEL  libavcodec/allcodecs.c)
2934 2935 2936 2937
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)
2938 2939
OUTDEV_LIST=$(find_things   outdev   OUTDEV   libavdevice/alldevices.c)
INDEV_LIST=$(find_things    indev    _IN      libavdevice/alldevices.c)
2940
PROTOCOL_LIST=$(find_things protocol PROTOCOL libavformat/allformats.c)
2941
FILTER_LIST=$(find_things   filter   FILTER   libavfilter/allfilters.c)
2942

2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956
ALL_COMPONENTS="
    $BSF_LIST
    $DECODER_LIST
    $DEMUXER_LIST
    $ENCODER_LIST
    $FILTER_LIST
    $HWACCEL_LIST
    $INDEV_LIST
    $MUXER_LIST
    $OUTDEV_LIST
    $PARSER_LIST
    $PROTOCOL_LIST
"

2957 2958 2959 2960 2961 2962
for n in $COMPONENT_LIST; do
    v=$(toupper ${n%s})_LIST
    eval enable \$$v
    eval ${n}_if_any="\$$v"
done

2963
enable $ARCH_EXT_LIST
2964 2965 2966 2967 2968 2969 2970

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

2971 2972 2973 2974
print_3_columns() {
    cat | tr ' ' '\n' | sort | pr -r -3 -t
}

2975
show_list() {
Ramiro Polla's avatar
Ramiro Polla committed
2976 2977
    suffix=_$1
    shift
2978
    echo $* | sed s/$suffix//g | print_3_columns
2979 2980 2981
    exit 0
}

2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002
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 }")
}

3003
for opt do
3004 3005
    optval="${opt#*=}"
    case "$opt" in
3006 3007
        --extra-ldflags=*)
            add_ldflags $optval
3008
        ;;
3009 3010 3011
        --extra-ldexeflags=*)
            add_ldexeflags $optval
        ;;
3012 3013
        --extra-libs=*)
            add_extralibs $optval
3014
        ;;
3015 3016
        --disable-devices)
            disable $INDEV_LIST $OUTDEV_LIST
3017
        ;;
3018 3019
        --enable-debug=*)
            debuglevel="$optval"
3020 3021 3022 3023 3024 3025 3026
        ;;
        --disable-programs)
            disable $PROGRAM_LIST
        ;;
        --disable-everything)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
        ;;
3027 3028 3029 3030
        --disable-all)
            map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
            disable $LIBRARY_LIST $PROGRAM_LIST doc
        ;;
3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043
        --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}
3044 3045 3046
            list=$(filter "$name" $list)
            [ "$list" = "" ] && warn "Option $opt did not match anything"
            $action $list
3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066
        ;;
        --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
        ;;
3067 3068
        --fatal-warnings) enable fatal_warnings
        ;;
3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080
        *)
            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
        ;;
3081
    esac
3082 3083
done

3084
for e in $env; do
3085 3086
    eval "export $e"
done
3087

3088 3089
disabled logging && logfile=/dev/null

3090
echo "# $0 $FFMPEG_CONFIGURATION" > $logfile
3091 3092
set >> $logfile

3093 3094
test -n "$valgrind" && toolchain="valgrind-memcheck"

3095
case "$toolchain" in
3096 3097
    clang-asan)
        cc_default="clang"
3098 3099
        add_cflags  -fsanitize=address
        add_ldflags -fsanitize=address
3100 3101 3102
    ;;
    clang-tsan)
        cc_default="clang"
3103 3104
        add_cflags  -fsanitize=thread -pie
        add_ldflags -fsanitize=thread -pie
3105
    ;;
3106 3107 3108 3109 3110
    clang-usan)
        cc_default="clang"
        add_cflags  -fsanitize=undefined
        add_ldflags -fsanitize=undefined
    ;;
3111 3112 3113 3114 3115 3116 3117 3118 3119 3120
    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
    ;;
3121 3122 3123 3124 3125
    gcc-usan)
        cc_default="gcc"
        add_cflags  -fsanitize=undefined
        add_ldflags -fsanitize=undefined
    ;;
3126
    valgrind-massif)
3127
        target_exec_default=${valgrind:-"valgrind"}
3128
        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"
3129
    ;;
3130
    valgrind-memcheck)
3131
        target_exec_default=${valgrind:-"valgrind"}
3132
        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"
3133
    ;;
3134
    msvc)
3135 3136
        # Check whether the current MSVC version needs the C99 converter.
        # From MSVC 2013 (compiler major version 18) onwards, it does actually
3137
        # support enough of C99 to build ffmpeg. Default to the new
3138 3139 3140 3141 3142
        # behaviour if the regexp was unable to match anything, since this
        # successfully parses the version number of existing supported
        # versions that require the converter (MSVC 2010 and 2012).
        cl_major_ver=$(cl 2>&1 | sed -n 's/.*Version \([[:digit:]]\{1,\}\)\..*/\1/p')
        if [ -z "$cl_major_ver" ] || [ $cl_major_ver -ge 18 ]; then
3143
            cc_default="cl"
3144 3145 3146
        else
            cc_default="c99wrap cl"
        fi
3147
        ld_default="link"
3148
        nm_default="dumpbin -symbols"
3149
        ar_default="lib"
3150
        target_os_default="win32"
3151 3152 3153 3154 3155
        # Use a relative path for TMPDIR. This makes sure all the
        # ffconf temp files are written with a relative path, avoiding
        # issues with msys/win32 path conversion for MSVC parameters
        # such as -Fo<file> or -out:<file>.
        TMPDIR=.
3156
    ;;
3157
    icl)
3158 3159
        cc_default="icl"
        ld_default="xilink"
3160 3161 3162
        nm_default="dumpbin -symbols"
        ar_default="xilib"
        target_os_default="win32"
3163
        TMPDIR=.
3164
    ;;
3165 3166 3167 3168
    gcov)
        add_cflags  -fprofile-arcs -ftest-coverage
        add_ldflags -fprofile-arcs -ftest-coverage
    ;;
3169
    hardened)
3170 3171 3172
        add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
        add_cflags   -fno-strict-overflow -fstack-protector-all
        add_ldflags  -Wl,-z,relro -Wl,-z,now
3173
    ;;
3174 3175 3176 3177 3178
    ?*)
        die "Unknown toolchain $toolchain"
    ;;
esac

3179 3180 3181 3182 3183 3184 3185
test -n "$cross_prefix" && enable cross_compile

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

3186 3187
ar_default="${cross_prefix}${ar_default}"
cc_default="${cross_prefix}${cc_default}"
3188
cxx_default="${cross_prefix}${cxx_default}"
3189 3190
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
3191 3192 3193
ranlib_default="${cross_prefix}${ranlib_default}"
strip_default="${cross_prefix}${strip_default}"
windres_default="${cross_prefix}${windres_default}"
3194 3195 3196

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

3197 3198
set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \
    target_exec target_os yasmexe
3199 3200
enabled cross_compile || host_cc_default=$cc
set_default host_cc
3201

3202
pkg_config_fail_message=""
3203 3204 3205
if ! $pkg_config --version >/dev/null 2>&1; then
    warn "$pkg_config not found, library detection may fail."
    pkg_config=false
3206 3207 3208
elif is_in -static $cc $LDFLAGS && ! is_in --static $pkg_config $pkg_config_flags; then
    pkg_config_fail_message="
Note: When building a static binary, add --pkg-config-flags=\"--static\"."
3209 3210
fi

3211 3212 3213 3214 3215
if test $doxygen != $doxygen_default && \
  ! $doxygen --version >/dev/null 2>&1; then
    warn "Specified doxygen \"$doxygen\" not found, API documentation will fail to build."
fi

3216 3217
exesuf() {
    case $1 in
3218
        mingw32*|win32|win64|cygwin*|*-dos|freedos|opendos|os/2*|symbian) echo .exe ;;
3219 3220 3221 3222 3223
    esac
}

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

3225
# set temporary file name
3226
: ${TMPDIR:=$TEMPDIR}
3227
: ${TMPDIR:=$TMP}
3228
: ${TMPDIR:=/tmp}
3229

3230 3231 3232 3233 3234
if [ -n "$tempprefix" ] ; then
    mktemp(){
        echo $tempprefix.${HOSTNAME}.${UID}
    }
elif ! check_cmd mktemp -u XXXXXX; then
3235 3236 3237
    # simple replacement for missing mktemp
    # NOT SAFE FOR GENERAL USE
    mktemp(){
3238
        echo "${2%%XXX*}.${HOSTNAME}.${UID}.$$"
3239 3240 3241 3242 3243 3244
    }
fi

tmpfile(){
    tmp=$(mktemp -u "${TMPDIR}/ffconf.XXXXXXXX")$2 &&
        (set -C; exec > $tmp) 2>/dev/null ||
3245
        die "Unable to create temporary file in $TMPDIR."
3246 3247 3248 3249 3250 3251
    append TMPFILES $tmp
    eval $1=$tmp
}

trap 'rm -f -- $TMPFILES' EXIT

3252
tmpfile TMPASM .asm
3253
tmpfile TMPC   .c
3254
tmpfile TMPCPP .cpp
3255 3256
tmpfile TMPE   $EXESUF
tmpfile TMPH   .h
3257
tmpfile TMPM   .m
3258 3259 3260 3261
tmpfile TMPO   .o
tmpfile TMPS   .S
tmpfile TMPSH  .sh
tmpfile TMPV   .ver
3262 3263

unset -f mktemp
3264

3265 3266
chmod +x $TMPE

3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279
# 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

3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290
armasm_flags(){
    for flag; do
        case $flag in
            # Filter out MSVC cl.exe options from cflags that shouldn't
            # be passed to gas-preprocessor
            -M[TD]*)                                            ;;
            *)                  echo $flag                      ;;
        esac
   done
}

3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308
ccc_flags(){
    for flag; do
        case $flag in
            -std=c99)           echo -c99                       ;;
            -mcpu=*)            echo -arch ${flag#*=}           ;;
            -mieee)             echo -ieee                      ;;
            -O*|-fast)          echo $flag                      ;;
            -fno-math-errno)    echo -assume nomath_errno       ;;
            -g)                 echo -g3                        ;;
            -Wall)              echo -msg_enable level2         ;;
            -Wno-pointer-sign)  echo -msg_disable ptrmismatch1  ;;
            -Wl,*)              echo $flag                      ;;
            -f*|-W*)                                            ;;
            *)                  echo $flag                      ;;
        esac
   done
}

Luca Barbato's avatar
Luca Barbato committed
3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320
cparser_flags(){
    for flag; do
        case $flag in
            -Wno-switch)             echo -Wno-switch-enum ;;
            -Wno-format-zero-length) ;;
            -Wdisabled-optimization) ;;
            -Wno-pointer-sign)       echo -Wno-other ;;
            *)                       echo $flag ;;
        esac
    done
}

3321
msvc_common_flags(){
3322 3323
    for flag; do
        case $flag in
3324 3325 3326 3327 3328 3329
            # 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
3330
            -fomit-frame-pointer) ;;
3331 3332 3333 3334
            -g)                   echo -Z7 ;;
            -fno-math-errno)      ;;
            -fno-common)          ;;
            -fno-signed-zeros)    ;;
3335
            -fPIC)                ;;
3336 3337
            -mthumb)              ;;
            -march=*)             ;;
3338
            -lz)                  echo zlib.lib ;;
3339 3340
            -lavifil32)           echo vfw32.lib ;;
            -lavicap32)           echo vfw32.lib user32.lib ;;
3341
            -l*)                  echo ${flag#-l}.lib ;;
3342
            -L*)                  echo -libpath:${flag#-L} ;;
3343 3344 3345 3346 3347
            *)                    echo $flag ;;
        esac
    done
}

3348 3349 3350 3351
msvc_flags(){
    msvc_common_flags "$@"
    for flag; do
        case $flag in
3352
            -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389     \
3353 3354
                                       -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
                                       -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
3355
                                       -wd4307 \
3356
                                       -wd4273 -wd4554 -wd4701 ;;
3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368
        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 ;;
3369
            -flto)                echo -ipo ;;
3370 3371 3372 3373
        esac
    done
}

3374 3375 3376 3377 3378 3379 3380 3381 3382
icc_flags(){
    for flag; do
        case $flag in
            -flto)                echo -ipo ;;
            *)                    echo $flag ;;
        esac
    done
}

3383 3384 3385
pgi_flags(){
    for flag; do
        case $flag in
3386
            -flto)                echo -Mipa=fast,libopt,libinline,vestigial ;;
3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410
            -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   ;;
3411 3412 3413 3414 3415 3416 3417
                    bonnell)                   echo -xarch=ssse3         ;;
                    corei7|nehalem)            echo -xtarget=nehalem     ;;
                    westmere)                  echo -xtarget=westmere    ;;
                    silvermont)                echo -xarch=sse4_2        ;;
                    corei7-avx|sandybridge)    echo -xtarget=sandybridge ;;
                    core-avx*|ivybridge|haswell|broadwell)
                                               echo -xarch=avx           ;;
3418
                    amdfam10|barcelona)        echo -xtarget=barcelona   ;;
3419 3420
                    btver1)                    echo -xarch=amdsse4a      ;;
                    btver2|bdver*)             echo -xarch=avx           ;;
3421
                    athlon-4|athlon-[mx]p)     echo -xarch=ssea          ;;
3422
                    k8|opteron|athlon64|athlon-fx)
3423 3424
                                               echo -xarch=sse2a         ;;
                    athlon*)                   echo -xarch=pentium_proa  ;;
3425 3426 3427 3428 3429 3430
                esac
                ;;
            -std=c99)             echo -xc99              ;;
            -fomit-frame-pointer) echo -xregs=frameptr    ;;
            -fPIC)                echo -KPIC -xcode=pic32 ;;
            -W*,*)                echo $flag              ;;
3431 3432
            -f*-*|-W*|-mimpure-text)                      ;;
            -shared)              echo -G                 ;;
3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454
            *)                    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        ;;
3455
            -mfpu=vfpv3-d16) echo --float_support=vfpv3d16    ;;
3456 3457 3458 3459
            -msoft-float)   echo --float_support=vfplib       ;;
            -O[0-3]|-mf=*)  echo $flag                        ;;
            -g)             echo -g -mn                       ;;
            -pds=*)         echo $flag                        ;;
3460 3461 3462
            -D*|-I*)        echo $flag                        ;;
            --gcc|--abi=*)  echo $flag                        ;;
            -me)            echo $flag                        ;;
3463 3464 3465 3466
        esac
    done
}

3467 3468 3469 3470
probe_cc(){
    pfx=$1
    _cc=$2

3471 3472
    unset _type _ident _cc_c _cc_e _cc_o _flags _cflags
    unset _ld_o _ldflags _ld_lib _ld_path
3473
    unset _depflags _DEPCMD _DEPFLAGS
3474 3475
    _flags_filter=echo

3476 3477 3478
    if $_cc --version 2>&1 | grep -q '^GNU assembler'; then
        true # no-op to avoid reading stdin in following checks
    elif $_cc -v 2>&1 | grep -q '^gcc.*LLVM'; then
3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496
        _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'
3497
    elif $_cc --version 2>/dev/null | grep -q ^icc; then
3498 3499 3500 3501 3502 3503
        _type=icc
        _ident=$($_cc --version | head -n1)
        _depflags='-MMD'
        _cflags_speed='-O3'
        _cflags_size='-Os'
        _cflags_noopt='-O1'
3504
        _flags_filter=icc_flags
3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515
    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'
3516
        _flags_filter=ccc_flags
3517
    elif $_cc --vsn 2>/dev/null | grep -Eq "ARM (C/C\+\+ )?Compiler"; then
3518 3519
        test -d "$sysroot" || die "No valid sysroot specified."
        _type=armcc
3520
        _ident=$($_cc --vsn | grep -i build | head -n1 | sed 's/.*: //')
3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532
        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'
3533
    elif $_cc -version 2>/dev/null | grep -Eq 'TMS470|TI ARM'; then
3534 3535 3536
        _type=tms470
        _ident=$($_cc -version | head -n1 | tr -s ' ')
        _flags='--gcc --abi=eabi -me'
3537
        _cc_e='-ppl -fe=$@'
3538 3539 3540 3541 3542 3543 3544 3545
        _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)
3546
        _depflags='-MMD -MF $(@:.o=.d) -MT $@'
3547 3548 3549 3550 3551 3552
        _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)'
3553
        _DEPFLAGS='-xM1 -xc99'
3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574
        _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 }')"
3575
        opt_common='-alias=ansi -Mdse -Mlre -Mpre'
3576 3577
        _cflags_speed="-O3 -Mautoinline -Munroll=c:4 $opt_common"
        _cflags_size="-O2 -Munroll=c:1 $opt_common"
3578
        _cflags_noopt="-O"
3579
        _flags_filter=pgi_flags
3580 3581 3582 3583 3584
    elif $_cc 2>&1 | grep -q 'Microsoft.*ARM.*Assembler'; then
        _type=armasm
        _ident=$($_cc | head -n1)
        # 4509: "This form of conditional instruction is deprecated"
        _flags="-nologo -ignore 4509"
3585
        _flags_filter=armasm_flags
3586 3587
    elif $_cc 2>&1 | grep -q Intel; then
        _type=icl
3588
        _ident=$($_cc 2>&1 | head -n1)
3589
        _depflags='-QMMD -QMF$(@:.o=.d) -QMT$@'
3590 3591
        # Not only is O3 broken on 13.x+ but it is slower on all previous
        # versions (tested) as well.
3592 3593 3594
        _cflags_speed="-O2"
        _cflags_size="-O1 -Oi" # -O1 without -Oi miscompiles stuff
        if $_cc 2>&1 | grep -q Linker; then
3595
            _ld_o='-out:$@'
3596 3597 3598
        else
            _ld_o='-Fe$@'
        fi
3599
        _cc_o='-Fo$@'
3600
        _cc_e='-P'
3601
        _flags_filter=icl_flags
3602 3603
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
3604
        # -Qdiag-error to make icl error when seeing certain unknown arguments
3605
        _flags='-nologo -Qdiag-error:4044,10157'
3606
        # -Qvec- -Qsimd- to prevent miscompilation, -GS, fp:precise for consistency
3607
        # with MSVC which enables it by default.
3608
        _cflags='-D_USE_MATH_DEFINES -FIstdlib.h -Dstrtoll=_strtoi64 -Qms0 -Qvec- -Qsimd- -GS -fp:precise'
3609
        disable stripping
3610 3611
    elif $_cc 2>&1 | grep -q Microsoft; then
        _type=msvc
3612
        _ident=$($_cc 2>&1 | head -n1)
3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629
        _DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
        _DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
        _cflags_speed="-O2"
        _cflags_size="-O1"
        if $_cc 2>&1 | grep -q Linker; then
            _ld_o='-out:$@'
        else
            _ld_o='-Fe$@'
        fi
        _cc_o='-Fo$@'
        _cc_e='-P -Fi$@'
        _flags_filter=msvc_flags
        _ld_lib='lib%.a'
        _ld_path='-libpath:'
        _flags='-nologo'
        _cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
        disable stripping
Luca Barbato's avatar
Luca Barbato committed
3630 3631 3632 3633 3634 3635 3636
    elif $_cc --version 2>/dev/null | grep -q ^cparser; then
        _type=cparser
        _ident=$($_cc --version | head -n1)
        _depflags='-MMD'
        _cflags_speed='-O4'
        _cflags_size='-O2'
        _flags_filter=cparser_flags
3637
    fi
3638 3639 3640 3641 3642 3643

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

set_ccvars(){
3644
    eval ${1}_C=\${_cc_c-\${${1}_C}}
3645
    eval ${1}_E=\${_cc_e-\${${1}_E}}
3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669
    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
3670

3671 3672
test -n "$cc_type" && enable $cc_type ||
    warn "Unknown C compiler $cc, unable to select optimal CFLAGS"
3673

3674
: ${as_default:=$cc}
3675
: ${dep_cc_default:=$cc}
3676
: ${ld_default:=$cc}
3677
: ${host_ld_default:=$host_cc}
3678
set_default ar as dep_cc ld host_ld windres
3679

3680 3681 3682 3683 3684 3685 3686 3687 3688
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
3689
LD_O=${_ld_o-$LD_O}
3690 3691
LD_LIB=${_ld_lib-$LD_LIB}
LD_PATH=${_ld_path-$LD_PATH}
3692

3693 3694 3695 3696
probe_cc hostld "$host_ld"
host_ldflags_filter=$_flags_filter
add_host_ldflags $_flags $_ldflags
HOSTLD_O=${_ld_o-$HOSTLD_O}
3697 3698 3699 3700 3701 3702 3703

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

3705 3706 3707 3708 3709 3710
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='$@'
3711 3712 3713
elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then
    arflags='-Xany -r -c'
    ar_o='$@'
3714 3715 3716
elif $ar 2>&1 | grep -q "\[D\] "; then
    arflags="rcD"
    ar_o='$@'
3717
else
3718
    arflags="rc"
3719 3720 3721
    ar_o='$@'
fi

3722
add_cflags $extra_cflags
Mohamed Naufal's avatar
Mohamed Naufal committed
3723
add_cxxflags $extra_cxxflags
3724
add_asflags $extra_cflags
3725

3726 3727
if test -n "$sysroot"; then
    case "$cc_type" in
3728
        gcc|llvm_gcc|clang)
3729
            add_cppflags --sysroot="$sysroot"
3730
            add_ldflags --sysroot="$sysroot"
3731 3732 3733
# On Darwin --sysroot may be ignored, -isysroot always affects headers and linking
            add_cppflags -isysroot "$sysroot"
            add_ldflags -isysroot "$sysroot"
3734
        ;;
3735 3736 3737 3738
        tms470)
            add_cppflags -I"$sysinclude"
            add_ldflags  --sysroot="$sysroot"
        ;;
3739 3740 3741
    esac
fi

3742
if test "$cpu" = host; then
3743 3744
    enabled cross_compile &&
        die "--cpu=host makes no sense when cross-compiling."
3745 3746

    case "$cc_type" in
3747
        gcc|llvm_gcc)
3748 3749
            check_native(){
                $cc $1=native -v -c -o $TMPO $TMPC >$TMPE 2>&1 || return
3750
                sed -n "/cc1.*$1=/{
3751 3752 3753 3754
                            s/.*$1=\\([^ ]*\\).*/\\1/
                            p
                            q
                        }" $TMPE
3755 3756 3757 3758 3759
            }
            cpu=$(check_native -march || check_native -mcpu)
        ;;
    esac

3760 3761
    test "${cpu:-host}" = host &&
        die "--cpu=host not supported with compiler $cc"
3762 3763
fi

3764 3765
# Deal with common $arch aliases
case "$arch" in
3766 3767 3768
    aarch64|arm64)
        arch="aarch64"
    ;;
3769
    arm*|iPad*|iPhone*)
3770 3771
        arch="arm"
    ;;
3772
    mips*|IP*)
3773 3774
        arch="mips"
    ;;
3775
    parisc*|hppa*)
3776 3777
        arch="parisc"
    ;;
3778
    "Power Macintosh"|ppc*|powerpc*)
3779 3780 3781 3782 3783 3784 3785 3786
        arch="ppc"
    ;;
    s390|s390x)
        arch="s390"
    ;;
    sh4|sh)
        arch="sh4"
    ;;
3787
    sun4u|sparc*)
3788 3789
        arch="sparc"
    ;;
3790 3791 3792
    tilegx|tile-gx)
        arch="tilegx"
    ;;
3793
    i[3-6]86*|i86pc|BePC|x86pc|x86_64|x86_32|amd64)
3794 3795 3796 3797
        arch="x86"
    ;;
esac

3798
is_in $arch $ARCH_LIST || warn "unknown architecture $arch"
3799
enable $arch
3800

3801
# Add processor-specific flags
3802
if enabled aarch64; then
3803

Måns Rullgård's avatar
Måns Rullgård committed
3804
    case $cpu in
3805
        armv*)
Måns Rullgård's avatar
Måns Rullgård committed
3806 3807
            cpuflags="-march=$cpu"
        ;;
3808 3809
        *)
            cpuflags="-mcpu=$cpu"
Måns Rullgård's avatar
Måns Rullgård committed
3810 3811
        ;;
    esac
3812

3813
elif enabled alpha; then
3814

3815
    cpuflags="-mcpu=$cpu"
3816 3817 3818

elif enabled arm; then

3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840
    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;
3841
        elif check_arm_arch 7S;       then echo armv7-a;
3842 3843 3844 3845 3846 3847 3848 3849 3850
        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)

3851 3852 3853
    case $cpu in
        armv*)
            cpuflags="-march=$cpu"
3854
            subarch=$(echo $cpu | sed 's/[^a-z0-9]//g')
3855 3856 3857
        ;;
        *)
            cpuflags="-mcpu=$cpu"
3858 3859 3860
            case $cpu in
                cortex-a*)                               subarch=armv7a  ;;
                cortex-r*)                               subarch=armv7r  ;;
3861
                cortex-m*)                 enable thumb; subarch=armv7m  ;;
3862 3863 3864
                arm11*)                                  subarch=armv6   ;;
                arm[79]*e*|arm9[24]6*|arm96*|arm102[26]) subarch=armv5te ;;
                armv4*|arm7*|arm9[24]*)                  subarch=armv4   ;;
3865
                *)                             subarch=$(probe_arm_arch) ;;
3866
            esac
3867 3868
        ;;
    esac
3869

3870 3871
    case "$subarch" in
        armv5t*)    enable fast_clz                ;;
3872 3873 3874 3875
        armv[6-8]*)
            enable fast_clz
            disabled fast_unaligned || enable fast_unaligned
            ;;
3876 3877
    esac

3878
elif enabled avr32; then
3879

3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897
    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
3898 3899 3900

elif enabled bfin; then

3901
    cpuflags="-mcpu=$cpu"
3902 3903 3904

elif enabled mips; then

3905
    cpuflags="-march=$cpu"
3906

3907 3908
    case $cpu in
        24kc)
3909
            disable mips32r5
3910
            disable mips64r6
3911 3912 3913
            disable mipsfpu
            disable mipsdspr1
            disable mipsdspr2
3914
            disable msa
3915 3916
        ;;
        24kf*)
3917
            disable mips32r5
3918
            disable mips64r6
3919 3920
            disable mipsdspr1
            disable mipsdspr2
3921
            disable msa
3922 3923
        ;;
        24kec|34kc|1004kc)
3924
            disable mips32r5
3925
            disable mips64r6
3926 3927
            disable mipsfpu
            disable mipsdspr2
3928
            disable msa
3929 3930
        ;;
        24kef*|34kf*|1004kf*)
3931
            disable mips32r5
3932
            disable mips64r6
3933
            disable mipsdspr2
3934
            disable msa
3935 3936
        ;;
        74kc)
3937
            disable mips32r5
3938
            disable mips64r6
3939
            disable mipsfpu
3940 3941
            disable msa
        ;;
3942 3943 3944 3945 3946
        74kf)
            disable mips32r5
            disable mips64r6
            disable msa
        ;;
3947
        p5600)
3948
            disable mips64r6
3949 3950 3951 3952 3953
            disable mipsdspr1
            disable mipsdspr2

            check_cflags "-mtune=p5600"
        ;;
3954 3955 3956 3957 3958 3959 3960 3961 3962
        i6400)
            disable mips32r5
            disable mipsdspr1
            disable mipsdspr2
            disable mipsfpu

            check_cflags "-mtune=i6400 -mabi=64"
            check_ldflags "-mabi=64"
        ;;
3963
        loongson3*)
3964
            disable mipsfpu
3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977
            disable mips32r2
            disable mips32r5
            disable mips64r6
            disable mipsdspr1
            disable mipsdspr2
            disable msa
            enable local_aligned_8 local_aligned_16
            enable simd_align_16
            enable fast_64bit
            enable fast_clz
            enable fast_cmov
            enable fast_unaligned
            disable aligned_stack
3978
            cpuflags="-march=loongson3a -mhard-float"
3979
        ;;
3980 3981
        generic)
            disable mips32r5
3982
            disable mips64r6
3983
            disable msa
3984 3985 3986
        ;;
    esac

3987
elif enabled ppc; then
3988

3989 3990
    disable ldbrx

3991 3992
    case $(tolower $cpu) in
        601|ppc601|powerpc601)
Måns Rullgård's avatar
Måns Rullgård committed
3993
            cpuflags="-mcpu=601"
3994
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3995
        ;;
3996
        603*|ppc603*|powerpc603*)
Måns Rullgård's avatar
Måns Rullgård committed
3997
            cpuflags="-mcpu=603"
3998
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
3999
        ;;
4000
        604*|ppc604*|powerpc604*)
Måns Rullgård's avatar
Måns Rullgård committed
4001
            cpuflags="-mcpu=604"
4002
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
4003
        ;;
4004
        g3|75*|ppc75*|powerpc75*)
4005
            cpuflags="-mcpu=750"
4006
            disable altivec
Måns Rullgård's avatar
Måns Rullgård committed
4007
        ;;
4008
        g4|745*|ppc745*|powerpc745*)
4009
            cpuflags="-mcpu=7450"
4010
            disable vsx
Måns Rullgård's avatar
Måns Rullgård committed
4011
        ;;
4012
        74*|ppc74*|powerpc74*)
4013
            cpuflags="-mcpu=7400"
4014
            disable vsx
Måns Rullgård's avatar
Måns Rullgård committed
4015
        ;;
4016
        g5|970|ppc970|powerpc970)
4017
            cpuflags="-mcpu=970"
4018
            disable vsx
Måns Rullgård's avatar
Måns Rullgård committed
4019
        ;;
4020
        power[3-6]*)
Måns Rullgård's avatar
Måns Rullgård committed
4021
            cpuflags="-mcpu=$cpu"
4022 4023 4024 4025
            disable vsx
        ;;
        power[7-8]*)
            cpuflags="-mcpu=$cpu"
Måns Rullgård's avatar
Måns Rullgård committed
4026
        ;;
4027
        cell)
Måns Rullgård's avatar
Måns Rullgård committed
4028 4029
            cpuflags="-mcpu=cell"
            enable ldbrx
4030
            disable vsx
Måns Rullgård's avatar
Måns Rullgård committed
4031
        ;;
4032 4033 4034 4035
        e500mc)
            cpuflags="-mcpu=e500mc"
            disable altivec
        ;;
4036 4037 4038
        e500v2)
            cpuflags="-mcpu=8548 -mhard-float -mfloat-gprs=double"
            disable altivec
4039
            disable dcbzl
4040 4041 4042 4043
        ;;
        e500)
            cpuflags="-mcpu=8540 -mhard-float"
            disable altivec
4044
            disable dcbzl
Måns Rullgård's avatar
Måns Rullgård committed
4045 4046
        ;;
    esac
4047

4048
elif enabled sparc; then
4049 4050

    case $cpu in
4051 4052
        cypress|f93[04]|tsc701|sparcl*|supersparc|hypersparc|niagara|v[789])
            cpuflags="-mcpu=$cpu"
4053
        ;;
4054
        ultrasparc*|niagara[234])
4055 4056 4057 4058
            cpuflags="-mcpu=$cpu"
        ;;
    esac

4059 4060
elif enabled x86; then

Måns Rullgård's avatar
Måns Rullgård committed
4061 4062 4063
    case $cpu in
        i[345]86|pentium)
            cpuflags="-march=$cpu"
4064
            disable i686
Måns Rullgård's avatar
Måns Rullgård committed
4065 4066
            disable mmx
        ;;
4067
        # targets that do NOT support nopl and conditional mov (cmov)
Måns Rullgård's avatar
Måns Rullgård committed
4068 4069
        pentium-mmx|k6|k6-[23]|winchip-c6|winchip2|c3)
            cpuflags="-march=$cpu"
4070
            disable i686
Måns Rullgård's avatar
Måns Rullgård committed
4071
        ;;
4072
        # targets that do support nopl and conditional mov (cmov)
4073 4074
        i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx\
        |core*|atom|bonnell|nehalem|westmere|silvermont|sandybridge|ivybridge|haswell|broadwell|amdfam10|barcelona|b[dt]ver*)
Måns Rullgård's avatar
Måns Rullgård committed
4075
            cpuflags="-march=$cpu"
4076
            enable i686
Måns Rullgård's avatar
Måns Rullgård committed
4077 4078 4079 4080 4081
            enable fast_cmov
        ;;
        # targets that do support conditional mov but on which it's slow
        pentium4|pentium4m|prescott|nocona)
            cpuflags="-march=$cpu"
4082
            enable i686
Måns Rullgård's avatar
Måns Rullgård committed
4083 4084 4085
            disable fast_cmov
        ;;
    esac
4086 4087 4088

fi

4089 4090 4091 4092
if [ "$cpu" != generic ]; then
    add_cflags  $cpuflags
    add_asflags $cpuflags
fi
4093

4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106
# 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

4107
add_cppflags -D_ISOC99_SOURCE
Mohamed Naufal's avatar
Mohamed Naufal committed
4108
add_cxxflags -D__STDC_CONSTANT_MACROS
4109
check_cflags -std=c99
4110
check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
4111 4112
#include <stdlib.h>
EOF
4113
check_cc -D_LARGEFILE_SOURCE <<EOF && add_cppflags -D_LARGEFILE_SOURCE
4114 4115
#include <stdlib.h>
EOF
4116

4117
add_host_cppflags -D_ISOC99_SOURCE
4118
check_host_cflags -std=c99
4119
check_host_cflags -Wall
4120
check_host_cflags -O3
4121

4122 4123 4124 4125 4126 4127 4128 4129
check_64bit(){
    arch32=$1
    arch64=$2
    expr=$3
    check_code cc "" "int test[2*($expr) - 1]" &&
        subarch=$arch64 || subarch=$arch32
}

4130
case "$arch" in
4131
    aarch64|alpha|ia64)
4132
        spic=$shared
4133
    ;;
4134 4135
    mips)
        check_64bit mips mips64 '_MIPS_SIM > 1'
4136
        spic=$shared
4137
    ;;
4138 4139 4140 4141
    parisc)
        check_64bit parisc parisc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
4142 4143
    ppc)
        check_64bit ppc ppc64 'sizeof(void *) > 4'
4144
        spic=$shared
4145
    ;;
4146 4147 4148 4149
    s390)
        check_64bit s390 s390x 'sizeof(void *) > 4'
        spic=$shared
    ;;
4150 4151 4152 4153
    sparc)
        check_64bit sparc sparc64 'sizeof(void *) > 4'
        spic=$shared
    ;;
4154
    x86)
4155
        check_64bit x86_32 x86_64 'sizeof(void *) > 4'
4156 4157 4158
        # Treat x32 as x64 for now. Note it also needs spic=$shared
        test "$subarch" = "x86_32" && check_cpp_condition stddef.h 'defined(__x86_64__)' &&
            subarch=x86_64
4159
        if test "$subarch" = "x86_64"; then
4160
            spic=$shared
4161
        fi
4162
    ;;
4163 4164 4165 4166 4167
    ppc)
        check_cc <<EOF && subarch="ppc64"
        int test[(int)sizeof(char*) - 7];
EOF
    ;;
4168 4169
esac

4170
enable $subarch
4171
enabled spic && enable_weak pic
4172

4173
# OS specific
4174
case $target_os in
4175
    aix)
4176
        SHFLAGS=-shared
4177
        add_cppflags '-I\$(SRC_PATH)/compat/aix'
4178
        enabled shared && add_ldflags -Wl,-brtl
4179
        ;;
4180 4181
    android)
        disable symver
4182
        enable section_data_rel_ro
4183 4184 4185 4186 4187
        SLIB_INSTALL_NAME='$(SLIBNAME)'
        SLIB_INSTALL_LINKS=
        # soname not set on purpose
        SHFLAGS=-shared
        ;;
4188
    haiku)
4189
        prefix_default="/boot/common"
4190
        network_extralibs="-lnetwork"
François Revol's avatar
François Revol committed
4191
        host_libs=
4192
        ;;
4193
    sunos)
4194
        SHFLAGS='-shared -Wl,-h,$$(@F)'
4195
        enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
4196
        network_extralibs="-lsocket -lnsl"
4197
        add_cppflags -D__EXTENSIONS__
4198 4199 4200 4201 4202
        # 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.
4203 4204 4205
        enabled_all suncc x86 &&
            echo "hwcap_1 = OVERRIDE;" > mapfile &&
            add_ldflags -Wl,-M,mapfile
4206
        nm_default='nm -P -g'
4207 4208
        ;;
    netbsd)
4209
        disable symver
4210 4211
        oss_indev_extralibs="-lossaudio"
        oss_outdev_extralibs="-lossaudio"
4212
        enabled gcc || check_ldflags -Wl,-zmuldefs
4213
        ;;
4214
    openbsd|bitrig)
4215
        disable symver
4216
        SHFLAGS='-shared'
4217
        SLIB_INSTALL_NAME='$(SLIBNAME).$(LIBMAJOR).$(LIBMINOR)'
4218
        SLIB_INSTALL_LINKS=
4219 4220
        oss_indev_extralibs="-lossaudio"
        oss_outdev_extralibs="-lossaudio"
4221
        ;;
4222 4223 4224 4225
    dragonfly)
        disable symver
        ;;
    freebsd)
4226 4227
        ;;
    bsd/os)
4228
        add_extralibs -lpoll -lgnugetopt
4229
        strip="strip -d"
4230 4231
        ;;
    darwin)
4232
        enabled ppc && add_asflags -force_cpusubtype_ALL
4233
        SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
4234
        enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
4235
        strip="${strip} -x"
4236
        add_ldflags -Wl,-dynamic,-search_paths_first
4237 4238 4239
        SLIBSUF=".dylib"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
Loren Merritt's avatar
Loren Merritt committed
4240
        objformat="macho"
4241
        enabled x86_64 && objformat="macho64"
4242
        enabled_any pic shared x86_64 ||
4243
            { check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
4244 4245
        ;;
    mingw32*)
4246
        if test $target_os = "mingw32ce"; then
4247 4248 4249 4250
            disable network
        else
            target_os=mingw32
        fi
4251
        LIBTARGET=i386
4252
        if enabled x86_64; then
4253
            LIBTARGET="i386:x86-64"
4254
        elif enabled arm; then
4255
            LIBTARGET=arm-wince
4256
        fi
4257
        enabled shared && ! enabled small && check_cmd $windres --version && enable gnu_windres
4258 4259
        check_ldflags -Wl,--nxcompat
        check_ldflags -Wl,--dynamicbase
4260
        enabled x86_32 && check_ldflags -Wl,--large-address-aware
4261
        shlibdir_default="$bindir_default"
4262 4263 4264 4265
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
4266
        dlltool="${cross_prefix}dlltool"
4267
        if check_cmd lib.exe -list; then
4268
            SLIB_EXTRA_CMD=-'sed -e "s/ @[^ ]*//" $$(@:$(SLIBSUF)=.orig.def) > $$(@:$(SLIBSUF)=.def); lib.exe /machine:$(LIBTARGET) /def:$$(@:$(SLIBSUF)=.def) /out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
4269 4270 4271 4272
            if enabled x86_64; then
                LIBTARGET=x64
            fi
        elif check_cmd $dlltool --version; then
4273
            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)'
4274
        fi
4275 4276 4277 4278
        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)'
4279
        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
4280
        objformat="win32"
4281
        ranlib=:
4282
        enable dos_paths
4283
        ;;
4284
    win32|win64)
4285
        disable symver
4286 4287 4288 4289
        if enabled shared; then
            # Link to the import library instead of the normal static library
            # for shared libs.
            LD_LIB='%.lib'
4290
            # Cannot build both shared and static libs with MSVC or icl.
4291 4292
            disable static
        fi
4293
        enabled x86_32 && check_ldflags -LARGEADDRESSAWARE
4294 4295 4296 4297 4298
        shlibdir_default="$bindir_default"
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
4299
        SLIB_CREATE_DEF_CMD='$(SRC_PATH)/compat/windows/makedef $(SUBDIR)lib$(NAME).ver $(OBJS) > $$(@:$(SLIBSUF)=.def)'
4300 4301 4302 4303 4304
        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)'
4305 4306 4307 4308
        objformat="win32"
        ranlib=:
        enable dos_paths
        ;;
4309
    cygwin*)
4310
        target_os=cygwin
4311
        shlibdir_default="$bindir_default"
4312 4313 4314 4315
        SLIBPREF="cyg"
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
4316 4317 4318 4319
        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
4320
        objformat="win32"
4321
        enable dos_paths
4322
        enabled shared && ! enabled small && check_cmd $windres --version && enable gnu_windres
4323
        ;;
4324 4325
    *-dos|freedos|opendos)
        network_extralibs="-lsocket"
4326
        objformat="coff"
4327
        enable dos_paths
4328
        add_cppflags -U__STRICT_ANSI__
4329
        ;;
4330 4331
    linux)
        enable dv1394
4332
        enable section_data_rel_ro
4333 4334
        ;;
    irix*)
4335
        target_os=irix
4336 4337
        ranlib="echo ignoring ranlib"
        ;;
4338
    os/2*)
4339
        strip="lxlite -CS"
4340
        ln_s="cp -f"
4341
        objformat="aout"
4342
        add_cppflags -D_GNU_SOURCE
4343
        add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
4344
        SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
4345
        LIBSUF="_s.a"
4346 4347 4348 4349
        SLIBPREF=""
        SLIBSUF=".dll"
        SLIBNAME_WITH_VERSION='$(SLIBPREF)$(NAME)-$(LIBVERSION)$(SLIBSUF)'
        SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(shell echo $(NAME) | cut -c1-6)$(LIBMAJOR)$(SLIBSUF)'
4350
        SLIB_CREATE_DEF_CMD='echo LIBRARY $(SLIBNAME_WITH_MAJOR) INITINSTANCE TERMINSTANCE > $(SUBDIR)$(NAME).def; \
4351 4352 4353
            echo CODE PRELOAD MOVEABLE DISCARDABLE >> $(SUBDIR)$(NAME).def; \
            echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $(SUBDIR)$(NAME).def; \
            echo EXPORTS >> $(SUBDIR)$(NAME).def; \
Dave Yeo's avatar
Dave Yeo committed
4354
            emxexp $(OBJS) >> $(SUBDIR)$(NAME).def'
4355
        SLIB_EXTRA_CMD='emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.a $(SUBDIR)$(NAME).def; \
4356
            emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
4357
        SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
4358
        enable dos_paths
4359
        enable_weak os2threads
4360
        ;;
4361
    gnu/kfreebsd)
4362
        add_cppflags -D_BSD_SOURCE
4363
        ;;
4364 4365
    gnu)
        ;;
4366 4367 4368 4369
    qnx)
        add_cppflags -D_QNX_SOURCE
        network_extralibs="-lsocket"
        ;;
4370 4371 4372
    symbian)
        SLIBSUF=".dll"
        enable dos_paths
4373 4374 4375 4376 4377 4378 4379 4380
        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
4381
        ;;
4382 4383 4384
    osf1)
        add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
        ;;
4385 4386
    minix)
        ;;
Mans Rullgard's avatar
Mans Rullgard committed
4387 4388 4389 4390 4391 4392 4393 4394 4395
    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
4396
        disable ffserver
Mans Rullgard's avatar
Mans Rullgard committed
4397 4398
        cp_f='cp'
        ;;
4399 4400
    none)
        ;;
4401
    *)
4402
        die "Unknown OS '$target_os'."
4403 4404 4405
        ;;
esac

4406 4407
# determine libc flavour

4408 4409
probe_libc(){
    pfx=$1
4410
    pfx_no_=${pfx%_}
4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424
    # uclibc defines __GLIBC__, so it needs to be checked before glibc.
    if check_${pfx}cpp_condition features.h "defined __UCLIBC__"; then
        eval ${pfx}libc_type=uclibc
        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
    elif check_${pfx}cpp_condition features.h "defined __GLIBC__"; then
        eval ${pfx}libc_type=glibc
        add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
    # MinGW headers can be installed on Cygwin, so check for newlib first.
    elif check_${pfx}cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
        eval ${pfx}libc_type=newlib
        add_${pfx}cppflags -U__STRICT_ANSI__
    # MinGW64 is backwards compatible with MinGW32, so check for it first.
    elif check_${pfx}cpp_condition _mingw.h "defined __MINGW64_VERSION_MAJOR"; then
        eval ${pfx}libc_type=mingw64
4425 4426 4427 4428
        if check_${pfx}cpp_condition _mingw.h "__MINGW64_VERSION_MAJOR < 3"; then
            add_compat msvcrt/snprintf.o
            add_cflags "-include $source_path/compat/msvcrt/snprintf.h"
        fi
4429
        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
4430 4431
        eval test \$${pfx_no_}cc_type = "gcc" &&
            add_${pfx}cppflags -D__printf__=__gnu_printf__
4432 4433
    elif check_${pfx}cpp_condition _mingw.h "defined __MINGW_VERSION"  ||
         check_${pfx}cpp_condition _mingw.h "defined __MINGW32_VERSION"; then
4434 4435 4436 4437
        eval ${pfx}libc_type=mingw32
        check_${pfx}cpp_condition _mingw.h "__MINGW32_MAJOR_VERSION > 3 || \
            (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
            die "ERROR: MinGW32 runtime version must be >= 3.15."
4438
        add_${pfx}cppflags -U__STRICT_ANSI__ -D__USE_MINGW_ANSI_STDIO=1
4439 4440
        eval test \$${pfx_no_}cc_type = "gcc" &&
            add_${pfx}cppflags -D__printf__=__gnu_printf__
4441 4442
    elif check_${pfx}cpp_condition crtversion.h "defined _VC_CRT_MAJOR_VERSION"; then
        eval ${pfx}libc_type=msvcrt
4443 4444 4445 4446 4447 4448 4449 4450 4451 4452
        if check_${pfx}cpp_condition crtversion.h "_VC_CRT_MAJOR_VERSION < 14"; then
            if [ "$pfx" = host_ ]; then
                add_host_cppflags -Dsnprintf=_snprintf
            else
                add_compat strtod.o strtod=avpriv_strtod
                add_compat msvcrt/snprintf.o snprintf=avpriv_snprintf   \
                                             _snprintf=avpriv_snprintf  \
                                             vsnprintf=avpriv_vsnprintf
            fi
        fi
4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464
        # The MSVC 2010 headers (Win 7.0 SDK) set _WIN32_WINNT to
        # 0x601 by default unless something else is set by the user.
        # This can easily lead to us detecting functions only present
        # in such new versions and producing binaries requiring windows 7.0.
        # Therefore explicitly set the default to XP unless the user has
        # set something else on the command line.
        check_${pfx}cpp_condition stdlib.h "defined(_WIN32_WINNT)" ||
            add_${pfx}cppflags -D_WIN32_WINNT=0x0502
    elif check_${pfx}cpp_condition stddef.h "defined __KLIBC__"; then
        eval ${pfx}libc_type=klibc
    elif check_${pfx}cpp_condition sys/cdefs.h "defined __BIONIC__"; then
        eval ${pfx}libc_type=bionic
4465
    elif check_${pfx}cpp_condition sys/brand.h "defined LABELED_BRAND_NAME"; then
4466 4467
        eval ${pfx}libc_type=solaris
        add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
4468
    fi
4469 4470 4471 4472 4473 4474 4475 4476 4477
    check_${pfx}cc <<EOF
#include <time.h>
void *v = localtime_r;
EOF
test "$?" != 0 && check_${pfx}cc -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 <<EOF && add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
#include <time.h>
void *v = localtime_r;
EOF

4478
}
4479

4480
probe_libc
4481
test -n "$libc_type" && enable libc_$libc_type
4482 4483
probe_libc host_
test -n "$host_libc_type" && enable host_libc_$host_libc_type
4484

4485 4486 4487 4488 4489 4490
case $libc_type in
    bionic)
        add_compat strtod.o strtod=avpriv_strtod
        ;;
esac

4491 4492
# hacks for compiler/libc/os combinations

4493
if enabled_all tms470 libc_glibc; then
4494
    CPPFLAGS="-I${source_path}/compat/tms470 ${CPPFLAGS}"
4495 4496 4497 4498 4499 4500
    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

4501
if enabled_all ccc libc_glibc; then
4502 4503 4504
    add_ldflags -Wl,-z,now  # calls to libots crash without this
fi

4505 4506 4507
check_compile_assert flt_lim "float.h limits.h" "DBL_MAX == (double)DBL_MAX" ||
    add_cppflags '-I\$(SRC_PATH)/compat/float'

4508 4509 4510 4511
esc(){
    echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
}

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

4514
check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
4515

4516 4517
set_default libdir
: ${shlibdir_default:="$libdir"}
4518
: ${pkgconfigdir_default:="$libdir/pkgconfig"}
4519

4520
set_default $PATHS_LIST
4521
set_default nm
4522

4523
# we need to build at least one lib type
4524
if ! enabled_any static shared; then
4525 4526 4527 4528 4529 4530 4531 4532 4533
    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

4534
die_license_disabled() {
4535
    enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
4536 4537
}

4538 4539 4540 4541
die_license_disabled_gpl() {
    enabled $1 || { enabled $2 && die "$2 is incompatible with the gpl and --enable-$1 is not specified."; }
}

4542
die_license_disabled gpl frei0r
4543
die_license_disabled gpl libcdio
4544
die_license_disabled gpl libsmbclient
4545
die_license_disabled gpl libutvideo
4546
die_license_disabled gpl libvidstab
4547
die_license_disabled gpl libx264
Derek Buitenhuis's avatar
Derek Buitenhuis committed
4548
die_license_disabled gpl libx265
4549
die_license_disabled gpl libxavs
4550
die_license_disabled gpl libxvid
4551
die_license_disabled gpl libzvbi
4552 4553
die_license_disabled gpl x11grab

tipok's avatar
tipok committed
4554
die_license_disabled nonfree libaacplus
4555
die_license_disabled nonfree libfaac
4556
die_license_disabled nonfree nvenc
4557
enabled gpl && die_license_disabled_gpl nonfree libfdk_aac
4558
enabled gpl && die_license_disabled_gpl nonfree openssl
4559

4560 4561
die_license_disabled version3 libopencore_amrnb
die_license_disabled version3 libopencore_amrwb
4562
die_license_disabled version3 libsmbclient
4563
die_license_disabled version3 libvo_aacenc
4564
die_license_disabled version3 libvo_amrwbenc
4565

4566
enabled version3 && { enabled gpl && enable gplv3 || enable lgplv3; }
4567

4568
disabled optimizations || check_cflags -fomit-frame-pointer
4569

4570 4571
enable_weak_pic() {
    disabled pic && return
4572
    enable pic
4573
    add_cppflags -DPIC
4574 4575 4576 4577 4578 4579 4580
    case "$target_os" in
    mingw*|cygwin*)
        ;;
    *)
        add_cflags -fPIC
        ;;
    esac
4581
    add_asflags  -fPIC
4582 4583
}

4584
enabled pic && enable_weak_pic
4585

4586 4587 4588
check_cc <<EOF || die "Symbol mangling check failed."
int ff_extern;
EOF
4589
sym=$($nm $TMPO | awk '/ff_extern/{ print substr($0, match($0, /[^ \t]*ff_extern/)) }')
4590 4591
extern_prefix=${sym%%ff_extern*}

4592
check_cc <<EOF && enable_weak inline_asm
4593 4594
void foo(void) { __asm__ volatile ("" ::); }
EOF
4595

4596 4597 4598 4599 4600 4601 4602
_restrict=
for restrict_keyword in restrict __restrict__ __restrict; do
    check_cc <<EOF && _restrict=$restrict_keyword && break
void foo(char * $restrict_keyword p);
EOF
done

4603
check_cc <<EOF && enable pragma_deprecated
4604
void foo(void) { _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") }
4605 4606
EOF

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

4611 4612 4613 4614
check_cc <<EOF && enable attribute_may_alias
union { int x; } __attribute__((may_alias)) x;
EOF

4615 4616 4617
check_cc <<EOF || die "endian test failed"
unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
EOF
4618
od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
4619

4620 4621 4622
if ! enabled ppc64 || enabled bigendian; then
    disable vsx
fi
4623

4624 4625 4626 4627 4628 4629
check_gas() {
    log "check_gas using '$as' as AS"
    # :vararg is used on aarch64, arm and ppc altivec
    check_as <<EOF || return 1
.macro m n, y:vararg=0
\n: .int \y
4630 4631
.endm
m x
4632
EOF
4633 4634
    # .altmacro is only used in arm asm
    ! enabled arm || check_as <<EOF || return 1
4635
.altmacro
4636
EOF
4637 4638 4639 4640
    enable gnu_as
    return 0
}

4641
if enabled_any arm aarch64 || enabled_all ppc altivec && enabled asm; then
4642
    nogas=:
4643
    enabled_any arm aarch64 && nogas=die
4644
    enabled_all ppc altivec && [ $target_os_default != aix ] && nogas=warn
4645 4646 4647 4648 4649 4650 4651 4652 4653 4654
    as_noop=-v

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

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

4655 4656 4657
    test "${as#*gas-preprocessor.pl}" != "$as" ||
    check_cmd gas-preprocessor.pl -arch $arch -as-type $gaspp_as_type -- ${as:=$cc} $as_noop &&
        gas="${gas:=gas-preprocessor.pl} -arch $arch -as-type $gaspp_as_type -- ${as:=$cc}"
4658 4659 4660 4661

    if ! check_gas ; then
        as=${gas:=$as}
        check_gas || \
4662
            $nogas "GNU assembler not found, install/update gas-preprocessor"
4663
    fi
4664 4665 4666 4667

    check_as <<EOF && enable as_func
.func test
.endfunc
4668 4669 4670
EOF
fi

4671 4672
check_inline_asm inline_asm_labels '"1:\n"'

4673 4674
check_inline_asm inline_asm_nonlocal_labels '"Label:\n"'

4675
if enabled aarch64; then
4676
    enabled armv8 && check_insn armv8 'prfm   pldl1strm, [x0]'
4677 4678 4679 4680 4681 4682 4683
    # internal assembler in clang 3.3 does not support this instruction
    enabled neon && check_insn neon 'ext   v0.8B, v0.8B, v1.8B, #1'
    enabled vfp  && check_insn vfp  'fmadd d0,    d0,    d1,    d2'

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

elif enabled alpha; then
4684 4685 4686 4687

    check_cflags -mieee

elif enabled arm; then
4688

4689 4690 4691 4692
    check_cpp_condition stddef.h "defined __thumb__" && check_cc <<EOF && enable_weak thumb
float func(float a, float b){ return a+b; }
EOF

4693
    enabled thumb && check_cflags -mthumb || check_cflags -marm
4694

4695 4696 4697 4698 4699
    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
4700
            *) check_ld "cc" <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
4701 4702 4703
__asm__ (".eabi_attribute 28, 1");
int main(void) { return 0; }
EOF
4704 4705 4706
        esac
        warn "Compiler does not indicate floating-point ABI, guessing $fpabi."
    fi
4707

4708 4709 4710 4711
    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'
4712
    enabled vfp     && check_insn vfp     'fadds s0, s0, s0'
4713
    enabled vfpv3   && check_insn vfpv3   'vmov.f32 s0, #1.0'
4714
    enabled setend  && check_insn setend  'setend be'
4715

4716
    [ $target_os = linux ] || [ $target_os = android ] ||
4717 4718
        map 'enabled_any ${v}_external ${v}_inline || disable $v' \
            $ARCH_EXT_LIST_ARM
4719

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

4722 4723 4724
    check_as <<EOF && enable as_dn_directive
ra .dn d0.i16
.unreq ra
4725 4726 4727 4728 4729
EOF

    # llvm's integrated assembler supports .object_arch from llvm 3.5
    [ "$objformat" = elf ] && check_as <<EOF && enable as_object_arch
.object_arch armv4
4730 4731
EOF

4732
    [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
4733

4734
elif enabled mips; then
4735

4736 4737 4738 4739
    # Enable minimum ISA based on selected options
    if enabled mips64 && (enabled mipsdspr1 || enabled mipsdspr2); then
        add_cflags "-mips64r2"
        add_asflags "-mips64r2"
4740
    elif enabled mips64 && enabled mipsfpu && disabled loongson3; then
4741 4742
        add_cflags "-mips64"
        add_asflags "-mips64"
4743 4744 4745
    elif enabled mipsdspr1 || enabled mipsdspr2; then
        add_cflags "-mips32r2 -mfp32"
        add_asflags "-mips32r2 -mfp32"
4746
    elif enabled mips32r5 || enabled mips64r6; then
4747 4748
        check_cflags "-mfp64"
        check_ldflags "-mfp64"
4749 4750
    fi

4751 4752 4753
    enabled mips32r5  && check_cflags "-mips32r5 -msched-weight -mload-store-pairs -funroll-loops" &&
     check_ldflags "-mips32r5" &&
     check_inline_asm mips32r5  '"ulw $t0, ($t1)"'
4754 4755 4756
    enabled mips64r6  && check_cflags "-mips64r6 -msched-weight -mload-store-pairs -funroll-loops" &&
     check_ldflags "-mips64r6" &&
     check_inline_asm mips64r6  '"aui $t0, $t1, 1"'
4757
    enabled mipsdspr1 && add_cflags "-mdsp" && add_asflags "-mdsp" &&
4758
     check_inline_asm mipsdspr1 '"addu.qb $t0, $t1, $t2"'
4759
    enabled mipsdspr2 && add_cflags "-mdspr2" && add_asflags "-mdspr2" &&
4760
     check_inline_asm mipsdspr2 '"absq_s.qb $t0, $t1"'
4761
    enabled mipsfpu   && add_cflags "-mhard-float" && add_asflags "-mhard-float" &&
4762
     check_inline_asm mipsfpu   '"madd.d $f0, $f2, $f4, $f6"'
4763 4764
    enabled msa       && check_cflags "-mmsa" && check_ldflags "-mmsa" &&
     check_inline_asm msa       '"addvi.b $w0, $w1, 1"'
4765
    enabled loongson3 && check_inline_asm loongson3 '"gsldxc1 $f0, 0($2, $3)"'
4766 4767

    enabled mips32r5 && add_asflags "-mips32r5 -mfp64"
4768
    enabled mips64r6 && add_asflags "-mips64r6 -mfp64"
4769
    enabled msa && add_asflags "-mmsa"
4770

4771 4772 4773 4774
elif enabled parisc; then

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

4779
elif enabled ppc; then
4780

James Almer's avatar
James Almer committed
4781
    enable local_aligned_8 local_aligned_16 local_aligned_32
4782

4783 4784 4785 4786
    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)'
4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797

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

        # check if our compiler supports Motorola AltiVec C API
        check_cc <<EOF || disable altivec
$inc_altivec_h
int main(void) {
4798 4799 4800
    vector signed int v1 = (vector signed int) { 0 };
    vector signed int v2 = (vector signed int) { 1 };
    v1 = vec_add(v1, v2);
4801 4802 4803 4804
    return 0;
}
EOF

4805
        enabled altivec || warn "Altivec disabled, possibly missing --cpu flag"
4806
    fi
4807

4808
    if enabled vsx; then
4809 4810
        check_cflags -mvsx &&
        check_builtin vec_vsx_ld "altivec.h" "__builtin_vec_vsx_ld" || disable vsx
4811
    fi
4812 4813 4814 4815 4816

    if enabled power8; then
        check_cpp_condition "altivec.h" "defined(_ARCH_PWR8)" || disable power8
    fi

4817
elif enabled x86; then
4818

4819 4820
    check_builtin rdtsc    intrin.h   "__rdtsc()"
    check_builtin mm_empty mmintrin.h "_mm_empty()"
4821

James Almer's avatar
James Almer committed
4822
    enable local_aligned_8 local_aligned_16 local_aligned_32
4823

4824 4825 4826 4827
    # 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.
4828
    check_exec_crash <<EOF && enable ebp_available
4829 4830 4831
volatile int i=0;
__asm__ volatile ("xorl %%ebp, %%ebp" ::: "%ebp");
return i;
4832 4833
EOF

Reimar Döffinger's avatar
Reimar Döffinger committed
4834
    # check whether EBX is available on x86
4835 4836
    check_inline_asm ebx_available '""::"b"(0)' &&
        check_inline_asm ebx_available '"":::"%ebx"'
4837

4838
    # check whether xmm clobbers are supported
4839
    check_inline_asm xmm_clobbers '"":::"%xmm0"'
4840

4841 4842
    check_inline_asm inline_asm_direct_symbol_refs '"movl '$extern_prefix'test, %eax"' ||
        check_inline_asm inline_asm_direct_symbol_refs '"movl '$extern_prefix'test(%rip), %eax"'
4843

4844
    # check whether binutils is new enough to compile SSSE3/MMXEXT
4845 4846
    enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
    enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
4847

4848
    if ! disabled_any asm mmx yasm; then
4849 4850 4851 4852 4853 4854
        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"
4855 4856 4857 4858 4859 4860
            if enabled x86_64; then
                case "$objformat" in
                    elf)   objformat=elf64 ;;
                    win32) objformat=win64 ;;
                esac
            fi
4861 4862 4863 4864 4865 4866 4867 4868 4869
        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

4870 4871
        check_yasm "movbe ecx, [5]" && enable yasm ||
            die "yasm/nasm not found or too old. Use --disable-yasm for a crippled build."
4872
        check_yasm "vextracti128 xmm0, ymm0, 0"      || disable avx2_external
4873
        check_yasm "vpmacsdd xmm0, xmm1, xmm2, xmm3" || disable xop_external
4874
        check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
4875
        check_yasm "CPU amdnop" || disable cpunop
4876
    fi
4877

4878 4879 4880 4881 4882 4883
    case "$cpu" in
        athlon*|opteron*|k8*|pentium|pentium-mmx|prescott|nocona|atom|geode)
            disable fast_clz
        ;;
    esac

4884 4885
fi

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

4888
check_ldflags -Wl,--as-needed
4889
check_ldflags -Wl,-z,noexecstack
4890

4891 4892 4893 4894
if check_func dlopen; then
    ldl=
elif check_func dlopen -ldl; then
    ldl=-ldl
4895 4896
fi

4897 4898 4899
frei0r_filter_extralibs='$ldl'
frei0r_src_filter_extralibs='$ldl'
ladspa_filter_extralibs='$ldl'
4900
nvenc_encoder_extralibs='$ldl'
4901

4902
if ! disabled network; then
4903 4904 4905 4906
    check_func getaddrinfo $network_extralibs
    check_func getservbyport $network_extralibs
    check_func inet_aton $network_extralibs

4907
    check_type netdb.h "struct addrinfo"
4908 4909
    check_type netinet/in.h "struct group_source_req" -D_BSD_SOURCE
    check_type netinet/in.h "struct ip_mreq_source" -D_BSD_SOURCE
4910
    check_type netinet/in.h "struct ipv6_mreq" -D_DARWIN_C_SOURCE
4911
    check_type poll.h "struct pollfd"
4912
    check_type netinet/sctp.h "struct sctp_event_subscribe"
4913 4914 4915 4916 4917
    check_struct "sys/types.h sys/socket.h" "struct sockaddr" sa_len
    check_type netinet/in.h "struct sockaddr_in6"
    check_type "sys/types.h sys/socket.h" "struct sockaddr_storage"
    check_type "sys/types.h sys/socket.h" socklen_t

4918 4919 4920 4921
    # Prefer arpa/inet.h over winsock2
    if check_header arpa/inet.h ; then
        check_func closesocket
    elif check_header winsock2.h ; then
4922 4923 4924
        check_func_headers winsock2.h closesocket -lws2 &&
            network_extralibs="-lws2" ||
        { check_func_headers winsock2.h closesocket -lws2_32 &&
4925
            network_extralibs="-lws2_32"; } || disable winsock2_h network
4926
        check_func_headers ws2tcpip.h getaddrinfo $network_extralibs
4927

4928 4929
        check_type ws2tcpip.h socklen_t
        check_type ws2tcpip.h "struct addrinfo"
4930 4931
        check_type ws2tcpip.h "struct group_source_req"
        check_type ws2tcpip.h "struct ip_mreq_source"
4932
        check_type ws2tcpip.h "struct ipv6_mreq"
4933
        check_type winsock2.h "struct pollfd"
4934
        check_struct winsock2.h "struct sockaddr" sa_len
4935 4936 4937 4938 4939 4940 4941
        check_type ws2tcpip.h "struct sockaddr_in6"
        check_type ws2tcpip.h "struct sockaddr_storage"
    else
        disable network
    fi
fi

4942
check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
4943
check_builtin atomic_compare_exchange "" "int *ptr, *oldval; int newval; __atomic_compare_exchange_n(ptr, oldval, newval, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)"
4944 4945
check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
check_builtin MemoryBarrier windows.h "MemoryBarrier()"
4946
check_builtin sarestart signal.h "SA_RESTART"
4947
check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
4948 4949
check_builtin gmtime_r time.h "time_t *time; struct tm *tm; gmtime_r(time, tm)"
check_builtin localtime_r time.h "time_t *time; struct tm *tm; localtime_r(time, tm)"
4950 4951 4952 4953

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

4955
check_func  access
4956
check_func_headers time.h clock_gettime || { check_func_headers time.h clock_gettime -lrt && add_extralibs -lrt && LIBRT="-lrt"; }
Måns Rullgård's avatar
Måns Rullgård committed
4957
check_func  fcntl
4958 4959
check_func  fork
check_func  gethrtime
4960
check_func  getopt
4961
check_func  getrusage
4962
check_func  gettimeofday
4963
check_func  isatty
4964
check_func  mach_absolute_time
4965
check_func  mkstemp
4966
check_func  mmap
4967
check_func  mprotect
4968
# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
4969
check_func_headers time.h nanosleep || { check_func_headers time.h nanosleep -lrt && add_extralibs -lrt && LIBRT="-lrt"; }
4970
check_func  sched_getaffinity
Måns Rullgård's avatar
Måns Rullgård committed
4971
check_func  setrlimit
4972
check_struct "sys/stat.h" "struct stat" st_mtim.tv_nsec -D_BSD_SOURCE
4973
check_func  strerror_r
4974
check_func  sysconf
4975
check_func  sysctl
4976
check_func  usleep
4977

4978
check_func_headers conio.h kbhit
4979
check_func_headers io.h setmode
4980
check_func_headers lzo/lzo1x.h lzo1x_999_compress
4981 4982
check_func_headers stdlib.h getenv

4983
check_func_headers windows.h CoTaskMemFree -lole32
4984
check_func_headers windows.h GetProcessAffinityMask
4985
check_func_headers windows.h GetProcessTimes
4986
check_func_headers windows.h GetSystemTimeAsFileTime
4987
check_func_headers windows.h MapViewOfFile
4988
check_func_headers windows.h PeekNamedPipe
4989
check_func_headers windows.h SetConsoleTextAttribute
4990
check_func_headers windows.h Sleep
4991
check_func_headers windows.h VirtualAlloc
4992
check_struct windows.h "CONDITION_VARIABLE" Ptr
4993
check_func_headers glob.h glob
4994 4995
enabled xlib &&
    check_func_headers "X11/Xlib.h X11/extensions/Xvlib.h" XvGetPortAttribute -lXv -lX11 -lXext
4996

4997
check_header direct.h
4998
check_header dlfcn.h
4999
check_header d3d11.h
5000
check_header dxva.h
5001
check_header dxva2api.h -D_WIN32_WINNT=0x0600
5002
check_header io.h
5003
check_header libcrystalhd/libcrystalhd_if.h
5004
check_header mach/mach_time.h
5005
check_header malloc.h
5006
check_header net/udplite.h
5007
check_header poll.h
5008
check_header sys/mman.h
5009
check_header sys/param.h
5010
check_header sys/resource.h
5011
check_header sys/select.h
5012
check_header sys/time.h
5013
check_header sys/un.h
5014
check_header termios.h
5015
check_header unistd.h
5016
check_header valgrind/valgrind.h
5017 5018
check_header vdpau/vdpau.h
check_header vdpau/vdpau_x11.h
5019
check_header VideoDecodeAcceleration/VDADecoder.h
5020
check_header windows.h
5021
check_header X11/extensions/XvMClib.h
5022
check_header asm/types.h
5023

5024 5025 5026 5027 5028 5029
check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi

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

5030
check_type "windows.h dxva.h" "DXVA_PicParams_HEVC"
5031
check_type "windows.h d3d11.h" "ID3D11VideoDecoder"
5032
check_type "d3d9.h dxva2api.h" DXVA2_ConfigPictureDecode -D_WIN32_WINNT=0x0600
5033

5034
if ! disabled w32threads && ! enabled pthreads; then
5035 5036
    check_func_headers "windows.h process.h" _beginthreadex &&
        enable w32threads || disable w32threads
5037 5038
fi

5039 5040
# check for some common methods of building with pthread support
# do this before the optional library checks as some of them require pthreads
5041
if ! disabled pthreads && ! enabled w32threads && ! enabled os2threads; then
5042
    enable pthreads
5043
    if check_func pthread_join -pthread && check_func pthread_create -pthread; then
Måns Rullgård's avatar
Måns Rullgård committed
5044
        add_cflags -pthread
5045
        add_extralibs -pthread
5046
    elif check_func pthread_join -pthreads && check_func pthread_create -pthreads; then
Måns Rullgård's avatar
Måns Rullgård committed
5047
        add_cflags -pthreads
5048
        add_extralibs -pthreads
5049 5050 5051
    elif check_func pthread_join -ldl -pthread && check_func pthread_create -ldl -pthread; then
        add_cflags -ldl -pthread
        add_extralibs -ldl -pthread
5052
    elif check_func pthread_join -lpthreadGC2 && check_func pthread_create -lpthreadGC2; then
5053
        add_extralibs -lpthreadGC2
5054
    elif check_lib pthread.h pthread_join -lpthread && check_lib pthread.h pthread_create -lpthread; then
5055
        :
5056
    elif ! check_func pthread_join && ! check_func pthread_create; then
5057
        disable pthreads
Måns Rullgård's avatar
Måns Rullgård committed
5058
    fi
5059
    check_code cc "pthread.h" "static pthread_mutex_t atomic_lock = PTHREAD_MUTEX_INITIALIZER" || disable pthreads
5060 5061
fi

5062

5063 5064 5065 5066
if enabled pthreads; then
  check_func pthread_cancel
fi

5067 5068
disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
5069
disabled  lzma || check_lib2  lzma.h lzma_version_number -llzma || disable lzma
5070

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

5074 5075 5076
atan2f_args=2
ldexpf_args=2
powf_args=2
5077

5078
for func in $MATH_FUNCS; do
5079
    eval check_mathfunc $func \${${func}_args:-1}
5080 5081
done

5082
# these are off by default, so fail if requested and not available
5083
enabled avfoundation_indev && { check_header_oc AVFoundation/AVFoundation.h || disable avfoundation_indev; }
5084 5085
enabled avfoundation_indev && { check_lib2 CoreGraphics/CoreGraphics.h CGGetActiveDisplayList -framework CoreGraphics ||
                                check_lib2 ApplicationServices/ApplicationServices.h CGGetActiveDisplayList -framework ApplicationServices; }
5086 5087 5088
enabled avisynth          && { { check_lib2 "windows.h" LoadLibrary; } ||
                               { check_lib2 "dlfcn.h" dlopen -ldl; } ||
                               die "ERROR: LoadLibrary/dlopen not found for avisynth"; }
5089
enabled decklink          && { check_header DeckLinkAPI.h || die "ERROR: DeckLinkAPI.h header not found"; }
5090 5091
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
5092
enabled ladspa            && { check_header ladspa.h || die "ERROR: ladspa.h header not found"; }
5093 5094 5095
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
5096
enabled libbluray         && require_pkg_config libbluray libbluray/bluray.h bd_open
5097
enabled libbs2b           && require_pkg_config libbs2b bs2b.h bs2b_open
5098 5099 5100 5101
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
5102
enabled libdcadec         && require_pkg_config dcadec libdcadec/dca_context.h dcadec_context_create
5103
enabled libfaac           && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
5104 5105 5106
enabled libfdk_aac        && { use_pkg_config fdk-aac "fdk-aac/aacenc_lib.h" aacEncOpen ||
                               { require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac &&
                                 warn "using libfdk without pkg-config"; } }
5107
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"
5108
enabled libflite          && require2 libflite "flite/flite.h" flite_init $flite_libs
5109
enabled fontconfig        && enable libfontconfig
5110
enabled libfontconfig     && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
5111
enabled libfreetype       && require_libfreetype
5112
enabled libfribidi        && require_pkg_config fribidi fribidi.h fribidi_version_info
5113
enabled libgme            && require  libgme gme/gme.h gme_new_emu -lgme -lstdc++
5114 5115 5116 5117
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
5118
enabled libmfx            && require_pkg_config libmfx "mfx/mfxvideo.h" MFXInit
5119
enabled libmodplug        && require_pkg_config libmodplug libmodplug/modplug.h ModPlug_Load
5120
enabled libmp3lame        && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
5121
enabled libnut            && require libnut libnut.h nut_demuxer_init -lnut
5122 5123
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
5124
enabled libopencv         && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader
5125
enabled libopenh264       && require_pkg_config openh264 wels/codec_api.h WelsGetCodecVersion
5126 5127
enabled libopenjpeg       && { check_lib openjpeg.h opj_version -lopenmj2 -DOPJ_STATIC ||
                               check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
5128
                               check_lib openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
5129
                               die "ERROR: libopenjpeg not found"; }
5130
enabled libopus           && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
5131
enabled libpulse          && require_pkg_config libpulse pulse/pulseaudio.h pa_context_new
5132
enabled libquvi           && require_pkg_config libquvi quvi/quvi.h quvi_init
5133 5134
enabled librtmp           && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
enabled libschroedinger   && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
Romain Beauxis's avatar
Romain Beauxis committed
5135
enabled libshine          && require_pkg_config shine shine/layer3.h shine_encode_buffer
5136
enabled libsmbclient      && { use_pkg_config smbclient libsmbclient.h smbc_init ||
5137
                               require smbclient libsmbclient.h smbc_init -lsmbclient; }
5138
enabled libsnappy         && require snappy snappy-c.h snappy_compress -lsnappy
5139
enabled libsoxr           && require libsoxr soxr.h soxr_create -lsoxr
5140
enabled libssh            && require_pkg_config libssh libssh/sftp.h sftp_init
5141
enabled libspeex          && require_pkg_config speex speex/speex.h speex_decoder_init -lspeex
5142
enabled libstagefright_h264 && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h
5143
    media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h
5144
    media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder -lgnustl_static
5145
enabled libtheora         && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
5146 5147 5148 5149 5150
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
5151
enabled libvidstab        && require_pkg_config "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit
5152 5153 5154
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
5155

5156
enabled libvpx            && {
5157
    enabled libvpx_vp8_decoder && {
5158 5159 5160
        use_pkg_config "vpx >= 0.9.1" "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp8_dx ||
            check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
                die "ERROR: libvpx decoder version must be >=0.9.1";
5161 5162
    }
    enabled libvpx_vp8_encoder && {
5163 5164 5165
        use_pkg_config "vpx >= 0.9.7" "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp8_cx ||
            check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx ||
                die "ERROR: libvpx encoder version must be >=0.9.7";
5166 5167
    }
    enabled libvpx_vp9_decoder && {
5168 5169 5170
        use_pkg_config "vpx >= 1.3.0" "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_vp9_dx ||
            check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx ||
                disable libvpx_vp9_decoder;
5171 5172
    }
    enabled libvpx_vp9_encoder && {
5173 5174 5175
        use_pkg_config "vpx >= 1.3.0" "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_vp9_cx ||
            check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx VP9E_SET_AQ_MODE" -lvpx ||
                disable libvpx_vp9_encoder;
5176 5177 5178 5179 5180
    }
    if disabled_all libvpx_vp8_decoder libvpx_vp9_decoder libvpx_vp8_encoder libvpx_vp9_encoder; then
        die "libvpx enabled but no supported decoders found"
    fi
}
5181

5182
enabled libwavpack        && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput  -lwavpack
5183
enabled libwebp           && {
5184 5185
    enabled libwebp_encoder      && require_pkg_config "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion
    enabled libwebp_anim_encoder && { use_pkg_config "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit || disable libwebp_anim_encoder; } }
5186
enabled libx264           && { use_pkg_config x264 "stdint.h x264.h" x264_encoder_encode ||
5187 5188
                               { require libx264 x264.h x264_encoder_encode -lx264 &&
                                 warn "using libx264 without pkg-config"; } } &&
5189
                             { check_cpp_condition x264.h "X264_BUILD >= 118" ||
5190
                               die "ERROR: libx264 must be installed and version must be >= 0.118."; }
Derek Buitenhuis's avatar
Derek Buitenhuis committed
5191
enabled libx265           && require_pkg_config x265 x265.h x265_encoder_encode &&
5192 5193
                             { check_cpp_condition x265.h "X265_BUILD >= 57" ||
                               die "ERROR: libx265 version must be >= 57."; }
5194 5195
enabled libxavs           && require libxavs xavs.h xavs_encoder_encode -lxavs
enabled libxvid           && require libxvid xvid.h xvid_global -lxvidcore
5196
enabled libzmq            && require_pkg_config libzmq zmq.h zmq_ctx_new
5197
enabled libzvbi           && require libzvbi libzvbi.h vbi_decoder_new -lzvbi
5198 5199 5200 5201 5202 5203 5204
enabled mmal              && { check_lib interface/mmal/mmal.h mmal_port_connect -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host ||
                                { ! enabled cross_compile && {
                                    add_cflags -isystem/opt/vc/include/ -isystem/opt/vc/include/interface/vmcs_host/linux -isystem/opt/vc/include/interface/vcos/pthreads -fgnu89-inline ;
                                    add_extralibs -L/opt/vc/lib/ -lmmal_core -lmmal_util -lmmal_vc_client -lbcm_host ;
                                    check_lib interface/mmal/mmal.h mmal_port_connect ; }
                                check_lib interface/mmal/mmal.h mmal_port_connect ; } ||
                               die "ERROR: mmal not found"; }
5205 5206 5207 5208
enabled nvenc             && { check_header nvEncodeAPI.h || die "ERROR: nvEncodeAPI.h not found."; } &&
                             { check_cpp_condition nvEncodeAPI.h "NVENCAPI_MAJOR_VERSION >= 5" ||
                               die "ERROR: NVENC API version 4 or older is not supported"; } &&
                             { [ $target_os != cygwin ] || die "ERROR: NVENC is not supported on Cygwin currently."; }
5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219
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"; } &&
                             { 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"; }
Lukasz Marek's avatar
Lukasz Marek committed
5220 5221 5222 5223 5224 5225
enabled opengl            && { check_lib GL/glx.h glXGetProcAddress "-lGL" ||
                               check_lib2 windows.h wglGetProcAddress "-lopengl32 -lgdi32" ||
                               check_lib2 OpenGL/gl3.h glGetError "-Wl,-framework,OpenGL" ||
                               check_lib2 ES2/gl.h glGetError "-isysroot=${sysroot} -Wl,-framework,OpenGLES" ||
                               die "ERROR: opengl not found."
                             }
5226 5227 5228 5229
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"; }
5230
enabled qtkit_indev      && { check_header_oc QTKit/QTKit.h || disable qtkit_indev; }
5231

Samuel Pitoiset's avatar
Samuel Pitoiset committed
5232
if enabled gnutls; then
5233
    { check_lib2 gmp.h mpz_export -lgmp && enable gmp; } ||
Samuel Pitoiset's avatar
Samuel Pitoiset committed
5234 5235 5236
    { check_lib gcrypt.h gcry_mpi_new -lgcrypt && enable gcrypt; }
fi

5237 5238
# libdc1394 check
if enabled libdc1394; then
5239
    { require_pkg_config libdc1394-2 dc1394/dc1394.h dc1394_new &&
5240 5241 5242 5243 5244
        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
5245
if ! disabled sdl; then
5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258
    SDL_CONFIG="${cross_prefix}sdl-config"
    if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
        check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
        check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
        enable sdl
    else
        if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
            sdl_cflags=$("${SDL_CONFIG}" --cflags)
            sdl_libs=$("${SDL_CONFIG}" --libs)
            check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
            check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
            check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
            enable sdl
5259 5260 5261 5262
        elif enabled sdl ; then
            die "ERROR: SDL not found"
        else
            disable sdl
5263 5264
        fi
    fi
5265
fi
5266
enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
5267

5268
disabled securetransport || { check_func SecIdentityCreate "-Wl,-framework,CoreFoundation -Wl,-framework,Security" &&
5269
    check_lib2 "Security/SecureTransport.h Security/Security.h" "SSLCreateContext SecItemImport" "-Wl,-framework,CoreFoundation -Wl,-framework,Security" &&
5270 5271
    enable securetransport; }

5272
makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
5273 5274
enabled makeinfo \
    && [ 0$(makeinfo --version | grep "texinfo" | sed 's/.*texinfo[^0-9]*\([0-9]*\)\..*/\1/') -ge 5 ] \
5275 5276
    && enable makeinfo_html || disable makeinfo_html
disabled makeinfo_html && texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
5277
perl -v            > /dev/null 2>&1 && enable perl      || disable perl
5278
pod2man --help     > /dev/null 2>&1 && enable pod2man   || disable pod2man
5279
rsync --help 2> /dev/null | grep -q 'contimeout' && enable rsync_contimeout || disable rsync_contimeout
5280

5281
check_header linux/fb.h
5282 5283
check_header linux/videodev.h
check_header linux/videodev2.h
5284
check_code cc linux/videodev2.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_safe struct_v4l2_frmivalenum_discrete
5285

5286
check_header sys/videoio.h
5287
check_code cc sys/videoio.h "struct v4l2_frmsizeenum vfse; vfse.discrete.width = 0;" && enable_safe struct_v4l2_frmivalenum_discrete
5288

5289
check_func_headers "windows.h vfw.h" capCreateCaptureWindow "$vfwcap_indev_extralibs"
5290 5291 5292
# 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
5293

5294 5295
check_type "dshow.h" IBaseFilter

5296
# check for ioctl_meteor.h, ioctl_bt848.h and alternatives
Ramiro Polla's avatar
Ramiro Polla committed
5297 5298 5299 5300 5301 5302 5303
{ 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
5304

5305
check_header sndio.h
5306 5307 5308 5309 5310 5311 5312 5313
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
5314
check_header soundcard.h
Måns Rullgård's avatar
Måns Rullgård committed
5315

5316 5317
enabled_any alsa_indev alsa_outdev &&
    check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound
5318

5319
enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack && check_func sem_timedwait &&
5320
    check_func jack_port_get_latency_range -ljack
5321

5322 5323
enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio

5324
if enabled libcdio; then
5325 5326
    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 ||
5327
    die "ERROR: No usable libcdio/cdparanoia found"
5328
fi
5329

5330 5331
enabled xlib &&
    check_lib X11/Xlib.h XOpenDisplay -lX11 || disable xlib
5332

Carl Eugen Hoyos's avatar
Carl Eugen Hoyos committed
5333
if ! disabled libxcb; then
5334 5335
    check_pkg_config "xcb >= 1.4" xcb/xcb.h xcb_connect || {
        enabled libxcb && die "ERROR: libxcb >= 1.4 not found";
5336 5337
    } && disable x11grab && enable libxcb

Carl Eugen Hoyos's avatar
Carl Eugen Hoyos committed
5338
if enabled libxcb; then
5339
    disabled libxcb_shm || {
5340 5341
        check_pkg_config xcb-shm xcb/shm.h xcb_shm_attach || {
            enabled libxcb_shm && die "ERROR: libxcb_shm not found";
5342
        } && check_header sys/shm.h && enable libxcb_shm; }
5343

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

5349 5350 5351 5352 5353 5354 5355
    disabled libxcb_shape || {
        check_pkg_config xcb-shape xcb/shape.h xcb_shape_get_rectangles || {
            enabled libxcb_shape && die "ERROR: libxcb_shape not found";
        } && enable libxcb_shape; }

    add_cflags $xcb_cflags $xcb_shm_cflags $xcb_xfixes_cflags $xcb_shape_cflags
    add_extralibs $xcb_libs $xcb_shm_libs $xcb_xfixes_libs $xcb_shape_libs
5356
fi
Carl Eugen Hoyos's avatar
Carl Eugen Hoyos committed
5357
fi
5358 5359 5360 5361 5362 5363

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

5365 5366
check_func_headers "windows.h" CreateDIBSection "$gdigrab_indev_extralibs"

5367 5368 5369 5370 5371 5372 5373 5374 5375 5376
enabled dxva2api_h &&
    check_cc <<EOF && enable dxva2api_cobj
#define _WIN32_WINNT 0x0600
#define COBJMACROS
#include <windows.h>
#include <d3d9.h>
#include <dxva2api.h>
int main(void) { IDirectXVideoDecoder *o = NULL; IDirectXVideoDecoder_Release(o); return 0; }
EOF

5377 5378 5379
enabled vaapi &&
    check_lib va/va.h vaInitialize -lva ||
    disable vaapi
5380

5381 5382 5383 5384
enabled vaapi && enabled xlib &&
    check_lib2 "va/va.h va/va_x11.h" vaGetDisplay -lva -lva-x11 &&
    enable vaapi_x11

5385
enabled vdpau &&
5386
    check_cpp_condition vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" ||
5387
    disable vdpau
5388

5389
enabled vdpau && enabled xlib &&
5390
    check_func_headers "vdpau/vdpau.h vdpau/vdpau_x11.h" vdp_device_create_x11 -lvdpau &&
5391
    prepend ffmpeg_libs $($ldflags_filter "-lvdpau") &&
5392 5393
    enable vdpau_x11

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

5397
enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
5398 5399 5400

# add some useful compiler flags if supported
check_cflags -Wdeclaration-after-statement
5401
check_cflags -Wall
Michael Niedermayer's avatar
Michael Niedermayer committed
5402 5403 5404
check_cflags -Wdisabled-optimization
check_cflags -Wpointer-arith
check_cflags -Wredundant-decls
5405
check_cflags -Wwrite-strings
5406
check_cflags -Wtype-limits
5407
check_cflags -Wundef
5408
check_cflags -Wmissing-prototypes
5409
check_cflags -Wno-pointer-to-int-cast
5410
check_cflags -Wstrict-prototypes
5411
check_cflags -Wempty-body
5412
enabled extra_warnings && check_cflags -Winline
5413

5414 5415 5416 5417 5418 5419 5420 5421 5422 5423
check_disable_warning(){
    warning_flag=-W${1#-Wno-}
    test_cflags $warning_flag && add_cflags $1
}

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

5424
# add some linker flags
5425
check_ldflags -Wl,--warn-common
5426
check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
5427
enabled rpath && add_ldexeflags -Wl,-rpath,$libdir
5428
test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
5429

5430 5431
# add some strip flags
# -wN '..@*' is more selective than -x, but not available everywhere.
5432
check_stripflags -wN \'..@*\' || check_stripflags -x
5433

5434 5435 5436 5437 5438 5439 5440
enabled neon_clobber_test &&
    check_ldflags -Wl,--wrap,avcodec_open2              \
                  -Wl,--wrap,avcodec_decode_audio4      \
                  -Wl,--wrap,avcodec_decode_video2      \
                  -Wl,--wrap,avcodec_decode_subtitle2   \
                  -Wl,--wrap,avcodec_encode_audio2      \
                  -Wl,--wrap,avcodec_encode_video2      \
5441
                  -Wl,--wrap,avcodec_encode_subtitle    \
5442
                  -Wl,--wrap,swr_convert                \
5443
                  -Wl,--wrap,avresample_convert ||
5444 5445
    disable neon_clobber_test

5446
enabled xmm_clobber_test &&
5447 5448 5449 5450 5451
    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      \
5452
                  -Wl,--wrap,avcodec_encode_video       \
5453
                  -Wl,--wrap,avcodec_encode_video2      \
5454
                  -Wl,--wrap,avcodec_encode_subtitle    \
5455
                  -Wl,--wrap,swr_convert                \
5456
                  -Wl,--wrap,avresample_convert         \
5457
                  -Wl,--wrap,sws_scale ||
5458 5459
    disable xmm_clobber_test

5460
echo "X{};" > $TMPV
5461
if test_ldflags -Wl,--version-script,$TMPV; then
5462
    append SHFLAGS '-Wl,--version-script,\$(SUBDIR)lib\$(NAME).ver'
5463 5464
    check_cc <<EOF && enable symver_asm_label
void ff_foo(void) __asm__ ("av_foo@VERSION");
5465
void ff_foo(void) { ${inline_asm+__asm__($quotes);} }
5466 5467 5468 5469 5470 5471
EOF
    check_cc <<EOF && enable symver_gnu_asm
__asm__(".symver ff_foo,av_foo@VERSION");
void ff_foo(void) {}
EOF
fi
5472

5473 5474 5475 5476 5477 5478 5479 5480
if [ -z "$optflags" ]; then
    if enabled small; then
        optflags=$cflags_size
    elif enabled optimizations; then
        optflags=$cflags_speed
    else
        optflags=$cflags_noopt
    fi
5481
fi
5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492

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
5493
    disable inline_asm_direct_symbol_refs
5494
fi
5495 5496 5497 5498

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

5500 5501
enabled ftrapv && check_cflags -ftrapv

5502 5503 5504 5505
check_cc -mno-red-zone <<EOF && noredzone_flags="-mno-red-zone"
int x;
EOF

5506

5507
if enabled icc; then
Måns Rullgård's avatar
Måns Rullgård committed
5508 5509 5510 5511
    # Just warnings, no remarks
    check_cflags -w1
    # -wd: Disable following warnings
    # 144, 167, 556: -Wno-pointer-sign
5512
    # 188: enumerated type mixed with another type
5513
    # 1292: attribute "foo" ignored
5514
    # 1419: external declaration in primary source file
Måns Rullgård's avatar
Måns Rullgård committed
5515
    # 10006: ignoring unknown option -fno-signed-zeros
5516
    # 10148: ignoring unknown option -Wno-parentheses
Måns Rullgård's avatar
Måns Rullgård committed
5517
    # 10156: ignoring option '-W'; no argument required
5518 5519 5520
    # 13200: No EMMS instruction before call to function
    # 13203: No EMMS instruction before return from function
    check_cflags -wd144,167,188,556,1292,1419,10006,10148,10156,13200,13203
Måns Rullgård's avatar
Måns Rullgård committed
5521 5522 5523
    # 11030: Warning unknown option --as-needed
    # 10156: ignoring option '-export'; no argument required
    check_ldflags -wd10156,11030
5524 5525
    # icc 11.0 and 11.1 work with ebp_available, but don't pass the test
    enable ebp_available
5526 5527
    # The test above does not test linking
    enabled lto && disable symver_asm_label
5528
    if enabled x86_32; then
5529
        icc_version=$($cc -dumpversion)
5530 5531
        test ${icc_version%%.*} -ge 11 &&
            check_cflags -falign-stack=maintain-16-byte ||
5532 5533
            disable aligned_stack
    fi
5534 5535
elif enabled ccc; then
    # disable some annoying warnings
5536 5537 5538 5539
    add_cflags -msg_disable bitnotint
    add_cflags -msg_disable mixfuncvoid
    add_cflags -msg_disable nonstandcast
    add_cflags -msg_disable unsupieee
5540
elif enabled gcc; then
5541
    check_optflags -fno-tree-vectorize
5542
    check_cflags -Werror=format-security
5543
    check_cflags -Werror=implicit-function-declaration
5544
    check_cflags -Werror=missing-prototypes
5545
    check_cflags -Werror=return-type
5546
    check_cflags -Werror=vla
5547
    check_cflags -Wformat
5548
    check_cflags -fdiagnostics-color=auto
5549
    enabled extra_warnings || check_disable_warning -Wno-maybe-uninitialized
5550 5551
elif enabled llvm_gcc; then
    check_cflags -mllvm -stack-alignment=16
5552
elif enabled clang; then
5553
    check_cflags -mllvm -stack-alignment=16
5554
    check_cflags -Qunused-arguments
5555 5556
    check_cflags -Werror=implicit-function-declaration
    check_cflags -Werror=missing-prototypes
5557
    check_cflags -Werror=return-type
Luca Barbato's avatar
Luca Barbato committed
5558 5559 5560
elif enabled cparser; then
    add_cflags -Wno-missing-variable-declarations
    add_cflags -Wno-empty-statement
5561
elif enabled armcc; then
5562 5563
    add_cflags -W${armcc_opt},--diag_suppress=4343 # hardfp compat
    add_cflags -W${armcc_opt},--diag_suppress=3036 # using . as system include dir
5564
    # 2523: use of inline assembly is deprecated
5565 5566
    add_cflags -W${armcc_opt},--diag_suppress=2523
    add_cflags -W${armcc_opt},--diag_suppress=1207
5567
    add_cflags -W${armcc_opt},--diag_suppress=1293 # assignment in condition
5568
    add_cflags -W${armcc_opt},--diag_suppress=3343 # hardfp compat
5569 5570
    add_cflags -W${armcc_opt},--diag_suppress=167  # pointer sign
    add_cflags -W${armcc_opt},--diag_suppress=513  # pointer sign
5571 5572
elif enabled tms470; then
    add_cflags -pds=824 -pds=837
5573
    disable inline_asm
5574 5575
elif enabled pathscale; then
    add_cflags -fstrict-overflow -OPT:wrap_around_unsafe_opt=OFF
5576
elif enabled_any msvc icl; then
5577
    enabled x86_32 && disable aligned_stack
5578
    enabled_all x86_32 debug && add_cflags -Oy-
5579
    enabled debug && add_ldflags -debug
5580
    enable pragma_deprecated
5581
    if enabled icl; then
5582 5583 5584 5585
        # -Qansi-alias is basically -fstrict-aliasing, but does not work
        # (correctly) on icl 13.x.
        check_cpp_condition "windows.h" "__ICL < 1300 || __ICL >= 1400" &&
            add_cflags -Qansi-alias
5586 5587 5588 5589 5590
        # Some inline asm is not compilable in debug
        if enabled debug; then
            disable ebp_available
            disable ebx_available
        fi
5591
    fi
5592
    # msvcrt10 x64 incorrectly enables log2, only msvcrt12 (MSVC 2013) onwards actually has log2.
5593
    check_cpp_condition crtversion.h "_VC_CRT_MAJOR_VERSION >= 12" || disable log2
5594 5595
fi

5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607
case $as_type in
    clang)
        add_asflags -Qunused-arguments
    ;;
esac

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

Mans Rullgard's avatar
Mans Rullgard committed
5608
case $target_os in
5609 5610 5611
    osf1)
        enabled ccc && add_ldflags '-Wl,-expect_unresolved,*'
    ;;
Mans Rullgard's avatar
Mans Rullgard committed
5612 5613 5614 5615 5616
    plan9)
        add_cppflags -Dmain=plan9_main
    ;;
esac

5617
enable frame_thread_encoder
5618

5619 5620
enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }

5621
check_deps $CONFIG_LIST       \
5622
           $CONFIG_EXTRA      \
5623
           $HAVE_LIST         \
5624
           $ALL_COMPONENTS    \
5625

5626 5627
enabled threads && ! enabled pthreads && ! enabled atomics_native && die "non pthread threading without atomics not supported, try adding --enable-pthreads or --cpu=i486 or higher if you are on x86"

5628

5629
if test $target_os = "haiku"; then
5630 5631 5632 5633
    disable memalign
    disable posix_memalign
fi

5634
enabled_all dxva2 dxva2api_cobj CoTaskMemFree &&
5635
    prepend ffmpeg_libs $($ldflags_filter "-lole32" "-luser32") &&
5636 5637
    enable dxva2_lib

5638
! enabled_any memalign posix_memalign aligned_malloc &&
5639
    enabled simd_align_16 && enable memalign_hack
5640

5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667
# 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

5668 5669
map 'enabled $v && intrinsics=${v#intrinsics_}' $INTRINSICS_LIST

5670 5671 5672 5673 5674 5675 5676 5677
for thread in $THREADS_LIST; do
    if enabled $thread; then
        test -n "$thread_type" &&
            die "ERROR: Only one thread type must be selected." ||
            thread_type="$thread"
    fi
done

5678 5679
enabled zlib && add_cppflags -DZLIB_CONST

5680
# conditional library dependencies, in linking order
5681 5682 5683 5684
enabled amovie_filter       && prepend avfilter_deps "avformat avcodec"
enabled aresample_filter    && prepend avfilter_deps "swresample"
enabled asyncts_filter      && prepend avfilter_deps "avresample"
enabled atempo_filter       && prepend avfilter_deps "avcodec"
5685
enabled cover_rect_filter   && prepend avfilter_deps "avformat avcodec"
5686
enabled ebur128_filter && enabled swresample && prepend avfilter_deps "swresample"
5687
enabled elbg_filter         && prepend avfilter_deps "avcodec"
5688
enabled fftfilt_filter      && prepend avfilter_deps "avcodec"
5689
enabled find_rect_filter    && prepend avfilter_deps "avformat avcodec"
5690
enabled mcdeint_filter      && prepend avfilter_deps "avcodec"
5691
enabled movie_filter    && prepend avfilter_deps "avformat avcodec"
5692 5693 5694
enabled pan_filter          && prepend avfilter_deps "swresample"
enabled pp_filter           && prepend avfilter_deps "postproc"
enabled removelogo_filter   && prepend avfilter_deps "avformat avcodec swscale"
5695
enabled resample_filter && prepend avfilter_deps "avresample"
5696
enabled sab_filter          && prepend avfilter_deps "swscale"
5697
enabled scale_filter    && prepend avfilter_deps "swscale"
5698 5699 5700
enabled showspectrum_filter && prepend avfilter_deps "avcodec"
enabled smartblur_filter    && prepend avfilter_deps "swscale"
enabled subtitles_filter    && prepend avfilter_deps "avformat avcodec"
5701
enabled uspp_filter         && prepend avfilter_deps "avcodec"
5702 5703

enabled lavfi_indev         && prepend avdevice_deps "avfilter"
5704

5705
enabled opus_decoder    && prepend avcodec_deps "swresample"
5706

5707 5708 5709 5710 5711 5712 5713
expand_deps(){
    lib_deps=${1}_deps
    eval "deps=\$$lib_deps"
    append $lib_deps $(map 'eval echo \$${v}_deps' $deps)
    unique $lib_deps
}

5714 5715 5716
#we have to remove gpl from the deps here as some code assumes all lib deps are libs
postproc_deps="$(filter_out 'gpl' $postproc_deps)"

5717 5718
map 'expand_deps $v' $LIBRARY_LIST

5719
echo "install prefix            $prefix"
Diego Biurrun's avatar
Diego Biurrun committed
5720 5721
echo "source path               $source_path"
echo "C compiler                $cc"
5722
echo "C library                 $libc_type"
5723 5724
if test "$host_cc" != "$cc"; then
    echo "host C compiler           $host_cc"
5725
    echo "host C library            $host_libc_type"
5726
fi
Diego Biurrun's avatar
Diego Biurrun committed
5727
echo "ARCH                      $arch ($cpu)"
5728 5729
if test "$build_suffix" != ""; then
    echo "build suffix              $build_suffix"
5730
fi
5731 5732 5733
if test "$progs_suffix" != ""; then
    echo "progs suffix              $progs_suffix"
fi
5734 5735 5736
if test "$extra_version" != ""; then
    echo "version string suffix     $extra_version"
fi
5737
echo "big-endian                ${bigendian-no}"
5738
echo "runtime cpu detection     ${runtime_cpudetect-no}"
5739
if enabled x86; then
5740
    echo "${yasmexe}                      ${yasm-no}"
5741
    echo "MMX enabled               ${mmx-no}"
5742
    echo "MMXEXT enabled            ${mmxext-no}"
5743
    echo "3DNow! enabled            ${amd3dnow-no}"
5744
    echo "3DNow! extended enabled   ${amd3dnowext-no}"
5745
    echo "SSE enabled               ${sse-no}"
5746
    echo "SSSE3 enabled             ${ssse3-no}"
5747
    echo "AVX enabled               ${avx-no}"
5748
    echo "XOP enabled               ${xop-no}"
5749
    echo "FMA3 enabled              ${fma3-no}"
5750
    echo "FMA4 enabled              ${fma4-no}"
5751
    echo "i686 features enabled     ${i686-no}"
5752
    echo "CMOV is fast              ${fast_cmov-no}"
5753 5754
    echo "EBX available             ${ebx_available-no}"
    echo "EBP available             ${ebp_available-no}"
5755
fi
5756 5757 5758 5759
if enabled aarch64; then
    echo "NEON enabled              ${neon-no}"
    echo "VFP enabled               ${vfp-no}"
fi
5760
if enabled arm; then
5761 5762
    echo "ARMv5TE enabled           ${armv5te-no}"
    echo "ARMv6 enabled             ${armv6-no}"
5763
    echo "ARMv6T2 enabled           ${armv6t2-no}"
5764
    echo "VFP enabled               ${vfp-no}"
5765
    echo "NEON enabled              ${neon-no}"
5766
    echo "THUMB enabled             ${thumb-no}"
5767
fi
5768
if enabled mips; then
5769
    echo "MIPS FPU enabled          ${mipsfpu-no}"
5770
    echo "MIPS32R5 enabled          ${mips32r5-no}"
5771
    echo "MIPS64R6 enabled          ${mips64r6-no}"
5772 5773
    echo "MIPS DSP R1 enabled       ${mipsdspr1-no}"
    echo "MIPS DSP R2 enabled       ${mipsdspr2-no}"
5774
    echo "MIPS MSA enabled          ${msa-no}"
5775
    echo "LOONGSON3 enabled         ${loongson3-no}"
5776
fi
5777
if enabled ppc; then
5778
    echo "AltiVec enabled           ${altivec-no}"
5779 5780
    echo "VSX enabled               ${vsx-no}"
    echo "POWER8 enabled            ${power8-no}"
5781
    echo "PPC 4xx optimizations     ${ppc4xx-no}"
5782
    echo "dcbzl available           ${dcbzl-no}"
5783
fi
5784
echo "debug symbols             ${debug-no}"
5785
echo "strip symbols             ${stripping-no}"
5786
echo "optimize for size         ${small-no}"
5787
echo "optimizations             ${optimizations-no}"
5788 5789
echo "static                    ${static-no}"
echo "shared                    ${shared-no}"
5790
echo "postprocessing support    ${postproc-no}"
5791
echo "new filter support        ${avfilter-no}"
5792 5793
echo "network support           ${network-no}"
echo "threading support         ${thread_type-no}"
5794
echo "safe bitstream reader     ${safe_bitstream_reader-no}"
5795
echo "SDL support               ${sdl-no}"
5796
echo "opencl enabled            ${opencl-no}"
5797
echo "texi2html enabled         ${texi2html-no}"
5798
echo "perl enabled              ${perl-no}"
5799 5800
echo "pod2man enabled           ${pod2man-no}"
echo "makeinfo enabled          ${makeinfo-no}"
5801
echo "makeinfo supports HTML    ${makeinfo_html-no}"
5802 5803
test -n "$random_seed" &&
    echo "random seed               ${random_seed}"
5804
echo
Fabrice Bellard's avatar
Fabrice Bellard committed
5805

5806 5807 5808 5809
echo "External libraries:"
print_enabled '' $EXTERNAL_LIBRARY_LIST | print_3_columns
echo

5810
for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
5811
    echo "Enabled ${type}s:"
5812
    eval list=\$$(toupper $type)_LIST
5813
    print_enabled '_*' $list | print_3_columns
5814
    echo
5815 5816
done

5817
license="LGPL version 2.1 or later"
5818
if enabled nonfree; then
5819
    license="nonfree and unredistributable"
5820 5821 5822 5823
elif enabled gplv3; then
    license="GPL version 3 or later"
elif enabled lgplv3; then
    license="LGPL version 3 or later"
5824
elif enabled gpl; then
5825
    license="GPL version 2 or later"
5826 5827 5828
fi

echo "License: $license"
5829

5830
echo "Creating config.mak, config.h, and doc/config.texi..."
5831

5832
test -e Makefile || echo "include $source_path/Makefile" > Makefile
5833

5834 5835
enabled stripping || strip="echo skipping strip"

5836
config_files="$TMPH config.mak doc/config.texi"
5837

5838 5839
cat > config.mak <<EOF
# Automatically generated by configure - do not modify!
5840 5841
ifndef FFMPEG_CONFIG_MAK
FFMPEG_CONFIG_MAK=1
5842
FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
5843 5844 5845 5846 5847 5848
prefix=$prefix
LIBDIR=\$(DESTDIR)$libdir
SHLIBDIR=\$(DESTDIR)$shlibdir
INCDIR=\$(DESTDIR)$incdir
BINDIR=\$(DESTDIR)$bindir
DATADIR=\$(DESTDIR)$datadir
5849
DOCDIR=\$(DESTDIR)$docdir
5850
MANDIR=\$(DESTDIR)$mandir
5851
PKGCONFIGDIR=\$(DESTDIR)$pkgconfigdir
5852
SRC_PATH=$source_path
5853 5854 5855
ifndef MAIN_MAKEFILE
SRC_PATH:=\$(SRC_PATH:.%=..%)
endif
5856
CC_IDENT=$cc_ident
5857
ARCH=$arch
5858
INTRINSICS=$intrinsics
5859
CC=$cc
Mohamed Naufal's avatar
Mohamed Naufal committed
5860
CXX=$cxx
5861 5862 5863
AS=$as
LD=$ld
DEPCC=$dep_cc
5864 5865 5866
DEPCCFLAGS=$DEPCCFLAGS \$(CPPFLAGS)
DEPAS=$as
DEPASFLAGS=$DEPASFLAGS \$(CPPFLAGS)
5867
YASM=$yasmexe
5868
DEPYASM=$yasmexe
5869
AR=$ar
5870 5871
ARFLAGS=$arflags
AR_O=$ar_o
5872
RANLIB=$ranlib
5873
STRIP=$strip
5874
CP=cp -p
5875 5876 5877
LN_S=$ln_s
CPPFLAGS=$CPPFLAGS
CFLAGS=$CFLAGS
Mohamed Naufal's avatar
Mohamed Naufal committed
5878
CXXFLAGS=$CXXFLAGS
5879
ASFLAGS=$ASFLAGS
5880
AS_C=$AS_C
5881
AS_O=$AS_O
5882
CC_C=$CC_C
5883
CC_E=$CC_E
5884
CC_O=$CC_O
5885
CXX_C=$CXX_C
Mohamed Naufal's avatar
Mohamed Naufal committed
5886
CXX_O=$CXX_O
5887
LD_O=$LD_O
5888 5889
LD_LIB=$LD_LIB
LD_PATH=$LD_PATH
5890
DLLTOOL=$dlltool
5891
WINDRES=$windres
5892
DEPWINDRES=$dep_cc
5893
DOXYGEN=$doxygen
5894
LDFLAGS=$LDFLAGS
5895
LDEXEFLAGS=$LDEXEFLAGS
5896
SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
5897
ASMSTRIPFLAGS=$ASMSTRIPFLAGS
5898 5899
YASMFLAGS=$YASMFLAGS
BUILDSUF=$build_suffix
5900
PROGSSUF=$progs_suffix
5901 5902 5903 5904 5905 5906 5907 5908 5909
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
5910
CXXDEP=$CXXDEP
5911
CCDEP_FLAGS=$CCDEP_FLAGS
5912
ASDEP=$ASDEP
5913
ASDEP_FLAGS=$ASDEP_FLAGS
5914 5915 5916
CC_DEPFLAGS=$CC_DEPFLAGS
AS_DEPFLAGS=$AS_DEPFLAGS
HOSTCC=$host_cc
5917
HOSTLD=$host_ld
5918
HOSTCFLAGS=$host_cflags
5919
HOSTCPPFLAGS=$host_cppflags
5920 5921 5922
HOSTEXESUF=$HOSTEXESUF
HOSTLDFLAGS=$host_ldflags
HOSTLIBS=$host_libs
5923 5924 5925 5926 5927
DEPHOSTCC=$host_cc
DEPHOSTCCFLAGS=$DEPHOSTCCFLAGS \$(HOSTCCFLAGS)
HOSTCCDEP=$HOSTCCDEP
HOSTCCDEP_FLAGS=$HOSTCCDEP_FLAGS
HOSTCC_DEPFLAGS=$HOSTCC_DEPFLAGS
5928
HOSTCC_C=$HOSTCC_C
5929
HOSTCC_O=$HOSTCC_O
5930
HOSTLD_O=$HOSTLD_O
5931
TARGET_EXEC=$target_exec $target_exec_args
5932
TARGET_PATH=$target_path
5933
TARGET_SAMPLES=${target_samples:-\$(SAMPLES)}
5934
CFLAGS-ffplay=$sdl_cflags
5935
ZLIB=$($ldflags_filter -lz)
5936 5937
LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
EXTRALIBS=$extralibs
5938
COMPAT_OBJS=$compat_objs
5939
EXEOBJS=$exeobjs
5940
INSTALL=$install
5941 5942 5943 5944 5945 5946
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}
5947 5948 5949 5950
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}
5951
SAMPLES:=${samples:-\$(FATE_SAMPLES)}
5952
NOREDZONE_FLAGS=$noredzone_flags
5953
EOF
5954

5955
get_version(){
5956
    lcname=lib${1}
5957 5958
    name=$(toupper $lcname)
    file=$source_path/$lcname/version.h
5959
    eval $(awk "/#define ${name}_VERSION_M/ { print \$2 \"=\" \$3 }" "$file")
5960
    enabled raise_major && eval ${name}_VERSION_MAJOR=$((${name}_VERSION_MAJOR+100))
5961
    eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
5962 5963
    eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
    eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
5964
    eval echo "${lcname}_VERSION_MINOR=\$${name}_VERSION_MINOR" >> config.mak
5965 5966
}

5967
map 'get_version $v' $LIBRARY_LIST
5968

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

5971 5972 5973 5974 5975 5976 5977
print_program_libs(){
    eval "program_libs=\$${1}_libs"
    eval echo "LIBS-${1}=${program_libs}" >> config.mak
}

map 'print_program_libs $v' $PROGRAM_LIST

5978 5979
cat > $TMPH <<EOF
/* Automatically generated by configure - do not modify! */
5980 5981 5982
#ifndef FFMPEG_CONFIG_H
#define FFMPEG_CONFIG_H
#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
5983
#define FFMPEG_LICENSE "$(c_escape $license)"
James Almer's avatar
James Almer committed
5984
#define CONFIG_THIS_YEAR 2015
5985
#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
5986
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
5987
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
5988
#define av_restrict $_restrict
5989 5990
#define EXTERN_PREFIX "${extern_prefix}"
#define EXTERN_ASM ${extern_prefix}
5991
#define BUILDSUF "$build_suffix"
5992
#define SLIBSUF "$SLIBSUF"
5993
#define HAVE_MMX2 HAVE_MMXEXT
5994
#define SWS_MAX_FILTER_SIZE $sws_max_filter_size
5995
EOF
5996

5997 5998 5999
test -n "$assert_level" &&
    echo "#define ASSERT_LEVEL $assert_level" >>$TMPH

6000 6001 6002
test -n "$malloc_prefix" &&
    echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH

6003 6004 6005 6006 6007
if enabled yasm; then
    append config_files $TMPASM
    printf '' >$TMPASM
fi

6008 6009
enabled getenv || echo "#define getenv(x) NULL" >> $TMPH

6010

6011
mkdir -p doc
6012
mkdir -p tests
6013 6014
echo "@c auto-generated by configure" > doc/config.texi

6015 6016 6017
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
6018
                                     $CONFIG_EXTRA      \
6019
                                     $ALL_COMPONENTS    \
6020

6021
echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH
6022
echo "endif # FFMPEG_CONFIG_MAK" >> config.mak
6023

Diego Biurrun's avatar
Diego Biurrun committed
6024
# Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
6025
cp_if_changed $TMPH config.h
6026
touch .config
Nick Kurshev's avatar
Nick Kurshev committed
6027

6028 6029
enabled yasm && cp_if_changed $TMPASM config.asm

6030 6031 6032 6033 6034 6035
cat > $TMPH <<EOF
/* Generated by ffconf */
#ifndef AVUTIL_AVCONFIG_H
#define AVUTIL_AVCONFIG_H
EOF

6036
print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
6037 6038 6039 6040 6041

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

cp_if_changed $TMPH libavutil/avconfig.h

6042 6043 6044 6045
if test -n "$WARNINGS"; then
    printf "\n$WARNINGS"
    enabled fatal_warnings && exit 1
fi
6046

6047
# build pkg-config files
6048

6049
lib_version(){
6050
    eval printf "\"lib${1}${build_suffix} >= \$LIB$(toupper ${1})_VERSION, \""
6051 6052
}

6053
pkgconfig_generate(){
6054 6055 6056 6057 6058
    name=$1
    shortname=${name#lib}${build_suffix}
    comment=$2
    version=$3
    libs=$4
6059 6060
    requires=$(map 'lib_version $v' $(eval echo \$${name#lib}_deps))
    requires=${requires%, }
6061 6062
    enabled ${name#lib} || return 0
    mkdir -p $name
6063
    cat <<EOF > $name/$name${build_suffix}.pc
6064
prefix=$prefix
6065
exec_prefix=\${prefix}
6066
libdir=$libdir
6067
includedir=$incdir
6068

6069 6070 6071
Name: $name
Description: $comment
Version: $version
6072
Requires: $(enabled shared || echo $requires)
6073
Requires.private: $(enabled shared && echo $requires)
6074
Conflicts:
6075
Libs: -L\${libdir} $(enabled rpath && echo "-Wl,-rpath,\${libdir}") -l${shortname} $(enabled shared || echo $libs)
6076
Libs.private: $(enabled shared && echo $libs)
6077
Cflags: -I\${includedir}
6078
EOF
6079 6080 6081 6082

mkdir -p doc/examples/pc-uninstalled
includedir=${source_path}
[ "$includedir" = . ] && includedir="\${pcfiledir}/../../.."
6083
    cat <<EOF > doc/examples/pc-uninstalled/$name.pc
6084 6085
prefix=
exec_prefix=
6086 6087
libdir=\${pcfiledir}/../../../$name
includedir=${includedir}
6088

6089 6090 6091 6092
Name: $name
Description: $comment
Version: $version
Requires: $requires
6093
Conflicts:
6094
Libs: -L\${libdir} -Wl,-rpath,\${libdir} -l${shortname} $(enabled shared || echo $libs)
6095 6096
Cflags: -I\${includedir}
EOF
6097
}
6098

6099
pkgconfig_generate libavutil     "FFmpeg utility library"               "$LIBAVUTIL_VERSION"     "$LIBRT $LIBM"
6100 6101 6102 6103 6104
pkgconfig_generate libavcodec    "FFmpeg codec library"                 "$LIBAVCODEC_VERSION"    "$extralibs"
pkgconfig_generate libavformat   "FFmpeg container format library"      "$LIBAVFORMAT_VERSION"   "$extralibs"
pkgconfig_generate libavdevice   "FFmpeg device handling library"       "$LIBAVDEVICE_VERSION"   "$extralibs"
pkgconfig_generate libavfilter   "FFmpeg audio/video filtering library" "$LIBAVFILTER_VERSION"   "$extralibs"
pkgconfig_generate libpostproc   "FFmpeg postprocessing library"        "$LIBPOSTPROC_VERSION"   ""
6105
pkgconfig_generate libavresample "Libav audio resampling library"       "$LIBAVRESAMPLE_VERSION" "$LIBM"
6106 6107
pkgconfig_generate libswscale    "FFmpeg image rescaling library"       "$LIBSWSCALE_VERSION"    "$LIBM"
pkgconfig_generate libswresample "FFmpeg audio resampling library"      "$LIBSWRESAMPLE_VERSION" "$LIBM"