yading@10: \input texinfo @c -*- texinfo -*- yading@10: yading@10: @settitle Platform Specific Information yading@10: @titlepage yading@10: @center @titlefont{Platform Specific Information} yading@10: @end titlepage yading@10: yading@10: @top yading@10: yading@10: @contents yading@10: yading@10: @chapter Unix-like yading@10: yading@10: Some parts of FFmpeg cannot be built with version 2.15 of the GNU yading@10: assembler which is still provided by a few AMD64 distributions. To yading@10: make sure your compiler really uses the required version of gas yading@10: after a binutils upgrade, run: yading@10: yading@10: @example yading@10: $(gcc -print-prog-name=as) --version yading@10: @end example yading@10: yading@10: If not, then you should install a different compiler that has no yading@10: hard-coded path to gas. In the worst case pass @code{--disable-asm} yading@10: to configure. yading@10: yading@10: @section BSD yading@10: yading@10: BSD make will not build FFmpeg, you need to install and use GNU Make yading@10: (@command{gmake}). yading@10: yading@10: @section (Open)Solaris yading@10: yading@10: GNU Make is required to build FFmpeg, so you have to invoke (@command{gmake}), yading@10: standard Solaris Make will not work. When building with a non-c99 front-end yading@10: (gcc, generic suncc) add either @code{--extra-libs=/usr/lib/values-xpg6.o} yading@10: or @code{--extra-libs=/usr/lib/64/values-xpg6.o} to the configure options yading@10: since the libc is not c99-compliant by default. The probes performed by yading@10: configure may raise an exception leading to the death of configure itself yading@10: due to a bug in the system shell. Simply invoke a different shell such as yading@10: bash directly to work around this: yading@10: yading@10: @example yading@10: bash ./configure yading@10: @end example yading@10: yading@10: @anchor{Darwin} yading@10: @section Darwin (Mac OS X, iPhone) yading@10: yading@10: The toolchain provided with Xcode is sufficient to build the basic yading@10: unacelerated code. yading@10: yading@10: Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from yading@10: @url{http://github.com/yuvi/gas-preprocessor} to build the optimized yading@10: assembler functions. Just download the Perl script and put it somewhere yading@10: in your PATH, FFmpeg's configure will pick it up automatically. yading@10: yading@10: Mac OS X on amd64 and x86 requires @command{yasm} to build most of the yading@10: optimized assembler functions. @uref{http://www.finkproject.org/, Fink}, yading@10: @uref{http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap-macos.xml, Gentoo Prefix}, yading@10: @uref{http://mxcl.github.com/homebrew/, Homebrew} yading@10: or @uref{http://www.macports.org, MacPorts} can easily provide it. yading@10: yading@10: yading@10: @chapter DOS yading@10: yading@10: Using a cross-compiler is preferred for various reasons. yading@10: @url{http://www.delorie.com/howto/djgpp/linux-x-djgpp.html} yading@10: yading@10: yading@10: @chapter OS/2 yading@10: yading@10: For information about compiling FFmpeg on OS/2 see yading@10: @url{http://www.edm2.com/index.php/FFmpeg}. yading@10: yading@10: yading@10: @chapter Windows yading@10: yading@10: To get help and instructions for building FFmpeg under Windows, check out yading@10: the FFmpeg Windows Help Forum at @url{http://ffmpeg.zeranoe.com/forum/}. yading@10: yading@10: @section Native Windows compilation using MinGW or MinGW-w64 yading@10: yading@10: FFmpeg can be built to run natively on Windows using the MinGW or MinGW-w64 yading@10: toolchains. Install the latest versions of MSYS and MinGW or MinGW-w64 from yading@10: @url{http://www.mingw.org/} or @url{http://mingw-w64.sourceforge.net/}. yading@10: You can find detailed installation instructions in the download section and yading@10: the FAQ. yading@10: yading@10: Notes: yading@10: yading@10: @itemize yading@10: yading@10: @item Building natively using MSYS can be sped up by disabling implicit rules yading@10: in the Makefile by calling @code{make -r} instead of plain @code{make}. This yading@10: speed up is close to non-existent for normal one-off builds and is only yading@10: noticeable when running make for a second time (for example during yading@10: @code{make install}). yading@10: yading@10: @item In order to compile FFplay, you must have the MinGW development library yading@10: of @uref{http://www.libsdl.org/, SDL} and @code{pkg-config} installed. yading@10: yading@10: @item By using @code{./configure --enable-shared} when configuring FFmpeg, yading@10: you can build the FFmpeg libraries (e.g. libavutil, libavcodec, yading@10: libavformat) as DLLs. yading@10: yading@10: @end itemize yading@10: yading@10: @section Microsoft Visual C++ yading@10: yading@10: FFmpeg can be built with MSVC using a C99-to-C89 conversion utility and yading@10: wrapper. yading@10: yading@10: You will need the following prerequisites: yading@10: yading@10: @itemize yading@10: @item @uref{http://download.videolan.org/pub/contrib/c99-to-c89/, C99-to-C89 Converter & Wrapper} yading@10: @item @uref{http://code.google.com/p/msinttypes/, msinttypes} yading@10: @item @uref{http://www.mingw.org/, MSYS} yading@10: @item @uref{http://yasm.tortall.net/, YASM} yading@10: @item @uref{http://gnuwin32.sourceforge.net/packages/bc.htm, bc for Windows} if yading@10: you want to run @uref{fate.html, FATE}. yading@10: @end itemize yading@10: yading@10: To set up a proper MSVC environment in MSYS, you simply need to run yading@10: @code{msys.bat} from the Visual Studio command prompt. yading@10: yading@10: Place @code{makedef}, @code{c99wrap.exe}, @code{c99conv.exe}, and @code{yasm.exe} yading@10: somewhere in your @code{PATH}. yading@10: yading@10: Next, make sure @code{inttypes.h} and any other headers and libs you want to use yading@10: are located in a spot that MSVC can see. Do so by modifying the @code{LIB} and yading@10: @code{INCLUDE} environment variables to include the @strong{Windows} paths to yading@10: these directories. Alternatively, you can try and use the yading@10: @code{--extra-cflags}/@code{--extra-ldflags} configure options. yading@10: yading@10: Finally, run: yading@10: yading@10: @example yading@10: ./configure --toolchain=msvc yading@10: make yading@10: make install yading@10: @end example yading@10: yading@10: If you wish to compile shared libraries, add @code{--enable-shared} to your yading@10: configure options. Note that due to the way MSVC handles DLL imports and yading@10: exports, you cannot compile static and shared libraries at the same time, and yading@10: enabling shared libraries will automatically disable the static ones. yading@10: yading@10: Notes: yading@10: yading@10: @itemize yading@10: yading@10: @item It is possible that coreutils' @code{link.exe} conflicts with MSVC's linker. yading@10: You can find out by running @code{which link} to see which @code{link.exe} you yading@10: are using. If it is located at @code{/bin/link.exe}, then you have the wrong one yading@10: in your @code{PATH}. Either move or remove that copy, or make sure MSVC's yading@10: @code{link.exe} takes precedence in your @code{PATH} over coreutils'. yading@10: yading@10: @item If you wish to build with zlib support, you will have to grab a compatible yading@10: zlib binary from somewhere, with an MSVC import lib, or if you wish to link yading@10: statically, you can follow the instructions below to build a compatible yading@10: @code{zlib.lib} with MSVC. Regardless of which method you use, you must still yading@10: follow step 3, or compilation will fail. yading@10: @enumerate yading@10: @item Grab the @uref{http://zlib.net/, zlib sources}. yading@10: @item Edit @code{win32/Makefile.msc} so that it uses -MT instead of -MD, since yading@10: this is how FFmpeg is built as well. yading@10: @item Edit @code{zconf.h} and remove its inclusion of @code{unistd.h}. This gets yading@10: erroneously included when building FFmpeg. yading@10: @item Run @code{nmake -f win32/Makefile.msc}. yading@10: @item Move @code{zlib.lib}, @code{zconf.h}, and @code{zlib.h} to somewhere MSVC yading@10: can see. yading@10: @end enumerate yading@10: yading@10: @item FFmpeg has been tested with Visual Studio 2010 and 2012, Pro and Express. yading@10: Anything else is not officially supported. yading@10: yading@10: @end itemize yading@10: yading@10: @subsection Linking to FFmpeg with Microsoft Visual C++ yading@10: yading@10: If you plan to link with MSVC-built static libraries, you will need yading@10: to make sure you have @code{Runtime Library} set to yading@10: @code{Multi-threaded (/MT)} in your project's settings. yading@10: yading@10: You will need to define @code{inline} to something MSVC understands: yading@10: @example yading@10: #define inline __inline yading@10: @end example yading@10: yading@10: Also note, that as stated in @strong{Microsoft Visual C++}, you will need yading@10: an MSVC-compatible @uref{http://code.google.com/p/msinttypes/, inttypes.h}. yading@10: yading@10: If you plan on using import libraries created by dlltool, you must yading@10: set @code{References} to @code{No (/OPT:NOREF)} under the linker optimization yading@10: settings, otherwise the resulting binaries will fail during runtime. yading@10: This is not required when using import libraries generated by @code{lib.exe}. yading@10: This issue is reported upstream at yading@10: @url{http://sourceware.org/bugzilla/show_bug.cgi?id=12633}. yading@10: yading@10: To create import libraries that work with the @code{/OPT:REF} option yading@10: (which is enabled by default in Release mode), follow these steps: yading@10: yading@10: @enumerate yading@10: yading@10: @item Open the @emph{Visual Studio Command Prompt}. yading@10: yading@10: Alternatively, in a normal command line prompt, call @file{vcvars32.bat} yading@10: which sets up the environment variables for the Visual C++ tools yading@10: (the standard location for this file is something like yading@10: @file{C:\Program Files (x86_\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat}). yading@10: yading@10: @item Enter the @file{bin} directory where the created LIB and DLL files yading@10: are stored. yading@10: yading@10: @item Generate new import libraries with @command{lib.exe}: yading@10: yading@10: @example yading@10: lib /machine:i386 /def:..\lib\foo-version.def /out:foo.lib yading@10: @end example yading@10: yading@10: Replace @code{foo-version} and @code{foo} with the respective library names. yading@10: yading@10: @end enumerate yading@10: yading@10: @anchor{Cross compilation for Windows with Linux} yading@10: @section Cross compilation for Windows with Linux yading@10: yading@10: You must use the MinGW cross compilation tools available at yading@10: @url{http://www.mingw.org/}. yading@10: yading@10: Then configure FFmpeg with the following options: yading@10: @example yading@10: ./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc- yading@10: @end example yading@10: (you can change the cross-prefix according to the prefix chosen for the yading@10: MinGW tools). yading@10: yading@10: Then you can easily test FFmpeg with @uref{http://www.winehq.com/, Wine}. yading@10: yading@10: @section Compilation under Cygwin yading@10: yading@10: Please use Cygwin 1.7.x as the obsolete 1.5.x Cygwin versions lack yading@10: llrint() in its C library. yading@10: yading@10: Install your Cygwin with all the "Base" packages, plus the yading@10: following "Devel" ones: yading@10: @example yading@10: binutils, gcc4-core, make, git, mingw-runtime, texi2html yading@10: @end example yading@10: yading@10: In order to run FATE you will also need the following "Utils" packages: yading@10: @example yading@10: bc, diffutils yading@10: @end example yading@10: yading@10: If you want to build FFmpeg with additional libraries, download Cygwin yading@10: "Devel" packages for Ogg and Vorbis from any Cygwin packages repository: yading@10: @example yading@10: libogg-devel, libvorbis-devel yading@10: @end example yading@10: yading@10: These library packages are only available from yading@10: @uref{http://sourceware.org/cygwinports/, Cygwin Ports}: yading@10: yading@10: @example yading@10: yasm, libSDL-devel, libfaac-devel, libaacplus-devel, libgsm-devel, libmp3lame-devel, yading@10: libschroedinger1.0-devel, speex-devel, libtheora-devel, libxvidcore-devel yading@10: @end example yading@10: yading@10: The recommendation for x264 is to build it from source, as it evolves too yading@10: quickly for Cygwin Ports to be up to date. yading@10: yading@10: @section Crosscompilation for Windows under Cygwin yading@10: yading@10: With Cygwin you can create Windows binaries that do not need the cygwin1.dll. yading@10: yading@10: Just install your Cygwin as explained before, plus these additional yading@10: "Devel" packages: yading@10: @example yading@10: gcc-mingw-core, mingw-runtime, mingw-zlib yading@10: @end example yading@10: yading@10: and add some special flags to your configure invocation. yading@10: yading@10: For a static build run yading@10: @example yading@10: ./configure --target-os=mingw32 --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin yading@10: @end example yading@10: yading@10: and for a build with shared libraries yading@10: @example yading@10: ./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin yading@10: @end example yading@10: yading@10: @chapter Plan 9 yading@10: yading@10: The native @uref{http://plan9.bell-labs.com/plan9/, Plan 9} compiler yading@10: does not implement all the C99 features needed by FFmpeg so the gcc yading@10: port must be used. Furthermore, a few items missing from the C yading@10: library and shell environment need to be fixed. yading@10: yading@10: @itemize yading@10: yading@10: @item GNU awk, grep, make, and sed yading@10: yading@10: Working packages of these tools can be found at yading@10: @uref{http://code.google.com/p/ports2plan9/downloads/list, ports2plan9}. yading@10: They can be installed with @uref{http://9front.org/, 9front's} @code{pkg} yading@10: utility by setting @code{pkgpath} to yading@10: @code{http://ports2plan9.googlecode.com/files/}. yading@10: yading@10: @item Missing/broken @code{head} and @code{printf} commands yading@10: yading@10: Replacements adequate for building FFmpeg can be found in the yading@10: @code{compat/plan9} directory. Place these somewhere they will be yading@10: found by the shell. These are not full implementations of the yading@10: commands and are @emph{not} suitable for general use. yading@10: yading@10: @item Missing C99 @code{stdint.h} and @code{inttypes.h} yading@10: yading@10: Replacement headers are available from yading@10: @url{http://code.google.com/p/plan9front/issues/detail?id=152}. yading@10: yading@10: @item Missing or non-standard library functions yading@10: yading@10: Some functions in the C library are missing or incomplete. The yading@10: @code{@uref{http://ports2plan9.googlecode.com/files/gcc-apelibs-1207.tbz, yading@10: gcc-apelibs-1207}} package from yading@10: @uref{http://code.google.com/p/ports2plan9/downloads/list, ports2plan9} yading@10: includes an updated C library, but installing the full package gives yading@10: unusable executables. Instead, keep the files from @code{gccbin.tgz} yading@10: under @code{/386/lib/gnu}. From the @code{libc.a} archive in the yading@10: @code{gcc-apelibs-1207} package, extract the following object files and yading@10: turn them into a library: yading@10: yading@10: @itemize yading@10: @item @code{strerror.o} yading@10: @item @code{strtoll.o} yading@10: @item @code{snprintf.o} yading@10: @item @code{vsnprintf.o} yading@10: @item @code{vfprintf.o} yading@10: @item @code{_IO_getc.o} yading@10: @item @code{_IO_putc.o} yading@10: @end itemize yading@10: yading@10: Use the @code{--extra-libs} option of @code{configure} to inform the yading@10: build system of this library. yading@10: yading@10: @item FPU exceptions enabled by default yading@10: yading@10: Unlike most other systems, Plan 9 enables FPU exceptions by default. yading@10: These must be disabled before calling any FFmpeg functions. While the yading@10: included tools will do this automatically, other users of the yading@10: libraries must do it themselves. yading@10: yading@10: @end itemize yading@10: yading@10: @bye