Home

Awesome

CMake-based MinGW-w64 Cross Toolchain

This thing’s primary use is to build Windows binaries of mpv.

Alternatively, you can download the builds from here.

Prerequisites

Setup Build Environment

Manjaro / Arch Linux

These packages need to be installed first before compiling mpv:

pacman -S git gyp mercurial subversion ninja cmake meson ragel yasm nasm asciidoc enca gperf unzip p7zip gcc-multilib clang lld libc++ libc++abi python-pip curl lib32-glib2 mimalloc ccache

pip3 install rst2pdf mako jsonschema

Ubuntu Linux / WSL (Windows 10)

apt-get install build-essential checkinstall bison flex gettext git mercurial subversion ninja-build gyp cmake yasm nasm automake pkgconf libtool libtool-bin gcc-multilib g++-multilib clang lld libc++1 libc++abi1 libgmp-dev libmpfr-dev libmpc-dev libgcrypt-dev gperf ragel texinfo autopoint re2c asciidoc python3-pip docbook2x unzip p7zip-full curl mimalloc ccache

pip3 install rst2pdf meson mako jsonschema

Note:

Cygwin

Download Cygwin installer and run:

setup-x86_64.exe -R "C:\cygwin64" -q --packages="bash,binutils,bzip2,cygwin,gcc-core,gcc-g++,cygwin32-gcc-core,cygwin32-gcc-g++,gzip,m4,pkgconf,make,unzip,zip,diffutils,wget,git,patch,cmake,gperf,yasm,enca,asciidoc,bison,flex,gettext-devel,mercurial,python-devel,python-docutils,docbook2X,texinfo,libmpfr-devel,libgmp-devel,libmpc-devel,libtool,autoconf2.5,automake,automake1.9,libxml2-devel,libxslt-devel,meson,libunistring5"

Additionally, some packages, re2c, ninja, ragel, gyp, rst2pdf, nasm need to be installed manually.

MSYS2

Install MSYS2 and run it via MSYS2 MSYS shortcut. Don't use MSYS2 MinGW 32-bit or MSYS2 MinGW 64-bit shortcuts, that's important!

These packages need to be installed first before compiling mpv:

pacman -S base-devel cmake gcc yasm nasm git mercurial subversion gyp tar gmp-devel mpc-devel mpfr-devel python zlib-devel unzip zip p7zip meson libunistring5

Don't install anything from the mingw32 and mingw64 repositories, it's better to completely disable them in /etc/pacman.conf just to be safe.

Additionally, some packages, re2c, ninja, ragel, libjpeg, rst2pdf, jinja2 need to be installed manually.

Compiling with GCC

Example:

cmake -DTARGET_ARCH=x86_64-w64-mingw32 \
-DGCC_ARCH=x86-64-v3 \
-DSINGLE_SOURCE_LOCATION="/home/user/packages" \
-DRUSTUP_LOCATION="/home/user/install_rustup" \
-G Ninja -B build64 -S mpv-winbuild-cmake

This cmake command will create build64 folder for x86_64-w64-mingw32. Set -DTARGET_ARCH=i686-w64-mingw32 for compiling 32-bit.

-DGCC_ARCH=x86-64-v3 will set -march option when compiling gcc with x86-64-v3 instructions. Other value like native, znver3 should work too.

Enter build64 folder and build toolchain once. By default, it will be installed in install folder.

ninja download # download all packages at once (optional)
ninja gcc      # build gcc only once (take around ~20 minutes)
ninja mpv      # build mpv and all its dependencies

On WSL2, you might see it stuck with 100% disk usage and never finished. See below.

The final build64 folder's size will be around ~3GB.

Building Software (Second Time)

To build mpv for a second time:

ninja update # perform git pull on all packages that used git

After that, build mpv as usual:

ninja mpv

Compiling with Clang

Supported target architecture (TARGET_ARCH) with clang is: x86_64-w64-mingw32 , i686-w64-mingw32 , aarch64-w64-mingw32. The aarch64 are untested.

Example:

cmake -DTARGET_ARCH=x86_64-w64-mingw32 \
-DCMAKE_INSTALL_PREFIX="/home/user/clang_root" \
-DCOMPILER_TOOLCHAIN=clang \
-DGCC_ARCH=x86-64-v3 \
-DSINGLE_SOURCE_LOCATION="/home/user/packages" \
-DRUSTUP_LOCATION="/home/user/install_rustup" \
-DMINGW_INSTALL_PREFIX="/home/user/build_x86_64_v3/x86_64_v3-w64-mingw32" \
-G Ninja -B build_x86_64_v3 -S mpv-winbuild-cmake

The cmake command will create clang_root as clang sysroot where llvm tools installed. build_x86_64 is build directory to compiling packages.

cd build_x86_64
ninja llvm       # build LLVM (take around ~2 hours)
ninja rustup     # build rust toolchain
ninja llvm-clang # build clang on specified target
ninja mpv        # build mpv and all its dependencies

If you want add another target (ex. i686-w64-mingw32), change TARGET_ARCH and build folder.

cmake -DTARGET_ARCH=i686-w64-mingw32 \
-DCMAKE_INSTALL_PREFIX="/home/user/clang_root" \
-DCOMPILER_TOOLCHAIN=clang \
-DSINGLE_SOURCE_LOCATION="/home/user/packages" \
-DRUSTUP_LOCATION="/home/user/install_rustup" \
-DMINGW_INSTALL_PREFIX="/home/user/build_i686/i686-w64-mingw32" \
-G Ninja -B build_i686 -S mpv-winbuild-cmake
cd build_i686
ninja llvm-clang # same as above

If you've changed GCC_ARCH option, you need to run:

ninja rebuild_cache

to update flags which will pass on gcc, g++ and etc.

Available Commands

CommandsDescription
ninja packagecompile a package
ninja cleanremove all stamp files in all packages.
ninja downloadDownload all packages' sources at once without compiling.
ninja updateUpdate all git repos. When a package pulls new changes, all of its stamp files will be deleted and will be forced rebuild. If there is no change, it will not remove the stamp files and no rebuild occur. Use this instead of ninja clean if you don't want to rebuild everything in the next run.
ninja package-fullcleanRemove all stamp files of a package.
ninja package-litecleanRemove build, clean stamp files only. This will skip re-configure in the next running ninja package (after the first compile). Updating repo or patching need to do manually. Ideally, all DEPENDS targets in package.cmake should be temporarily commented or deleted. Might be useful in some cases.
ninja package-removebuildRemove 'build' directory of a package.
ninja package-removeprefixRemove 'prefix' directory.
ninja package-force-updateUpdate a package. Only git repo will be updated.

package is package's name found in packages folder.

Information about packages

WSL workaround

Place the file on specified location to limit ram & cpu usage to avoid getting stuck while building mpv.

# /etc/wsl.conf
[interop]
#enabled=false
appendWindowsPath=false

[automount]
enabled = true
options = "metadata"
mountFsTab = false

[user]
default=<user>
---------------------------------------
# C:\Users\<UserName>\.wslconfig
[wsl2]
memory=4GB
swap=0
pageReporting=false

VA-API Driver

To use VA-API Win32:

ninja mesa

vaon12_drv_video.dll will be generated in install/$TARGET_ARCH/bin

this is a layered driver running on top of Direct3D 12 API. Deployment instructions have been documented by Microsoft.

Acknowledgements

This project was originally created and maintained lachs0r. Since then, it heavily modified to suit my own need.