#!/bin/sh # Copyright (C) 2020-2023 Francois Gouget # # Installs the packages needed for Wine development. # # 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 2 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 . name0=`basename "$0"` error() { echo "$name0:error:" "$@" >&2 } warning() { echo "$name0:warning:" "$@" >&2 } dry_run() { local rc echo "$@" # This assumes that the command does not need quoting [ -n "$opt_cmd_log" ] && echo "$@" >>"$opt_cmd_log" [ "$opt_dry_run" = "1" ] && return 0 "$@" rc=$? [ $rc -ne 0 ] && echo "$1 -> rc=$rc" return $rc } ##### # # Generic helpers # ##### pkginstall="" pkgbroken="" pkgmissing="" pkgworkaround="" wt_get_bad_pkgs() { local pkgre="$1" echo "$pkgbroken $pkgmissing" | tr ' ' '\n' | sort -u | grep -E "^$pkgre" | tr '\n' ' ' } wt_remove_bad_pkg() { local pkg="$1" pkgbroken=`echo "$pkgbroken " | sed -e "s/ $pkg / /g"` pkgmissing=`echo "$pkgmissing " | sed -e "s/ $pkg / /g"` } wt_explain_bad_pkgs() { local pkg local rc=1 for pkg in $* do if echo " $pkgmissing $pkgbroken " | grep -q " $pkg " then wt_remove_bad_pkg "$pkg" rc=0 fi done return $rc } wt_pretty_list() { echo "$@" | tr ' ' '\n' | sort -u | tr '\n' ' ' | sed -e 's/^ //' -e 's/ $//' } wt_libdirs="" wt_create_so_warn=1 # wt_create_so # # Creates the .so symlink pointing to the .so. library. # If is omitted it is assumed to be identical to . # wt_create_so() also handles cases where the library is in /lib* rather than # /usr/lib*. # # Returns 0 if the symlink was already present, 1 if it was successfully # created, 2 if it could not be created. wt_create_so() { local libdir rc sover usrlibdir local sodev="$1" local solib="$2" [ -n "$solib" ] || solib="$sodev" if [ -z "$wt_libdirs" ] then error "the per-distribution code must set \$wt_libdirs" exit 1 fi rc=0 for libdir in $wt_libdirs do usrlibdir="/usr$libdir" if [ ! -f "$usrlibdir/$sodev.so" ] then sover=`cd "$usrlibdir" 2>/dev/null && ls "$solib.so".[0-9]* 2>/dev/null | head -n1` if [ ! -f "$usrlibdir/$sover" ] then # We want the full path in this case sover=`ls "$libdir/$solib.so".[0-9]* 2>/dev/null | head -n1` [ -f "$sover" ] || sover="" fi if [ -z "$sover" ] then error "could not find the ...$libdir/$sodev.so symlink target" rc=2 # Use -f because $sodev.so may be a broken symlink elif ! dry_run ln -s -f "$sover" "$usrlibdir/$sodev.so" then error "could not create the ...$libdir/$sodev.so symlink" rc=2 elif [ $rc -eq 0 ] then rc=1 fi fi done if [ $rc -eq 2 -a -n "$wt_create_so_warn" ] then wt_create_so_warn= warning "The symlink creation will fail if the non-dev package is not installed." [ "$opt_dry_run" = "1" ] && warning "This is particularly likely with --dry-run." fi return $rc } # wt_create_sos ... # # Create the development library symlinks in the ... list using # wt_create_so(). If they all succeeded, remove the packages matching the # regular expression from the broken and missing packages lists. wt_create_sos() { local bad_pkgs lib success local pkgre="$1" shift fixed="" for lib in "$@" do wt_create_so "$lib" # Only mark a package as fixed if no error occurred and at least one # symlink was provided (if no symlink was provided the package is # presumably bad for other reasons). rc=$? [ $rc -eq 2 ] && fixed=0 [ $rc -eq 1 -a -z "$fixed" ] && fixed=1 done if [ "$fixed" = "1" ] then bad_pkgs=`wt_get_bad_pkgs "$pkgre"` for pkg in $bad_pkgs do wt_remove_bad_pkg "$pkg" done pkgworkaround="$pkgworkaround $bad_pkgs" fi } ##### # # Debian # ##### # # Debian: Package helpers # # apt_check # # Checks that the information about matches the specified . # With the 'show' this can be used to verify that the package actually # exists, has the expected version, etc. apt_check() { local action="$1" local pkg="$2" shift 2 [ "$action" = "show" ] && action="show --no-all-versions" LANG= apt-cache $action "$pkg" 2>/dev/null | grep -E -q "$@" } # apt_addsection
# # Checks if the package is available and returns immediately if it # is. Otherwise asks whether
should be added to the apt sources. # If --yes was given or the user agrees the section is added but # 'apt-get update' is not called. # # Returns 0 if a section was added, non-zero otherwise. apt_addsection() { local a pkg local landmark="$1" local section="$2" local packages="$3" # Can the section even be added? command -v apt-add-repository >/dev/null 2>&1 || return 1 # Does it need to be added? pkg=`echo "$landmark" | sed -e "s/:.*//g"` apt_check show "$landmark" "Package: $pkg" && return 1 echo echo "********************" echo echo "The $section section is needed for $packages." echo echo -n "Do you want to add it? [Y/n] " if [ -n "$opt_yes" ] then echo "yes" a="y" else read a fi [ -z "$a" -o "$a" = "y" -o "$a" = "Y" ] || return 1 dry_run apt-add-repository "$section" } # apt_pkg [--test] ... # # If exists, schedule it for installation and return success. # Otherwise try again with the next package in the list. # # If none of the packages exist and --test was not specified, add them all # to the missing packages list and return failure. apt_pkg() { local pkg pkgarch local test= if [ "$1" = "--test" ] then test=1 shift fi echo -n "Checking $*..." for pkgarch in $* do pkg=`echo "$pkgarch" | sed -e "s/:.*//g"` if apt_check show "$pkgarch" "Package: $pkg" then echo " yes" pkginstall="$pkginstall $pkgarch" return 0 fi done echo " missing" [ -z "$test" ] && pkgmissing="$pkgmissing "`echo "$@" | sed -e 's/ /|/g'` return 1 } # apt_is_installed ... # # Returns success if the specified packages are all installed. apt_is_installed() { dpkg -l "$@" >/dev/null 2>&1 } # apt_multi [--test|--if-0 |--if-not-0 ] ... # # Schedules installation of both the 32- and 64-bit versions of the package # if possible. Otherwise installs the 64-bit version and marks the 32-bit one # as broken. # # Specifically, if --if-0 (resp. --if-not-0) is specified and is not 0 # (resp. is 0), assume the package does not support multiarch. # # If exists: # - If it supports multiarch schedule the installation of both 32- and 64-bit # versions and return 0 (success). # - If it is architecture neutral schedule installation and return success. # - Otherwise schedule installation of the 64-bit package, mark the 32-bit # version as broken and return 1 (failure). # # If does not exist, try again with the next package in the list. # If none of the packages exists and --test was not specified, add them all # to the missing packages list and return 2 (failure). apt_multi() { local pkg local test= local not_multi= if [ "$1" = "--test" ] then test=1 shift elif [ "$1" = "--if-0" ] then [ "$2" = "0" ] || not_multi=1 shift 2 elif [ "$1" = "--if-not-0" ] then [ "$2" != "0" ] || not_multi=1 shift 2 fi for pkg in $* do echo -n "Checking multiarch $pkg..." if [ -z "$not_multi" ] && # Check that both architectures are present apt_check show "$pkg:amd64" "Multi-Arch: same" && apt_check show "$pkg:i386" "Multi-Arch: same" then echo " i386 amd64" pkginstall="$pkginstall $pkg:i386 $pkg:amd64" return 0 elif apt_check show "$pkg" "Architecture: all" then echo " all" pkginstall="$pkginstall $pkg" return 0 elif apt_check show "$pkg" "Package: $pkg" then echo " broken" pkginstall="$pkginstall $pkg" [ -z "$test" ] && pkgbroken="$pkgbroken $pkg:i386" return 1 fi echo " missing" done [ -z "$test" ] && pkgmissing="$pkgmissing "`echo "$@" | sed -e 's/ /|/g'` return 2 } # apt_blacklist # # This is meant to deal with cases where multiarch support in is # broken by the package in a hard to detect way. # # Checks the version of the package and if it matches the # regular expression, installs the native package and the 32-bit # package and returns failure. # Otherwise invokes apt_multi() on || and returns success. apt_blacklist() { local canary="$1" local versionre="$2" local pkgdev="$3" local pkglibs="$4" if apt_check show "$canary" "Version: $versionre" then warning "Bad version for $canary, not using multiarch for $pkgdev" apt_pkg "$pkgdev" apt_pkg "$pkglibs:i386" pkgbroken="$pkgbroken $pkgdev:i386" return 1 fi apt_multi "$pkgdev" || apt_multi "$pkglibs" return 0 } apt_install() { if [ -z "$opt_dry_run" ] then echo -n "Waiting for the dpkg lock" while fuser /var/lib/dpkg/lock /var/lib/dpkg/lock-frontend \ /var/run/unattended-upgrades.lock >/dev/null 2>&1 do echo -n "." sleep 1 done echo " done" fi dry_run apt-get install $opt_yes `wt_pretty_list "$pkginstall"` || exit 1 echo } # apt_dev_workaround # # For some packages we need more than just the links created by wt_create_sos. # For those apt_dev_workaround manually extracts the package files and copies # the architecture-specific headers, pkg-config files, and libraries. apt_dev_workaround() { local pkg="$1" local dir file mkdir pkgextract cd pkgextract apt-get download "$pkg:i386" dpkg -x "$pkg"*.deb . find usr/lib/i386-linux-gnu/ \( -type f -o -type l \) | \ while read file do dir=$(dirname "/$file") [ -d "$dir" ] || dry_run mkdir -p "$dir" || exit 1 dry_run mv "$file" "/$file" || exit 1 done rc=$? cd .. rm -rf pkgextract if [ $rc -eq 0 ] then wt_remove_bad_pkg "$pkg:i386" fi return $rc } # # Debian: Base Wine dependencies # apt_init() { if [ `dpkg --print-architecture` != "amd64" ] then error "expected a 64-bit Debian distribution" exit 1 fi if [ "$opt_packages" = "1" ] then dry_run dpkg --add-architecture i386 dry_run apt-get update fi wt_libdirs="/lib/i386-linux-gnu /lib/x86_64-linux-gnu" } apt_wine() { local ver # Tools apt_pkg bison apt_pkg flex apt_pkg gcc apt_pkg gcc-mingw-w64 apt_pkg gcc-multilib apt_pkg gettext apt_pkg git # Pop! OS 22.04 managed to break multiarch support in libc6-dev!!! LANG= apt-get install --dry-run linux-libc-dev:i386 linux-libc-dev:amd64 >"$TMPDIR/$name0.$$" 2>&1 if [ $? -ne 0 ] then ver=`sed -e 's/^.*but \(5\..*\) is to be installed$/\1/' -e t -e d "$TMPDIR/$name0.$$" | head -n 1` warning "Force installing version $ver of linux-libc-dev" pkginstall="$pkginstall --allow-downgrades linux-libc-dev:i386=$ver linux-libc-dev:amd64=$ver" fi rm "$TMPDIR/$name0.$$" apt_multi libasound2-dev apt_multi libcapi20-dev apt_multi libdbus-1-dev apt_multi libfaudio-dev # Not used since Wine d8be85863fed (2021-10-21) # The FontConfig development package can only be installed if the FreeType # one supports multiarch apt_multi libfreetype6 apt_multi libfreetype-dev libfreetype6-dev apt_multi --if-0 $? libfontconfig-dev libfontconfig1-dev || apt_multi libfontconfig1 apt_multi libegl-dev apt_multi libgl-dev libgl1-mesa-dev apt_multi libglu1-mesa-dev # Not used since Wine ec55b1c271ae (2020-11-12) # The GPhoto2 development package can only be installed if the Exif # one supports multiarch apt_multi --test libexif-dev apt_multi --if-0 $? libgphoto2-dev || apt_multi libgphoto2-6 apt_multi libgsm1-dev # Not used since Wine 0e7fd41af953 (2021-10-20) # The GnuTLS development package can only be installed if the idn2 one # one supports multiarch apt_multi --test libidn2-dev libidn2-0-dev apt_multi --if-0 $? libgnutls28-dev || apt_multi libgnutls30 apt_multi libjpeg62-turbo-dev libjpeg-turbo8-dev # Not used since Wine a6ac035a7454 (2021-10-19) apt_multi libjxr-dev # Not used since Wine eb0180e7b4df (2021-10-21) if grep -i ubuntu /etc/os-release >/dev/null then # krb5-multidev multiarch support is broken on Ubuntu, # including for version 1.20.1-2. apt_blacklist krb5-multidev "(1.19.2-.ubuntu|1.20-.ubuntu|1.20.1-[123])" libkrb5-dev libkrb5-3 else # krb5-multidev multiarch support works on Debian, # including for version 1.20.1-2. apt_multi libkrb5-dev fi apt_multi liblcms2-dev # Not used since Wine 5c4c272a2606 (2021-10-19) apt_multi libldap-dev libldap2-dev apt_multi libmpg123-dev # Not used since Wine 5329da61ac51 (2021-10-21) apt_multi libncurses-dev libncurses5-dev # Not used since Wine 26c715f85b49 (2020-09-22) # The GStreamer development package can only be installed if the liborc # one supports multiarch apt_multi --test liborc-0.4-dev apt_multi --if-0 $? libgstreamer-plugins-base1.0-dev if [ $? -ne 0 ] then apt_multi libgstreamer-plugins-base1.0-0 apt_multi libgstreamer1.0-dev fi apt_multi libopenal-dev apt_multi libosmesa6-dev apt_multi libpcap0.8-dev || apt_multi libpcap0.8 # On Debian Testing this version has a conflicting man page (bug 1064636) apt_blacklist libpcsclite-dev 2.0.1-1.b1 libpcsclite-dev libpcsclite1 apt_multi libpng-dev libpng12-dev # Not used since Wine c3d8a29a0499 (2021-10-18) # The PulseAudio development package can only be installed if the Glib2 # one supports multiarch apt_multi --test libglib2.0-dev apt_multi --if-0 $? libpulse-dev || apt_multi libpulse0 # On Debian 9 libsane-dev claims to support multiarch but is broken apt_blacklist libsane-dev 1.0.25-4.1 libsane-dev libsane apt_pkg libsasl2-dev # One arch is sufficient for Wine # On Ubuntu 18.04 libsdl2-dev depends on libmirclient-dev which breaks # without warning in a multiarch configuration! apt_blacklist libmirclient-dev 0.31.1-0ubuntu1 libsdl2-dev libsdl2-2.0-0 # The CUPS development package can only be installed if the libtiff and # libcupsimage ones support multiarch rc=0 apt_multi libtiff-dev libtiff5-dev || rc=1 # Not used since Wine d36615ee5232 (2021-10-19) apt_multi --test libcupsimage2-dev libcupsimage-dev || rc=1 apt_multi --if-0 $rc libcups2-dev || apt_multi libcups2 apt_multi libudev-dev apt_pkg libunwind-dev # Wine only needs the 64-bit library apt_multi libusb-1.0-0-dev apt_multi libv4l-dev # vkd3d is not used since Wine 24432a24d5e9 (2022-03-03) # Before 1.2 vkd3d is missing libvkd3d-shader1 which is required for Wine. if apt_pkg libvkd3d-shader1 then # Multiarch support is broken in early versions (see bug 983776) apt_blacklist libvkd3d-dev '1.2-[1-5]$' libvkd3d-dev libvkd3d1 fi apt_multi libvulkan-dev apt_multi libwayland-dev apt_multi libx11-dev apt_multi libxcb1-dev apt_multi libxcomposite-dev apt_multi libxcursor-dev apt_multi libxi-dev apt_multi libxinerama-dev apt_multi libxkbcommon-dev apt_multi libxkbregistry-dev # The XML and XSLT development packages can only be installed if the ICU # one supports multiarch apt_multi --test libicu-dev; rc=$? apt_multi --if-0 $rc libxml2-dev || apt_multi libxml2 # Not used since Wine bca1b7f2faeb (2021-10-20) apt_multi --if-0 $rc libxslt1-dev || apt_multi libxslt1.1 # Not used since Wine bca1b7f2faeb (2021-10-20) apt_multi libxrandr-dev apt_multi libxrender-dev apt_multi libxxf86vm-dev apt_pkg make apt_multi ocl-icd-opencl-dev apt_multi oss4-dev apt_pkg prelink # Not used since Wine 4a0f3fbcb587 (2023-02-27) # For libnetapi (see bug 961867) apt_check depends samba-libs:i386 -E 'Depends: python3?-talloc:i386' apt_multi --if-not-0 $? samba-dev apt_multi unixodbc-dev || apt_multi libodbc1 } apt_wine_extra() { apt_pkg autoconf apt_multi libgettextpo-dev # To let wrc rebuild PO files apt_pkg libxml-libxml-perl # For make_opengl apt_pkg python3 # For make_vulkan apt_pkg unzip # For make_unicode apt_pkg wget # For make_unicode, make_opengl } apt_wine_tests() { local pkg apt_addsection ttf-mscorefonts-installer contrib "the Microsoft TrueType fonts packages" && dry_run apt-get update # GStreamer plugins for the quartz (winegstreamer) tests apt_multi gstreamer1.0-libav apt_multi --test libmjpegutils-2.1-0 apt_multi --if-0 $? gstreamer1.0-plugins-bad apt_multi gstreamer1.0-plugins-base apt_multi gstreamer1.0-plugins-good apt_multi --test libsidplay1v5 apt_multi --if-0 $? gstreamer1.0-plugins-ugly apt_multi libnss-mdns # For each 64-bit libnss module, its 32-bit equivalent is needed too for # the 32-bit tests: for pkg in $(dpkg -l libnss-*:amd64 | sed -e 's/^.* \([a-zA-Z0-9-]*\):amd64.*$/\1/' -e t -e d) do apt_multi $pkg done # The MIDI tests have to go through ALSA which needs the PulseAudio plugin apt_multi libasound2-plugins apt_pkg ttf-mscorefonts-installer apt_pkg winbind # For ntlm_auth } apt_wine_locales() { # Install fonts for the locale tests # Use Debian's task-* packages, which includes the task-* ones # that install the fonts relevant to that locale. # Also install the fonts for mlterm, the multi-lingual terminal emulator. local tasks="$(apt-cache search '^task-' | cut -f1 -d' ')" local font_pkg="" local extra_pkg="" for font_pkg in $(LANG= apt-cache depends $tasks mlterm | sed -e 's/^ *Recommends: fonts-/fonts-/' -e t -e d | sort -u) do apt_pkg "$font_pkg" case "$font_pkg" in fonts-noto*) # Avoid the fonts-noto-*-extra packages as they cause excessive # Wine slowdowns (see bug 51367). for extra_pkg in $(LANG= apt-cache depends "$font_pkg" | sed -e 's/^ *Recommends: \(fonts-noto.*-extra\)$/\1/' -e t -e d | sort -u) do if dpkg -l "$extra_pkg" | grep -E -q '^[^hrp]n' then apt-mark hold "$extra_pkg" fi done ;; esac done # Needed for gdi32:font in the Chinese locale apt_pkg fonts-arphic-uming } apt_wt_daily() { apt_pkg ntfs-3g apt_pkg time } apt_tb_wine() { apt_pkg genisoimage apt_pkg upx-ucl } apt_workarounds() { local xsltconfig if [ "$opt_wine" = "1" ] then # Work around the missing or broken multiarch support where possible # Needed for all Debian versions so far if apt_is_installed libvkd3d1:i386 then wt_create_sos libvkd3d-dev libvkd3d libvkd3d-shader libvkd3d-utils fi # Needed for Debian 10 wt_create_sos libsdl2-dev libSDL2-2.0 # Broken up to 2.0.9 wt_create_so libSDL2 libSDL2-2.0 # Needed for Ubuntu 18.04 wt_create_sos libcups2-dev libcups wt_create_sos libfontconfig1-dev libfontconfig wt_create_sos libfreetype6-dev libfreetype wt_create_sos libgnutls28-dev libgnutls wt_create_sos libpcap0.8-dev libpcap wt_create_sos libpcsclite-dev libpcsclite wt_create_sos libtiff-dev libtiff if ! apt_is_installed libgstreamer-plugins-base1.0-dev:i386 then apt_dev_workaround libgstreamer-plugins-base1.0-dev fi wt_create_sos libgstreamer-plugins-base1.0-dev libgstaudio-1.0 libgstbase-1.0 libgstreamer-1.0 libgstvideo-1.0 # Ubuntu 18.04 is missing libxslt/xsltconfig.h xsltconfig="libxslt/xsltconfig.h" if [ -f "/usr/include/x86_64-linux-gnu/$xsltconfig" -a \ ! -f "/usr/include/i386-linux-gnu/$xsltconfig" -a \ ! -f "/usr/include/$xsltconfig" -a \ -d "/usr/include/libxslt" ] then dry_run ln -s "../x86_64-linux-gnu/$xsltconfig" "/usr/include/$xsltconfig" elif [ -f "/usr/include/x86_64-linux-gnu/$xsltconfig" -a \ -f "/usr/include/i386-linux-gnu/$xsltconfig" -a \ -h "/usr/include/$xsltconfig" ] then echo "Removing the obsolete /usr/include/$xsltconfig symlink (was for libxslt1-dev)" dry_run rm "/usr/include/$xsltconfig" fi # Needed for Debian 9 wt_create_sos libgphoto2-dev libgphoto2 libgphoto2_port wt_create_sos libjpeg62-turbo-dev libjpeg wt_create_sos libkrb5-dev libcom_err libgssapi_krb5 libk5crypto libkrb5 wt_create_sos libpulse-dev libpulse wt_create_sos libsane-dev libsane wt_create_sos libxml2-dev libxml2 wt_create_sos libxslt1-dev libxslt wt_create_sos unixodbc-dev libodbc fi } apt_epilogue() { if wt_explain_bad_pkgs "libfaudio-dev" then echo "* Wine does not use the distribution's FAudio development packages since" echo " 2021-10 so feel free to ignore this issue. For older versions, FAudio is only" echo " available on distributions derived from Debian 11+." echo fi if wt_explain_bad_pkgs "libfaudio-dev:i386" then echo "* Wine does not use the distribution's FAudio development packages since" echo " 2021-10 so feel free to ignore this issue. For older versions, the" echo " 32-bit libfaudio-dev package is missing." echo fi if wt_explain_bad_pkgs "libgstreamer-plugins-base1.0-dev" then echo "* GStreamer has different header files for 32- and 64-bit. Unfortunately" echo " libgstreamer-plugins-base1.0-dev:i386 cannot be installed because some of its" echo " dependencies do not support multiarch. But this issue has been fixed in" echo " Debian 10 which may provide a viable workaround." echo fi if apt_check show "libpcap0.8" "Version: 1\\.[2-9]" then echo "* libpcap is likely too old and missing pcap_init(), making it unusable." echo fi if wt_explain_bad_pkgs "libxkbregistry-dev" then echo "* libxkbregistry is not available on Debian 10 and older so Wayland is not supported." echo fi if wt_explain_bad_pkgs "prelink" then echo "* Wine does not use prelink since 2023-02 so feel free to ignore this issue." echo fi if wt_explain_bad_pkgs "ttf-mscorefonts-installer" then echo "* ttf-mscorefonts-installer is in the contrib section of the repository. You" echo " may need to update /etc/apt/sources.list (man sources.list)." echo fi if wt_explain_bad_pkgs "oss4-dev" then echo "* OSS4 is no longer available in Debian but is obsolete anyway." echo " If really required, it is available in the Debian multimedia repository:" echo " deb-multimedia.org." echo fi if wt_explain_bad_pkgs "samba-dev:i386" then echo "* samba-dev ostensibly supports multiarch but the 32-bit version depends" echo " on python:i386 through python-talloc and samba-libs. Similarly the 64-bit" echo " version depends on python:amd64 thus breaking multiarch support." echo " https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=961867" echo fi if wt_explain_bad_pkgs "libvkd3d-shader1" then echo "* Wine does not use the distribution's vkd3d development packages since 2022-03" echo " so feel free to ignore this issue. For older versions, Wine needs a" echo " vkd3d >= 1.2 package (see experimental?)." echo elif wt_explain_bad_pkgs "libvkd3d-dev:i386" then echo "* Wine does not use the distribution's vkd3d development packages since 2022-03" echo " so feel free to ignore this issue. Should you want to install libvkd3d-dev" echo " anyway, note that 1.2-* claims to support multiarch but some versions ship a" echo " conflicting file (vkd3d-compiler)." echo " https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=983776" echo fi if wt_explain_bad_pkgs "libvkd3d1:i386" then echo "* Wine does not use the distribution's vkd3d development packages since 2022-03" echo " so feel free to ignore this issue. For older versions the 32-bit libvkd3d1" echo " package is missing." echo fi } ##### # # Zypper package manager (openSUSE, etc.) # ##### # # zypper: Package helpers # zypper_retry_lock() { local msg="$1" shift [ -n "$msg" ] && echo -n "$msg " >&3 locked="Waiting for lock." while zypper "$@" 2>/dev/null; [ $? -eq 7 ] do echo -n "$locked" >&3 locked="." sleep 1 done [ -n "$msg" -o "$locked" = "." ] && echo " done" >&3 } zypper_packages="" zypper_get_packages() { if [ -z "$zypper_packages" ] then zypper_packages=`zypper_retry_lock "Grabbing the available package list..." --non-interactive packages 3>&2 | sed -e '0,/\+----/ d' | cut -d'|' -f3 | sort -u` if [ -z "$zypper_packages" ] then error "'zypper packages' did not return the list of available packages" exit 1 fi fi } zypper_newrepos="" # zypper_addrepo # # Checks if the package is available and returns immediately if it # is. Otherwise builds the OBS repository URL from the string and # asks whether it should be added. If --yes was given or the user agrees the # repository is added but 'zypper refresh' is not called. # # Returns 0 if the repository is available, non-zero otherwise. zypper_addrepo() { local a distname url local landmark="$1" local project="$2" local packages="$3" repo_alias=$(echo $project | sed -e 's/:/_/g') if zypper repos 2>/dev/null | grep -q "$repo_alias" then zypper_newrepos="$zypper_newrepos $repo_alias" return 0 fi [ -n "$opt_norepo" ] && return 1 zypper_get_packages if [ -n "$landmark" ] then case "$zypper_packages" in *" $landmark "*) return 1 ;; esac fi distname=`zypper targetos | sed -e 's/^Distribution Label: //' -e 's/-x86_64$//' -e 's/[ -]/_/g'` # zypper targetos is broken on openSUSE Leap 15.3+ [ -n "$distname" ] || distname=`zypper --terse targetos --label | grep labelLong | sed -e 's/labelLong[ \t]*//' -e 's/ /_/g'` url="https://download.opensuse.org/repositories/$project/$distname/$project.repo" echo echo "********************" echo echo "The OBS repository below is needed for $packages." echo "$url" echo echo -n "Do you want to add it? [Y/n] " if [ -n "$opt_yes" ] then echo "yes" a="y" else read a fi [ -z "$a" -o "$a" = "y" -o "$a" = "Y" ] || return 1 options="--refresh" if [ -n "$opt_yes" ] then # Disable GPG checks to avoid the new GPG key question during refresh. # Also disable auto-refresh to limit future usage. options="--no-gpgcheck" fi preopt="" [ -n "$opt_yes" ] && preopt="--non-interactive" dry_run zypper $preopt addrepo $options "$url" [ $? -ne 0 ] && return 1 zypper_newrepos="$zypper_newrepos $repo_alias" return 0 } # zypper_check # # Checks that the information about matches the specified . # With the 'info' this can be used to verify that the package actually # exists, has the expected version, etc. zypper_check() { local action="$1" local pkg="$2" shift 2 LANG= zypper --non-interactive $action "$pkg" 2>/dev/null | grep -E -q "$@" } # zypper_pkg ... # # If exists, schedule it for installation and return success. # Otherwise try again with the next package in the list. # # If none of the packages exists, add them all to the missing packages list # and return failure. zypper_pkg() { local pkg zypper_get_packages for pkg in $* do echo -n "Checking $pkg..." case "$zypper_packages" in *" $pkg "*) echo " yes" pkginstall="$pkginstall $pkg" return 0 ;; esac # zypper_get_packages() does not know about virtual packages so fall # back to a slower 'zypper install' dry-run. if zypper --non-interactive install --dry-run "$pkg" >/dev/null 2>&1 then echo " yes" # Add the virtual package to $zypper_packages in case it is # queried again. Note: ensure it is enclosed in spaces. zypper_packages="$zypper_packages$pkg " pkginstall="$pkginstall $pkg" return 0 fi echo " no" done pkgmissing="$pkgmissing "`echo "$@" | sed -e 's/ /|/g'` return 1 } # zypper_multi ... # # Iterates over the package list until it finds a package that exists and # schedules both its 32- and 64-bit versions for installation using # zypper_pkg(). # # If both 32- and 64-bit versions were found return 0 (success). # If only the 64-bit version was found return 1 (failure). # If no matching package was found return 2 (failure). zypper_multi() { local pkg rc multi_missing local saved_pkgmissing="$pkgmissing" for pkg in $* do rc=0 zypper_pkg "$pkg" || rc=1 zypper_pkg "$pkg-32bit" || rc=$((rc + 1)) [ $rc -lt 2 ] && return $rc pkgmissing="$saved_pkgmissing" multi_missing="$multi_missing $pkg $pkg-32bit" done pkgmissing="$pkgmissing $multi_missing" return 2 } zypper_install() { local pkg oldpkginstall dry_run zypper_retry_lock "" --non-interactive needs-rebooting 3>&1 >/dev/null 2>&1 # Try to detect and avoid package conflicts oldpkginstall= while [ "$oldpkginstall" != "$pkginstall" ] do oldpkginstall="$pkginstall" zypper --non-interactive install --dry-run $pkginstall >"$TMPDIR/$name0.$$" 2>&1 for pkg in `sed -e 's/^ *Solution [0-9]*: do not install \(.*\)-[^-]*-[^-]*$/\1/' -e t -e d "$TMPDIR/$name0.$$"` do warning "Blacklisting $pkg because it causes conflicts" pkginstall=`echo "$pkginstall " | sed -e "s/ $pkg / /g"` pkgbroken="$pkgbroken $pkg" done done rm "$TMPDIR/$name0.$$" dry_run zypper install $opt_yes `wt_pretty_list $pkginstall` || exit 1 echo } # zypper_is_installed ... # # Returns success if the specified packages are all installed. zypper_is_installed() { rpm -q "$@" >/dev/null 2>&1 } # zypper_create_links ... # # Provide a 32-bit file for missing -dev-32bit packages by symlinking it to the # 64-bit one on the assumption they should be identical. This obviously can # only work some some files like headers and pkgconfig files and only in some # cases. # Updating the broken and missing packages lists is left to the caller and will # typically be taken care of by a subsequent wt_create_sos() call. zypper_create_links() { local file rc rc=0 for file in "$@" do [ -f "/usr/lib/$file" ] && continue if [ ! -f "/usr/lib64/$file" ] then error "could not find the /usr/lib64/$file symlink target" rc=1 elif [ ! -d `dirname "/usr/lib/$file"` ] && ! dry_run mkdir -p `dirname "/usr/lib/$file"` then error "could not create the /usr/lib/$file parent directory" rc=1 elif ! dry_run ln -s -f "/usr/lib64/$file" "/usr/lib/$file" then error "could not create the /usr/lib/$file symlink" rc=1 fi done return $rc } # zypper_create_pcs ... # # A thin wrapper around zypper_create_links() to simplify providing missing # pkgconfig files. zypper_create_pcs() { local lib rc rc=0 for lib in "$@" do zypper_create_links "pkgconfig/$lib.pc" || rc=1 done return $rc } # # zypper: Wine dependencies # zypper_init() { local refresh if [ `arch` != "x86_64" ] then error "expected a 64-bit openSUSE distribution" exit 1 fi wt_libdirs="/lib /lib64" } zypper_wine() { refresh= zypper_addrepo mingw32-cross-gcc windows:mingw:win32 "the win32 MinGW cross-compiler" && refresh=1 zypper_addrepo mingw64-cross-gcc windows:mingw:win64 "the win64 MinGW cross-compiler" && refresh=1 if [ -n "$refresh" ] then dry_run zypper refresh # Force reloading the package list zypper_packages="" fi # Tools zypper_pkg bison zypper_pkg flex zypper_multi gcc zypper_pkg gettext-runtime zypper_pkg git zypper_pkg make zypper_pkg mingw32-cross-gcc zypper_pkg mingw64-cross-gcc zypper_pkg prelink # Not used since Wine 4a0f3fbcb587 (2023-02-27) # Libraries zypper_multi alsa-devel zypper_multi libcapi20-devel capi4linux-devel zypper_multi cups-devel # Missing dependencies in -devel-32bit on openSUSE Tumbleweed zypper_multi libcups2 zypper_multi libnettle-devel zypper_multi cyrus-sasl-devel zypper_multi dbus-1-devel zypper_multi FAudio-devel # Not used since Wine d8be85863fed (2021-10-21) # Missing dependencies in -devel-32bit from Emulators:Wine (bug 1172309) zypper_multi libFAudio0 zypper_multi fontconfig-devel # Missing dependencies in -devel-32bit on openSUSE Leap 15.1 (bug 1172301) zypper_multi fontconfig zypper_multi freetype2-devel # Missing dependency in -devel-32bit on openSUSE Tumbleweed zypper_multi libbz2-devel zypper_multi glibc-devel zypper_multi glu-devel # Not used since Wine ec55b1c271ae (2020-11-12) # Missing -devel-32bit package in openSUSE Leap 15.1 (bug 1172304) zypper_multi gstreamer-devel # Installing the 32-bit glib2-devel allows working around the missing # gstreamer-devel-32bit package. It also compensates for the missing # dependency in that package. zypper_multi glib2-devel # gstreamer-devel-32bit also needs the 32-bit xxx.pc files for these zypper_multi libelf-devel zypper_multi libzstd-devel zypper_multi xz-devel if zypper_check "info --requires" "glib2-devel" "pkgconfig[(]libpcre[)]" then # openSUSE Leap 15.4 case zypper_multi libdw-devel || zypper_multi libdw1 zypper_multi libunwind-devel || zypper_multi libunwind zypper_multi orc || zypper_multi liborc-0_4-0 zypper_multi pcre-devel || zypper_multi libpcre1 else # openSUSE Tumbleweed case zypper_multi pcre2-devel || zypper_multi libpcre2-8-0 fi zypper_multi gstreamer-plugins-base-devel zypper_multi jxrlib-devel # Not used since Wine eb0180e7b4df (2021-10-21) # Missing dependencies in -devel-32bit on openSUSE Tumbleweed (bug 1183053) zypper_multi libjpegxr0 # Missing -32bit package in openSUSE Tumbleweed (bug 1183052) zypper_multi libjxrglue0 zypper_multi krb5-devel # Missing dependency in -devel-32bit in openSUSE Leap 15.1 (bug 1172301) zypper_multi libcom_err-devel zypper_multi libgnutls-devel zypper_multi libgphoto2-devel # Missing dependencies in -devel-32bit in openSUSE Leap 15.1 (bug 1172301) zypper_multi libgphoto2-6 zypper_multi libexif-devel zypper_multi libgsm-devel # Not used since Wine 0e7fd41af953 (2021-10-20) zypper_multi libjpeg8-devel # Not used since Wine a6ac035a7454 (2021-10-19) zypper_multi liblcms2-devel # Not used since Wine 5c4c272a2606 (2021-10-19) zypper_multi libnetapi-devel # Workaround the missing -devel-32bit package in openSUSE Leap 15.1 (bug 1172307) zypper_multi libnetapi0 zypper_multi libOSMesa-devel zypper_multi libpcap-devel zypper_multi libpng16-compat-devel # Not used since Wine c3d8a29a0499 (2021-10-18) zypper_multi libpulse-devel # Missing dependency in -devel-32bit in openSUSE Leap 15.1 (bug 1172301) zypper_multi libpulse0 zypper_multi libSDL2-devel zypper_multi libtiff-devel # Not used since Wine d36615ee5232 (2021-10-19) zypper_pkg libunwind-devel # Wine only needs the 64-bit library zypper_multi libudev-devel systemd-devel || zypper_multi libudev1 zypper_multi libusb-1_0-devel zypper_multi libv4l-devel # Missing dependency in -devel-32bit in openSUSE Leap 15.1 (bug 1172301) zypper_multi libv4l2-0 zypper_multi libX11-devel zypper_multi libXcomposite-devel zypper_multi libXcursor-devel zypper_multi libXext-devel zypper_multi libXfixes-devel zypper_multi libXi-devel zypper_multi libXinerama-devel zypper_multi libxkbcommon-devel # Missing *-32bit packages in openSUSE Leap (bug 1218639) # and -devel-32bit package in Tumbleweed (bug 1218640) zypper_multi libxkbregistry-devel zypper_multi libxkbregistry0 zypper_multi libXxf86vm-devel zypper_multi libxml2-devel # Not used since Wine bca1b7f2faeb (2021-10-20) zypper_multi libXrandr-devel zypper_multi libXrender-devel zypper_multi libxslt-devel # Not used since Wine bca1b7f2faeb (2021-10-20) zypper_multi Mesa-libGL-devel # Missing dependency in -devel-32bit in openSUSE Leap 15.1 (bug 1172302) zypper_multi Mesa-libGL1 zypper_multi mpg123-devel # Not used since Wine 5329da61ac51 (2021-10-21) zypper_multi ncurses-devel # Not used since Wine 26c715f85b49 (2020-09-22) zypper_pkg opencl-headers # Missing -32bit packages in openSUSE Leap 15.1 (bug 1172303) zypper_multi ocl-icd-devel zypper_multi libOpenCL1 # For the epilogue diagnostic zypper_multi openal-soft-devel # Missing dependency in -devel-32bit in openSUSE Leap 15.1 (bug 1172301) zypper_multi libopenal1 zypper_multi openldap2-devel # Missing -32bit packages in openSUSE Leap but unused by Wine so far zypper_multi pcsc-lite-devel || zypper_multi libpcsclite1 zypper_multi sane-backends-devel # Missing dependency in -devel-32bit in openSUSE Leap 15.1 (bug 1172301) # and in Tumbleweed. Also the libsane.so.* librares moved from # sane-backends in Leap 15.x to libsane1 in Tumbleweed. zypper_multi libsane1 sane-backends # unixODBC-devel-32bit only contains the pkg-config files (so no headers # and .so symlinks) but it is still needed. zypper_multi unixODBC-devel zypper_multi unixODBC # vkd3d is not used since Wine 24432a24d5e9 (2022-03-03) zypper_multi vkd3d-devel # Missing dependencies in -devel-32bit from home:dimesio (bug 1172310) zypper_multi libvkd3d1 zypper_multi vulkan-devel # Missing dependency in -devel-32bit in openSUSE Leap 15.1 (bug 1172301) zypper_multi libvulkan1 zypper_multi wayland-devel # Missing dependency in -devel-32bit in openSUSE Tumbleweed zypper_multi libffi-devel zypper_multi zlib-devel # Not used since Wine 7f726ddd89be (2021-10-18) } zypper_wine_extra() { zypper_pkg autoconf zypper_pkg gettext-tools # To let wrc rebuild PO files zypper_pkg perl-XML-LibXML # For make_opengl zypper_pkg python3 # For make_vulkan zypper_pkg unzip # For make_unicode zypper_pkg wget # For make_unicode, make_opengl } zypper_wine_tests() { zypper_pkg fetchmsttfonts # GStreamer plugins for the quartz (winegstreamer) tests zypper_multi gstreamer-plugins-bad zypper_multi gstreamer-plugins-base zypper_multi gstreamer-plugins-good zypper_multi gstreamer-plugins-libav zypper_multi gstreamer-plugins-ugly # The MIDI tests have to go through ALSA which needs the PulseAudio plugin zypper_multi alsa-plugins-pulse zypper_pkg samba-winbind # For ntlm_auth } zypper_wine_locales() { # Install fonts for the locale tests (mirrored from the Debian list) zypper_pkg baekmuk-ttf-fonts zypper_pkg dejavu-fonts zypper_pkg khmeros-fonts zypper_pkg noto-sans-fonts zypper_pkg noto-coloremoji-fonts } zypper_wt_daily() { zypper_pkg ntfs-3g zypper_pkg time } zypper_tb_wine() { true # upx-ucl is not available } zypper_workarounds() { if [ "$opt_wine" = "1" ] then # Work around the missing 32-bit development packages where possible # Needed for openSUSE Leap 15.1 wt_create_sos gstreamer-devel-32bit libgstbase-1.0 libgstreamer-1.0 wt_create_sos libnetapi-devel-32bit libnetapi wt_create_sos Mesa-libGL-devel-32bit libGL wt_create_sos ocl-icd-devel-32bit libOpenCL wt_create_sos vulkan-devel-32bit libvulkan # Needed for openSUSE Leap 15.4 zypper_create_links "dbus-1.0/include/dbus/dbus-arch-deps.h" wt_create_sos "(libudev|systemd)-devel-32bit" libudev wt_create_sos pcsc-lite-devel-32bit libpcsclite # Needed for GStreamer on openSUSE Leap 15.4 zypper_create_pcs libdw && wt_create_sos libdw-devel-32bit libdw zypper_create_pcs libffi && wt_create_sos libffi-devel-32bit libffi if zypper_is_installed pcre-devel then # autoconf mostly needs the pkgconfig workaround zypper_create_pcs libpcre && wt_create_sos pcre-devel-32bit libpcre fi zypper_create_pcs libunwind && wt_create_sos libunwind-devel-32bit libunwind zypper_create_pcs orc-0.4 && wt_create_sos orc-32bit liborc-0.4 # Needed for GStreamer on openSUSE Tumbleweed if zypper_is_installed pcre2-devel then # GStreamer needs this one through GLib2 # and autoconf mostly needs the pkgconfig workaround zypper_create_pcs libpcre2-8 && wt_create_sos pcre2-devel-32bit libpcre2-8 fi # Needed for Wayland on openSUSE Tumbleweed if zypper_is_installed libxkbregistry0-32bit && zypper_is_installed libxkbregistry-devel then zypper_create_pcs xkbregistry && wt_create_sos libxkbregistry-devel-32bit libxkbregistry fi fi } zypper_epilogue() { if wt_explain_bad_pkgs "capi4linux-devel" "capi4linux-devel-32bit" "libcapi20-devel" "libcapi20-devel-32bit" then echo "* openSUSE Leap 15.3+ is missing all support for libcapi20. This only impacts" echo " the rare Windows applications that would use ISDN phone lines." echo " https://bugzilla.opensuse.org/show_bug.cgi?id=1191039" echo " https://wiki.winehq.org/Building_Wine#Satisfying_Build_Dependencies" echo fi if wt_explain_bad_pkgs "FAudio-devel" then echo "* Wine does not use the distribution's FAudio development packages since 2021-10. For older versions, FAudio-devel is available through the Emulators:Wine project on the OBS." echo " https://build.opensuse.org/project/show/Emulators:Wine" echo fi if wt_explain_bad_pkgs "gstreamer-devel-32bit" then echo "* GStreamer has different header files for 32- and 64-bit. Unfortunately" echo " gstreamer-devel-32bit is missing which means there is no easy workaround." echo " But you can check these two pages for more information on how to manually" echo " overcome this hurdle:" echo " https://bugzilla.opensuse.org/show_bug.cgi?id=973217" echo " https://wiki.winehq.org/OpenSUSE#Build_Tools_and_Dependencies" echo fi if wt_explain_bad_pkgs "jxrlib-devel-32bit" "libjpegxr0-32bit" "libjxrglue0-32bit" then echo "* Wine does not use the distribution's jxrlib packages since 2021-10 so feel free" echo " to ignore this issue. For older versions, both jxrlib-devel-32bit and" echo " jxrlib-32bit are missing so there is no 32-bit support at all for JPEG XR" echo " images. Try a newer distributution release." echo fi if [ "$opt_wine" = "1" -a "$opt_packages" = "1" ] then echo "* OSS4 is known not to be available but is obsolete anyway." echo " https://wiki.winehq.org/Building_Wine#Satisfying_Build_Dependencies" echo fi if wt_explain_bad_pkgs "mingw32-cross-gcc" then echo "* The MinGW compiler is available through the windows:mingw:win32 projects" echo " on the OBS." echo " https://build.opensuse.org/project/show/windows:mingw:win32" echo fi if wt_explain_bad_pkgs "mingw64-cross-gcc" then echo "* The MinGW compiler is available through the windows:mingw:win64 projects" echo " on the OBS." echo " https://build.opensuse.org/project/show/windows:mingw:win64" echo fi if wt_explain_bad_pkgs "prelink" then echo "* Wine does not use prelink since 2023-02 so feel free to ignore this issue." echo " For older versions, it may be possible to use the RHEL prelink package." echo " https://software.opensuse.org/package/prelink" echo fi if wt_explain_bad_pkgs "vkd3d-devel" "vkd3d-devel-32bit" "libvkd3d1" "libvkd3d1-32bit" then echo "* Wine does not use the distribution's vkd3d development packages since 2022-03" echo " so feel free to ignore this issue. For older versions vkd3d is only available" echo " through the home:dimesio project on the OBS." echo " https://build.opensuse.org/project/show/home:dimesio" echo fi if [ -n "$opt_yes" -a -n "$zypper_newrepos" ] then echo "* Because of the --yes option the GPG checks had to be disabled for the" echo " new repositories below. You may want to remove them or manually reenable" echo " GPG checking and auto-refresh." for repo in $zypper_newrepos do echo " zypper modifyrepo --gpgcheck --refresh $repo" done echo fi } ##### # # Command line processing # ##### wt_parse_cmdline() { local arg local usage="" while [ $# -gt 0 ] do arg="$1" shift case "$arg" in --wine) opt_wine="1" ;; --no-wine) opt_wine="0" ;; --extra) opt_wine_extra="1" ;; --no-extra) opt_wine_extra="0" ;; --tests) opt_wine_tests="1" ;; --no-tests) opt_wine_tests="0" ;; --locales) opt_wine_locales="1" ;; --no-locales) opt_wine_locales="0" ;; --wt-daily) opt_wt_daily="1" ;; --no-wt-daily) opt_wt_daily="0" ;; --tb-wine) opt_tb_wine="1" ;; --no-tb-wine) opt_tb_wine="0" ;; --all) opt_wine="1" opt_wine_extra="1" opt_wine_tests="1" opt_wine_locales="1" opt_wt_daily="1" opt_tb_wine="1" ;; --no-repo) opt_norepo="0" ;; --packages) opt_packages="1" ;; --workarounds) opt_workarounds="1" ;; --yes) opt_yes="-y";; --dry-run) opt_dry_run="1" ;; --cmd-log) if [ -n "$opt_cmd_log" ] then error "--cmd-log can only be specified once" usage=2 # but continue processing options fi if [ $# -eq 0 ] then error "missing value for --cmd-log" usage=2 else opt_cmd_log="$1" shift fi ;; --help|-h|-?) usage=0 break ;; *) error "unknown option '$arg'" usage=2 break ;; esac done if [ -z "$usage" ] then if [ -z "$opt_wine$opt_wine_extra$opt_wine_tests$opt_locales$opt_wt_daily$opt_tb_wine" ] then opt_wine="1" opt_wine_extra="1" fi if [ -z "$opt_packages$opt_workarounds" ] then opt_packages="1" opt_workarounds="1" fi fi if [ "$usage" = "0" ] then echo "Usage: $name0 [--no-wine] [--no-extra] [--tests] [--locales] [--wt-daily] [--tb-wine] [--no-repo] [--packages] [--workarounds] [--yes] [--cmd-log SCRIPT] [--dry-run] [--help]" echo echo "Installs the packages needed to build the 32- and 64-bit versions of Wine. When possible applies workarounds if installing both the 32- and 64-bit development packages is impossible. Can also install some extra packages needed by the tests and the wt-daily scripts." echo echo "Default options:" echo " --wine --extra --no-tests --no-locales --no-wt-daily --no-tb-wine --packages --workarounds" echo "Tested on:" echo " Debian 9 & 10, Linux Mint 19.03, Ubuntu 18.04 & 19.10." echo " openSUSE Leap 15.1, Tumbleweed (2020-05)." echo echo "Where:" echo " --no-wine Do not install the packages needed to compile Wine." echo " --no-extra Only install the packages needed to compile Wine, not those" echo " needed to regenerate part of its source (autoconf, etc)." echo " --tests Install some packages needed to run the Wine tests." echo " --locales Install packages needed to test Wine in most locales." echo " --wt-daily Install the packages needed for the wt-daily scripts." echo " --tb-wine Install the packages needed for the TestBot's wine VMs." echo " --all Same as --wine --extra --tests --locales --wt-daily --tb-wine." echo " --no-repo Don't add extra package repositories." echo " --packages Install the packages." echo " --workarounds Apply workarounds for packages that don't support multiarch so" echo " that both the 32- and 64-bit versions of Wine can be built." echo " --yes Answer yes to all package installation prompts." echo " --cmd-log SCRIPT Saves all commands being run to the specified shell script." echo " --dry-run Only show which actions would be taken." echo " --help, -h Shows this help message." exit 0 elif [ -n "$usage" ] then error "try '$name0 --help' for more information" exit $usage fi } wt_build_cmdargs() { # Rebuild a cleaner, more explicit command line for --cmd-log wt_cmdargs="" [ "$opt_wine" = "1" ] && wt_cmdargs="$wt_cmdargs --wine" [ "$opt_wine_extra" = "1" ] && wt_cmdargs="$wt_cmdargs --extra" [ "$opt_wine_tests" = "1" ] && wt_cmdargs="$wt_cmdargs --tests" [ "$opt_wine_locales" = "1" ] && wt_cmdargs="$wt_cmdargs --locales" [ "$opt_wt_daily" = "1" ] && wt_cmdargs="$wt_cmdargs --wt-daily" [ "$opt_tb_wine" = "1" ] && wt_cmdargs="$wt_cmdargs --tb-wine" [ "$opt_norepo" = "1" ] && wt_cmdargs="$wt_cmdargs --no-repo" [ "$opt_packages" = "1" ] && wt_cmdargs="$wt_cmdargs --packages" [ "$opt_workarounds" = "1" ] && wt_cmdargs="$wt_cmdargs --workarounds" [ "$opt_yes" = "1" ] && wt_cmdargs="$wt_cmdargs --yes" [ "$opt_dry_run" = "1" ] && wt_cmdargs="$wt_cmdargs --dry-run" } ##### # # Package installation # ##### wt_init() { [ -n "$TMPDIR" ] || TMPDIR="/tmp" if [ -x "/usr/bin/apt-cache" -a -x "/usr/bin/apt-get" ] then wt_platform="apt" elif [ -x "/usr/bin/zypper" ] then wt_platform="zypper" else error "this Linux distribution is not supported." exit 1 fi ${wt_platform}_init if [ -n "$opt_cmd_log" ] then ( echo "#!/bin/sh" echo "# Generated by $name0$wt_cmdargs" . /etc/os-release echo "# For the '$wt_platform' platform on $PRETTY_NAME" echo "# These commands may not be applicable to any other platform." if [ "$opt_dry_run" = "1" ] then echo "# *** WARNING ***" echo "# In --dry-run mode the workarounds will likely be incorrect or incomplete." fi echo "set -x" echo ) >"$opt_cmd_log" if [ $? -ne 0 ] then error "could not generate the --cmd-log script" exit 1 fi chmod +x "$opt_cmd_log" fi } wt_pre_install() { if [ "$opt_packages" = "1" ] then [ "$opt_wine" = "1" ] && ${wt_platform}_wine [ "$opt_wine_extra" = "1" ] && ${wt_platform}_wine_extra [ "$opt_wine_tests" = "1" ] && ${wt_platform}_wine_tests [ "$opt_wine_locales" = "1" ] && ${wt_platform}_wine_locales [ "$opt_wt_daily" = "1" ] && ${wt_platform}_wt_daily [ "$opt_tb_wine" = "1" ] && ${wt_platform}_tb_wine fi } wt_install() { [ "$opt_packages" = "1" ] && ${wt_platform}_install } wt_post_install() { [ "$opt_workarounds" = "1" ] && ${wt_platform}_workarounds } wt_epilogue() { echo ${wt_platform}_epilogue pkgworkaround=`wt_pretty_list "$pkgworkaround"` if [ -n "$pkgworkaround" ] then echo "* Workarounds were successfully applied for the following broken or missing" echo " packages." echo " $pkgworkaround" echo fi pkgbroken=`wt_pretty_list "$pkgbroken"` if [ -n "$pkgbroken" ] then echo "* Could not install the following packages because they do not support" echo " multiarch." echo " $pkgbroken" echo fi pkgmissing=`wt_pretty_list "$pkgmissing"` if [ -n "$pkgmissing" ] then echo "* Could not install the following packages because they are not available." echo " $pkgmissing" echo fi } ##### # # Main # ##### if [ -z "$WT_INSTALL_DEV_LIB" ] then opt_wine="" opt_wine_extra="" opt_wine_tests="" opt_wine_locales="" opt_wt_daily="" opt_tb_wine="" opt_norepo="" opt_packages="" opt_workarounds="" opt_yes="" opt_dry_run="" opt_cmd_log="" wt_parse_cmdline "$@" wt_build_cmdargs wt_init wt_pre_install wt_install wt_post_install wt_epilogue fi