From a41691dbbbaf60fa04a0d8db56f4095f5ef0a569 Mon Sep 17 00:00:00 2001 From: spectranator Date: Fri, 4 Oct 2024 16:06:55 +0000 Subject: [PATCH] Updated MinGW64 (MSYS2) build guide (#59) --- build-for-windows.md | 78 ++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/build-for-windows.md b/build-for-windows.md index 75c11fcbd..72777bf11 100644 --- a/build-for-windows.md +++ b/build-for-windows.md @@ -102,59 +102,59 @@ git submodule update --init --recursive ## Method II: MinGW-w64 Build with MSYS2 -### Prerequisites to install - -* [MSYS2](https://www.msys2.org) -* [Vulkan SDK](https://vulkan.lunarg.com/sdk/home#windows) - **Make sure to select Latest SDK.** -* Make sure to follow the instructions and update to the latest version by running `pacman -Syu` as many times as needed. - -### Install yuzu dependencies for MinGW-w64 - -* Open the `MSYS2 MinGW 64-bit` (mingw64.exe) shell -* Download and install all dependencies using: `pacman -Syu git make mingw-w64-x86_64-SDL2 mingw-w64-x86_64-cmake mingw-w64-x86_64-python-pip mingw-w64-x86_64-qt5 mingw-w64-x86_64-toolchain autoconf libtool automake-wrapper` -* Add MinGW binaries to the PATH: `echo 'PATH=/mingw64/bin:$PATH' >> ~/.bashrc` -* Add glslangValidator to the PATH: `echo 'PATH=$(readlink -e /c/VulkanSDK/*/Bin/):$PATH' >> ~/.bashrc` - -### Clone the yuzu repository with Git - -**from Codeberg repo (the `--recursive` option automatically clones the required Git submodules):** +### Get Vulkan SDK and install dependencies ``` -git clone --depth 1 --recursive https://codeberg.org/litucks/torzu.git -cd torzu -``` -**from Torzu repo (assuming Tor is installed as a service):** -``` -git -c http.proxy=socks5h://127.0.0.1:9050 clone --depth 1 http://vub63vv26q6v27xzv2dtcd25xumubshogm67yrpaz2rculqxs7jlfqad.onion/torzu-emu/torzu.git -cd torzu -git submodule update --init --recursive +pacman -Syu git make mingw-w64-x86_64-SDL2 mingw-w64-x86_64-cmake mingw-w64-x86_64-qt5 mingw-w64-x86_64-toolchain ``` -### Run the following commands to build yuzu (dynamically linked build) +### Setup environment variables +``` +export PATH=":$PATH" +export VCPKG_DEFAULT_HOST_TRIPLET=x64-mingw-static +export VCPKG_DEFAULT_TRIPLET=x64-mingw-static +``` +We have to manually set some VCPKG variables for some reason. +This issue probably already exists in the original Yuzu. -```bash +### Generating makefile +``` mkdir build && cd build -cmake -G "MSYS Makefiles" -DYUZU_USE_BUNDLED_VCPKG=ON -DYUZU_TESTS=OFF .. -make -j$(nproc) -# test yuzu out with -./bin/yuzu.exe +cmake -G "MSYS Makefiles" -DYUZU_USE_BUNDLED_VCPKG=ON -DYUZU_TESTS=OFF -DVCPKG_TARGET_TRIPLET=x64-mingw-static .. ``` +`DVCPKG_TARGET_TRIPLET` has to be overriden to `x64-mingw-static` here to generate a static build that doesn't require extra DLLs to be packaged. -* *(Note: This build is not a static build meaning that you need to include all of the DLLs with the .exe in order to use it!)* - -e.g. -```Bash -cp externals/ffmpeg-*/bin/*.dll bin/ +### Build yuzu ``` +make -j4 yuzu +``` +The reason we are not using `make all` is that linker will fail. +This is because Yuzu developer didn't set linker flags properly in their `CMakeLists.txt` for some reason. So we have add something manually. +``` +VERBOSE=1 make yuzu +``` +This will shows the exact link command, should be something like: +``` +cd ***/src/yuzu && /mingw64/bin/c++.exe -O3 -DNDEBUG -Wl,--subsystem,windows -Wl,--whole-archive ... +``` +Copy the command line and add the following arguments: +``` +-static-libstdc++ -lws2_32 -s -Wl,--Map,../../bin/yuzu.map +``` +Explanation of the extra arguments: +- `-static-libstdc++`: Force usage of static libstdc++, without this argument the binary will have no entrypoint. +- `-lws2_32`: Link the ws2_32.a provided by mingw. +- `-s`: Optional, strip the symbols from the output binary. +- `-Wl,--Map,../../bin/yuzu.map`: Optional, output a separated linker map to `../../bin/yuzu.map` +Please note that `-lw2_32` is already added, but the order is not correct and hence cause linking fails. -Bonus Note: Running programs from inside `MSYS2 MinGW x64` shell has a different %PATH% than directly from explorer. This different %PATH% has the locations of the other DLLs required. -![image](https://user-images.githubusercontent.com/190571/165000848-005e8428-8a82-41b1-bb4d-4ce7797cdac8.png) - +Now the built executable should work properly. Repeating step 4 should build `yuzu-cmd` as well. +Some DLLs (e.g., Qt) are still required as they cannot being linked statically. Copying those DLLs from the latest release is one option. ### Building without Qt (Optional) Doesn't require the rather large Qt dependency, but you will lack a GUI frontend: - * Pass the `-DENABLE_QT=no` flag to cmake + * Pass the `-DENABLE_QT=NO` flag to cmake ## Method III: CLion Environment Setup