Recently, I've been attempting to get FFmpeg building on MSVC. Normally FFmpeg is built with MinGW for Windows, but it is 100% possible to build it on MSVC. For those curious, I need this as a *static* library, and attempting to link statically built MinGW libraries on MSVC generally doesn't make for a fun time.

However, previously I had to rely on several horrible hacks, such as running everything through the MSYS shell (not ideal in the slightest), and then manually implanting `cl.exe` and others into PATH. This is not only a huge pain, but actually caused significant problems as it made it much harder to make pretty much any changes whatsoever without inevitably breaking everything.

Thus, when I had to make some significant changes to my script, I ended up facing a large number of issues. In no particular order:

 * pkg-config is basically nonexistent on Windows, and is barely
   functional when it does exist. This was a problem for Vulkan,
   ffnvcodec, openssl, and others.
 * Some of the libraries spit out absolutely gargantuan commands that
   go well over Windows' command line character limit of 8191, causing
   indecipherable build failures.
 * Windows' pathing is fundamentally incompatible with UNIX pathing,
   which caused also indecipherable build failures that ended up being
   caused by `gsub` in one of the scripts. Notably, I had to use this
   awful hack:
   sed-i's|gsub(/\\\\|gsub(/\\\\\\\\|g'ffbuild/*.mak

 * After all of this, I still haven't managed to get it to build,
   because I STILL get completely random build failures that make no
   sense whatsoever. For example, the libavutil target sometimes simply
   refuses to build any of its associated object files: LINK : fatal
   error LNK1181: cannot open input file 'libavutil\adler32.o' I still
   haven't figured this one out. It requires manual intervention to
   fix, which is terrible for UX and also virtually impossible to script.

My proposition to solve this is to use CMake. The great thing about CMake is that *we don't have to worry about any of this!* CMake is incredibly smart and is more than capable of doing all of that and more, and *dramatically* faster too. It has so many advantages that I can't list them all. But here's an abridged list:

 * CMake is completely platform agnostic and doesn't require a "special
   GNU build" like make does. Instead it's capable of using Ninja, also
   platform agnostic, which is both faster than make AND runs
   everywhere. This would've fixed several of the Windows-specific
   issues I faced--not to mention that users of non-GNU operating
   systems (Solaris, *BSD, etc.) don't HAVE to install GNU make just
   for it to work. This also means those users don't have to explicitly
   invoke `gmake` and can instead just `cmake --build`.
 * CMake does a lot for you. The giant-wall-of-text configure script is
   cool and all, but CMake requires significantly less manual
   intervention, as it handles:
     o Compilers
     o Build type
     o Options and settings
     o Platform/architecture specific stuff
 * CMake doesn't rely on coreutils or anything besides itself. This
   means you don't *have* to install GNU coreutils on systems that lack
   them by default, and also prevents spurious failures caused by minor
   differences between distributions of awk, sed, etc.
 * CMake handles package finding for you. Many of FFmpeg's dependencies
   *also* install CMake config files, which are significantly nicer to
   play with than pkg-config. CMake is also perfectly capable of using
   pkg-config as well!
 * CMake scripts are FAR more readable. Trying to parse through the
   giant configure script is a pain, especially when I'm trying to see
   what an option does and leaving confused because it's handled in
   some random other file nobody has touched in 10 years. With CMake
   however, options are laid out nicely in explicit commands and can
   even be parsed by IDEs, making them extremely easy to read and find.

This isn't even close to a comprehensive list of CMake's benefits nor the MANY problems I had with the configure script. That being said, I imagine this will be met with a lot of criticism, so to pre-emptively answer some questions I may or may not receive:

 * *Why not do it yourself?*
     o The biggest reason is I don't fully understand what every option
       does and thus would not be able to do much of anything helpful.
       Not to mention I don't really have the free time at the moment
       to dive into something that may very well be immediately
       rejected from the patch mailing list.
 * *Why not just fix the configure script and Makefiles?*
     o This is an even bigger ask than making a whole new build system,
       because it is fundamentally not designed for MSVC to even be
       possible whatsoever. Makefiles are inherently UNIX-y and don't
       play well with Windows in general; not to mention that
       maintaining a giant wall of text script is generally frowned upon.
 * *Why change what's not broken?*
     o The build system as is, is quite broken on MSVC. I barely
       scratched the surface of the sheer myriad of issues I had and am
       still having.

That's all.
_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to