1\input texinfo @c -*- texinfo -*- 2@documentencoding UTF-8 3 4@settitle Platform Specific Information 5@titlepage 6@center @titlefont{Platform Specific Information} 7@end titlepage 8 9@top 10 11@contents 12 13@chapter Unix-like 14 15Some parts of FFmpeg cannot be built with version 2.15 of the GNU 16assembler which is still provided by a few AMD64 distributions. To 17make sure your compiler really uses the required version of gas 18after a binutils upgrade, run: 19 20@example 21$(gcc -print-prog-name=as) --version 22@end example 23 24If not, then you should install a different compiler that has no 25hard-coded path to gas. In the worst case pass @code{--disable-asm} 26to configure. 27 28@section Advanced linking configuration 29 30If you compiled FFmpeg libraries statically and you want to use them to 31build your own shared library, you may need to force PIC support (with 32@code{--enable-pic} during FFmpeg configure) and add the following option 33to your project LDFLAGS: 34 35@example 36-Wl,-Bsymbolic 37@end example 38 39If your target platform requires position independent binaries, you should 40pass the correct linking flag (e.g. @code{-pie}) to @code{--extra-ldexeflags}. 41 42@section BSD 43 44BSD make will not build FFmpeg, you need to install and use GNU Make 45(@command{gmake}). 46 47@section (Open)Solaris 48 49GNU Make is required to build FFmpeg, so you have to invoke (@command{gmake}), 50standard Solaris Make will not work. When building with a non-c99 front-end 51(gcc, generic suncc) add either @code{--extra-libs=/usr/lib/values-xpg6.o} 52or @code{--extra-libs=/usr/lib/64/values-xpg6.o} to the configure options 53since the libc is not c99-compliant by default. The probes performed by 54configure may raise an exception leading to the death of configure itself 55due to a bug in the system shell. Simply invoke a different shell such as 56bash directly to work around this: 57 58@example 59bash ./configure 60@end example 61 62@anchor{Darwin} 63@section Darwin (Mac OS X, iPhone) 64 65The toolchain provided with Xcode is sufficient to build the basic 66unaccelerated code. 67 68Mac OS X on PowerPC or ARM (iPhone) requires a preprocessor from 69@url{https://github.com/FFmpeg/gas-preprocessor} or 70@url{https://github.com/yuvi/gas-preprocessor}(currently outdated) to build the optimized 71assembly functions. Put the Perl script somewhere 72in your PATH, FFmpeg's configure will pick it up automatically. 73 74Mac OS X on amd64 and x86 requires @command{nasm} to build most of the 75optimized assembly functions. @uref{http://www.finkproject.org/, Fink}, 76@uref{https://wiki.gentoo.org/wiki/Project:Prefix, Gentoo Prefix}, 77@uref{https://mxcl.github.com/homebrew/, Homebrew} 78or @uref{http://www.macports.org, MacPorts} can easily provide it. 79 80 81@chapter DOS 82 83Using a cross-compiler is preferred for various reasons. 84@url{http://www.delorie.com/howto/djgpp/linux-x-djgpp.html} 85 86 87@chapter OS/2 88 89For information about compiling FFmpeg on OS/2 see 90@url{http://www.edm2.com/index.php/FFmpeg}. 91 92 93@chapter Windows 94 95To get help and instructions for building FFmpeg under Windows, check out 96the FFmpeg Windows Help Forum at @url{http://ffmpeg.zeranoe.com/forum/}. 97 98@section Native Windows compilation using MinGW or MinGW-w64 99 100FFmpeg can be built to run natively on Windows using the MinGW-w64 101toolchain. Install the latest versions of MSYS2 and MinGW-w64 from 102@url{http://msys2.github.io/} and/or @url{http://mingw-w64.sourceforge.net/}. 103You can find detailed installation instructions in the download section and 104the FAQ. 105 106Notes: 107 108@itemize 109 110@item Building for the MSYS environment is discouraged, MSYS2 provides a full 111MinGW-w64 environment through @file{mingw64_shell.bat} or 112@file{mingw32_shell.bat} that should be used instead of the environment 113provided by @file{msys2_shell.bat}. 114 115@item Building using MSYS2 can be sped up by disabling implicit rules in the 116Makefile by calling @code{make -r} instead of plain @code{make}. This 117speed up is close to non-existent for normal one-off builds and is only 118noticeable when running make for a second time (for example during 119@code{make install}). 120 121@item In order to compile FFplay, you must have the MinGW development library 122of @uref{http://www.libsdl.org/, SDL} and @code{pkg-config} installed. 123 124@item By using @code{./configure --enable-shared} when configuring FFmpeg, 125you can build the FFmpeg libraries (e.g. libavutil, libavcodec, 126libavformat) as DLLs. 127 128@end itemize 129 130@subsection Native Windows compilation using MSYS2 131 132The MSYS2 MinGW-w64 environment provides ready to use toolchains and dependencies 133through @command{pacman}. 134 135Make sure to use @file{mingw64_shell.bat} or @file{mingw32_shell.bat} to have 136the correct MinGW-w64 environment. The default install provides shortcuts to 137them under @command{MinGW-w64 Win64 Shell} and @command{MinGW-w64 Win32 Shell}. 138 139@example 140# normal msys2 packages 141pacman -S make pkgconf diffutils 142 143# mingw-w64 packages and toolchains 144pacman -S mingw-w64-x86_64-nasm mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2 145@end example 146 147To target 32 bits replace @code{x86_64} with @code{i686} in the command above. 148 149@section Microsoft Visual C++ or Intel C++ Compiler for Windows 150 151FFmpeg can be built with MSVC 2013 or later. 152 153You will need the following prerequisites: 154 155@itemize 156@item @uref{http://msys2.github.io/, MSYS2} 157@item @uref{http://www.nasm.us/, NASM} 158(Also available via MSYS2's package manager.) 159@end itemize 160 161To set up a proper environment in MSYS2, you need to run @code{msys_shell.bat} from 162the Visual Studio or Intel Compiler command prompt. 163 164Place @code{yasm.exe} somewhere in your @code{PATH}. 165 166Next, make sure any other headers and libs you want to use, such as zlib, are 167located in a spot that the compiler can see. Do so by modifying the @code{LIB} 168and @code{INCLUDE} environment variables to include the @strong{Windows-style} 169paths to these directories. Alternatively, you can try to use the 170@code{--extra-cflags}/@code{--extra-ldflags} configure options. 171 172Finally, run: 173 174@example 175For MSVC: 176./configure --toolchain=msvc 177 178For ICL: 179./configure --toolchain=icl 180 181make 182make install 183@end example 184 185If you wish to compile shared libraries, add @code{--enable-shared} to your 186configure options. Note that due to the way MSVC and ICL handle DLL imports and 187exports, you cannot compile static and shared libraries at the same time, and 188enabling shared libraries will automatically disable the static ones. 189 190Notes: 191 192@itemize 193 194@item If you wish to build with zlib support, you will have to grab a compatible 195zlib binary from somewhere, with an MSVC import lib, or if you wish to link 196statically, you can follow the instructions below to build a compatible 197@code{zlib.lib} with MSVC. Regardless of which method you use, you must still 198follow step 3, or compilation will fail. 199@enumerate 200@item Grab the @uref{http://zlib.net/, zlib sources}. 201@item Edit @code{win32/Makefile.msc} so that it uses -MT instead of -MD, since 202this is how FFmpeg is built as well. 203@item Edit @code{zconf.h} and remove its inclusion of @code{unistd.h}. This gets 204erroneously included when building FFmpeg. 205@item Run @code{nmake -f win32/Makefile.msc}. 206@item Move @code{zlib.lib}, @code{zconf.h}, and @code{zlib.h} to somewhere MSVC 207can see. 208@end enumerate 209 210@item FFmpeg has been tested with the following on i686 and x86_64: 211@itemize 212@item Visual Studio 2013 Pro and Express 213@item Intel Composer XE 2013 214@item Intel Composer XE 2013 SP1 215@end itemize 216Anything else is not officially supported. 217 218@end itemize 219 220@subsection Linking to FFmpeg with Microsoft Visual C++ 221 222If you plan to link with MSVC-built static libraries, you will need 223to make sure you have @code{Runtime Library} set to 224@code{Multi-threaded (/MT)} in your project's settings. 225 226You will need to define @code{inline} to something MSVC understands: 227@example 228#define inline __inline 229@end example 230 231Also note, that as stated in @strong{Microsoft Visual C++}, you will need 232an MSVC-compatible @uref{http://code.google.com/p/msinttypes/, inttypes.h}. 233 234If you plan on using import libraries created by dlltool, you must 235set @code{References} to @code{No (/OPT:NOREF)} under the linker optimization 236settings, otherwise the resulting binaries will fail during runtime. 237This is not required when using import libraries generated by @code{lib.exe}. 238This issue is reported upstream at 239@url{http://sourceware.org/bugzilla/show_bug.cgi?id=12633}. 240 241To create import libraries that work with the @code{/OPT:REF} option 242(which is enabled by default in Release mode), follow these steps: 243 244@enumerate 245 246@item Open the @emph{Visual Studio Command Prompt}. 247 248Alternatively, in a normal command line prompt, call @file{vcvars32.bat} 249which sets up the environment variables for the Visual C++ tools 250(the standard location for this file is something like 251@file{C:\Program Files (x86_\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat}). 252 253@item Enter the @file{bin} directory where the created LIB and DLL files 254are stored. 255 256@item Generate new import libraries with @command{lib.exe}: 257 258@example 259lib /machine:i386 /def:..\lib\foo-version.def /out:foo.lib 260@end example 261 262Replace @code{foo-version} and @code{foo} with the respective library names. 263 264@end enumerate 265 266@anchor{Cross compilation for Windows with Linux} 267@section Cross compilation for Windows with Linux 268 269You must use the MinGW cross compilation tools available at 270@url{http://www.mingw.org/}. 271 272Then configure FFmpeg with the following options: 273@example 274./configure --target-os=mingw32 --cross-prefix=i386-mingw32msvc- 275@end example 276(you can change the cross-prefix according to the prefix chosen for the 277MinGW tools). 278 279Then you can easily test FFmpeg with @uref{http://www.winehq.com/, Wine}. 280 281@section Compilation under Cygwin 282 283Please use Cygwin 1.7.x as the obsolete 1.5.x Cygwin versions lack 284llrint() in its C library. 285 286Install your Cygwin with all the "Base" packages, plus the 287following "Devel" ones: 288@example 289binutils, gcc4-core, make, git, mingw-runtime, texinfo 290@end example 291 292In order to run FATE you will also need the following "Utils" packages: 293@example 294diffutils 295@end example 296 297If you want to build FFmpeg with additional libraries, download Cygwin 298"Devel" packages for Ogg and Vorbis from any Cygwin packages repository: 299@example 300libogg-devel, libvorbis-devel 301@end example 302 303These library packages are only available from 304@uref{http://sourceware.org/cygwinports/, Cygwin Ports}: 305 306@example 307yasm, libSDL-devel, libgsm-devel, libmp3lame-devel, 308speex-devel, libtheora-devel, libxvidcore-devel 309@end example 310 311The recommendation for x264 is to build it from source, as it evolves too 312quickly for Cygwin Ports to be up to date. 313 314@section Crosscompilation for Windows under Cygwin 315 316With Cygwin you can create Windows binaries that do not need the cygwin1.dll. 317 318Just install your Cygwin as explained before, plus these additional 319"Devel" packages: 320@example 321gcc-mingw-core, mingw-runtime, mingw-zlib 322@end example 323 324and add some special flags to your configure invocation. 325 326For a static build run 327@example 328./configure --target-os=mingw32 --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin 329@end example 330 331and for a build with shared libraries 332@example 333./configure --target-os=mingw32 --enable-shared --disable-static --extra-cflags=-mno-cygwin --extra-libs=-mno-cygwin 334@end example 335 336@bye 337