#!/usr/bin/env bash set -euo pipefail usage() { echo "Usage: $0 [-r] [build-directory [install-prefix]]" echo "Build and install locally as a user, or system wide as root." echo " -r Remove the installed helper instead of building." echo " -h Show this help." } removeInstalled=false while getopts ':rh' option; do case "$option" in r) removeInstalled=true ;; h) usage; exit 0 ;; *) usage >&2; exit 2 ;; esac done shift "$((OPTIND - 1))" if (( $# > 2 )); then usage >&2 exit 2 fi projectDir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) buildDir=${1:-"$projectDir/build"} systemPrefix=/usr if (( EUID == 0 )); then defaultPrefix=$systemPrefix else defaultPrefix="${HOME}/.local" fi prefix=${2:-"$defaultPrefix"} installDir="${prefix%/}/libexec/wine-access" installedFiles=(wine-access.exe wine-access.exe.so wine-access-menu.dll wine-access-menu32.dll wine-access-menu-host32.exe) has_installation() { local candidateDir=$1 local installedFile for installedFile in "${installedFiles[@]}"; do if [[ -e "$candidateDir/$installedFile" || -L "$candidateDir/$installedFile" ]]; then return 0 fi done return 1 } if "$removeInstalled"; then if has_installation "$installDir"; then for installedFile in "${installedFiles[@]}"; do rm -f -- "$installDir/$installedFile" done echo "Removed Wine Access from $installDir" elif (( EUID != 0 && $# < 2 )) && has_installation "$systemPrefix/libexec/wine-access"; then echo "Only a system-wide installation was found. Run: sudo ./build.sh -r" >&2 exit 1 else echo "No Wine Access installation found in $installDir" fi exit 0 fi check_prerequisites() { local requirement tool package local -a missingRequirements=() missingPackages=() local -A seenPackages=() local -a requirements=( cmake:cmake make:make gcc:gcc g++:gcc pkg-config:pkgconf winegcc:wine wineg++:wine widl:wine x86_64-w64-mingw32-gcc:mingw-w64-gcc i686-w64-mingw32-gcc:mingw-w64-gcc ) for requirement in "${requirements[@]}"; do tool=${requirement%%:*} package=${requirement#*:} if ! command -v "$tool" >/dev/null 2>&1; then missingRequirements+=("$tool (Arch Linux package: $package)") if [[ ! -v "seenPackages[$package]" ]]; then missingPackages+=("$package") seenPackages[$package]=1 fi fi done if command -v pkg-config >/dev/null 2>&1 && ! pkg-config --exists gio-2.0; then missingRequirements+=("GIO development files, gio-2.0 (Arch Linux package: glib2)") missingPackages+=(glib2) fi if (( ${#missingRequirements[@]} > 0 )); then echo "Missing build prerequisites:" >&2 for requirement in "${missingRequirements[@]}"; do echo " $requirement" >&2 done if ! command -v pkg-config >/dev/null 2>&1; then echo "GIO development files cannot be checked until pkg-config is available." >&2 fi echo "On Arch Linux: sudo pacman -S --needed ${missingPackages[*]}" >&2 echo "On other distributions, install the equivalent development packages." >&2 return 1 fi } check_prerequisites cmake \ -S "$projectDir" \ -B "$buildDir" \ -DCMAKE_BUILD_TYPE=RelWithDebInfo \ -DCMAKE_TOOLCHAIN_FILE="$projectDir/winelib-toolchain.cmake" \ -DCMAKE_INSTALL_PREFIX="$prefix" \ -DCMAKE_INSTALL_LIBEXECDIR:PATH=libexec \ -DWINE_ACCESS_INSTALL_DIR:PATH=libexec/wine-access cmake --build "$buildDir" --parallel cmake --install "$buildDir"