Last active
October 19, 2025 01:38
-
-
Save shmerl/baf82630e312c04e8910ca3081ab943f to your computer and use it in GitHub Desktop.
For building Wine staging
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| # Builds Wine-staging | |
| # Notes: | |
| # 1. Targeted for usage inside a VM (use shared directory $HOME/mnt/vmshare between host and guest). | |
| # | |
| # 2. For best build, enable WineHQ repository for your Debian flavor, including sources. | |
| # I.e. in your .sources file for it, have: | |
| # Types: deb deb-src | |
| # | |
| # See also: https://gitlab.winehq.org/wine/wine/-/wikis/Debian-Ubuntu | |
| # | |
| # 3. You'd need to separately push the result on the host to whatever location you want (like to /opt). | |
| # | |
| # 4. Place any manual patches in ${HOME}/build/patches | |
| # | |
| # 5. Override arch to something else if you aren't using Ryzen. | |
| # | |
| # Usage: | |
| # wine_staging_build.sh [staging-patchset] | |
| # | |
| # Examples: | |
| # 1. To build just Wine with ntdll-ForceBottomUpAlloc patches: | |
| # | |
| # wine_staging_build.sh ntdll-ForceBottomUpAlloc | |
| # | |
| # 2. To build specific Wine version with specific patches (matching versions help avoid conflicts); | |
| # | |
| # wine_branch=wine-10.16 wine_staging_branch=v10.16 wine_staging_build.sh ntdll-ForceBottomUpAlloc | |
| # | |
| # 3. wine_ver is a shortcut variable that allows setting aligning version for both: | |
| # | |
| # wine_ver=10.16 wine_staging_build.sh ntdll-ForceBottomUpAlloc | |
| # | |
| # 4. To build full Wine staging: | |
| # | |
| # wine_staging_build.sh | |
| # | |
| base=${HOME}/build | |
| wine_branch=${wine_branch:-"master"} | |
| wine_src="${base}/wine/source" | |
| wine_build="${base}/wine/build" | |
| wine_staging_branch=${wine_staging_branch:-"master"} | |
| wine_staging_src="${base}/wine-staging" | |
| wow64=${wow64:-true} # set to false to disable new unified wow64 mode | |
| update_sources=${update_sources:-true} | |
| reset_sources=${reset_sources:-true} | |
| update_staging_sources=${update_staging_sources:-true} | |
| reset_staging_sources=${reset_staging_sources:-true} | |
| patches=${patches:-true} # enabled | |
| patches_dir="${base}/wine/patches-staging" # extra patches if any | |
| arch=${arch:-"znver4"} # assumes Ryzen, change if needed | |
| staging_patchset="$@" | |
| if [[ "${wine_ver+isset}" ]]; then | |
| wine_branch="wine-${wine_ver}" | |
| wine_staging_branch="v${wine_ver}" | |
| fi | |
| if [[ "$staging_patchset" == "" ]]; then | |
| staging_patchset='--all' | |
| fi | |
| if [[ "$wine_branch" == "wine"* ]]; then | |
| dest_dir="${HOME}/mnt/vmshare/${wine_branch}-staging" | |
| else | |
| dest_dir="${HOME}/mnt/vmshare/wine-${wine_branch}-staging" | |
| fi | |
| export CXXFLAGS="-O3 -march=${arch}" | |
| export CFLAGS="$CXXFLAGS" | |
| export CROSSCFLAGS="$CXXFLAGS" | |
| function prepare() { | |
| mkdir -p "$patches_dir" | |
| mkdir -p "$wine_build" | |
| sudo apt build-dep wine-staging | |
| if (($? != 0)); then | |
| # fall back to wine package build deps if wine-staging isn't available | |
| sudo apt build-dep wine | |
| fi | |
| # needed for various packages that aren't yet installed by build dependencies | |
| sudo apt install libxkbregistry-dev libvulkan-dev libavformat-dev | |
| } | |
| function update_wine_sources() { | |
| cd $(dirname "$wine_src") | |
| git clone https://gitlab.winehq.org/wine/wine.git $(basename "$wine_src") | |
| cd "$wine_src" | |
| # If updating, reset is enforced regardless of the $reset_sources, to avoid possible merging confusion | |
| if $reset_sources || $update_sources; then | |
| git reset --hard HEAD | |
| git clean -df | |
| fi | |
| if $update_sources; then | |
| git checkout master | |
| git pull --rebase --prune | |
| fi | |
| git checkout ${wine_branch} | |
| if (($? != 0)); then | |
| echo "Invalid branch or tag ${wine_branch}! Aborting" | |
| exit 2 | |
| fi | |
| } | |
| function update_wine_staging_sources() { | |
| cd $(dirname "$wine_staging_src") | |
| git clone https://gitlab.winehq.org/wine/wine-staging.git $(basename "$wine_staging_src") | |
| cd "$wine_staging_src" | |
| # If updating, reset is enforced regardless of the $reset_sources, to avoid possible merging confusion | |
| if $reset_staging_sources || $update_staging_sources; then | |
| git reset --hard HEAD | |
| git clean -df | |
| fi | |
| if $update_staging_sources; then | |
| git checkout master | |
| git pull --rebase --prune | |
| fi | |
| git checkout ${wine_staging_branch} | |
| if (($? != 0)); then | |
| echo "Invalid branch or tag ${wine_staging_branch}! Aborting" | |
| exit 2 | |
| fi | |
| } | |
| function extra_patch() { | |
| local patch_dir="$1" | |
| cd $wine_src | |
| for patchfile in ${patch_dir}/*; do | |
| echo "Applying ${patchfile}" | |
| patch -p1 -i ${patchfile} | |
| if (($? != 0)); then | |
| echo "Extra patching failed, check what's wrong..." | |
| exit 1 | |
| fi | |
| done | |
| } | |
| function patch_staging { | |
| cd "$wine_src" | |
| ${wine_staging_src}/staging/patchinstall.py $staging_patchset | |
| if (($? != 0)); then | |
| echo "Patching failed, check what's wrong..." | |
| exit 1 | |
| fi | |
| } | |
| function patch_sources() { | |
| if $patches; then | |
| extra_patch "${patches_dir}" | |
| fi | |
| patch_staging | |
| } | |
| function configure() { | |
| rm -rfv ${wine_build}/* | |
| cd $wine_build | |
| local arch_param='' | |
| if $wow64; then | |
| arch_param='--enable-archs=i386,x86_64' | |
| else | |
| arch_param='--enable-win64' | |
| fi | |
| ${wine_src}/configure $arch_param --with-wayland --with-vulkan --with-ffmpeg --disable-tests --prefix= | |
| } | |
| function build() { | |
| cd $wine_build | |
| make -j$(nproc) | |
| if (($? != 0)); then | |
| echo "Build failed!" | |
| exit 2 | |
| fi | |
| } | |
| function publish() { | |
| cd $wine_build | |
| mkdir -p ${dest_dir} | |
| rm -rfv ${dest_dir}/* | |
| DESTDIR=${dest_dir} make -j$(nproc) install | |
| } | |
| ############################################ | |
| shopt -s nullglob | |
| prepare | |
| update_wine_sources | |
| update_wine_staging_sources | |
| patch_sources | |
| configure | |
| build | |
| publish |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment