[pkg-wine-party] Bug#769234: Automatically detect wine32 and wine64.
Hi,
please see below for another patch. IMO it is clean, simple and
matches the logic of the wine-script perfectly.
It tries to detect the correct wine version using the following
precedence:
1. WINEARCH - can't be misinterpreted and was also used
previously.
2. WINEPREFIX - if it is set and system.reg exists, we have a
clean indicator if it is a 32-bit or 64-bit installation,
and therefore which wine to use.
3. WINELOADER - if it is set to a known loader, use this for
deciding which wine to use.
The 32-bit loaders seem to work with both wine32 and wine64,
but I see no point in doing this here. Instead it is easier
to choose the correct 32-bit or 64-bit wineprefix later if
wine loader and binary match.
Note that I'm not really familiar with the preloader.
4. Test with "file" if $1 is a 64-bit application. Note that some
64-bit applications have PE32 installers, or install single
PE32 executables. But those also seem to work with wine64 as
long as wine32 is installed. Therefore only testing for PE32+.
Additionally to the posted patch, we'd need to depend on "file".
It seems to work perfectly, except for one case which can't be solved
here:
64-bit applications with PE32 installers still require manual
intervention (e.g. export WINEARCH=win64) to install correctly. Then
they will work automatically afterwards.
Without manual intervention they are installed in a 32-bit prefix.
Desktop launchers are broken then. Starting a 64-bit app directly will
work, but will be running in a 64-bit prefix despite of being installed
in a 32-bit prefix.
Without these changes they will be installed in a 32-bit prefix, but
then fail to work.
So this patch may obfuscate the need for manual intervention.
However one may use WoW64 (#762058) together with this patch.
What do you think?
Greets
jre
=======================================
diff --git a/debian/scripts/wine b/debian/scripts/wine
index eb929a9..a1463c9 100755
--- a/debian/scripts/wine
+++ b/debian/scripts/wine
@@ -6,6 +6,32 @@ bindir=/usr/lib/$name
wine32=$bindir/wine
wine64=$bindir/wine64
+if test -n "$WINEARCH"; then
+ true
+elif [ -n "$WINEPREFIX" ] &&
+ [ -e "${WINEPREFIX}/system.reg" ] &&
+ grep -q "^\#arch=win32" "${WINEPREFIX}/system.reg"; then
+ echo "Setting WINEARCH=win32 because $WINEPREFIX is a 32-bit installation."
+ WINEARCH=win32
+elif [ -n "$WINEPREFIX" ] &&
+ [ -e "${WINEPREFIX}/system.reg" ] &&
+ grep -q "^\#arch=win64" "${WINEPREFIX}/system.reg"; then
+ echo "Setting WINEARCH=win64 because $WINEPREFIX is a 64-bit installation."
+ WINEARCH=win64
+elif [ -n "$WINELOADER" ] &&
+ [ "$(echo $WINELOADER|sed "s|-preloader||;s|wine32|wine|")" = "/usr/lib/$name/wine" ]; then
+ echo "Setting WINEARCH=win32 because of WINELOADER $WINELOADER."
+ WINEARCH=win32
+elif [ -n "$WINELOADER" ] &&
+ [ "$(echo $WINELOADER|sed "s|-preloader||")" = "/usr/lib/$name/wine64" ]; then
+ echo "Setting WINEARCH=win64 because of WINELOADER $WINELOADER."
+ WINEARCH=win64
+elif [ -f "$1" ] &&
+ file -bL "$1"|grep -Eq "PE32+ executable.*x86-64"; then
+ echo "Setting WINEARCH=win64 because $1 is a PE32+ executable."
+ WINEARCH=win64
+fi
+
if test -x $wine32 -a "$WINEARCH" != "win64"; then
wine=$wine32
elif test -x $wine64; then
Reply to: