@ -1,40 +1,253 @@ | |||
# pol-wine-dxvk | |||
Automate installation of the newest DXVK + Wine Staging into all your PlayonLinux wineprefixes (Arch Linux) | |||
Automate installation of the newest DXVK + Wine Staging, and optionally update all your PlayonLinux wineprefixes (Ubuntu/Mint/Arch Linux/Manjaro) | |||
**IMPORTANT** Set your username correctly to _USER_ variable. This variable is defined at the beginning of `updatewine.sh` shell script. | |||
## About | |||
## Usage | |||
This script bundle offers an easy-way solution to use the bleeding edge Wine Staging & DXVK packages system-wide on Ubuntu/Mint and Arch Linux based Linux distributions. | |||
Run with sudo | |||
## Motivation | |||
**Accessibility, lower the barrier.** My personal motivation to develop this script bundle was to lower the barried to people to get their hands on the latest bleeding-edge Wine / Wine Staging & DXVK versions on major Linux distribution platforms. | |||
I have seen that there is not a clear way to install Wine Staging Git & DXVK, especially on Ubuntu/Mint. Therefore, I decided someone has to do something, so this script bundle was born. | |||
Additionally, the benefits of the bleeding-edge Wine/Wine Staging & DXVK versions are quite limited at the moment. Wine Staging is not easily available on Debian-based Linux distributions, and DXVK is practically bundled to Lutris or Steam gaming platform as a form of Proton. We have to keep in mind that not all Windows programs are run under Steam on Linux but many programs are run via PlayOnLinux or without relying on any other third-party management software. | |||
The solution I provide here _is not bundled to any commercial or other Wine management platform_. The latest Wine Staging & DXVK bundle is available system-wide, not just Steam, Lutris or PlayOnLinux. | |||
---------------- | |||
## Requirements | |||
- Ubuntu, Mint or any other Linux distribution which uses `dpkg` and `àpt` for package management | |||
- pure Debian is not supported yet | |||
- Arch Linux, Manjaro or any other Linux distribution which uses `pacman` for package management | |||
- **Not listed as a hard dependency, but actually required by DXVK**: The latest Nvidia or AMD GPU drivers. Personally, I've used proprietary Nvidia drivers & AMDGPU (not AMDGPU Pro). | |||
---------------- | |||
## Why to compile from source? | |||
**Advantages:** | |||
- packages are directly adapted to your system | |||
- packages do not rely on PPAs which may be abandoned in time | |||
- using Git sources provide the latest packages available publicly | |||
**Disadvantages:** | |||
- takes time & CPU processing | |||
- is unreliable in some cases, the script may break easily due to rapid DXVK development or distro changes | |||
- may break working already-working versions of the packages (use `--no-install` parameter to avoid installation of DXVK & Wine) | |||
---------------- | |||
## Script usage | |||
For instructions, run: | |||
``` | |||
bash updatewine.sh --help | |||
``` | |||
on the main script folder. | |||
You can pass arguments like: | |||
``` | |||
bash updatewine.sh --no-staging --no-install | |||
``` | |||
All supported arguments are: | |||
- `--no-staging` = Build Wine instead of Wine Staging | |||
- `--no-install` = Do not install Wine or DXVK, just compile them. Note that Wine must be installed for DXVK compilation. | |||
- `--no-wine` = Do not compile or install Wine/Wine Staging | |||
- `--no-dxvk` = Do not compile or install DXVK | |||
- `--no-pol` = Do not update current user's PlayOnLinux Wine prefixes | |||
---------------- | |||
## Compiled packages are stored for later usage | |||
Successfully compiled Wine & DXVK packages are stored as follows: | |||
On Ubuntu/Mint: | |||
- `main script folder/debian/compiled_deb/` | |||
On Arch Linux: | |||
- `main script folder/arch/compiled_pkg/` | |||
The subfolders there are generated according to buildtime timestamp, known as `build identifier` | |||
## DXVK usage | |||
**NOTE:** DXVK must be installed before applying these steps! | |||
To enable DXVK on existing wineprefixes, just run | |||
``` | |||
WINEPREFIX=/path/to/my/wineprefix setup_dxvk | |||
``` | |||
`winetricks` is required for this command. | |||
## Add DXVK to PlayOnLinux Wine prefixes | |||
To install DXVK on specific PlayOnLinux wineprefix which uses a different than `system` version of Wine, apply the following command syntax: | |||
``` | |||
WINEPREFIX="$HOME/.PlayOnLinux/wineprefix/myprefix" WINEPATH=$HOME/.PlayOnLinux/wine/{linux-amd64,linux-x86}/wineversion/bin" setup_dxvk | |||
``` | |||
where you need to set either `linux-amd64` or `linux-x86` and set `wineversion` to match a real one, obviously. | |||
system-wide `winetricks` executable (`/usr/bin/winetricks`) is required for this command. | |||
### Uninstall temporary development packages (Ubuntu/Mint etc. only): | |||
Development packages can take extra space on your system so you may find useful to uninstall them. | |||
This package comes with `debian_devpkgremoval.sh` script which is targeted for that purpose. | |||
It uninstalls majority of Wine-Staging (Git), meson & glslang buildtime dependencies. | |||
To use `debian_devpkgremoval.sh`, simply run: | |||
``` | |||
bash debian_devpkgremoval.sh | |||
``` | |||
--------------------------- | |||
### EXAMPLES: | |||
**NOTE:** If `--no-install` option is given, the script doesn't check for PlayOnLinux Wine prefixes. | |||
**NOTE:** PlayOnLinux Wine prefixes is checked for current user only. | |||
**1)** Compile Wine Staging & DXVK, make and installable packages for them and install them : | |||
`bash updatewine.sh` | |||
**2)** Compile DXVK and make an installable package for it. Do not install: | |||
`bash updatewine.sh --no-wine --no-install` | |||
**3)** Compile Wine Staging and make and installable package for it. Do not install: | |||
`bash updatewine.sh --no-dxvk --no-install` | |||
**4)** Compile Wine and make and installable package for it. Do not install: | |||
`bash updatewine.sh --no-staging --no-dxvk --no-install` | |||
**5)** Compile Wine & DXVK, and make and installable packages for them. Do not install: | |||
`bash updatewine.sh --no-staging --no-install` | |||
**6)** Compile Wine Staging & DXVK, and make and installable packages for them. Do not install: | |||
`bash updatewine.sh --no-install` | |||
**7)** Compile Wine & DXVK, make and installable packages for them and install them : | |||
`bash updatewine.sh --no-staging` | |||
**8)** Compile Wine, make and installable packages for it. Install it, do not check PlayOnLinux wineprefixes: | |||
`bash updatewine.sh --no-staging --no-dxvk --no-pol` | |||
--------------------------- | |||
### NOTES | |||
**NOTE: Do not pause a virtual machine**. It is not recommended to run this script in a virtualized environment (Oracle VirtualBox, for instance) if you plan to `Pause` the virtual machine during script runtime. This causes an internal sudo validate loop to get nuts. In normal environments and in normal runtime cases, this doesn't happen. Validate loop is required to keep sudo permissions alive for the script since the execution time exceeds default system-wide sudo timeout limit. | |||
--------------------------- | |||
### Test-run validation | |||
This is validation test done for the script. This test is to ensure it works as expected. It is mandatory due to rapid development of the packages it handles. | |||
**Latest test-run:** 11th November, 2018 | |||
**Linux Distributions:** | |||
- Success: Arch Linux, Linux Mint 19 | |||
- Failure: Debian 9 (Wine), Ubuntu 18.04 (DXVK) | |||
#### Failure reasons: | |||
Debian: | |||
- conflicting amd64/i386 Wine build time dependency packages, must find workaround for this | |||
- no winetricks package | |||
Ubuntu 18.04: | |||
- during DXVK compilation, the following error appears: | |||
``` | |||
sudo bash ./updatewine.sh | |||
... | |||
[162/192] Compiling C++ object 'src/d3d11/src@d3d11@@d3d11@sha/d3d11_swapchain.cpp.obj'. | |||
FAILED: src/d3d11/src@d3d11@@d3d11@sha/d3d11_swapchain.cpp.obj | |||
x86_64-w64-mingw32-g++ -Isrc/d3d11/src@d3d11@@d3d11@sha -Isrc/d3d11 -I../../../../src/d3d11 -I../../../.././include -fdiagnostics-color=always -pipe -Wall -Winvalid-pch -Wnon-virtual-dtor -std=c++1z -O3 -DNOMINMAX -MD -MQ 'src/d3d11/src@d3d11@@d3d11@sha/d3d11_swapchain.cpp.obj' -MF 'src/d3d11/src@d3d11@@d3d11@sha/d3d11_swapchain.cpp.obj.d' -o 'src/d3d11/src@d3d11@@d3d11@sha/d3d11_swapchain.cpp.obj' -c ../../../../src/d3d11/d3d11_swapchain.cpp | |||
{standard input}: Assembler messages: | |||
{standard input}:3269: Warning: end of file not at end of a line; newline inserted | |||
{standard input}: Error: open SEH entry at end of file (missing .seh_endproc) | |||
x86_64-w64-mingw32-g++: internal compiler error: Killed (program cc1plus) | |||
... | |||
``` | |||
or | |||
``` | |||
... | |||
[137/192] Compiling C++ object 'src/d3d11/src@d3d11@@d3d11@sha/d3d11_view_uav.cpp.obj'. | |||
FAILED: src/d3d11/src@d3d11@@d3d11@sha/d3d11_view_uav.cpp.obj | |||
x86_64-w64-mingw32-g++ -Isrc/d3d11/src@d3d11@@d3d11@sha -Isrc/d3d11 -I../../../../src/d3d11 -I../../../.././include -fdiagnostics-color=always -pipe -Wall -Winvalid-pch -Wnon-virtual-dtor -std=c++1z -O3 -DNOMINMAX -MD -MQ 'src/d3d11/src@d3d11@@d3d11@sha/d3d11_view_uav.cpp.obj' -MF 'src/d3d11/src@d3d11@@d3d11@sha/d3d11_view_uav.cpp.obj.d' -o 'src/d3d11/src@d3d11@@d3d11@sha/d3d11_view_uav.cpp.obj' -c ../../../../src/d3d11/d3d11_view_uav.cpp | |||
x86_64-w64-mingw32-g++: internal compiler error: Killed (program cc1plus) | |||
Please submit a full bug report, | |||
with preprocessed source if appropriate. | |||
See <https://gcc.gnu.org/bugs/> for instructions. | |||
[144/192] Compiling C++ object 'src/d3d11/src@d3d11@@d3d11@sha/d3d11_context.cpp.obj'. | |||
ninja: build stopped: subcommand failed. | |||
... | |||
``` | |||
**NOTE:** All commands are executed as user (defined above). Only commands which require root permissions are ones which install packages wine-staging-git and dxvk into your system. | |||
--------------------------- | |||
All regular user commands have prefix 'cmd' in the main script. | |||
### TODO | |||
### Switches: | |||
- Add support for pure Debian. Main issue is conflicting amd64/i386 Wine buildtime packages | |||
**--refresh** | |||
- Workaround must be found, maybe split single Wine deb package into two, with suffixes amd64 & i386? | |||
- Check for new Staging/DXVK releases, update PoL Wine prefixes if needed | |||
- For pure Debian, package 'winetricks' must be compiled, too | |||
- Does a comparison between local & remote git repos | |||
- Add compilation scripts for the latest AMDGPU & Nvidia drivers on Arch Linux/Debian/Ubuntu/Mint | |||
**--check** | |||
- Remove temp folders in case of failure (meson/glslang/dxvk-git/wine... temp build folders) | |||
- Check for new Staging/DXVK releases | |||
- Add support for custom DXVK patches | |||
- Does a comparison between local & remote git repos | |||
- Better handling for sudo validation loop function | |||
**--force** | |||
- may cause the terminal output to get nuts | |||
- Force Wine Staging & DXVK installation | |||
- when interrupting the script, the exit functionality may not be handled correctly? | |||
--------------------------- | |||
### LICENSE | |||
This repository uses GPLv3 license. See [LICENSE](https://github.com/Fincer/pol-wine-dxvk/blob/master/LICENSE) for details. | |||
This repository uses GPLv3 license. See [LICENSE](LICENSE) for details. |
@ -0,0 +1,43 @@ | |||
# Maintainer: Adrià Cereto i Massagué <ssorgatem at gmail.com> | |||
# Contributor: Pekka Helenius <fincer89 at hotmail dot com> | |||
pkgname=dxvk-git | |||
_pkgname=dxvk | |||
pkgver=0.91.21 | |||
pkgrel=1 | |||
arch=('i686' 'x86_64') | |||
conflicts=("dxvk-win64-bin") | |||
provides=("dxvk" "dxvk64") | |||
depends=('vulkan-icd-loader' 'wine' 'winetricks') | |||
conflicts=("dxvk-git<$pkgver") | |||
pkgdesc="A Vulkan-based compatibility layer for Direct3D 10/11 which allows running 3D applications on Linux using Wine." | |||
arch=('x86_64' 'i686') | |||
url="https://github.com/doitsujin/dxvk" | |||
license=('custom:zlib/libpng') | |||
makedepends=('ninja' 'meson>=0.43' 'glslang' 'mingw-w64-gcc' 'git' 'wine') | |||
options=(!strip !buildflags staticlibs) | |||
source=(${pkgname}::"git+https://github.com/doitsujin/dxvk.git") | |||
sha256sums=('SKIP') | |||
pkgver() { | |||
cd "${pkgname}" | |||
git describe --long | sed 's/\-[a-z].*//; s/\-/\./; s/[a-z]//g' | |||
} | |||
build() { | |||
"${srcdir}/${pkgname}"/package-release.sh ${pkgver} "${srcdir}"/build --no-package | |||
} | |||
package() { | |||
mkdir -p "${pkgdir}"/usr/{bin,share/dxvk} | |||
cp -r "${srcdir}"/build/${_pkgname}-${pkgver}/* "${pkgdir}/usr/share/dxvk/" | |||
echo -e "#!/bin/sh\nwinetricks --force /usr/share/dxvk/setup_dxvk.verb" \ | |||
> "${pkgdir}/usr/bin/setup_dxvk" | |||
chmod +x "${pkgdir}/usr/bin/setup_dxvk" | |||
} | |||
@ -0,0 +1,20 @@ | |||
<?xml version="1.0"?> | |||
<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> | |||
<fontconfig> | |||
<alias binding="same"> | |||
<family>MS Shell Dlg</family> | |||
<accept><family>Microsoft Sans Serif</family></accept> | |||
<default><family>sans-serif</family></default> | |||
</alias> | |||
<alias binding="same"> | |||
<family>MS Shell Dlg 2</family> | |||
<accept><family>Tahoma</family></accept> | |||
<default><family>sans-serif</family></default> | |||
</alias> | |||
<alias binding="same"> | |||
<family>MS Sans Serif</family> | |||
<prefer><family>Microsoft Sans Serif</family></prefer> | |||
<default><family>sans-serif</family></default> | |||
</alias> | |||
</fontconfig> |
@ -0,0 +1,319 @@ | |||
# Maintainer: Daniel Bermond < yahoo-com: danielbermond > | |||
# Contributor: Pekka Helenius (~ Fincer) <fincer89@hotmail.com> | |||
# Enable Wine Staging? 1 = yes | |||
enable_staging=1 | |||
# Staging patchsets. Default: all patchsets. Please see Wine Staging patchinstall.sh file for individual patchset names. | |||
staging_patchsets=(--all) # In order to disable all patchsets, use #(--all) and add desired patchsets individually here | |||
# Enable 32-bit compilation? 1 = yes | |||
enable_32=1 | |||
# Enable 64-bit compilation? 1 = yes | |||
enable_64=1 | |||
provides=('wine' 'wine-git' 'wine-staging' 'wine-staging-git' 'wine-staging-dxvk-git') | |||
if [[ enable_staging -eq 1 ]]; then | |||
pkgname=wine-staging-git | |||
pkgdesc="A compatibility layer for running Windows programs (staging branch, Git version)" | |||
url="https://github.com/wine-staging/wine-staging/" | |||
conflicts=('wine' 'wine-git' 'wine-staging') | |||
else | |||
pkgname=wine-git | |||
pkgdesc="A compatibility layer for running Windows programs (Git version)" | |||
url="https://source.winehq.org/git/wine.git/" | |||
conflicts=('wine' 'wine-staging' 'wine-staging-git') | |||
fi | |||
pkgver=stg.3.19.r9.g566cd55d+wine.wine.3.19.r220.g5e0d1c89ed | |||
pkgrel=1 | |||
arch=('i686' 'x86_64') | |||
license=('LGPL') | |||
_depends=( | |||
'attr' 'lib32-attr' | |||
'fontconfig' 'lib32-fontconfig' | |||
'lcms2' 'lib32-lcms2' | |||
'libxml2' 'lib32-libxml2' | |||
'libxcursor' 'lib32-libxcursor' | |||
'libxrandr' 'lib32-libxrandr' | |||
'libxdamage' 'lib32-libxdamage' | |||
'libxi' 'lib32-libxi' | |||
'gettext' 'lib32-gettext' | |||
'freetype2' 'lib32-freetype2' | |||
'glu' 'lib32-glu' | |||
'libsm' 'lib32-libsm' | |||
'gcc-libs' 'lib32-gcc-libs' | |||
'libpcap' 'lib32-libpcap' | |||
'desktop-file-utils' | |||
'vulkan-icd-loader' 'lib32-vulkan-icd-loader' | |||
) | |||
makedepends=( | |||
'git' | |||
'autoconf' | |||
'ncurses' | |||
'bison' | |||
'perl' | |||
#'fontforge' | |||
'flex' | |||
'gcc>=4.5.0-2' | |||
'giflib' 'lib32-giflib' | |||
'libpng' 'lib32-libpng' | |||
'gnutls' 'lib32-gnutls' | |||
'libxinerama' 'lib32-libxinerama' | |||
'libxcomposite' 'lib32-libxcomposite' | |||
'libxmu' 'lib32-libxmu' | |||
'libxxf86vm' 'lib32-libxxf86vm' | |||
'libldap' 'lib32-libldap' | |||
'mpg123' 'lib32-mpg123' | |||
'openal' 'lib32-openal' | |||
'v4l-utils' 'lib32-v4l-utils' | |||
'alsa-lib' 'lib32-alsa-lib' | |||
'libxcomposite' 'lib32-libxcomposite' | |||
'mesa' 'lib32-mesa' | |||
'libgl' 'lib32-libgl' | |||
'opencl-icd-loader' 'lib32-opencl-icd-loader' | |||
'libxslt' 'lib32-libxslt' | |||
'libpulse' 'lib32-libpulse' | |||
'libva' 'lib32-libva' | |||
'gst-plugins-base-libs' 'lib32-gst-plugins-base-libs' | |||
'samba' | |||
#'opencl-headers' | |||
#'gcc-multilib>=4.5.0-2' | |||
) | |||
optdepends=( | |||
'giflib' 'lib32-giflib' | |||
'libpng' 'lib32-libpng' | |||
'libldap' 'lib32-libldap' | |||
'gnutls' 'lib32-gnutls' | |||
'mpg123' 'lib32-mpg123' | |||
'openal' 'lib32-openal' | |||
'v4l-utils' 'lib32-v4l-utils' | |||
'libpulse' 'lib32-libpulse' | |||
'alsa-plugins' 'lib32-alsa-plugins' | |||
'alsa-lib' 'lib32-alsa-lib' | |||
'libjpeg-turbo' 'lib32-libjpeg-turbo' | |||
'libxcomposite' 'lib32-libxcomposite' | |||
'libxinerama' 'lib32-libxinerama' | |||
'ncurses' 'lib32-ncurses' | |||
'opencl-icd-loader' 'lib32-opencl-icd-loader' | |||
'libxslt' 'lib32-libxslt' | |||
'libtxc_dxtn' 'lib32-libtxc_dxtn' | |||
'libva' 'lib32-libva' | |||
'gst-plugins-base-libs' 'lib32-gst-plugins-base-libs' | |||
'vulkan-icd-loader' 'lib32-vulkan-icd-loader' | |||
'cups' | |||
'samba' | |||
'dosbox' | |||
) | |||
# lib32-libtxc_dxtn | |||
# 'gtk3' 'lib32-gtk3' | |||
options=('staticlibs') | |||
source=( | |||
wine-git::'git://source.winehq.org/git/wine.git' | |||
'30-win32-aliases.conf' | |||
) | |||
if [[ $(find ./wine-patches -mindepth 1 -maxdepth 1 -regex ".*\.\(patch\|diff\)$") ]]; then | |||
cp -r ./wine-patches/*.{patch,diff} ./ | |||
p=0 | |||
for patch in $(find . -mindepth 1 -maxdepth 1 -regex ".*\.\(patch\|diff\)$"); do | |||
patches[$p]="$(basename ${patch})" | |||
let p++ | |||
done | |||
unset p | |||
source+=(${source[@]} ${patches[@]}) | |||
fi | |||
if [[ enable_staging -eq 1 ]]; then | |||
stagingsrc=wine-staging-git::'git://github.com/wine-staging/wine-staging.git' | |||
source+=($stagingsrc) | |||
fi | |||
if [[ "$CARCH" == "i686" ]]; then | |||
# Strip lib32 etc. on i686 | |||
_depends=(${_depends[@]/*32-*/}) | |||
makedepends=(${makedepends[@]/*32-*/} ${_depends[@]}) | |||
makedepends=(${makedepends[@]/*-multilib*/}) | |||
optdepends=(${optdepends[@]/*32-*/}) | |||
else | |||
makedepends=(${makedepends[@]} ${_depends[@]}) | |||
fi | |||
pkgver() { | |||
msg2 "Setting Wine versions..." | |||
if [[ enable_staging -eq 1 ]]; then | |||
cd "${srcdir}/wine-staging-git" | |||
_staging_tag="$(git tag | sort -Vr | head -n1 | sed 's/-/./g;s/^v//')" | |||
_staging_version="stg.$(git describe --long \ | |||
| sed 's/\([^-]*-g\)/r\1/;s/-/./g;s/^v//' \ | |||
| sed "s/^latest.release/${_staging_tag}/")" | |||
fi | |||
cd "${srcdir}/wine-git" | |||
_wine_version="wine.$(git describe --long | sed 's/\([^-]*-g\)/r\1/;s/-/./g')" | |||
if [[ enable_staging -eq 1 ]]; then | |||
printf "%s+%s" "$_staging_version" "$_wine_version" | |||
else | |||
printf "%s" "$_wine_version" | |||
fi | |||
} | |||
prepare() { | |||
if [[ enable_staging -eq 1 ]]; then | |||
cd "$srcdir"/wine-git | |||
msg2 "Cleaning the wine source code tree..." | |||
# Restore the wine tree to its git origin state, without wine-staging patches | |||
#+(necessary for reapllying wine-staging patches in succedent builds, | |||
#+otherwise the patches will fail to be reapplied) | |||
git reset --hard HEAD # Restore tracked files | |||
git clean -d -x -f # Delete untracked files | |||
# Change back to the wine upstream commit that this version of wine-staging is based on | |||
git checkout $(../"$pkgname"/patches/patchinstall.sh --upstream-commit) | |||
fi | |||
} | |||
build() { | |||
cd "${srcdir}" | |||
# Delete old build dirs (from previous builds) and make new ones | |||
rm -rf "$pkgname"-{32,64}-build | |||
mkdir --parents "$pkgname"-32-build | |||
if [[ enable_staging -eq 1 ]]; then | |||
# Apply all wine-staging patches | |||
msg2 "Applying wine-staging patches..." | |||
./wine-staging-git/patches/patchinstall.sh DESTDIR="${srcdir}/wine-git" \ | |||
${staging_patchsets[*]} | |||
fi | |||
if [[ $(ls "${srcdir}"/*.patch | wc -w) -ne 0 ]]; then | |||
cd "${srcdir}"/wine-git | |||
# Apply all custom patches | |||
msg2 "Applying custom patches..." | |||
for i in "${srcdir}"/*{.patch,diff}; do | |||
patch -Np1 < ${i} | |||
done | |||
fi | |||
cd "${srcdir}" | |||
# Build wine 64-bit | |||
#+(according to the wine wiki this 64-bit/32-bit building order is mandatory) | |||
if [[ "$CARCH" = "x86_64" ]] && [[ enable_64 -eq 1 ]]; then | |||
msg2 "Building Wine-64..." | |||
mkdir --parents "$pkgname"-64-build | |||
cd "$pkgname"-64-build | |||
../wine-git/configure \ | |||
--with-x \ | |||
--with-gstreamer \ | |||
--enable-win64 \ | |||
--with-xattr \ | |||
--disable-mscoree \ | |||
--with-vulkan \ | |||
--prefix=/usr \ | |||
--libdir=/usr/lib | |||
make | |||
_wine32opts=( | |||
--libdir=/usr/lib32 | |||
--with-wine64="${srcdir}/${pkgname}-64-build" | |||
) | |||
export PKG_CONFIG_PATH="/usr/lib32/pkgconfig" | |||
fi | |||
# Build wine 32-bit | |||
if [[ enable_32 -eq 1 ]]; then | |||
msg2 "Building Wine-32..." | |||
cd "$srcdir"/"$pkgname"-32-build | |||
../wine-git/configure \ | |||
--with-x \ | |||
--with-gstreamer \ | |||
--with-xattr \ | |||
--disable-mscoree \ | |||
--with-vulkan \ | |||
"${_wine32opts[@]}" \ | |||
--prefix=/usr | |||
make | |||
fi | |||
if [[ ! enable_32 -eq 1 ]] && [[ ! enable_64 -eq 1 ]]; then | |||
msg2 "You must define at least one architecture in PKGBUILD! Aborting" | |||
exit 1 | |||
fi | |||
} | |||
package() { | |||
depends=(${_depends[@]}) | |||
# Package wine 32-bit | |||
#+(according to the wine wiki this reverse 32-bit/64-bit packaging order is important) | |||
if [[ $enable_32 -eq 1 ]]; then | |||
msg2 "Packaging Wine-32..." | |||
cd "$srcdir"/"$pkgname"-32-build | |||
if [ "$CARCH" = "i686" ]; then | |||
make prefix="$pkgdir/usr" install | |||
else | |||
make prefix="${pkgdir}/usr" \ | |||
libdir="${pkgdir}/usr/lib32" \ | |||
dlldir="${pkgdir}/usr/lib32/wine" install | |||
fi | |||
fi | |||
# Package wine 64-bit | |||
if [[ "$CARCH" == "x86_64" ]] && [[ enable_64 -eq 1 ]]; then | |||
msg2 "Packaging Wine-64..." | |||
cd "$srcdir"/"$pkgname"-64-build | |||
make prefix="${pkgdir}/usr" \ | |||
libdir="${pkgdir}/usr/lib" \ | |||
dlldir="${pkgdir}/usr/lib/wine" install | |||
if [[ enable_dxvk -eq 1 ]]; then | |||
mv "$srcdir"/dxvk-compiled/x64/{d3d11.dll,dxgi.dll} "${pkgdir}/usr/lib/wine/fakedlls/" | |||
chmod 644 "${pkgdir}/usr/lib/wine/fakedlls/"{d3d11.dll,dxgi.dll} | |||
mv "$srcdir"/dxvk-compiled/x32/{d3d11.dll,dxgi.dll} "${pkgdir}/usr/lib32/wine/fakedlls/" | |||
chmod 644 "${pkgdir}/usr/lib32/wine/fakedlls/"{d3d11.dll,dxgi.dll} | |||
fi | |||
fi | |||
# Font aliasing settings for Win32 applications | |||
install -d "$pkgdir"/etc/fonts/conf.{avail,d} | |||
install -m644 "${srcdir}/30-win32-aliases.conf" "${pkgdir}/etc/fonts/conf.avail" | |||
ln -s ../conf.avail/30-win32-aliases.conf "${pkgdir}/etc/fonts/conf.d/30-win32-aliases.conf" | |||
} | |||
md5sums=('SKIP' | |||
'1ff4e467f59409272088d92173a0f801' | |||
'SKIP' | |||
'1ff4e467f59409272088d92173a0f801' | |||
'd41d8cd98f00b204e9800998ecf8427e' | |||
'd41d8cd98f00b204e9800998ecf8427e' | |||
'SKIP') |
@ -0,0 +1,369 @@ | |||
#!/bin/bash | |||
# Set up Wine Staging + DXVK on Arch Linux & Variants | |||
# Copyright (C) 2018 Pekka Helenius | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 3 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <https://www.gnu.org/licenses/>. | |||
######################################################## | |||
# DO NOT RUN INDIVIDUALLY, ONLY VIA ../updatewine.sh PARENT SCRIPT! | |||
######################################################## | |||
datedir="${1}" | |||
######################################################## | |||
# http://wiki.bash-hackers.org/snipplets/print_horizontal_line#a_line_across_the_entire_width_of_the_terminal | |||
function INFO_SEP() { printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - ; } | |||
######################################################## | |||
# Parse input arguments | |||
i=0 | |||
for arg in ${@:2}; do | |||
args[$i]="${arg}" | |||
let i++ | |||
done | |||
# Must be a true array as defined above, not a single index list! | |||
#args="${@:2}" | |||
for check in ${args[@]}; do | |||
case ${check} in | |||
--no-staging) | |||
NO_STAGING= | |||
;; | |||
--no-install) | |||
NO_INSTALL= | |||
# Do not check for PlayOnLinux wine prefixes | |||
NO_POL= | |||
;; | |||
--no-wine) | |||
NO_WINE= | |||
;; | |||
--no-dxvk) | |||
NO_DXVK= | |||
;; | |||
--no-pol) | |||
NO_POL= | |||
;; | |||
esac | |||
done | |||
########################################################### | |||
ARCH_BUILDROOT="${PWD}" | |||
function Arch_intCleanup() { | |||
rm -rf ${ARCH_BUILDROOT}/{0-wine-staging-git/{wine-patches,*.tar.xz},0-dxvk-git/{dxvk-git,*.tar.xz}} | |||
exit 0 | |||
} | |||
# Allow interruption of the script at any time (Ctrl + C) | |||
trap "Arch_intCleanup" INT | |||
########################################################### | |||
function ccacheCheck() { | |||
if [[ $(pacman -Q | awk '{print $1}' | grep -wE "ccache" | wc -l) -eq 0 ]]; then | |||
echo -e "NOTE: Please consider using 'ccache' for faster compilation times.\nInstall it by typing 'sudo pacman -S ccache'\n" | |||
fi | |||
} | |||
########################################################### | |||
# Validate all files exist | |||
function checkFiles() { | |||
local wine_files=('30-win32-aliases.conf' 'PKGBUILD') | |||
local dxvk_files=('PKGBUILD') | |||
function validatefiles() { | |||
local list=${1} | |||
local name=${2} | |||
local path=${3} | |||
for file in ${list[@]}; do | |||
if [[ ! -f "${path}/${file}" ]]; then | |||
echo -e "Could not locate file ${} for ${name}. Aborting\n" | |||
exit 1 | |||
fi | |||
done | |||
} | |||
if [[ ! -v NO_WINE ]]; then | |||
validatefiles "${wine_files[*]}" Wine "${ARCH_BUILDROOT}/0-wine-staging-git" | |||
fi | |||
if [[ ! -v NO_DXVK ]]; then | |||
validatefiles "${dxvk_files[*]}" DXVK "${ARCH_BUILDROOT}/0-dxvk-git" | |||
fi | |||
} | |||
########################################################### | |||
# Disable or enable Wine Staging, depending on user's | |||
# choice | |||
function checkStaging() { | |||
# Enable Wine Staging | |||
if [[ ! -v NO_STAGING ]]; then | |||
sed -i 's/enable_staging=[0-9]/enable_staging=1/' "${ARCH_BUILDROOT}/0-wine-staging-git/PKGBUILD" | |||
wine_name="wine-staging-git" | |||
# Enable Wine, disable Staging | |||
else | |||
sed -i 's/enable_staging=[0-9]/enable_staging=0/' "${ARCH_BUILDROOT}/0-wine-staging-git/PKGBUILD" | |||
wine_name="wine" | |||
fi | |||
} | |||
########################################################### | |||
# Check package dependencies beforehand, just to avoid | |||
# annoying situations which could occur later while the script | |||
# is already running. | |||
# Just for "packages which are not found" array <=> ERRPKGS | |||
# We need to set it outside of checkDepends function | |||
# because it is a global variable for all checked packages | |||
l=0 | |||
function checkDepends() { | |||
# The first and the second argument | |||
local packagedir=${1} | |||
local package=${2} | |||
# We get necessary variables to check from this file | |||
local file="./${packagedir}/PKGBUILD" | |||
# All but the (zero), the first and the second argument | |||
# We check the value of these file variables | |||
local file_vars=${@:3} | |||
for var in ${file_vars[*]}; do | |||
# Get the variable and set it as a new variable in the current shell | |||
# This is applicable only to variable arrays! Do not use if the variable is not an array. | |||
local field=$(awk "/^${var}/,/)/" ${file} | sed -r "s/^${var}=|[)|(|']//g") | |||
local i=0 | |||
for parse in ${field[*]}; do | |||
if [[ ! $parse =~ ^# ]]; then | |||
local PKGS[$i]=$(printf '%s' $parse | sed 's/[=|>|<].*$//') | |||
let i++ | |||
fi | |||
done | |||
# Sort list and delete duplicate index values | |||
local PKGS=($(sort -u <<< "${PKGS[*]}")) | |||
for pkg in ${PKGS[*]}; do | |||
if [[ $(printf $(pacman -Q ${pkg} &>/dev/null)$?) -ne 0 ]]; then | |||
ERRPKGS[$l]=${pkg} | |||
echo -e "\e[91mError:\e[0m Dependency '${pkg}' not found, required by '${package}' (${file} => ${var})" | |||
let l++ | |||
fi | |||
done | |||
done | |||
echo -e "\e[92m==>\e[0m\e[1m Dependency check for ${package} done.\e[0m\n" | |||
} | |||
function check_alldeps() { | |||
if [[ -v ERRPKGS ]]; then | |||
echo -e "The following dependencies are missing:\n\e[91m\ | |||
$(for o in ${ERRPKGS[@]}; do printf '%s\n' ${o}; done)\ | |||
\e[0m\n" | |||
exit 1 | |||
fi | |||
} | |||
########################################################### | |||
function prepare_env() { | |||
# Copy Wine patch files | |||
cp -rf ${ARCH_BUILDROOT}/../wine_custom_patches ${ARCH_BUILDROOT}/0-wine-staging-git/wine-patches | |||
# Create identifiable directory for this build | |||
mkdir -p ${ARCH_BUILDROOT}/compiled_pkg/"${datedir}" | |||
} | |||
########################################################### | |||
# Remove any existing pkg,src or tar.xz packages left by previous pacman commands | |||
function cleanUp() { | |||
rm -rf ${ARCH_BUILDROOT}/*/{pkg,src,*.tar.xz} | |||
rm -rf ${ARCH_BUILDROOT}/0-wine-staging-git/{*.patch} | |||
} | |||
########################################################### | |||
function build_pkg() { | |||
local pkgname=${1} | |||
local pkgname_friendly={2} | |||
local pkgdir=${3} | |||
local cleanlist=${4} | |||
# Create package and install it to the system | |||
cd "${ARCH_BUILDROOT}"/${pkgdir} | |||
bash -c "updpkgsums && makepkg" | |||
# After successful compilation... | |||
if [[ $(ls ${pkgname}-*tar.xz | wc -l) -ne 0 ]]; then | |||
if [[ ! -v NO_INSTALL ]]; then | |||
yes | sudo pacman -U ${pkgname}-*.tar.xz | |||
fi | |||
mv ${pkgname}-*.tar.xz ${ARCH_BUILDROOT}/compiled_pkg/${datedir}/ && \ | |||
echo -e "\nCompiled ${pkgname_friendly} is stored at '$(readlink -f ${ARCH_BUILDROOT}/compiled_pkg/${datedir}/)/'\n" | |||
for rml in ${cleanlist[*]}; do | |||
rm -rf "${ARCH_BUILDROOT}/${pkgdir}/${rml}" | |||
done | |||
else | |||
echo -e "Error occured while compliling ${pkgname} from source.\n" | |||
for rml in ${cleanlist[*]}; do | |||
rm -rf "${ARCH_BUILDROOT}/${pkgdir}/${rml}" | |||
done | |||
exit 1 | |||
fi | |||
cd "${ARCH_BUILDROOT}" | |||
} | |||
########################################################## | |||
function updatePOL() { | |||
# Check whether we will update user's PoL wine prefixes | |||
if [[ ! -v NO_POL ]]; then | |||
# Check existence of PoL default folder in user's homedir | |||
if [[ ! -d "$HOME/PlayOnLinux" ]]; then | |||
echo -e "Warning. Couldn't find PoL directories in the user's $USERNAME homedir.\n" | |||
return 0 | |||
fi | |||
fi | |||
if [[ ! -v NO_WINE ]]; then | |||
# If a new Wine Staging version was installed and 'System' version of Wine has been used in | |||
# PoL wineprefix configurations, update those existing PoL wineprefixes | |||
for wineprefix in $(find $HOME/.PlayOnLinux/wineprefix -mindepth 1 -maxdepth 1 -type d); do | |||
if [[ -d ${wineprefix}/dosdevices ]]; then | |||
# If VERSION string exists, skip updating that prefix. | |||
if [[ $(printf $(grep -ril "VERSION" ${wineprefix}/playonlinux.cfg &> /dev/null)$?) -ne 0 ]]; then | |||
WINEPREFIX=${wineprefix} wineboot -u | |||
fi | |||
fi | |||
done | |||
fi | |||
if [[ ! -v NO_DXVK ]]; then | |||
for wineprefix in $(find $HOME/.PlayOnLinux/wineprefix -mindepth 1 -maxdepth 1 -type d); do | |||
if [[ -d ${wineprefix}/dosdevices ]]; then | |||
WINEPREFIX=${wineprefix} setup_dxvk | |||
fi | |||
done | |||
fi | |||
} | |||
########################################################## | |||
# Clean these temporary folders & files files | |||
# TODO Shall we remove git folders or keep them? | |||
dxvk_cleanlist=('pkg' 'src' '*.tar.xz') # dxvk-git | |||
wine_cleanlist=('*.patch' '*.diff' 'pkg' 'src' 'wine-patches' '*.tar.xz') # wine-*git | |||
########################################################## | |||
# Validate all buildtime files | |||
checkFiles | |||
# Check whether we build Wine or Wine Staging | |||
checkStaging | |||
# Check whether we have ccache installed | |||
ccacheCheck | |||
# Prepare building environment: copy patches and create timestamped folder for compiled packages | |||
prepare_env | |||
# Clean all previous trash we may have | |||
cleanUp | |||
######################### | |||
# Check Wine & DXVK dependencies, depending on whether these packages | |||
# are to be built | |||
echo -e "\e[1mINFO:\e[0m Checking dependencies for packages.\n" | |||
if [[ ! -v NO_WINE ]]; then | |||
checkDepends "0-wine-staging-git" "${wine_name}" _depends makedepends | |||
fi | |||
if [[ ! -v NO_DXVK ]]; then | |||
checkDepends "0-dxvk-git" "dxvk-git" depends makedepends | |||
fi | |||
check_alldeps | |||
######################### | |||
# Compile Wine & DXVK, depending on whether these packages | |||
# are to be built | |||
if [[ ! -v NO_WINE ]]; then | |||
build_pkg wine "${wine_name}" "0-wine-staging-git" "${wine_cleanlist[*]}" | |||
fi | |||
if [[ ! -v NO_DXVK ]]; then | |||
build_pkg dxvk DXVK "0-dxvk-git" "${dxvk_cleanlist[*]}" | |||
fi | |||
######################### | |||
# Update user's PlayonLinux wine prefixes if needed | |||
if [[ ! -v NO_POL ]]; then | |||
echo -e "Updating your PlayOnLinux Wine prefixes.\n" | |||
updatePOL | |||
fi | |||
@ -0,0 +1,474 @@ | |||
#!/bin/env bash | |||
# Compile DXVK git on Debian/Ubuntu/Mint and variants | |||
# Copyright (C) 2018 Pekka Helenius | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 3 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <https://www.gnu.org/licenses/>. | |||
########################################################### | |||
# DO NOT RUN INDIVIDUALLY, ONLY VIA ../../updatewine.sh PARENT SCRIPT! | |||
######################################################## | |||
datedir="${1}" | |||
DXVKROOT="${PWD}" | |||
########################################################### | |||
# Parse input arguments | |||
i=0 | |||
for arg in ${@:2}; do | |||
args[$i]="${arg}" | |||
let i++ | |||
done | |||
# Must be a true array as defined above, not a single index list! | |||
#args="${@:2}" | |||
for check in ${args[@]}; do | |||
case ${check} in | |||
--no-install) | |||
NO_INSTALL= | |||
;; | |||
--updateoverride) | |||
updateoverride= | |||
;; | |||
esac | |||
done | |||
########################################################### | |||
# Some version of Wine must be found in the system | |||
# Warn the user | |||
function wineCheck() { | |||
if [[ ! $(which wine 2>/dev/null) ]]; then | |||
echo -e "Warning: You must have Wine installed before DXVK can be compiled.\n" | |||
fi | |||
} | |||
wineCheck | |||
########################################################### | |||
function DXVK_intCleanup() { | |||
rm -rf ${DXVKROOT}/{dxvk-git,meson,glslang} | |||
rm -rf ${DXVKROOT}/../compiled_deb/"${datedir}" | |||
exit 0 | |||
} | |||
# Allow interruption of the script at any time (Ctrl + C) | |||
trap "DXVK_intCleanup" INT | |||
######################################################## | |||
# http://wiki.bash-hackers.org/snipplets/print_horizontal_line#a_line_across_the_entire_width_of_the_terminal | |||
function INFO_SEP() { printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - ; } | |||
######################################################## | |||
# Universal core dependencies | |||
_coredeps=('dh-make' 'make' 'gcc' 'build-essential' 'fakeroot') | |||
################################## | |||
function customReqs() { | |||
if [[ -v updateoverride ]]; then | |||
echo -en "Updating package databases." && \ | |||
if [[ $(printf $(sudo -n uptime &>/dev/null)$?) -ne 0 ]]; then printf " Please provide your sudo password.\n"; else printf "\n\n"; fi | |||
sudo apt update | |||
fi | |||
for cmd in git tar wget; do | |||
if [[ $(printf $(which ${cmd} &> /dev/null)$?) -ne 0 ]]; then | |||
echo -e "Missing ${cmd}. Installing...\n" | |||
sudo apt update && sudo apt install -y ${cmd} | |||
fi | |||
done | |||
for coredep in ${_coredeps[@]}; do | |||
local coredep=$(printf ${coredep} | sed 's/\+/\\\+/g') | |||
if [[ $(apt version ${coredep} | wc -w) -eq 0 ]]; then | |||
echo -e "Installing core dependency $(printf ${coredep} | sed 's/\\//g').\n" | |||
sudo apt install -y ${coredep} | |||
if [[ $? -ne 0 ]]; then | |||
echo -e "Could not install ${coredep}. Aborting.\n" | |||
exit 1 | |||
fi | |||
fi | |||
done | |||
} | |||
customReqs | |||
################################## | |||
function pkgcompilecheck() { | |||
local pkg=$(printf ${1} | sed 's/\+/\\\+/g') | |||
if [[ $(dpkg --get-selections | awk '{print $1}' | grep -wE "^${pkg}$" | wc -l) -eq 0 ]] || [[ -v updateoverride ]]; then | |||
${2} | |||
fi | |||
} | |||
################################################### | |||
function preparepackage() { | |||
echo -e "Starting compilation (& installation) of ${1}\n" | |||
local a=0 | |||
local _pkgname=${1} | |||
local _pkgdeps=${2} | |||
local _pkgurl=${3} | |||
local _pkgver=${4} | |||
if [[ -n ${5} ]]; then local _pkgdeps_runtime=${5}; fi | |||
function pkgdependencies() { | |||
for pkgdep in ${@}; do | |||
if [[ $(apt version ${pkgdep} | wc -w) -eq 0 ]]; then | |||
echo -e "Installing ${_pkgname} dependency ${pkgdep} ($(($a + 1 )) / $((${#*} + 1)))\n." | |||
sudo apt install -y ${pkgdep} &> /dev/null | |||
if [[ $? -eq 0 ]]; then | |||
let a++ | |||
else | |||
echo -e "\nError occured while installing ${pkgdep}. Aborting.\n" | |||
exit 1 | |||
fi | |||
fi | |||
done | |||
} | |||
function pkgversion() { | |||
if [[ -n "${_pkgver}" ]] && [[ "${_pkgver}" =~ ^git ]]; then | |||
cd ${_pkgname} | |||
_pkgver=$(eval "${_pkgver}") | |||
cd .. | |||
fi | |||
} | |||
function pkgfoldername() { | |||
rm -rf ${_pkgname} | |||
mkdir ${_pkgname} | |||
cd ${_pkgname} | |||
echo -e "Retrieving source code of ${_pkgname} from $(printf ${_pkgurl} | sed 's/^.*\/\///; s/\/.*//')\n" | |||
git clone ${_pkgurl} ${_pkgname} | |||
pkgversion && \ | |||
mv ${_pkgname} ${_pkgname}-${_pkgver} | |||
cd ${_pkgname}-${_pkgver} | |||
} | |||
pkgdependencies "${_pkgdeps[*]}" && \ | |||
if [[ -v _pkgdeps_runtime ]]; then pkgdependencies "${_pkgdeps_runtime[*]}"; fi | |||
pkgfoldername | |||
unset _pkgver | |||
} | |||
################################################### | |||
function meson_install_main() { | |||
local pkgname="meson" | |||
local pkgdeps_build=( | |||
'python3' | |||
'dh-python' | |||
'python3-setuptools' | |||
'ninja-build' | |||
) | |||
<<DISABLED | |||
'zlib1g-dev' | |||
'libboost-dev' | |||
'libboost-thread-dev' | |||
'libboost-test-dev' | |||
'libboost-log-dev' | |||
'gobjc' | |||
'gobjc++' | |||
'gnustep-make' | |||
'libgnustep-base-dev' | |||
'libgtest-dev' | |||
'google-mock' | |||
'qtbase5-dev' | |||
'qtbase5-dev-tools' | |||
'qttools5-dev-tools' | |||
'protobuf-compiler' | |||
'libprotobuf-dev' | |||
'default-jdk-headless' | |||
'valac' | |||
'gobject-introspection' | |||
'libgirepository1.0-dev' | |||
'gfortran' | |||
'flex' | |||
'bison' | |||
'mono-mcs' | |||
'mono-devel' | |||
'libwxgtk3.0-dev' | |||
'gtk-doc-tools' | |||
'rustc' | |||
'bash-doc' | |||
'python3-dev' | |||
'cython3' | |||
'gdc' | |||
'itstool' | |||
'libgtk-3-dev' | |||
'g++-arm-linux-gnueabihf' | |||
'bash-doc' | |||
'valgrind' | |||
'llvm-dev' | |||
'libsdl2-dev' | |||
'openmpi-bin' | |||
'libopenmpi-dev' | |||
'libvulkan-dev' | |||
'libpcap-dev' | |||
'libcups2-dev' | |||
'gtk-sharp2' | |||
'gtk-sharp2-gapi' | |||
'libglib2.0-cil-dev' | |||
'libwmf-dev' | |||
'mercurial' | |||
'gcovr' | |||
'lcov' | |||
'fpga-icestorm' | |||
'arachne-pnr' | |||
'yosys' | |||
'qtbase5-private-dev' | |||
DISABLED | |||
local pkgver_git="git describe --long | sed 's/\-[a-z].*//; s/\-/\./; s/[a-z]//g'" | |||
local pkgurl="https://github.com/mesonbuild/meson" | |||
local pkgurl_debian="http://archive.ubuntu.com/ubuntu/pool/universe/m/meson/meson_0.45.1-2.debian.tar.xz" | |||
function meson_debianbuild() { | |||
wget ${pkgurl_debian} -O debian.tar.xz | |||
tar xf debian.tar.xz && rm debian.tar.xz | |||
local sedversion=$(printf '%s' $(pwd | sed -e 's/.*\-//' -e 's/\./\\\./g')) | |||
# Do not perform checks | |||
sed -ir '/nocheck/d' debian/control | |||
sed -ir '/\.\/run_tests\.py/d' debian/rules | |||
# Downgrade debhelper version requirement for Debian compatilibity | |||
sed -ir 's/debhelper (>= 11)/debhelper (>= 10)/' debian/control | |||
sed -ir "s/0\.45\.1-2/${sedversion}/" debian/changelog | |||
sed -ir '/rm \$\$(pwd)\/debian\/meson\/usr\/bin\/mesontest/d' debian/rules | |||
sed -ir '/rm \$\$(pwd)\/debian\/meson\/usr\/bin\/mesonconf/d' debian/rules | |||
sed -ir '/rm \$\$(pwd)\/debian\/meson\/usr\/bin\/mesonintrospect/d' debian/rules | |||
sed -ir '/rm \$\$(pwd)\/debian\/meson\/usr\/bin\/wraptool/d' debian/rules | |||
sed -ir '/rm \-rf \$\$(pwd)\/debian\/meson\/usr\/lib\/python3/d' debian/rules | |||
#sed -ir "s/0\.45\.1-2/${sedversion}/" debian/files | |||
#sed -ir "s/0\.45\.1-2/${sedversion}/" debian/meson/DEBIAN/control | |||
rm -r debian/patches | |||
# Compile the package and actually install it. It is required by DXVK | |||
DEB_BUILD_OPTIONS="strip nodocs noddebs" dpkg-buildpackage -rfakeroot -b -us -uc | |||
if [[ $? -eq 0 ]]; then | |||
rm -rf ../*.{changes,buildinfo,tar.xz} && \ | |||
sudo dpkg -i ../${pkgname}*.deb && \ | |||
mv ../${pkgname}*.deb ../../../compiled_deb/"${datedir}" && \ | |||
echo -e "Compiled ${pkgname} is stored at '$(readlink -f ../../../compiled_deb/"${datedir}")/'\n" | |||
cd ../.. | |||
rm -rf ${pkgname} | |||
else | |||
exit 1 | |||
fi | |||
} | |||
preparepackage "${pkgname}" "${pkgdeps_build[*]}" "${pkgurl}" "${pkgver_git}" && \ | |||
meson_debianbuild | |||
} | |||
################################################### | |||
function glslang_install_main() { | |||
local pkgname="glslang" | |||
local pkgdeps_build=('cmake' 'python2.7') | |||
local pkgurl="https://github.com/KhronosGroup/glslang" | |||
local pkgver_git="git describe --long | sed 's/\-[a-z].*//; s/\-/\./; s/[a-z]//g'" | |||
function glslang_debianbuild() { | |||
# Compile the package and actually install it. It is required by DXVK | |||
dh_make --createorig -s -y | |||
sed -ie "s/^Build-Depends:.*$/Build-Depends: debhelper (>=10), $(echo ${_coredeps[*]} | sed 's/\s/, /g'), $(echo ${pkgdeps_build[*]} | sed 's/\s/, /g')/g" debian/control | |||
printf 'override_dh_usrlocal:' | tee -a debian/rules | |||
DEB_BUILD_OPTIONS="strip nodocs noddebs" dpkg-buildpackage -rfakeroot -b -us -uc | |||
if [[ $? -eq 0 ]]; then | |||
rm -rf ../*.{changes,buildinfo,tar.xz} && \ | |||
sudo dpkg -i ../${pkgname}*.deb && \ | |||
mv ../${pkgname}*.deb ../../../compiled_deb/"${datedir}" && \ | |||
echo -e "Compiled ${pkgname} is stored at '$(readlink -f ../../../compiled_deb/"${datedir}")/'\n" | |||
cd ../.. | |||
rm -rf ${pkgname} | |||
else | |||
exit 1 | |||
fi | |||
} | |||
preparepackage "${pkgname}" "${pkgdeps_build[*]}" "${pkgurl}" "${pkgver_git}" && \ | |||
glslang_debianbuild | |||
} | |||
################################################### | |||
function dxvk_install_main() { | |||
local pkgname="dxvk-git" | |||
local pkgdeps_build=( | |||
'meson' | |||
'glslang' | |||
'gcc-mingw-w64-x86-64' | |||
'gcc-mingw-w64-i686' | |||
'g++-mingw-w64-x86-64' | |||
'g++-mingw-w64-i686' | |||
'mingw-w64-x86-64-dev' | |||
'mingw-w64-i686-dev' | |||
) | |||
local pkgdeps_runtime=('wine' 'winetricks') | |||
local pkgver_git="git describe --long | sed 's/\-[a-z].*//; s/\-/\./; s/[a-z]//g'" | |||
local pkgurl="https://github.com/doitsujin/dxvk" | |||
function dxvk_posixpkgs() { | |||
local packages=( | |||
'i686-w64-mingw32-g++' | |||
'i686-w64-mingw32-gcc' | |||
'x86_64-w64-mingw32-g++' | |||
'x86_64-w64-mingw32-gcc' | |||
) | |||
for package in "${packages[@]}"; do | |||
local option=$(echo "" | sudo update-alternatives --config "${package}" | grep posix | sed 's@^[^0-9]*\([0-9]\+\).*@\1@') | |||
echo "${option}" | sudo update-alternatives --config "${package}" &> /dev/null | |||
done | |||
} | |||
function dxvk_debianbuild() { | |||
local dxvx_relative_builddir="debian/source/dxvk-master" | |||
dh_make --createorig -s -y | |||
sed -ie "s/^Build-Depends:.*$/Build-Depends: debhelper (>=10), $(echo ${_coredeps[*]} | sed 's/\s/, /g'), $(echo ${pkgdeps_build[*]} | sed 's/\s/, /g')/g" debian/control | |||
sed -ie "s/^Depends:.*$/Depends: $(echo ${pkgdeps_runtime} | sed 's/\s/, /g')/g" debian/control | |||
printf "${dxvx_relative_builddir}/setup_dxvk.verb usr/share/dxvk/" > debian/install | |||
printf "\n${dxvx_relative_builddir}/bin/* usr/bin/" >> debian/install | |||
rm debian/*.{ex,EX} | |||
cat << 'DXVK-DEBIANRULES' > debian/rules | |||
#!/usr/bin/make -f | |||
%: | |||
dh $@ | |||
override_dh_auto_configure: | |||
override_dh_usrlocal: | |||
DXVK-DEBIANRULES | |||
bash ./package-release.sh master debian/source/ --no-package | |||
if [[ $? -ne 0 ]]; then | |||
echo "Error while compiling ${pkgname}. Check messages above. Aborting\n" | |||
exit 1 | |||
fi | |||
sed -ir '/dxvk64_dir/d' ${dxvx_relative_builddir}/setup_dxvk.verb | |||
mkdir -p ${dxvx_relative_builddir}/bin | |||
echo -e "#!/bin/sh\nwinetricks --force /usr/share/dxvk/setup_dxvk.verb" \ | |||
> "${dxvx_relative_builddir}/bin/setup_dxvk" | |||
chmod +x "${dxvx_relative_builddir}/bin/setup_dxvk" | |||
for arch in 64 32; do | |||
mkdir -p ${dxvx_relative_builddir}/x${arch} | |||
printf "\n${dxvx_relative_builddir}/x${arch}/* usr/share/dxvk/x${arch}/" >> debian/install | |||
done | |||
DEB_BUILD_OPTIONS="strip nodocs noddebs" dpkg-buildpackage -us -uc -b --source-option=--include-binaries | |||
if [[ $? -eq 0 ]]; then | |||
if [[ ! -v NO_INSTALL ]]; then | |||
sudo dpkg -i ../${pkgname}*.deb | |||
fi | |||
rm -rf ../*.{changes,buildinfo,tar.xz} | |||
mv ../${pkgname}*.deb ../../../compiled_deb/"${datedir}" && \ | |||
echo -e "Compiled ${pkgname} is stored at '$(readlink -f ../../../compiled_deb/"${datedir}")/'\n" | |||
cd ../.. | |||
rm -rf ${pkgname} | |||
else | |||
exit 1 | |||
fi | |||
} | |||
preparepackage "${pkgname}" "${pkgdeps_build[*]}" "${pkgurl}" "${pkgver_git}" "${pkgdeps_runtime[*]}" && \ | |||
dxvk_posixpkgs && \ | |||
dxvk_debianbuild | |||
} | |||
#################################################################### | |||
pkgcompilecheck meson meson_install_main | |||
pkgcompilecheck glslang glslang_install_main | |||
dxvk_install_main | |||
@ -0,0 +1,48 @@ | |||
#!/bin/env bash | |||
# Update PoL Wine prefixes (DXVK & Wine Staging) on Debian/Ubuntu/Mint | |||
# Copyright (C) 2018 Pekka Helenius | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 3 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <https://www.gnu.org/licenses/>. | |||
############################################################################## | |||
# Check existence of PoL default folder in user's homedir | |||
if [[ ! -d "$HOME/.PlayOnLinux" ]]; then | |||
echo "Warning. Couldn't find PoL directories in the user $USER homedir." | |||
exit 0 | |||
fi | |||
# Install dxvk-git to every PlayOnLinux wineprefix | |||
if [[ $? -eq 0 ]] && [[ ! -v NOPOL ]]; then | |||
for wineprefix in $(find $HOME/.PlayOnLinux/wineprefix -mindepth 1 -maxdepth 1 -type d); do | |||
if [[ -d ${wineprefix}/dosdevices ]]; then | |||
WINEPREFIX=${wineprefix} setup_dxvk | |||
fi | |||
done | |||
fi | |||
# If a new Wine Staging version was installed and 'System' version of Wine has been used in | |||
# PoL wineprefix configurations, update those existing PoL wineprefixes | |||
if [[ ! -v NOPOL ]]; then | |||
for wineprefix in $(find $HOME/.PlayOnLinux/wineprefix -mindepth 1 -maxdepth 1 -type d); do | |||
if [[ -d ${wineprefix}/dosdevices ]]; then | |||
# If VERSION string exists, skip updating that prefix. | |||
if [[ $(printf $(grep -ril "VERSION" ${wineprefix}/playonlinux.cfg &> /dev/null)$?) -ne 0 ]]; then | |||
WINEPREFIX=${wineprefix} wineboot -u | |||
fi | |||
fi | |||
done | |||
fi |
@ -0,0 +1,200 @@ | |||
#!/bin/env bash | |||
# Wrapper for DXVK & Wine compilation scripts | |||
# Copyright (C) 2018 Pekka Helenius | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 3 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <https://www.gnu.org/licenses/>. | |||
######################################################## | |||
# DO NOT RUN INDIVIDUALLY, ONLY VIA ../updatewine.sh PARENT SCRIPT! | |||
######################################################## | |||
ROOTDIR="${PWD}" | |||
datedir="${1}" | |||
######################################################## | |||
# http://wiki.bash-hackers.org/snipplets/print_horizontal_line#a_line_across_the_entire_width_of_the_terminal | |||
function INFO_SEP() { printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' - ; } | |||
######################################################## | |||
# Parse input arguments | |||
i=0 | |||
for arg in ${@:2}; do | |||
args[$i]="${arg}" | |||
let i++ | |||
done | |||
# Must be a true array as defined above, not a single index list! | |||
#args="${@:2}" | |||
# All valid arguments given in ../updatewine.sh are handled... | |||
# All valid arguments are passed to subscripts... | |||
# ...but these are specifically used in this script | |||
# | |||
for check in ${args[@]}; do | |||
case ${check} in | |||
--no-wine) | |||
NO_WINE= | |||
;; | |||
--no-dxvk) | |||
NO_DXVK= | |||
;; | |||
--no-pol) | |||
NO_POL= | |||
;; | |||
--no-install) | |||
# If this option is given, do not check PoL wineprefixes | |||
NO_POL= | |||
;; | |||
esac | |||
done | |||
######################################################## | |||
mkdir -p ${ROOTDIR}/compiled_deb/${datedir} | |||
######################################################## | |||
function Deb_intCleanup() { | |||
cd ${ROOTDIR} | |||
rm -rf compiled_deb/${datedir} | |||
exit 0 | |||
} | |||
# Allow interruption of the script at any time (Ctrl + C) | |||
trap "Deb_intCleanup" INT | |||
######################################################## | |||
function ccacheCheck() { | |||
if [[ $(apt version ccache | wc -w) -eq 0 ]]; then | |||
echo -e "NOTE: Please consider using 'ccache' for faster compilation times.\nInstall it by typing 'sudo apt install ccache'\n" | |||
fi | |||
} | |||
ccacheCheck | |||
######################################################## | |||
function wine_install_main() { | |||
echo -e "Starting compilation & installation of Wine\n\n\ | |||
This can take up to 0.5-2 hours depending on the available CPU cores.\n\n\ | |||
Using $(nproc --ignore 1) of $(nproc) available CPU cores for Wine source code compilation. | |||
" | |||
bash -c "cd ${ROOTDIR}/wineroot/ && bash ./winebuild.sh \"${datedir}\" \"${args[*]}\"" | |||
} | |||
######################################################## | |||
function questionresponse() { | |||
local response=${1} | |||
read -r -p "" response | |||
if [[ $(echo $response | sed 's/ //g') =~ ^([yY][eE][sS]|[yY])$ ]]; then | |||
echo "" | |||
return 0 | |||
else | |||
return 1 | |||
fi | |||
} | |||
################################## | |||
INFO_SEP | |||
echo -e "\e[1mINFO:\e[0m About installation\n\nThe installation may take long time because many development dependencies may be \ | |||
installed and the following packages will be compiled from source (depending on your choise):\n\n\ | |||
\t- Wine/Wine Staging (latest git version)\n\ | |||
\t- DXVK (latest git version)\n\ | |||
\t- meson & glslang (latest git versions; these are build time dependencies for DXVK)\n\n\ | |||
Do you want to continue? [Y/n]" | |||
questionresponse | |||
if [[ $? -ne 0 ]]; then | |||
echo -e "Cancelling.\n" | |||
exit 2 | |||
fi | |||
#################### | |||
AVAIL_SPACE=$(df -h -B MB --output=avail . | sed '1d; s/[A-Z]*//g') | |||
REC_SPACE=8000 | |||
if [[ ${AVAIL_SPACE} -lt ${REC_SPACE} ]]; then | |||
INFO_SEP | |||
echo -e "\e[1mWARNING:\e[0m Not sufficient storage space\n\nYou will possibly run out of space while compiling software.\n\ | |||
The script strongly recommends ~\e[1m$((${REC_SPACE} / 1000)) GB\e[0m at least to compile software successfully but you have only\n\ | |||
\e[1m${AVAIL_SPACE} MB\e[0m left on the filesystem the script is currently placed at.\n\n\ | |||
Be aware that the script process may fail because of this, especially while compiling Wine Staging.\n\n\ | |||
Do you really want to continue? [Y/n]" | |||
questionresponse | |||
if [[ $? -ne 0 ]]; then | |||
echo -e "Cancelling.\n" | |||
exit 2 | |||
fi | |||
unset AVAIL_SPACE REC_SPACE | |||
fi | |||
#################### | |||
INFO_SEP | |||
echo -e "\e[1mINFO:\e[0m Update existing dependencies?\n\nIn a case you have old build time dependencies on your system, do you want to update them?\n\ | |||
If you answer 'yes', then those dependencies are updated if needed. Otherwise, already installed\n\ | |||
build time dependencies are not updated. If you don't have 'meson' or 'glslang' installed on your system, they will be compiled, anyway.\n\ | |||
Be aware, that updating these packages may increase total run time used by this script.\n\n\ | |||
Update dependency packages & other system packages? [Y/n]" | |||
questionresponse | |||
if [[ $? -eq 0 ]]; then | |||
args+=('--updateoverride') | |||
fi | |||
INFO_SEP | |||
######################################################## | |||
if [[ ! -v NO_WINE ]]; then | |||
wine_install_main | |||
else | |||
echo -e "Skipping Wine build & installation process.\n" | |||
fi | |||
if [[ ! -v NO_DXVK ]]; then | |||
bash -c "cd ${ROOTDIR}/dxvkroot && bash dxvkbuild.sh \"${datedir}\" \"${args[*]}\"" | |||
else | |||
echo -e "Skipping DXVK build & installation process.\n" | |||
fi | |||
if [[ ! -v NO_POL ]]; then | |||
bash -c "cd ${ROOTDIR} && bash playonlinux_prefixupdate.sh" | |||
fi | |||
@ -0,0 +1,639 @@ | |||
#!/bin/env bash | |||
# Wine/Wine Staging build script for Ubuntu & variants (amd64) | |||
# Copyright (C) 2018 Pekka Helenius | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 3 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <https://www.gnu.org/licenses/>. | |||
######################################################## | |||
# DO NOT RUN INDIVIDUALLY, ONLY VIA ../../updatewine.sh PARENT SCRIPT! | |||
######################################################## | |||
# | |||
# Staging patchsets. Default: all patchsets. | |||
# Applies only if Wine Staging is set to be compiled | |||
# Please see Wine Staging patchinstall.sh file for individual patchset names. | |||
staging_patchsets=(--all) | |||
######################################################## | |||
datedir="${1}" | |||
######################################################## | |||
# Parse input arguments | |||
i=0 | |||
for arg in ${@:2}; do | |||
args[$i]="${arg}" | |||
let i++ | |||
done | |||
# Must be a true array as defined above, not a single index list! | |||
#args="${@:2}" | |||
for check in ${args[@]}; do | |||
case ${check} in | |||
--no-staging) | |||
NO_STAGING= | |||
;; | |||
--no-install) | |||
NO_INSTALL= | |||
;; | |||
esac | |||
done | |||
######################################################## | |||
function Wine_intCleanup() { | |||
cd .. | |||
rm -rf winebuild_${datedir} | |||
exit 0 | |||
} | |||
# Allow interruption of the script at any time (Ctrl + C) | |||
trap "Wine_intCleanup" INT | |||
######################################################## | |||
# This is specifically for Debian | |||
# Must be done to install Wine buildtime dependencies on amd64 environment | |||
# | |||
if [[ $(dpkg --print-foreign-architectures | grep i386 | wc -l) -eq 0 ]]; then | |||
sudo dpkg --add-architecture i386 | |||
sudo apt update | |||
fi | |||
######################################################## | |||
function getWine() { | |||
function cleanOldBuilds() { | |||
if [[ $(find . -type d -name "winebuild_*" | wc -l) -ne 0 ]]; then | |||
echo -e "Removing old Wine build folders. This can take a while.\n" | |||
rm -rf ./winebuild_* | |||
fi | |||
} | |||
cleanOldBuilds | |||
mkdir winebuild_${datedir} | |||
cd winebuild_${datedir} | |||
WINEROOT="${PWD}" | |||
echo -e "Retrieving source code of Wine$(if [[ ! -v NO_STAGING ]]; then echo ' & Wine Staging' ; fi)\n" | |||
git clone git://source.winehq.org/git/wine.git | |||
if [[ ! -v NO_STAGING ]]; then | |||
git clone git://github.com/wine-staging/wine-staging.git | |||
WINEDIR_STAGING="${WINEROOT}/wine-staging" | |||
PKGNAME="wine-staging-git" | |||
else | |||
PKGNAME="wine-git" | |||
fi | |||
mkdir wine-{patches,32-build,32-install,64-build,64-install,package} | |||
cp -r ../../../wine_custom_patches/*.{patch,diff} wine-patches/ 2>/dev/null | |||
WINEDIR="${WINEROOT}/wine" | |||
WINEDIR_PATCHES="${WINEROOT}/wine-patches" | |||
WINEDIR_BUILD_32="${WINEROOT}/wine-32-build" | |||
WINEDIR_BUILD_64="${WINEROOT}/wine-64-build" | |||
WINEDIR_INSTALL_32="${WINEROOT}/wine-32-install" | |||
WINEDIR_INSTALL_64="${WINEROOT}/wine-64-install" | |||
WINEDIR_PACKAGE="${WINEROOT}/wine-package" | |||
} | |||
function getDebianFiles() { | |||
local debian_archive=wine_3.0-1ubuntu1.debian.tar.xz | |||
cd "${WINEDIR}" | |||
wget http://archive.ubuntu.com/ubuntu/pool/universe/w/wine/${debian_archive} | |||
tar xvf ${debian_archive} | |||
rm ${debian_archive} | |||
} | |||
######################################################## | |||
# Wine build dependency list on Debian | |||
wine_deps_build=( | |||
'make' | |||
'gcc-multilib' | |||
'g++-multilib' | |||
'libxml-simple-perl' | |||
'libxml-parser-perl' | |||
'libxml-libxml-perl' | |||
'lzma' | |||
'flex' | |||
'bison' | |||
'quilt' | |||
'gettext' | |||
'oss4-dev' | |||
'sharutils' | |||
'pkg-config' | |||
'dctrl-tools' | |||
'khronos-api' | |||
'unicode-data' | |||
'freebsd-glue' | |||
'icoutils' | |||
'librsvg2-bin' | |||
'imagemagick' | |||
'fontforge' | |||
'libxi-dev:amd64' | |||
'libxt-dev:amd64' | |||
'libxmu-dev:amd64' | |||
'libx11-dev:amd64' | |||
'libxext-dev:amd64' | |||
'libxfixes-dev:amd64' | |||
'libxrandr-dev:amd64' | |||
'libxcursor-dev:amd64' | |||
'libxrender-dev:amd64' | |||
'libxkbfile-dev:amd64' | |||
'libxxf86vm-dev:amd64' | |||
'libxxf86dga-dev:amd64' | |||
'libxinerama-dev:amd64' | |||
'libgl1-mesa-dev:amd64' | |||
'libglu1-mesa-dev:amd64' | |||
'libxcomposite-dev:amd64' | |||
'libpng-dev:amd64' | |||
'libssl-dev:amd64' | |||
'libv4l-dev:amd64' | |||
'libxml2-dev:amd64' | |||
'libgsm1-dev:amd64' | |||
'libjpeg-dev:amd64' | |||
'libkrb5-dev:amd64' | |||
'libtiff-dev:amd64' | |||
'libsane-dev:amd64' | |||
'libudev-dev:amd64' | |||
'libpulse-dev:amd64' | |||
'liblcms2-dev:amd64' | |||
'libldap2-dev:amd64' | |||
'libxslt1-dev:amd64' | |||
'unixodbc-dev:amd64' | |||
'libcups2-dev:amd64' | |||
'libcapi20-dev:amd64' | |||
'libopenal-dev:amd64' | |||
'libdbus-1-dev:amd64' | |||
'freeglut3-dev:amd64' | |||
'libmpg123-dev:amd64' | |||
'libasound2-dev:amd64' | |||
'libgphoto2-dev:amd64' | |||
'libosmesa6-dev:amd64' | |||
'libpcap0.8-dev:amd64' | |||
'libgnutls28-dev:amd64' | |||
'libncurses5-dev:amd64' | |||
'libgettextpo-dev:amd64' | |||
'libfreetype6-dev:amd64' | |||
'libfontconfig1-dev:amd64' | |||
'libgstreamer-plugins-base1.0-dev:amd64' | |||
'ocl-icd-opencl-dev:amd64' | |||
'libvulkan-dev:amd64' | |||
'libxi-dev:i386' | |||
'libxt-dev:i386' | |||
'libxmu-dev:i386' | |||
'libx11-dev:i386' | |||
'libxext-dev:i386' | |||
'libxfixes-dev:i386' | |||
'libxrandr-dev:i386' | |||
'libxcursor-dev:i386' | |||
'libxrender-dev:i386' | |||
'libxkbfile-dev:i386' | |||
'libxxf86vm-dev:i386' | |||
'libxxf86dga-dev:i386' | |||
'libxinerama-dev:i386' | |||
'libgl1-mesa-dev:i386' | |||
'libglu1-mesa-dev:i386' | |||
'libxcomposite-dev:i386' | |||
'libpng-dev:i386' | |||
'libssl-dev:i386' | |||
'libv4l-dev:i386' | |||
'libgsm1-dev:i386' | |||
'libjpeg-dev:i386' | |||
'libkrb5-dev:i386' | |||
'libsane-dev:i386' | |||
'libudev-dev:i386' | |||
'libpulse-dev:i386' | |||
'liblcms2-dev:i386' | |||
'libldap2-dev:i386' | |||
'unixodbc-dev:i386' | |||
'libcapi20-dev:i386' | |||
'libopenal-dev:i386' | |||
'libdbus-1-dev:i386' | |||
'freeglut3-dev:i386' | |||
'libmpg123-dev:i386' | |||
'libasound2-dev:i386' | |||
'libgphoto2-dev:i386' | |||
'libosmesa6-dev:i386' | |||
'libpcap0.8-dev:i386' | |||
'libncurses5-dev:i386' | |||
'libgettextpo-dev:i386' | |||
'libfreetype6-dev:i386' | |||
'libfontconfig1-dev:i386' | |||
'ocl-icd-opencl-dev:i386' | |||
'libvulkan-dev:i386' | |||
) | |||
# Excluded x86 packages since they conflict with their amd64 counterparts: | |||
# | |||
# libxslt1-dev:i386 | |||
# libxml2-dev:i386 | |||
# libicu-dev:i386 | |||
# libtiff-dev:i386 | |||
# libcups2-dev:i386 | |||
# libgnutls28-dev:i386 | |||
# libgstreamer1.0-dev:i386 | |||
# libgstreamer-plugins-base1.0-dev:i386 | |||
######################################################## | |||
# Wine runtime dependency list on Debian | |||
wine_deps_runtime=( | |||
'libxcursor1:i386' | |||
'libxrandr2:i386' | |||
'libxi6:i386' | |||
'libsm6:i386' | |||
'libvulkan1:i386' | |||
'libasound2:i386' | |||
'libc6:i386' | |||
'libfontconfig1:i386' | |||
'libfreetype6:i386' | |||
'libgcc1:i386' | |||
'libglib2.0-0:i386' | |||
'libgphoto2-6:i386' | |||
'libgphoto2-port12:i386' | |||
'liblcms2-2:i386' | |||
'libldap-2.4-2:i386' | |||
'libmpg123-0:i386' | |||
'libncurses5:i386' | |||
'libopenal1:i386' | |||
'libpcap0.8:i386' | |||
'libpulse0:i386' | |||
'libtinfo5:i386' | |||
'libudev1:i386' | |||
'libx11-6:i386' | |||
'libxext6:i386' | |||
'libxml2:i386' | |||
'ocl-icd-libopencl1:i386' | |||
'zlib1g:i386' | |||
'fontconfig:amd64' | |||
'libxcursor1:amd64' | |||
'libxrandr2:amd64' | |||
'libxi6:amd64' | |||
'gettext:amd64' | |||
'libsm6:amd64' | |||
'libvulkan1:amd64' | |||
'libasound2:amd64' | |||
'libc6:amd64' | |||
'libfontconfig1:amd64' | |||
'libfreetype6:amd64' | |||
'libgcc1:amd64' | |||
'libglib2.0-0:amd64' | |||
'libgphoto2-6:amd64' | |||
'libgphoto2-port12:amd64' | |||
'liblcms2-2:amd64' | |||
'libldap-2.4-2:amd64' | |||
'libmpg123-0:amd64' | |||
'libncurses5:amd64' | |||
'libopenal1:amd64' | |||
'libpcap0.8:amd64' | |||
'libpulse0:amd64' | |||
'libtinfo5:amd64' | |||
'libudev1:amd64' | |||
'libx11-6:amd64' | |||
'libxext6:amd64' | |||
'libxml2:amd64' | |||
'ocl-icd-libopencl1:amd64' | |||
'zlib1g:amd64' | |||
'desktop-file-utils' | |||
'libgstreamer-plugins-base1.0-0:amd64' | |||
'libgstreamer1.0-0:amd64' | |||
) | |||
# Exclude the following i386 runtime dependencies | |||
# because they conflict with their amd64 counterparts: | |||
# gettext:i386 | |||
######################################################## | |||
# Wine dependencies: | |||
function WineDeps() { | |||
local a=0 | |||
local deps="${1}" | |||
local depsname=${2} | |||
echo -e "Installing Wine dependencies.\n" # Sudo password may be required.\n" | |||
# TODO should we install all at once, or go iterating the list, | |||
# giving better output for user. Iterative method is slower, though. | |||
# | |||
# sudo apt install -y ${deps[*]} | |||
# if [[ $? -ne 0 ]]; then | |||
# echo -e "Error while installing Wine dependencies. Aborting\n" | |||
# exit 1 | |||
# fi | |||
function pkgdependencies() { | |||
for pkgdep in ${@}; do | |||
if [[ $(apt version ${pkgdep} | wc -w) -eq 0 ]]; then | |||
echo -e "Installing ${depsname} dependency ${pkgdep} ($(($a + 1 )) / $((${#*} + 1)))\n." | |||
sudo apt install -y ${pkgdep} &> /dev/null | |||
if [[ $? -eq 0 ]]; then | |||
let a++ | |||
else | |||
echo -e "\nError occured while installing ${pkgdep}. Aborting.\n" | |||
exit 1 | |||
fi | |||
fi | |||
done | |||
} | |||
pkgdependencies ${deps[*]} | |||
} | |||
######################################################## | |||
# Wine staging override list | |||
# Wine Staging replaces and conflicts with these packages | |||
# Applies to debian/control file | |||
wine_over_pkgs=( | |||
'wine' | |||
'wine-development' | |||
'wine64-development' | |||
'wine1.6' | |||
'wine1.6-i386' | |||
'wine1.6-amd64' | |||
'libwine:amd64' | |||
'libwine:i386' | |||
'wine-stable' | |||
'wine32' | |||
'wine64' | |||
) | |||
############################ | |||
# Suggest section in debian/control file | |||
wine_suggest_pkgs=( | |||
'winbind' | |||
'winetricks' | |||
'fonts-wine' | |||
'playonlinux' | |||
'wine-binfmt' | |||
'dosbox' | |||
) | |||
######################################################## | |||
# Feed the following data to Wine debian/control file | |||
function feedControlfile() { | |||
local MAINTAINER="$USER" | |||
sed -ie "s/^Build-Depends:.*$/Build-Depends: debhelper (>=11), $(echo ${wine_deps_build[*]} | sed 's/\s/, /g')/g" debian/control | |||
sed -ie "s/^Depends:.*$/Depends: $(echo ${wine_deps_runtime[*]} | sed 's/\s/, /g')/g" debian/control | |||
sed -ie "s/^Suggests:.*$/Suggests: $(echo ${wine_suggest_pkgs[*]} | sed 's/\s/, /g')/g" debian/control | |||
sed -ie "s/^Maintainer:.*$/Maintainer: ${MAINTAINER}/g" debian/control | |||
sed -ie "s/^Source:.*$/Source: ${PKGNAME}/g" debian/control | |||
sed -ie "s/^Package:.*$/Package: ${PKGNAME}/g" debian/control | |||
for ctrl_section in Conflicts Breaks Replaces Provides; do | |||
sed -ie "s/^${ctrl_section}:.*$/${ctrl_section}: $(echo ${wine_over_pkgs[*]} | sed 's/\s/, /g')/g" debian/control | |||
done | |||
} | |||
######################################################## | |||
# Refresh Wine GIT | |||
function refreshWineGIT() { | |||
# Restore the wine tree to its git origin state, without wine-staging patches | |||
# (necessary for reapllying wine-staging patches in succedent builds, | |||
# otherwise the patches will fail to be reapplied) | |||
cd "${WINEDIR}" | |||
git reset --hard HEAD # Restore tracked files | |||
git clean -d -x -f # Delete untracked files | |||
if [[ ! -v NO_STAGING ]]; then | |||
# Change back to the wine upstream commit that this version of wine-staging is based on | |||
git checkout $(bash "${WINEDIR_STAGING}"/patches/patchinstall.sh --upstream-commit) | |||
fi | |||
} | |||
######################################################## | |||
# Get Wine version tag | |||
function getWineVersion() { | |||
cd "${WINEDIR}" | |||
wine_version=$(git describe | sed 's/^[a-z]*-//; s/-[0-9]*-[a-z0-9]*$//') | |||
} | |||
######################################################## | |||
# Apply patches | |||
function patchWineSource() { | |||
if [[ ! -v NO_STAGING ]]; then | |||
cd "${WINEDIR_STAGING}/patches" | |||
bash ./patchinstall.sh DESTDIR="${WINEDIR}" ${staging_patchsets[*]} | |||
fi | |||
cp -r ${WINEROOT}/../../../wine_custom_patches/* "${WINEDIR_PATCHES}/" | |||
if [[ $(find "${WINEDIR_PATCHES}" -mindepth 1 -maxdepth 1 -regex ".*\.\(patch\|diff\)$") ]]; then | |||
cd "${WINEDIR}" | |||
for i in "${WINEDIR_PATCHES}"/*.patch; do | |||
patch -Np1 < $i | |||
done | |||
fi | |||
} | |||
######################################################## | |||
# 64-bit build | |||
function wine64Build() { | |||
cd "${WINEDIR_BUILD_64}" | |||
"${WINEDIR}"/configure \ | |||
--with-x \ | |||
--with-gstreamer \ | |||
--enable-win64 \ | |||
--with-xattr \ | |||
--disable-mscoree \ | |||
--with-vulkan \ | |||
--prefix=/usr \ | |||
--libdir=/usr/lib/x86_64-linux-gnu/ | |||
make -j$(nproc --ignore 1) | |||
make -j$(nproc --ignore 1) prefix="${WINEDIR_INSTALL_64}/usr" \ | |||
libdir="${WINEDIR_INSTALL_64}/usr/lib/x86_64-linux-gnu/" \ | |||
dlldir="${WINEDIR_INSTALL_64}/usr/lib/x86_64-linux-gnu/wine" install | |||
} | |||
# 32-bit build | |||
function wine32Build() { | |||
# Gstreamer amd64 & i386 dev packages conflict on Ubuntu | |||
cd "${WINEDIR_BUILD_32}" | |||
"${WINEDIR}"/configure \ | |||
--with-x \ | |||
--with-gstreamer \ | |||
--with-xattr \ | |||
--disable-mscoree \ | |||
--with-vulkan \ | |||
--without-gstreamer \ | |||
--libdir=/usr/lib/i386-linux-gnu/ \ | |||
--with-wine64="${WINEDIR_BUILD_64}" \ | |||
--prefix=/usr | |||
make -j$(nproc --ignore 1) | |||
make -j$(nproc --ignore 1) prefix="${WINEDIR_INSTALL_32}/usr" \ | |||
libdir="${WINEDIR_INSTALL_32}/usr/lib/i386-linux-gnu/" \ | |||
dlldir="${WINEDIR_INSTALL_32}/usr/lib/i386-linux-gnu/wine" install | |||
} | |||
######################################################## | |||
function mergeWineBuilds() { | |||
cp -r "${WINEDIR_INSTALL_64}"/* "${WINEDIR_PACKAGE}"/ | |||
cp -r "${WINEDIR_INSTALL_32}"/usr/bin/{wine,wine-preloader} "${WINEDIR_PACKAGE}"/usr/bin/ | |||
cp -r "${WINEDIR_INSTALL_32}"/usr/lib/* "${WINEDIR_PACKAGE}"/usr/lib/ | |||
} | |||
function buildDebianArchive() { | |||
cd "${WINEROOT}" | |||
mv "${WINEDIR_PACKAGE}" "${WINEROOT}/${PKGNAME}-${wine_version}" | |||
cd "${WINEROOT}/${PKGNAME}-${wine_version}" | |||
dh_make --createorig -s -y | |||
rm debian/*.{ex,EX} | |||
printf "usr/* /usr" > debian/install | |||
cat << 'DEBIANCONTROL' > debian/control | |||
Source: | |||
Section: otherosfs | |||
Priority: optional | |||
Maintainer: | |||
Build-Depends: | |||
Standards-Version: 4.1.2 | |||
Homepage: https://www.winehq.org | |||
Package: | |||
Architecture: any | |||
Depends: | |||
Suggests: | |||
Conflicts: | |||
Breaks: | |||
Replaces: | |||
Provides: | |||
Description: A compatibility layer for running Windows programs. | |||
Wine is an open source Microsoft Windows API implementation for | |||
POSIX-compliant operating systems, including Linux. | |||
Git version includes the latest updates available for Wine. | |||
DEBIANCONTROL | |||
feedControlfile | |||
DEB_BUILD_OPTIONS="strip nodocs noddebs" dpkg-buildpackage -b -us -uc | |||
} | |||
function installDebianArchive() { | |||
cd "${WINEROOT}" | |||
# TODO Although the package name ends with 'amd64', this contains both 32 and 64 bit Wine versions | |||
echo -e "\nInstalling Wine.\n" # Please provide your sudo password. | |||
sudo dpkg -i ${PKGNAME}_${wine_version}-1_amd64.deb | |||
} | |||
function storeDebianArchive() { | |||
cd "${WINEROOT}" | |||
mv ${PKGNAME}_${wine_version}-1_amd64.deb ../../compiled_deb/"${datedir}" && \ | |||
echo -e "Compiled ${PKGNAME} is stored at '$(readlink -f ../../compiled_deb/"${datedir}")/'\n" | |||
rm -rf winebuild_${datedir} | |||
} | |||
function clearTree() { | |||
rm -rf "${WINEROOT}" | |||
} | |||
######################################################## | |||
# Get Wine (& Wine-Staging) sources | |||
getWine | |||
# Install Wine dependencies | |||
WineDeps "${wine_deps_build[*]}" "Wine build time" | |||
WineDeps "${wine_deps_runtime[*]}" "Wine runtime" | |||
# Refresh & sync Wine (+ Wine Staging) git sources | |||
refreshWineGIT | |||
# Update Wine source files | |||
patchWineSource | |||
# Get Wine/Wine Staging version | |||
getWineVersion | |||
# Compile 64 & 32 bit Wine/Wine Staging | |||
wine64Build | |||
wine32Build | |||
# Bundle compiled Wine-Staging files | |||
mergeWineBuilds | |||
# Bundle and install Debian deb archive | |||
buildDebianArchive | |||
if [[ ! -v NO_INSTALL ]]; then | |||
installDebianArchive | |||
fi | |||
storeDebianArchive | |||
# Clear all temporary files | |||
clearTree | |||
@ -0,0 +1,182 @@ | |||
# Uninstall Wine-Staging, DXVK, meson & glslang buildtime deps on Debian | |||
# Copyright (C) 2018 Pekka Helenius | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 3 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <https://www.gnu.org/licenses/>. | |||
############################################################################## | |||
meson_deps=( | |||
'dh-python' | |||
'python3-setuptools' | |||
'ninja-build' | |||
) | |||
#glslang_deps=( | |||
# Nothing to remove actually, just python2.7 which is likely required by other packages | |||
#) | |||
wine_deps=( | |||
'libxi-dev:amd64' | |||
'libxt-dev:amd64' | |||
'libxmu-dev:amd64' | |||
'libx11-dev:amd64' | |||
'libxext-dev:amd64' | |||
'libxfixes-dev:amd64' | |||
'libxrandr-dev:amd64' | |||
'libxcursor-dev:amd64' | |||
'libxrender-dev:amd64' | |||
'libxkbfile-dev:amd64' | |||
'libxxf86vm-dev:amd64' | |||
'libxxf86dga-dev:amd64' | |||
'libxinerama-dev:amd64' | |||
'libgl1-mesa-dev:amd64' | |||
'libglu1-mesa-dev:amd64' | |||
'libxcomposite-dev:amd64' | |||
'libpng-dev:amd64' | |||
'libssl-dev:amd64' | |||
'libv4l-dev:amd64' | |||
'libxml2-dev:amd64' | |||
'libgsm1-dev:amd64' | |||
'libjpeg-dev:amd64' | |||
'libkrb5-dev:amd64' | |||
'libtiff-dev:amd64' | |||
'libsane-dev:amd64' | |||
'libudev-dev:amd64' | |||
'libpulse-dev:amd64' | |||
'liblcms2-dev:amd64' | |||
'libldap2-dev:amd64' | |||
'libxslt1-dev:amd64' | |||
'unixodbc-dev:amd64' | |||
'libcups2-dev:amd64' | |||
'libcapi20-dev:amd64' | |||
'libopenal-dev:amd64' | |||
'libdbus-1-dev:amd64' | |||
'freeglut3-dev:amd64' | |||
'libmpg123-dev:amd64' | |||
'libasound2-dev:amd64' | |||
'libgphoto2-dev:amd64' | |||
'libosmesa6-dev:amd64' | |||
'libpcap0.8-dev:amd64' | |||
'libgnutls28-dev:amd64' | |||
'libncurses5-dev:amd64' | |||
'libgettextpo-dev:amd64' | |||
'libfreetype6-dev:amd64' | |||
'libfontconfig1-dev:amd64' | |||
'libgstreamer-plugins-base1.0-dev:amd64' | |||
'ocl-icd-opencl-dev:amd64' | |||
'libvulkan-dev:amd64' | |||
'libxi-dev:i386' | |||
'libxt-dev:i386' | |||
'libxmu-dev:i386' | |||
'libx11-dev:i386' | |||
'libxext-dev:i386' | |||
'libxfixes-dev:i386' | |||
'libxrandr-dev:i386' | |||
'libxcursor-dev:i386' | |||
'libxrender-dev:i386' | |||
'libxkbfile-dev:i386' | |||
'libxxf86vm-dev:i386' | |||
'libxxf86dga-dev:i386' | |||
'libxinerama-dev:i386' | |||
'libgl1-mesa-dev:i386' | |||
'libglu1-mesa-dev:i386' | |||
'libxcomposite-dev:i386' | |||
'libpng-dev:i386' | |||
'libssl-dev:i386' | |||
'libv4l-dev:i386' | |||
'libgsm1-dev:i386' | |||
'libjpeg-dev:i386' | |||
'libkrb5-dev:i386' | |||
'libsane-dev:i386' | |||
'libudev-dev:i386' | |||
'libpulse-dev:i386' | |||
'liblcms2-dev:i386' | |||
'libldap2-dev:i386' | |||
'unixodbc-dev:i386' | |||
'libcapi20-dev:i386' | |||
'libopenal-dev:i386' | |||
'libdbus-1-dev:i386' | |||
'freeglut3-dev:i386' | |||
'libmpg123-dev:i386' | |||
'libasound2-dev:i386' | |||
'libgphoto2-dev:i386' | |||
'libosmesa6-dev:i386' | |||
'libpcap0.8-dev:i386' | |||
'libncurses5-dev:i386' | |||
'libgettextpo-dev:i386' | |||
'libfreetype6-dev:i386' | |||
'libfontconfig1-dev:i386' | |||
'ocl-icd-opencl-dev:i386' | |||
'libvulkan-dev:i386' | |||
) | |||
dxvk_deps=( | |||
'meson' | |||
'glslang' | |||
'gcc-mingw-w64-x86-64' | |||
'gcc-mingw-w64-i686' | |||
'g++-mingw-w64-x86-64' | |||
'g++-mingw-w64-i686' | |||
'mingw-w64-x86-64-dev' | |||
'mingw-w64-i686-dev' | |||
) | |||
wine_deps_noremove=( | |||
'gcc-multilib' | |||
'g++-multilib' | |||
'libxml-simple-perl' | |||
'libxml-parser-perl' | |||
'libxml-libxml-perl' | |||
'lzma' | |||
'flex' | |||
'bison' | |||
'quilt' | |||
'gettext' | |||
'oss4-dev' | |||
'sharutils' | |||
'pkg-config' | |||
'dctrl-tools' | |||
'khronos-api' | |||
'unicode-data' | |||
'freebsd-glue' | |||
'icoutils' | |||
'librsvg2-bin' | |||
'imagemagick' | |||
'fontforge' | |||
) | |||
core_deps_noremove=( | |||
'make' 'cmake' 'gcc' 'git' 'build-essential' 'fakeroot' | |||
) | |||
removals_name=('Meson' 'Wine Staging' 'DXVK') | |||
removals=('${meson_deps[*]}' '${wine_deps[*]}' '${dxvk_deps[*]}') | |||
i=0 | |||
for k in ${removals[*]}; do | |||
echo -e "\nRemoving ${removals_name[$i]} buildtime dependencies\n" | |||
sudo apt-get purge --remove $(eval echo ${k}) | |||
let i++ | |||
done | |||
echo -e "\nThe following Wine Staging buildtime dependencies were not removed:\n$(for o in ${wine_deps_noremove[*]}; do echo ${o}; done)\n" | |||
echo -e "\nThe following core buildtime dependencies were not removed:\n$(for o in ${core_deps_noremove[*]}; do echo ${o}; done)\n" | |||
read -r -p "Auto remove packages which are no longer needed? [Y/n] " question | |||
if [[ $(echo $question | sed 's/ //g') =~ ^([yY][eE][sS]|[yY])$ ]]; then | |||
sudo apt-get purge --autoremove | |||
fi | |||
@ -0,0 +1,4 @@ | |||
Put your custom Wine patches here. | |||
Valid file suffix formats are: .diff and .patch | |||
These patches are applied during Wine + Wine Staging compilation |