aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex S <iwtcex@gmail.com>2021-07-26 09:06:49 +0000
committerGerald Pfeifer <gerald@FreeBSD.org>2021-07-26 09:10:27 +0000
commit1d2af6e08958ac78de9fae727283ac8cdaf8705f (patch)
tree68b51410a5307e190743babca27001f43b90cead
parent7daa72be5dcda33d065050cb74c5c84b996a8446 (diff)
downloadports-1d2af6e08958ac78de9fae727283ac8cdaf8705f.tar.gz
ports-1d2af6e08958ac78de9fae727283ac8cdaf8705f.zip
emulators/wine: Invoke with LD_BIND_NOW and revampe WoW
Wine 6.0 and later need LD_BIND_NOW / LD_32_BIND_NOW on FreeBSD, cf. https://bugs.winehq.org/show_bug.cgi?id=50257 and https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=252307 so move the actual binaries to wine64.bin / wine.bin and invoke them via a script that does those settings. Also revamp the WoW handling/packging which combines 32-bit/i386 Wine into 64-bit/amd64 Wine. Submitted by: Alex S <iwtcex@gmail.com> PR: 257284, 252307
-rw-r--r--emulators/wine/Makefile10
-rw-r--r--emulators/wine/pkg-plist8
-rw-r--r--emulators/wine/pkg32.sh13
-rw-r--r--emulators/wine/wine-wow64.sh42
-rw-r--r--emulators/wine/wine.sh14
5 files changed, 85 insertions, 2 deletions
diff --git a/emulators/wine/Makefile b/emulators/wine/Makefile
index 1e906e38b82e..7af4e43d8a44 100644
--- a/emulators/wine/Makefile
+++ b/emulators/wine/Makefile
@@ -154,6 +154,16 @@ pre-build:
cd ${WRKSRC} && ${MAKE_CMD} depend
post-install:
+.if ${ARCH} == i386
+ ${MV} ${STAGEDIR}${PREFIX}/bin/wineserver ${STAGEDIR}${PREFIX}/bin/wineserver32
+ ${MV} ${STAGEDIR}${PREFIX}/bin/wine ${STAGEDIR}${PREFIX}/bin/wine.bin
+ ${INSTALL_SCRIPT} ${FILESDIR}/wine.sh ${STAGEDIR}${PREFIX}/bin/wine
+.else
+ ${MV} ${STAGEDIR}${PREFIX}/bin/wine64 ${STAGEDIR}${PREFIX}/bin/wine64.bin
+ ${INSTALL_SCRIPT} ${FILESDIR}/wine.sh ${STAGEDIR}${PREFIX}/bin/wine64
+ ${INSTALL_SCRIPT} ${FILESDIR}/wine-wow64.sh ${STAGEDIR}${PREFIX}/bin/wine
+ ${INSTALL_SCRIPT} ${FILESDIR}/pkg32.sh ${STAGEDIR}${DATADIR}/pkg32.sh
+.endif
@${MV} -f ${STAGEDIR}${WINELIBDIR}/libwine.so.1.0 \
${STAGEDIR}${WINELIBDIR}/libwine.so.1
@${LN} -sf libwine.so.1 ${STAGEDIR}/${WINELIBDIR}/libwine.so
diff --git a/emulators/wine/pkg-plist b/emulators/wine/pkg-plist
index 6209f46a7e8e..df1e5ce4d141 100644
--- a/emulators/wine/pkg-plist
+++ b/emulators/wine/pkg-plist
@@ -5,8 +5,10 @@ bin/notepad
bin/regedit
bin/regsvr32
bin/widl
-%%WINE32%%bin/wine
+bin/wine
+%%WINE32%%bin/wine.bin
%%WINE64%%bin/wine64
+%%WINE64%%bin/wine64.bin
bin/wineboot
bin/winebuild
bin/winecfg
@@ -20,7 +22,8 @@ bin/winegcc
bin/winemaker
bin/winemine
bin/winepath
-bin/wineserver
+%%WINE32%%bin/wineserver32
+%%WINE64%%bin/wineserver
bin/wmc
bin/wrc
include/wine/debug.h
@@ -3365,6 +3368,7 @@ share/applications/wine.desktop
%%DATADIR%%/nls/normnfkc.nls
%%DATADIR%%/nls/normnfkd.nls
%%DATADIR%%/nls/sortdefault.nls
+%%WINE64%%%%DATADIR%%/pkg32.sh
%%PORTDOCS%%%%DOCSDIR%%/ANNOUNCE
%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
%%PORTDOCS%%%%DOCSDIR%%/README
diff --git a/emulators/wine/pkg32.sh b/emulators/wine/pkg32.sh
new file mode 100644
index 000000000000..a26ee5b5d7f6
--- /dev/null
+++ b/emulators/wine/pkg32.sh
@@ -0,0 +1,13 @@
+#!/bin/sh -e
+
+if [ "$(id -u)" = 0 ]
+then
+ echo "Don't run this script as root!"
+ exit 1
+fi
+
+I386_ROOT="${WINE_i386_ROOT:-$HOME/.i386-wine-pkg}"
+
+mkdir -p "$I386_ROOT"
+ABI=$(pkg config ABI | sed s/amd64/i386/)
+echo pkg -o ABI="$ABI" -o INSTALL_AS_USER=true -o RUN_SCRIPTS=false --rootdir "$I386_ROOT" "$@"
diff --git a/emulators/wine/wine-wow64.sh b/emulators/wine/wine-wow64.sh
new file mode 100644
index 000000000000..e24bc30e1b78
--- /dev/null
+++ b/emulators/wine/wine-wow64.sh
@@ -0,0 +1,42 @@
+#!/bin/sh -e
+
+TARGET="$(realpath "$0")"
+PREFIX="${TARGET%/*/*}"
+LOCALBASE="${PREFIX}"
+
+I386_ROOT="${WINE_i386_ROOT:-$HOME/.i386-wine-pkg}"
+
+if [ ! -f "$I386_ROOT/$PREFIX/bin/wine" ]
+then
+ printf "%s doesn't exist!\n\n" "$I386_ROOT/$PREFIX/bin/wine"
+ printf "Try installing 32-bit Wine with\n\t%s\n" "$PREFIX/share/wine/pkg32.sh install wine mesa-dri"
+ exit 1
+fi
+
+WINE32_VERSION=$(env -u WINELOADERNOEXEC "$I386_ROOT/$PREFIX/bin/wine" --version)
+WINE64_VERSION=$(env -u WINELOADERNOEXEC "${TARGET}64" --version)
+if [ "$WINE32_VERSION" != "$WINE64_VERSION" ]
+then
+ printf "wine [%s] and wine64 [%s] versions do not match!\n\n" "$WINE32_VERSION" "$WINE64_VERSION"
+ printf "Try updating 32-bit wine with\n\t%s\n" "$PREFIX/share/wine/pkg32.sh upgrade"
+ exit 1
+fi
+
+export LIBGL_DRIVERS_PATH="${LIBGL_DRIVERS_PATH:+$LIBGL_DRIVERS_PATH:}$LOCALBASE/lib/dri:$LOCALBASE/lib32/dri:$I386_ROOT/$LOCALBASE/lib/dri"
+export LD_32_LIBRARY_PATH="${LD_32_LIBRARY_PATH:+$LD_32_LIBRARY_PATH:}$I386_ROOT/$PREFIX/lib/wine:$LOCALBASE/lib32:$I386_ROOT/$LOCALBASE/lib"
+
+for d in "$I386_ROOT/$LOCALBASE"/llvm*/lib
+do
+ if [ -d "$d" ]
+ then
+ export LD_32_LIBRARY_PATH="$LD_32_LIBRARY_PATH:$d"
+ fi
+done
+export LD_32_LIBRARY_PATH_RPATH=y
+
+if [ -z "$WINE_NO_WOW64" ]
+then
+ export WINESERVER="${TARGET}server"
+fi
+
+exec "$I386_ROOT/$PREFIX/bin/wine" "$@"
diff --git a/emulators/wine/wine.sh b/emulators/wine/wine.sh
new file mode 100644
index 000000000000..96a350fce615
--- /dev/null
+++ b/emulators/wine/wine.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+TARGET="$(realpath "$0")"
+
+if [ -z "$WINESERVER" ] && [ -f "${TARGET}server32" ]
+then
+ export WINESERVER="${TARGET}server32"
+fi
+
+# Workaround for https://bugs.winehq.org/show_bug.cgi?id=50257
+export LD_BIND_NOW=1
+export LD_32_BIND_NOW=1
+
+exec "${TARGET}.bin" "$@"