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