Automate installation of DXVK, D9VK + Wine/Wine Staging & update GPU drivers + PlayonLinux wineprefixes (Debian/Ubuntu/Mint/Arch Linux/Manjaro)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

313 lines
7.9 KiB

#!/bin/env bash
# Winetricks package builder for Debian
# Copyright (C) 2019 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 if we're using bash or sh to run the script. If bash, OK.
# If another one, ask user to run the script with bash.
BASH_CHECK=$(ps | grep `echo $$` | awk '{ print $4 }')
if [ $BASH_CHECK != "bash" ]; then
echo "
Please run this script using bash (/usr/bin/bash).
"
exit 1
fi
########################################################
# Just a title & author for this script, used in initialization
SCRIPT_TITLE="\e[1mWinetricks package builder & installer\e[0m"
SCRIPT_AUTHOR="Pekka Helenius (~Fincer), 2019"
########################################################
pkgname="winetricks"
pkgsrc="https://github.com/Winetricks/winetricks"
pkgurl="https://winetricks.org"
# TODO Do not require wine as a hard dependency since
# it may break things. Wine is practically required, though.
#
pkgdeps_runtime=('cabextract' 'unzip' 'x11-utils') # 'wine'
########################################################
WORKDIR="${PWD}"
###########################
# DO NOT CHANGE THIS if you intend to use this shell
# script as a part updatewine.sh shell script!
BUILD_MAINDIR="${WORKDIR}/debian/winetricks-git"
########################################################
echo -e "\n${SCRIPT_TITLE}\n"
########################################################
# If the script is interrupted (Ctrl+C/SIGINT), do the following
function Winetricks_intCleanup() {
rm -rf ${BUILD_MAINDIR}
exit 0
}
# Allow interruption of the script at any time (Ctrl + C)
trap "Winetricks_intCleanup" INT
###########################################################
COMMANDS=(
apt
dpkg
git
grep
sudo
wc
)
function checkCommands() {
if [[ $(which --help 2>/dev/null) ]] && [[ $(echo --help 2>/dev/null) ]]; then
local a=0
for command in ${@}; do
if [[ ! $(which $command 2>/dev/null) ]]; then
local COMMANDS_NOTFOUND[$a]=${command}
let a++
fi
done
if [[ -n $COMMANDS_NOTFOUND ]]; then
echo -e "\nError! The following commands could not be found: ${COMMANDS_NOTFOUND[*]}\nAborting\n"
exit 1
fi
else
exit 1
fi
}
checkCommands "${COMMANDS[*]}"
########################################################
function runtimeCheck() {
# Runtime package names to check on Debian
local known_pkgs=${1}
##########################
# This array applies only if wine is defined
# as a runtime dependency for Winetricks
#
# 'dpkg -s' check is quite primitive,
# do this additional check for Wine
local known_wines=(
'wine'
'wine-stable'
'wine32'
'wine64'
'libwine:amd64'
'libwine:i386'
'wine-git'
'wine-staging-git'
)
##########################
# Check if these packages are present on the system
i=0
for pkg in ${known_pkgs[@]}; do
if [[ $(echo $(dpkg -s ${pkg} &>/dev/null)$?) -ne 0 ]]; then
local pkglist[$i]=${pkg}
let i++
fi
done
# This loop applies only if wine is defined
# as a runtime dependency for Winetricks
#
# If known wine is found, drop 'wine' from pkglist array
for winepkg in ${known_wines[@]}; do
if [[ $(echo $(dpkg -s ${winepkg} &>/dev/null)$?) -eq 0 ]]; then
pkglist=( "${pkglist[@]/wine}" )
fi
done
if [[ -n ${pkglist[*]} ]]; then
echo -e "\e[1mWARNING:\e[0m Not installing Winetricks because the following runtime dependencies are missing:\n\n$(for l in ${pkglist[*]}; do echo ${l}; done)\n\n\
These should be installed in order to use Winetricks. Just compiling Winetricks for later use.\n"
# Force --no-install switch
NO_INSTALL=
fi
}
########################################################
function winetricks_prepare() {
# Define package folder path and create it
# Clone package source from 'pkgurl'
pkgdir="${BUILD_MAINDIR}/${pkgname}"
mkdir -p ${pkgdir} && \
git clone ${pkgsrc} "${pkgdir}"
if [[ $? -ne 0 ]]; then
echo -e "Error while downloading source of ${pkgname} package. Aborting\n"
exit 1
fi
# Parse package version field
function pkgver() {
cd "${pkgdir}"
git describe --long | sed 's/\-[^0-9].*//; s/\-/\./g'
if [[ $? -ne 0 ]]; then
echo -e "Error while parsing ${pkgname} version field. Aborting\n"
exit 1
fi
}
# Define package version field variable 'pkgver'
pkgver=$(pkgver)
# Rename the source folder to meet the standards of Debian builder
cd "${BUILD_MAINDIR}" && \
mv "${pkgname}" "${pkgname}-${pkgver}"
# Source folder which is used now, just added version string suffix
pkgdir="${BUILD_MAINDIR}/${pkgname}-${pkgver}"
}
########################################################
function coredeps_check() {
# Universal core build time dependencies for package compilation
_coredeps=('dh-make' 'make' 'gcc' 'build-essential' 'fakeroot')
local i=0
for coredep in ${_coredeps[@]}; do
if [[ $(echo $(dpkg -s ${coredep} &>/dev/null)$?) -ne 0 ]]; then
echo -e "Installing core dependency ${coredep}.\n"
buildpkglist[$i]=${coredep}
sudo apt install -y ${coredep}
if [[ $? -ne 0 ]]; then
echo -e "Could not install ${coredep}. Aborting.\n"
exit 1
fi
let i++
fi
done
}
########################################################
function feed_debiancontrol() {
cat << CONTROLFILE > "${pkgdir}/debian/control"
Source: ${pkgname}
Section: unknown
Priority: optional
Maintainer: ${USER} <${USER}@unknown>
Build-Depends: debhelper (>= 9)
Standards-Version: 3.9.8
Homepage: ${pkgurl}
Package: ${pkgname}
Architecture: all
Depends: $(echo "${pkgdeps_runtime[*]}" | sed 's/\s/, /g')
Suggests: wine
Description: Script to install various redistributable runtime libraries in Wine.
CONTROLFILE
}
########################################################
function winetricks_debianbuild() {
cd "${pkgdir}"
# Delete existing debian folder
rm -rf debian
# Create debian subdirectory
dh_make --createorig -s -y -c lgpl
# Update debian/control file
feed_debiancontrol
# Skip tests while executing deb builder
printf 'override_dh_auto_test:' | tee -a debian/rules
# Remove irrelevant sample files
rm -rf debian/*.{ex,EX}
# Start deb builder. Do not build either debug symbols or doc files
DEB_BUILD_OPTIONS="strip nodocs noddebs" dpkg-buildpackage -rfakeroot -b -us -uc
if [[ $? -ne 0 ]]; then
echo -e "Error while compiling ${pkgname}. Check messages above. Aborting\n"
exit 1
fi
# Once compiled, possibly install and store the compiled deb archive
if [[ $? -eq 0 ]]; then
if [[ ! -v NO_INSTALL ]]; then
sudo dpkg -i ../${pkgname}*.deb
fi
mv ../${pkgname}*.deb "${WORKDIR}"/ && \
cd "${WORKDIR}"
rm -rf "${BUILD_MAINDIR}"
else
exit 1
fi
}
########################################################
runtimeCheck "${pkgdeps_runtime[*]}"
winetricks_prepare
# If we run this script via debian/updatewine_debian.sh, this check is already done there
coredeps_check
winetricks_debianbuild
########################################################
# Build time dependencies which were installed but no longer needed
if [[ -v buildpkglist ]]; then
echo -e "The following build time dependencies were installed and no longer needed:\n\n$(for l in ${buildpkglist[*]}; do echo ${l}; done)\n"
fi