doc/platform.texi
1de6e14e
 \input texinfo @c -*- texinfo -*-
b4917514
 @documentencoding UTF-8
1de6e14e
 
7669144a
 @settitle Platform Specific Information
1de6e14e
 @titlepage
7669144a
 @center @titlefont{Platform Specific Information}
1de6e14e
 @end titlepage
 
 @top
 
 @contents
 
 @chapter Unix-like
 
c59b80c8
 Some parts of FFmpeg cannot be built with version 2.15 of the GNU
1de6e14e
 assembler which is still provided by a few AMD64 distributions. To
 make sure your compiler really uses the required version of gas
 after a binutils upgrade, run:
 
 @example
 $(gcc -print-prog-name=as) --version
 @end example
 
 If not, then you should install a different compiler that has no
 hard-coded path to gas. In the worst case pass @code{--disable-asm}
 to configure.
 
33a7b453
 @section Advanced linking configuration
 
e8a966e3
 If you compiled FFmpeg libraries statically and you want to use them to
33a7b453
 build your own shared library, you may need to force PIC support (with
e8a966e3
 @code{--enable-pic} during FFmpeg configure) and add the following option
33a7b453
 to your project LDFLAGS:
 
 @example
 -Wl,-Bsymbolic
 @end example
 
bb0babd7
 If your target platform requires position independent binaries, you should
 pass the correct linking flag (e.g. @code{-pie}) to @code{--extra-ldexeflags}.
 
1de6e14e
 @section BSD
 
c59b80c8
 BSD make will not build FFmpeg, you need to install and use GNU Make
90c9edba
 (@command{gmake}).
1de6e14e
 
 @section (Open)Solaris
 
31dfe20d
 GNU Make is required to build FFmpeg, so you have to invoke (@command{gmake}),
1de6e14e
 standard Solaris Make will not work. When building with a non-c99 front-end
 (gcc, generic suncc) add either @code{--extra-libs=/usr/lib/values-xpg6.o}
 or @code{--extra-libs=/usr/lib/64/values-xpg6.o} to the configure options
 since the libc is not c99-compliant by default. The probes performed by
 configure may raise an exception leading to the death of configure itself
 due to a bug in the system shell. Simply invoke a different shell such as
 bash directly to work around this:
 
 @example
 bash ./configure
 @end example
 
 @anchor{Darwin}
bed04e2b
 @section Darwin (Mac OS X, iPhone)
1de6e14e
 
 The toolchain provided with Xcode is sufficient to build the basic
41ed7ab4
 unaccelerated code.
1de6e14e
 
bed04e2b
 Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from
