commit: c989072bfe1f64bc47326d740498f575d4bccaeb
parent 6809947698f51d989c6bce990eeafad6685f764a
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date: Sat, 26 Aug 2023 17:07:20 +0200
app-emulation/wine-wayland: Synchronise with wine-vanilla
Diffstat:
4 files changed, 208 insertions(+), 66 deletions(-)
diff --git a/app-emulation/wine-wayland/files/wine-vanilla-7.0-noexecstack.patch b/app-emulation/wine-wayland/files/wine-vanilla-7.0-noexecstack.patch
@@ -0,0 +1,7 @@
+Also write GNU-stack note on dummy files used for stub libraries.
+--- a/tools/winebuild/import.c
++++ b/tools/winebuild/import.c
+@@ -1675,2 +1675,3 @@
+ output( "\t.text\n" );
++ output_gnu_stack_note();
+ }
diff --git a/app-emulation/wine-wayland/files/wine-vanilla-7.20-unwind.patch b/app-emulation/wine-wayland/files/wine-vanilla-7.20-unwind.patch
@@ -0,0 +1,36 @@
+Fix build with llvm-libunwind, and also fix for non-llvm libunwind
+when using clang+bfd given clang doesn't have _Unwind_Find_FDE in
+its rtlib and expects it from llvm-libunwind.
+
+The _CONFIG_H_ check is for <llvm-libunwind-15 (adds _VERSION).
+--- a/dlls/ntdll/unix/dwarf.h
++++ b/dlls/ntdll/unix/dwarf.h
+@@ -255,5 +255,7 @@
+ };
+
++#if defined(_LIBUNWIND_VERSION) || defined(____LIBUNWIND_CONFIG_H__) || !defined(__clang__)
+ extern const struct dwarf_fde *_Unwind_Find_FDE (void *, struct dwarf_eh_bases *);
++#endif
+
+ static unsigned char dwarf_get_u1( const unsigned char **p )
+--- a/dlls/ntdll/unix/signal_x86_64.c
++++ b/dlls/ntdll/unix/signal_x86_64.c
+@@ -623,5 +623,5 @@
+ int rc;
+
+-#ifdef __APPLE__
++#if defined(__APPLE__) || defined(_LIBUNWIND_VERSION) || defined(____LIBUNWIND_CONFIG_H__)
+ rc = unw_getcontext( &unw_context );
+ if (rc == UNW_ESUCCESS)
+@@ -746,4 +746,5 @@
+ {
+ struct dwarf_eh_bases bases;
++#if defined(_LIBUNWIND_VERSION) || defined(____LIBUNWIND_CONFIG_H__) || !defined(__clang__)
+ const struct dwarf_fde *fde = _Unwind_Find_FDE( (void *)(context->Rip - 1), &bases );
+
+@@ -751,4 +752,5 @@
+ return dwarf_virtual_unwind( context->Rip, &dispatch->EstablisherFrame, context, fde,
+ &bases, &dispatch->LanguageHandler, &dispatch->HandlerData );
++#endif
+ #ifdef HAVE_LIBUNWIND
+ return libunwind_virtual_unwind( context->Rip, &dispatch->EstablisherFrame, context,
diff --git a/app-emulation/wine-wayland/files/wine-vanilla-8.13-rpath.patch b/app-emulation/wine-wayland/files/wine-vanilla-8.13-rpath.patch
@@ -0,0 +1,15 @@
+Patch Source: https://gitlab.alpinelinux.org/alpine/aports/-/blob/master/community/wine/rpath.patch
+Alpine Bug: https://gitlab.alpinelinux.org/alpine/aports/-/issues/13249
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -784,6 +784,9 @@ case $host_os in
+ [WINELOADER_LDFLAGS="$WINELOADER_LDFLAGS -Wl,-z,max-page-size=0x1000"])
+ ;;
+ esac
++
++ # do this at the end because it needs double dollar for makefile
++ WINE_TRY_CFLAGS([-Wl,-rpath,\\\$ORIGIN],[UNIXLDFLAGS="$UNIXLDFLAGS '-Wl,-rpath,\$\$ORIGIN'"])
+ ;;
+ esac
+
diff --git a/app-emulation/wine-wayland/wine-wayland-9999.ebuild b/app-emulation/wine-wayland/wine-wayland-9999.ebuild
@@ -4,10 +4,12 @@
EAPI=8
MULTILIB_COMPAT=( abi_x86_{32,64} )
-inherit autotools flag-o-matic multilib multilib-build toolchain-funcs wrapper
+# note: multilib+wrapper are not unused, currently a pkgcheck false positive
+inherit autotools flag-o-matic multilib multilib-build
+inherit prefix toolchain-funcs wrapper
-WINE_GECKO=2.47.3
-WINE_MONO=7.4.0
+WINE_GECKO=2.47.4
+WINE_MONO=8.0.0
if [[ ${PV} == *9999 ]]; then
inherit git-r3
@@ -27,16 +29,20 @@ LICENSE="LGPL-2.1+ BSD-2 IJG MIT OPENLDAP ZLIB gsm libpng2 libtiff"
SLOT="${PV}"
IUSE="
+X +abi_x86_32 +abi_x86_64 +alsa capi crossdev-mingw cups dos
- llvm-libunwind debug custom-cflags +fontconfig +gecko gphoto2
- +gstreamer kerberos +mingw +mono netapi nls odbc opencl +opengl
- osmesa pcap perl pulseaudio samba scanner +sdl selinux +ssl
- +truetype udev udisks +unwind usb v4l +vulkan +wayland +xcomposite xinerama"
+ llvm-libunwind custom-cflags +fontconfig +gecko gphoto2 +gstreamer
+ kerberos +mingw +mono netapi nls odbc opencl +opengl osmesa pcap
+ perl pulseaudio samba scanner +sdl selinux smartcard +ssl +strip
+ +truetype udev udisks +unwind usb v4l +vulkan wayland wow64
+ +xcomposite xinerama"
+# bug #551124 for truetype
+# TODO: wow64 can be done without mingw if using clang (needs bug #912237)
REQUIRED_USE="
X? ( truetype )
xinerama? ( X )
xcomposite? ( X )
wayland? ( truetype )
- crossdev-mingw? ( mingw )" # bug #551124 for truetype
+ crossdev-mingw? ( mingw )
+ wow64? ( abi_x86_64 !abi_x86_32 mingw )"
# tests are non-trivial to run, can hang easily, don't play well with
# sandbox, and several need real opengl/vulkan or network access
@@ -87,18 +93,27 @@ WINE_COMMON_DEPEND="
pcap? ( net-libs/libpcap[${MULTILIB_USEDEP}] )
pulseaudio? ( media-libs/libpulse[${MULTILIB_USEDEP}] )
scanner? ( media-gfx/sane-backends[${MULTILIB_USEDEP}] )
+ smartcard? ( sys-apps/pcsc-lite[${MULTILIB_USEDEP}] )
udev? ( virtual/libudev:=[${MULTILIB_USEDEP}] )
- wayland? ( dev-libs/wayland[${MULTILIB_USEDEP}] )
unwind? (
llvm-libunwind? ( sys-libs/llvm-libunwind[${MULTILIB_USEDEP}] )
!llvm-libunwind? ( sys-libs/libunwind:=[${MULTILIB_USEDEP}] )
)
- usb? ( dev-libs/libusb:1[${MULTILIB_USEDEP}] )"
+ usb? ( dev-libs/libusb:1[${MULTILIB_USEDEP}] )
+ wayland? ( dev-libs/wayland[${MULTILIB_USEDEP}] )"
RDEPEND="
${WINE_COMMON_DEPEND}
app-emulation/wine-desktop-common
- dos? ( games-emulation/dosbox )
- gecko? ( app-emulation/wine-gecko:${WINE_GECKO}[${MULTILIB_USEDEP}] )
+ dos? (
+ || (
+ games-emulation/dosbox
+ games-emulation/dosbox-staging
+ )
+ )
+ gecko? (
+ app-emulation/wine-gecko:${WINE_GECKO}[${MULTILIB_USEDEP}]
+ wow64? ( app-emulation/wine-gecko[abi_x86_32] )
+ )
gstreamer? ( media-plugins/gst-plugins-meta:1.0[${MULTILIB_USEDEP}] )
mono? ( app-emulation/wine-mono:${WINE_MONO} )
perl? (
@@ -112,25 +127,34 @@ DEPEND="
${WINE_COMMON_DEPEND}
sys-kernel/linux-headers
X? ( x11-base/xorg-proto )
- wayland? (
- dev-util/wayland-scanner
- dev-libs/wayland-protocols
- )"
+ wayland? ( dev-libs/wayland-protocols )"
BDEPEND="
+ || (
+ sys-devel/binutils
+ sys-devel/lld
+ )
dev-lang/perl
- sys-devel/binutils
sys-devel/bison
sys-devel/flex
virtual/pkgconfig
mingw? ( !crossdev-mingw? (
>=dev-util/mingw64-toolchain-10.0.0_p1-r2[${MULTILIB_USEDEP}]
+ wow64? ( dev-util/mingw64-toolchain[abi_x86_32] )
) )
- nls? ( sys-devel/gettext )"
+ nls? ( sys-devel/gettext )
+ wayland? ( dev-util/wayland-scanner )"
IDEPEND=">=app-eselect/eselect-wine-2"
+QA_CONFIG_IMPL_DECL_SKIP=(
+ __clear_cache # unused on amd64+x86 (bug #900338)
+ res_getservers # false positive
+)
QA_TEXTRELS="usr/lib/*/wine/i386-unix/*.so" # uses -fno-PIC -Wl,-z,notext
PATCHES=(
+ "${FILESDIR}"/wine-vanilla-7.0-noexecstack.patch
+ "${FILESDIR}"/wine-vanilla-7.20-unwind.patch
+ "${FILESDIR}"/wine-vanilla-8.13-rpath.patch
)
pkg_pretend() {
@@ -138,7 +162,8 @@ pkg_pretend() {
if use crossdev-mingw && [[ ! -v MINGW_BYPASS ]]; then
local mingw=-w64-mingw32
- for mingw in $(usev abi_x86_64 x86_64${mingw}) $(usev abi_x86_32 i686${mingw}); do
+ for mingw in $(usev abi_x86_64 x86_64${mingw}) \
+ $(use abi_x86_32 || use wow64 && echo i686${mingw}); do
if ! type -P ${mingw}-gcc >/dev/null; then
eerror "With USE=crossdev-mingw, you must prepare the MinGW toolchain"
eerror "yourself by installing sys-devel/crossdev then running:"
@@ -164,9 +189,28 @@ src_prepare() {
default
+ if tc-is-clang; then
+ if use mingw; then
+ # -mabi=ms was ignored by <clang:16 then turned error in :17
+ # if used without --target *-windows, then gets used in install
+ # phase despite USE=mingw, drop as a quick fix for now
+ sed -i '/MSVCRTFLAGS=/s/-mabi=ms//' configure.ac || die
+ else
+ # fails in ./configure unless --enable-archs is passed, allow to
+ # bypass with EXTRA_ECONF but is currently considered unsupported
+ # (by Gentoo) as additional work is needed for (proper) support
+ # note: also fails w/ :17, but unsure if safe to drop w/o mingw
+ [[ ${EXTRA_ECONF} == *--enable-archs* ]] ||
+ die "building ${PN} with clang is only supported with USE=mingw"
+ fi
+ fi
+
# ensure .desktop calls this variant + slot
sed -i "/^Exec=/s/wine /${P} /" loader/wine.desktop || die
+ # datadir is not where wine-mono is installed, so prefixy alternate paths
+ hprefixify -w /get_mono_path/ dlls/mscoree/metahost.c
+
# always update for patches (including user's wrt #432348)
eautoreconf
tools/make_requests || die # perl
@@ -182,9 +226,13 @@ src_configure() {
--includedir="${EPREFIX}"/usr/include/${P}
--libdir="${EPREFIX}"${WINE_PREFIX}
--mandir="${EPREFIX}"${WINE_DATADIR}/man
+
+ $(usev wow64 --enable-archs=x86_64,i386)
+
$(use_enable gecko mshtml)
$(use_enable mono mscoree)
--disable-tests
+
$(use_with X x)
$(use_with alsa)
$(use_with capi)
@@ -205,6 +253,7 @@ src_configure() {
$(use_with pulseaudio pulse)
$(use_with scanner sane)
$(use_with sdl)
+ $(use_with smartcard pcsclite)
$(use_with ssl gnutls)
$(use_with truetype freetype)
$(use_with udev)
@@ -219,19 +268,56 @@ src_configure() {
$(usev !odbc ac_cv_lib_soname_odbc=)
)
- tc-ld-force-bfd # builds with non-bfd but broken at runtime (bug #867097)
filter-lto # build failure
- use mingw || filter-flags -fno-plt # build failure
use custom-cflags || strip-flags # can break in obscure ways at runtime
- use crossdev-mingw || PATH=${BROOT}/usr/lib/mingw64-toolchain/bin:${PATH}
- # temporary workaround for tc-ld-force-bfd not yet enforcing with mold
- # https://github.com/gentoo/gentoo/pull/28355
- [[ $($(tc-getCC) ${LDFLAGS} -Wl,--version 2>/dev/null) == mold* ]] &&
- append-ldflags -fuse-ld=bfd
+ # wine uses linker tricks unlikely to work with non-bfd/lld (bug #867097)
+ # (do self test until https://github.com/gentoo/gentoo/pull/28355)
+ if [[ $(LC_ALL=C $(tc-getCC) ${LDFLAGS} -Wl,--version 2>/dev/null) != @(LLD|GNU\ ld)* ]]
+ then
+ has_version -b sys-devel/binutils &&
+ append-ldflags -fuse-ld=bfd ||
+ append-ldflags -fuse-ld=lld
+ strip-unsupported-flags
+ fi
+
+ if use mingw; then
+ use crossdev-mingw || PATH=${BROOT}/usr/lib/mingw64-toolchain/bin:${PATH}
+
+ filter-flags -fno-plt # build failure
+
+ # CROSSCC was formerly recognized by wine, thus been using similar
+ # variables (subject to change, esp. if ever make a mingw.eclass).
+ local mingwcc_amd64=${CROSSCC:-${CROSSCC_amd64:-x86_64-w64-mingw32-gcc}}
+ local mingwcc_x86=${CROSSCC:-${CROSSCC_x86:-i686-w64-mingw32-gcc}}
+ local -n mingwcc=mingwcc_$(usex abi_x86_64 amd64 x86)
+
+ conf+=(
+ ac_cv_prog_x86_64_CC="${mingwcc_amd64}"
+ ac_cv_prog_i386_CC="${mingwcc_x86}"
- # build using upstream's way (--with-wine64)
- # order matters: configure+compile 64->32, install 32->64
+ CROSSCFLAGS="${CROSSCFLAGS:-$(
+ filter-flags '-fstack-protector*' #870136
+ filter-flags '-mfunction-return=thunk*' #878849
+
+ # -mavx with mingw-gcc has a history of obscure issues and
+ # disabling is seen as safer, e.g. `WINEARCH=win32 winecfg`
+ # crashes with -march=skylake >=wine-8.10, similar issues with
+ # znver4: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110273
+ append-cflags -mno-avx #912268
+
+ CC=${mingwcc} test-flags-CC ${CFLAGS:--O2}
+ )}"
+
+ CROSSLDFLAGS="${CROSSLDFLAGS:-$(
+ filter-flags '-fuse-ld=*'
+
+ CC=${mingwcc} test-flags-CCLD ${LDFLAGS}
+ )}"
+ )
+ fi
+
+ # order matters with multilib: configure+compile 64->32, install 32->64
local -i bits
for bits in $(usev abi_x86_64 64) $(usev abi_x86_32 32); do
(
@@ -240,10 +326,7 @@ src_configure() {
mkdir ../build${bits} || die
cd ../build${bits} || die
- pe_arch=i386
if (( bits == 64 )); then
- pe_arch=x86_64
- : "${CROSSCC:=${CROSSCC_amd64:-x86_64-w64-mingw32-gcc}}"
conf+=( --enable-win64 )
elif use amd64; then
conf+=(
@@ -253,26 +336,6 @@ src_configure() {
# _setup is optional, but use over Wine's auto-detect (+#472038)
multilib_toolchain_setup x86
fi
- : "${CROSSCC:=${CROSSCC_x86:-i686-w64-mingw32-gcc}}"
-
- if use mingw; then
- # CROSSCC is no longer recognized by Wine, but still use for now
- # (future handling for CROSS* variables is subject to changes)
- conf+=( ac_cv_prog_${pe_arch}_CC="${CROSSCC}" )
-
- # use *FLAGS for mingw, but strip unsupported
- : "${CROSSCFLAGS:=$(
- # >=wine-7.21 configure.ac no longer adds -fno-strict by mistake
- append-cflags '-fno-strict-aliasing'
- filter-flags '-fstack-clash-protection' #758914
- filter-flags '-fstack-protector*' #870136
- filter-flags '-mfunction-return=thunk*' #878849
- CC=${CROSSCC} test-flags-CC ${CFLAGS:--O2})}"
- : "${CROSSLDFLAGS:=$(
- filter-flags '-fuse-ld=*'
- CC=${CROSSCC} test-flags-CCLD ${LDFLAGS})}"
- export CROSS{C,LD}FLAGS
- fi
ECONF_SOURCE=${S} econf "${conf[@]}"
)
@@ -288,17 +351,27 @@ src_install() {
use abi_x86_32 && emake DESTDIR="${D}" -C ../build32 install
use abi_x86_64 && emake DESTDIR="${D}" -C ../build64 install # do last
- # symlink for plain 'wine' and install its man pages if 64bit-only #404331
- if use abi_x86_64 && use !abi_x86_32; then
- dosym wine64 ${WINE_PREFIX}/bin/wine
- dosym wine64-preloader ${WINE_PREFIX}/bin/wine-preloader
- local man
- for man in ../build64/loader/wine.*man; do
- : "${man##*/wine}"
- : "${_%.*}"
- insinto ${WINE_DATADIR}/man/${_:+${_#.}/}man1
- newins ${man} wine.1
- done
+ # Ensure both wine64 and wine are available if USE=abi_x86_64 (wow64,
+ # -abi_x86_32, and/or EXTRA_ECONF could cause varying scenarios where
+ # one or the other could be missing and that is unexpected for users
+ # and some tools like winetricks)
+ if use abi_x86_64; then
+ if [[ -e ${ED}${WINE_PREFIX}/bin/wine64 && ! -e ${ED}${WINE_PREFIX}/bin/wine ]]; then
+ dosym wine64 ${WINE_PREFIX}/bin/wine
+ dosym wine64-preloader ${WINE_PREFIX}/bin/wine-preloader
+
+ # also install wine(1) man pages (incl. translations)
+ local man
+ for man in ../build64/loader/wine.*man; do
+ : "${man##*/wine}"
+ : "${_%.*}"
+ insinto ${WINE_DATADIR}/man/${_:+${_#.}/}man1
+ newins ${man} wine.1
+ done
+ elif [[ ! -e ${ED}${WINE_PREFIX}/bin/wine64 && -e ${ED}${WINE_PREFIX}/bin/wine ]]; then
+ dosym wine ${WINE_PREFIX}/bin/wine64
+ dosym wine-preloader ${WINE_PREFIX}/bin/wine64-preloader
+ fi
fi
use perl || rm "${ED}"${WINE_DATADIR}/man/man1/wine{dump,maker}.1 \
@@ -310,19 +383,30 @@ src_install() {
make_wrapper "${bin##*/}-${P#wine-}" "${bin#"${ED}"}"
done
- # don't let portage try to strip PE files with the wrong
- # strip executable and instead handle it here (saves ~120MB)
if use mingw; then
+ # don't let portage try to strip PE files with the wrong
+ # strip executable and instead handle it here (saves ~120MB)
dostrip -x ${WINE_PREFIX}/wine/{i386,x86_64}-windows
- use debug ||
+
+ if use strip; then
+ ebegin "Stripping Windows (PE) binaries"
find "${ED}"${WINE_PREFIX}/wine/*-windows -regex '.*\.\(a\|dll\|exe\)' \
- -exec $(usex abi_x86_64 x86_64 i686)-w64-mingw32-strip --strip-unneeded {} + || die
+ -exec $(usex abi_x86_64 x86_64 i686)-w64-mingw32-strip --strip-unneeded {} +
+ eend ${?} || die
+ fi
fi
dodoc ANNOUNCE AUTHORS README* documentation/README*
}
pkg_postinst() {
+ if use !abi_x86_32 && use !wow64; then
+ ewarn "32bit support is disabled. While 64bit applications themselves will"
+ ewarn "work, be warned that it is not unusual that installers or other helpers"
+ ewarn "will attempt to use 32bit and fail. If do not want full USE=abi_x86_32,"
+ ewarn "note the experimental/WIP USE=wow64 can allow 32bit without multilib."
+ fi
+
eselect wine update --if-unset || die
}