## Build Proton in Docker This image has all necessary dependencies for building the [Proton](https://github.com/ValveSoftware/Proton). Difference from official way of building Proton: - does not use VM; - does not rely on Steam runtime; - preconfigures ccache (incl. mingw32) to speed up the recompilation time; ## 1. Build this image and spawn in it ``` docker-compose build docker-compose run --rm proton ``` ## 2. Clone the Proton repository ``` git clone -b proton_3.16 https://github.com/ValveSoftware/Proton.git proton cd proton/ git submodule update --init ``` ## 3. Configure your build environment According to [this](https://github.com/FNA-XNA/FAudio/wiki/FAudio-for-Proton#part-1-building-faudio) FFMPEG is needed only for the WMA support in FAudio. I will not build ``--with-ffmpeg`` in this example as it requires more changes. ``` ./configure.sh --no-steam-runtime --build-name "Proton 3.16 My" export NO_NESTED_MAKE=1 export SUBMAKE_JOBS=$(getconf _NPROCESSORS_ONLN) ``` ## 4. Configure and build the Proton See what are the default targets should you like to make them one-by-one instead of all at once: ``` $ make help Default targets (make all): faudio lsteamclient vrclient dxvk dist wine fonts ``` I prefer to build them one-by-one arch-by-arch since ``make all`` is trying to build ``lsteamclient`` and ``vrclient`` targets before building ``wine`` whilst both targets having ``wine`` as a build dependency. You can see it in ``build/makefile_base.mak`` file. My preferred make order: ``` make -j$(getconf _NPROCESSORS_ONLN) cmake32 make -j$(getconf _NPROCESSORS_ONLN) cmake64 make -j$(getconf _NPROCESSORS_ONLN) faudio32 make -j$(getconf _NPROCESSORS_ONLN) faudio64 make -j$(getconf _NPROCESSORS_ONLN) wine32 make -j$(getconf _NPROCESSORS_ONLN) wine64 make -j$(getconf _NPROCESSORS_ONLN) dxvk make -j$(getconf _NPROCESSORS_ONLN) lsteamclient32 make -j$(getconf _NPROCESSORS_ONLN) lsteamclient64 make -j$(getconf _NPROCESSORS_ONLN) vrclient32 make -j$(getconf _NPROCESSORS_ONLN) vrclient64 make -j$(getconf _NPROCESSORS_ONLN) dist make -j$(getconf _NPROCESSORS_ONLN) fonts ``` After this you will get the result under ``./dist`` directory. This is the Proton you have just built. > Hints > You can run ``make obj-wine32/Makefile`` and look in ``obj-wine32/config.log`` to see what is missing. > ``DISABLED_SUBDIRS`` should be empty, otherwise you are going to miss some DLLs. > > If you updated the dev dependencies or ``wine/`` submodule repo and do not want wasting time recompiling the whole wine subrepo again, you can re-create Makefile ``rm obj-wine32/Makefile; make obj-wine32/Makefile``, so next time you run ``make wine32`` it will recompile only what is needed. The same applies to wine64. ## 5. Final steps (Optional) You can archive your dist directory the same way Valve does: ``` $ tar -C ./dist/dist -c . | gzip -c -1 > ./dist/proton_dist.tar.gz ``` Copy your freshly built Proton to your Steam directory ``~/.local/share/Steam/compatibilitytools.d/``. > Since I am running [Steam in a docker](https://git.nixaid.com/arno/steam) it has a custom home path ``~/git/steam/data``. > This repo I have at ``~/git/proton`` directory. ``` $ mkdir -p ~/git/steam/data/.local/share/Steam/compatibilitytools.d $ rsync -avx --progress ~/git/proton/data/proton/dist/ ~/git/steam/data/.local/share/Steam/compatibilitytools.d/proton-316-my/ ``` You are done at this point. Now you can go ``Steam -> Settings -> Steam Play`` and pick your ``Proton 3.16 My`` from the compatibility tool list. ## Links - https://github.com/ValveSoftware/Proton/ ---- # Extra ## Tested on Proton 3.16 - [proton_3.16 branch](https://github.com/ValveSoftware/Proton/tree/proton_3.16/) ``` $ grep ^ .git/modules/*/HEAD .git/HEAD .git/modules/FAudio/HEAD:10ee03e10d5abc0aca8661a098b481cb6f746c1d .git/modules/cmake/HEAD:c4ab098097f4fe1bc85ee29c6de390dff435f63f .git/modules/dxvk/HEAD:3b3ccc8194733e20ce7e2a54edcf54fe4a2b9785 .git/modules/ffmpeg/HEAD:ace829cb45cff530b8a0aed6adf18f329d7a98f6 .git/modules/openal-soft/HEAD:ce6076091bac3c00cd10803916e8911495580bd0 .git/modules/openvr/HEAD:1fb1030f2ac238456dca7615a4408fb2bb42afb6 .git/modules/wine/HEAD:478f3c4a2cdb181c31af19a9031e5c3c6daad2f2 .git/HEAD:ref: refs/heads/proton_3.16 ``` ## Ccache ccache is a compiler cache. It speeds up recompilation by caching previous compilations and detecting when the same compilation is being done again. > It is already installed in this docker image. ``` apt-get install ccache /usr/sbin/update-ccache-symlinks echo 'export PATH="/usr/lib/ccache:$PATH"' | tee /home/user/.profile ``` No limit to the number of files and size of the cache: ``` ccache -F 0 ccache -M 0 ``` Stats: ``` ccache -s ``` Empty the cache and reset the stats: ``` ccache -C -z ```