835f4137
 @url{https://github.com/FFmpeg/gas-preprocessor} or
b5c6b23a
 @url{https://github.com/yuvi/gas-preprocessor}(currently outdated) to build the optimized
463a7cde
 assembly functions. Put the Perl script somewhere
c59b80c8
 in your PATH, FFmpeg's configure will pick it up automatically.
1de6e14e
 
4f9297ac
 Mac OS X on amd64 and x86 requires @command{nasm} to build most of the
a125f87a
 optimized assembly functions. @uref{http://www.finkproject.org/, Fink},
4f9297ac
 @uref{https://wiki.gentoo.org/wiki/Project:Prefix, Gentoo Prefix},
675a66a9
 @uref{https://mxcl.github.com/homebrew/, Homebrew}
bed04e2b
 or @uref{http://www.macports.org, MacPorts} can easily provide it.
1de6e14e
 
 
 @chapter DOS
 
 Using a cross-compiler is preferred for various reasons.
 @url{http://www.delorie.com/howto/djgpp/linux-x-djgpp.html}
 
 
 @chapter OS/2
 
c59b80c8
 For information about compiling FFmpeg on OS/2 see
1de6e14e
 @url{http://www.edm2.com/index.php/FFmpeg}.
 
 
 @chapter Windows
 
c59b80c8
 To get help and instructions for building FFmpeg under Windows, check out
99a30ad5
 the FFmpeg Windows Help Forum at @url{http://ffmpeg.zeranoe.com/forum/}.
c59b80c8
 
f8241055
 @section Native Windows compilation using MinGW or MinGW-w64
1de6e14e
 
6c906ded
 FFmpeg can be built to run natively on Windows using the MinGW-w64
 toolchain. Install the latest versions of MSYS2 and MinGW-w64 from
 @url{http://msys2.github.io/} and/or @url{http://mingw-w64.sourceforge.net/}.
583661ee
 You can find detailed installation instructions in the download section and
 the FAQ.
1de6e14e
 
 Notes:
 
 @itemize
 
b0e8651a
 @item Building for the MSYS environment is discouraged, MSYS2 provides a full
 MinGW-w64 environment through @file{mingw64_shell.bat} or
 @file{mingw32_shell.bat} that should be used instead of the environment
 provided by @file{msys2_shell.bat}.
6b7df142
 
 @item Building using MSYS2 can be sped up by disabling implicit rules in the
 Makefile by calling @code{make -r} instead of plain @code{make}. This
1de6e14e
 speed up is close to non-existent for normal one-off builds and is only
d19f3e9a
 noticeable when running make for a second time (for example during
1de6e14e
 @code{make install}).
 
c59b80c8
 @item In order to compile FFplay, you must have the MinGW development library
d19f3e9a
 of @uref{http://www.libsdl.org/, SDL} and @code{pkg-config} installed.
1de6e14e
 
c59b80c8
 @item By using @code{./configure --enable-shared} when configuring FFmpeg,
 you can build the FFmpeg libraries (e.g. libavutil, libavcodec,
 libavformat) as DLLs.
1de6e14e
 
 @end itemize
 
6b7df142
 @subsection Native Windows compilation using MSYS2
 
 The MSYS2 MinGW-w64 environment provides ready to use toolchains and dependencies
 through @command{pacman}.
 
 Make sure to use @file{mingw64_shell.bat} or @file{mingw32_shell.bat} to have
b0e8651a
 the correct MinGW-w64 environment. The default install provides shortcuts to
 them under @command{MinGW-w64 Win64 Shell} and @command{MinGW-w64 Win32 Shell}.
6b7df142
 
 @example
 # normal msys2 packages
 pacman -S make pkgconf diffutils
 
 # mingw-w64 packages and toolchains
4f9297ac
 pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2
6b7df142
 @end example
 
41ed7ab4
 To target 32 bits replace @code{x86_64} with @code{i686} in the command above.
6b7df142
 
b0ce601c
 @section Microsoft Visual C++ or Intel C++ Compiler for Windows
1de6e14e
 
ec0b0c2b
 FFmpeg can be built with MSVC 2012 or earlier using a C99-to-C89 conversion utility
 and wrapper, or with MSVC 2013 and ICL natively.
1de6e14e
 
f8241055
 You will need the following prerequisites:
1de6e14e
 
f8241055
 @itemize
ec0b0c2b
 @item @uref{https://github.com/libav/c99-to-c89/, C99-to-C89 Converter & Wrapper}
 (if using MSVC 2012 or earlier)
f8241055
 @item @uref{http://code.google.com/p/msinttypes/, msinttypes}
ec0b0c2b
 (if using MSVC 2012 or earlier)
6c906ded
 @item @uref{http://msys2.github.io/, MSYS2}
4f9297ac
 @item @uref{http://www.nasm.us/, NASM}
6c906ded
 (Also available via MSYS2's package manager.)
f8241055
 @end itemize
 
6c906ded
 To set up a proper environment in MSYS2, you need to run @code{msys_shell.bat} from
b0ce601c
 the Visual Studio or Intel Compiler command prompt.
f8241055
 
ec0b0c2b
 Place @code{yasm.exe} somewhere in your @code{PATH}. If using MSVC 2012 or
 earlier, place @code{c99wrap.exe} and @code{c99conv.exe} somewhere in your
 @code{PATH} as well.
f8241055
 
ec0b0c2b
 Next, make sure any other headers and libs you want to use, such as zlib, are
 located in a spot that the compiler can see. Do so by modifying the @code{LIB}
 and @code{INCLUDE} environment variables to include the @strong{Windows-style}
99d68d46
 paths to these directories. Alternatively, you can try to use the
ec0b0c2b
 @code{--extra-cflags}/@code{--extra-ldflags} configure options. If using MSVC
 2012 or earlier, place @code{inttypes.h} somewhere the compiler can see too.
f8241055
 
 Finally, run:
 
 @example
b0ce601c
 For MSVC:
f8241055
 ./configure --toolchain=msvc
b0ce601c
 
 For ICL:
 ./configure --toolchain=icl
 
f8241055
 make
 make install
 @end example
 
7139f0e6
 If you wish to compile shared libraries, add @code{--enable-shared} to your
b0ce601c
 configure options. Note that due to the way MSVC and ICL handle DLL imports and
eed74064
 exports, you cannot compile static and shared libraries at the same time, and
 enabling shared libraries will automatically disable the static ones.
 
f8241055
 Notes:
 
 @itemize
 
 @item If you wish to build with zlib support, you will have to grab a compatible
 zlib binary from somewhere, with an MSVC import lib, or if you wish to link
 statically, you can follow the instructions below to build a compatible
 @code{zlib.lib} with MSVC. Regardless of which method you use, you must still
 follow step 3, or compilation will fail.
 @enumerate
 @item Grab the @uref{http://zlib.net/, zlib sources}.
 @item Edit @code{win32/Makefile.msc} so that it uses -MT instead of -MD, since
 this is how FFmpeg is built as well.
 @item Edit @code{zconf.h} and remove its inclusion of @code{unistd.h}. This gets
 erroneously included when building FFmpeg.
 @item Run @code{nmake -f win32/Makefile.msc}.
 @item Move @code{zlib.lib}, @code{zconf.h}, and @code{zlib.h} to somewhere MSVC
 can see.
 @end enumerate
 
bad8f04b
 @item FFmpeg has been tested with the following on i686 and x86_64:
b0ce601c
 @itemize
 @item Visual Studio 2010 Pro and Express
 @item Visual Studio 2012 Pro and Express
ec0b0c2b
 @item Visual Studio 2013 Pro and Express
b0ce601c
 @item Intel Composer XE 2013
ec0b0c2b
 @item Intel Composer XE 2013 SP1
b0ce601c
 @end itemize
f8241055
 Anything else is not officially supported.
 
 @end itemize
 
bad603c6
 @subsection Linking to FFmpeg with Microsoft Visual C++
f8241055
 
bad603c6
 If you plan to link with MSVC-built static libraries, you will need
 to make sure you have @code{Runtime Library} set to
 @code{Multi-threaded (/MT)} in your project's settings.
1de6e14e
 
f2f57d16
 You will need to define @code{inline} to something MSVC understands:
bad603c6
 @example
 #define inline __inline
 @end example
 
 Also note, that as stated in @strong{Microsoft Visual C++}, you will need
 an MSVC-compatible @uref{http://code.google.com/p/msinttypes/, inttypes.h}.
 
 If you plan on using import libraries created by dlltool, you must
 set @code{References} to @code{No (/OPT:NOREF)} under the linker optimization
 settings, otherwise the resulting binaries will fail during runtime.
 This is not required when using import libraries generated by @code{lib.exe}.
1de6e14e
 This issue is reported upstream at
 @url{http://sourceware.org/bugzilla/show_bug.cgi?id=12633}.
 
 To create import libraries that work with the @code{/OPT:REF} option
 (which is enabled by default in Release mode), follow these steps:
 
 @enumerate
 
bad603c6
 @item Open the @emph{Visual Studio Command Prompt}.
1de6e14e
 
 Alternatively, in a normal command line prompt, call @file{vcvars32.bat}
 which sets up the environment variables for the Visual C++ tools
bad603c6
 (the standard location for this file is something like
 @file{C:\Program Files (x86_\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat}).
1de6e14e
 
 @item Enter the @file{bin} directory where the created LIB and DLL files
 are stored.
 
90c9edba
 @item Generate new import libraries with @command{lib.exe}:
1de6e14e
 
 @example
d19f3e9a
 lib /machine:i386 /def:..\lib\foo-version.def  /out:foo.lib
1de6e14e
 @end example
 
d19f3e9a
 Replace @code{foo-version} and @code{foo} with the respective library names.
 
1de6e14e
 @end enumerate
 
 @anchor{Cross compilation for Windows with Linux}
 @section Cross compilation for Windows with Linux
 
 You must use the MinGW cross compilation tools available at
 @url{http://www.mingw.org/}.
 
c59b80c8
 Then configure FFmpeg with the following options:
1de6e14e
 @example
 ./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc-
 @end example
 (you can change the cross-prefix according to the prefix chosen for the
 MinGW tools).
 
c59b80c8
 Then you can easily test FFmpeg with @uref{http://www.winehq.com/, Wine}.
1de6e14e
 
 @section Compilation under Cygwin
 
 Please use Cygwin 1.7.x as the obsolete 1.5.x Cygwin versions lack
 llrint() in its C library.
 
 Install your Cygwin with all the "Base" packages, plus the
 following "Devel" ones:
 @example
17ad5fbb
 binutils, gcc4-core, make, git, mingw-runtime, texinfo
1de6e14e
 @end example
 
578344f7
 In order to run FATE you will also need the following "Utils" packages:
1de6e14e
 @example
a982c5d7
 diffutils
1de6e14e
 @end example
 
c59b80c8
 If you want to build FFmpeg with additional libraries, download Cygwin
1de6e14e
 "Devel" packages for Ogg and Vorbis from any Cygwin packages repository:
 @example
 libogg-devel, libvorbis-devel
 @end example
 
 These library packages are only available from
 @uref{http://sourceware.org/cygwinports/, Cygwin Ports}:
 
 @example
dc0f7114
 yasm, libSDL-devel, libgsm-devel, libmp3lame-devel,
220b24c7
 speex-devel, libtheora-devel, libxvidcore-devel
1de6e14e
 @end example
 
d19f3e9a
 The recommendation for x264 is to build it from source, as it evolves too
 quickly for Cygwin Ports to be up to date.
1de6e14e
 
 @section Crosscompilation for Windows under Cygwin
 
 With Cygwin you can create Windows binaries that do not need the cygwin1.dll.
 
 Just install your Cygwin as explained before, plus these additional
 "Devel" packages:
 @example
 gcc-mingw-core, mingw-runtime, mingw-zlib
 @end example
 
 and add some special flags to your configure invocation.
 
 For a static build run
 @example
 ./configure --target-os=mingw32 --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin
 @end example
 
 and for a build with shared libraries
 @example
 ./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin
 @end example
 
 @bye