commit: f53d1bd478c460721be936f7691ba5744471edb6 Author: Ionen Wolkens <ionen <AT> gentoo <DOT> org> AuthorDate: Fri Sep 9 14:37:37 2022 +0000 Commit: Ionen Wolkens <ionen <AT> gentoo <DOT> org> CommitDate: Sat Sep 10 09:47:14 2022 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=f53d1bd4
app-emulation/wine-vanilla: use new ebuild for 7.0-r3 Based on wine-proton's rewritten ebuild with added logic to handle additional USE that are being forced in wine-proton but should be optional here. 7.17 to follow in a bump. Main goal is to make this hopefully easier to maintain and cleanup ancient constructs that haven't been relevant in 10+ years. Also fixes a few misc issues. List likely incomplete as haven't kept track of everything while writing wine-proton's ebuild, but for some notable differences compared to older ebuilds: - use upstream's way to handle multilib (--with-wine64) to ensure wow64 combined build is done as it should > like before it still allows 4 types, outline for clarity: amd64, abi_x86_32, abi_x86_64: full wow64, uses --with-wine64 amd64, -abi_x86_32, abi_x86_64: wine -> wine64, no --with-wine64 amd64, abi_x86_32, -abi_x86_64: default 32bit-only build, on 64bit x86, abi_x86_32, -abi_x86_64: default with nothing special - some other differences for ABI handling: > use /usr/lib/<variant> for both rather than lib64 > read CROSSCC_x86/CROSSCC_amd64 on top of wine's CROSSCC > CROSS flags check is done per-ABI rather than once for both > rely on MULTILIB_COMPAT to set REQUIRED_USE - force ld.bfd wrt bug #867097 and bug #744829, the various linker tricks currently make it unrealistic to use anything else and workarounds are insufficient for non-broken runtime even if it builds (note can still build with clang, it's lld/mold that lead to issues) - set QA_TEXTREL wrt bug #746338, seems expected given wine does these with -fno-PIC -Wl,-z,notext (aka don't treat DT_TEXTREL as errors) - fix execstack warnings for stub libraries (likely benign, just noisy) - handle stripping of PE files manually given portage doesn't know the right strip executable to use which resulted in warnings, potential mangling, and ignoring .exe/.dll files - use --<exact> for eselect-wine rather than --all to reduce noise - nonfatal eselect-wine for prerm, this allows removing wine in the event it was already deregistered notably if postinst's eselect-wine failed (which gives an error but doesn't fail installation) - do maintainer-oriented sanity check for matching mono on top of gecko's, check is always done regardless of USE and is only nonfatal for live version - various deps revisions, hopefully more pedantic, for some notes: > split dlopen'ed deps for clarity, these "could" be runtime optfeatures but realistically want wine to work as expected (split makes it easier to handle app-portage/iwdevtools' qa-vdb reports which gives a list of libraries it believes can be removed... and it turns out to be the dlopen list) > yacc -> bison, this explicitly looks for bison > XML-Simple -> XML-LibXML, it's what winemaker actually uses > move extras under X?, per configure.ac they are no-op if X is unset - IUSE newly enabled by default: > gstreamer: crippled without this and is only set by gnome profile > mingw: wine been focusing on PE conversions and most distros offer mingw builds making users hit unexpected issues if disabled (no longer need crossdev for this, so default is more reasonable now) > sdl: input devices like gamepads not being functional can be unexpected and unclear as to why (albeit desktop profile sets this) > vkd3d: matches later versions that have it always enabled as a bundled PE build > vulkan: grown in importance and matches already-default opengl - IUSE newly disabled by default: > perl: winemaker/dump are very rarely needed and may pull a chain of modules for no reason > udisks: unimportant for common usage and handled by desktop profile - IUSE added (disabled by default): > debug: to skip stripping of PE files, like other mingw packages > llvm-libunwind: use over libunwind - IUSE removed: > mp3: was a no-op forgotten IUSE > oss: this is ossv4 support which needs unpackaged media-sound/oss and a patched kernel, makes little sense to expose as USE that sometime confuse users (use EXTRA_ECONF=--with-oss instead) > realtime: wrt bug #753698, drop dependency on rtkit > run-exes: leave .desktop's MimeType alone (force current default), not convinced a USE to sed MimeType out makes sense and untrusted potentially harmful files are not limited to .exe, could be doing this for every .desktop (...don't open untrusted files, or use a user patch if really must) > threads: leave it up to defaults, no need to touch this (dos/samba optfeature'ish USE could make sense to remove but left alone for now) - no warnings if disable mono/gecko defaults, does not feel necessary - skip some unnecessary cruft, like > PATCHES_BIN code, unsure when this was last used > QA_DESKTOP_FILE, these are installed by wine-desktop-common > PLOCALES, wine been generating po/LINGUAS itself since wine-1.9.5 > xdg.eclass, updates are done by eselect-wine after putting files in a path xdg tools will recognize (meaningless in ebuild) > --enable-hal, like tons of --enable-* switches, it wasn't needed and only an issue because ebuild used to pass a hard --disable-hal > opencl 32bit check, virtual/opencl is different nowadays using a glvnd-like loader and it doesn't prevent building support even if there's ultimately no backend to load (not our job to check that), furthermore the test used eselect-opencl that is gone from the tree > env_vcs_vars: the eclass already inform of variables to use even in a multi-repo context (and -vanilla is not even multi) - not skipping l18n man pages + README based on LINGUAS (normally not used for this and is small files, use INSTALL_MASK if unwanted) - no multislot-apploader.patch, haven't found a way in which this matters with current layout and scripts seem to use the right slot - no multilib-portage.patch, need to support multilib-portage was already non-existent and got further dropped by a council vote - no winegcc.patch, unsure if was still relevant with current ebuilds but there is no known winegcc build issues with the new one - always run make_requests to handle patches rather than check md5sum, make_vulkan could make sense too but that requires adding python logic to the ebuild for something that's normally unneeded (make_requests is only optional for vanilla without user patches) - not using gentoo-wine-patches tarball, debatable but feel there's too few patches (and small) to be worth sharing across variants anymore (which may need rebasing anyway), and this skips the need to have per-developer URI logic/updates to maintain the tarball > also drop the hires icon it contained, questionable whether Gentoo should even handle this rather than use upstream's (ideally ping upstream's issue for attention instead, but could consider reinstating if it's really wanted) - use Wine's new gitlab, has more capabilities (e.g. shallow clones) - LICENSE update to include bundled libraries, e.g. libpng (not unbundled given PE files can't use system's ELF libraries) - copyright header reset to 2022-only, not based on old ebuilds Attempted to support tests (which previous ebuilds restricted), but concluded that skipping enough for a working subset would be too difficult to maintain, not to mention sandbox violations to fix and how easily it can hang. Bug: https://bugs.gentoo.org/744829 Bug: https://bugs.gentoo.org/746338 Bug: https://bugs.gentoo.org/753698 Bug: https://bugs.gentoo.org/867097 Signed-off-by: Ionen Wolkens <ionen <AT> gentoo.org> .../files/wine-vanilla-7.0-llvm-libunwind.patch | 9 + .../files/wine-vanilla-7.0-noexecstack.patch | 7 + .../wine-vanilla/wine-vanilla-7.0-r3.ebuild | 318 +++++++++++++++++++++ 3 files changed, 334 insertions(+) diff --git a/app-emulation/wine-vanilla/files/wine-vanilla-7.0-llvm-libunwind.patch b/app-emulation/wine-vanilla/files/wine-vanilla-7.0-llvm-libunwind.patch new file mode 100644 index 000000000000..eaec4d898b98 --- /dev/null +++ b/app-emulation/wine-vanilla/files/wine-vanilla-7.0-llvm-libunwind.patch @@ -0,0 +1,9 @@ +Note the dodgy _CONFIG_H_ check can be removed when >=llvm-libunwind-15 +(which adds _VERSION) is well established: https://reviews.llvm.org/D121015 +--- a/dlls/ntdll/unix/signal_x86_64.c ++++ b/dlls/ntdll/unix/signal_x86_64.c +@@ -1359,3 +1359,3 @@ + +-#ifdef __APPLE__ ++#if defined(__APPLE__) || defined(_LIBUNWIND_VERSION) || defined(____LIBUNWIND_CONFIG_H__) + rc = unw_getcontext( &unw_context ); diff --git a/app-emulation/wine-vanilla/files/wine-vanilla-7.0-noexecstack.patch b/app-emulation/wine-vanilla/files/wine-vanilla-7.0-noexecstack.patch new file mode 100644 index 000000000000..92aa0b4b5c5d --- /dev/null +++ b/app-emulation/wine-vanilla/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-vanilla/wine-vanilla-7.0-r3.ebuild b/app-emulation/wine-vanilla/wine-vanilla-7.0-r3.ebuild new file mode 100644 index 000000000000..8aef3c25fdd6 --- /dev/null +++ b/app-emulation/wine-vanilla/wine-vanilla-7.0-r3.ebuild @@ -0,0 +1,318 @@ +# Copyright 2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +MULTILIB_COMPAT=( abi_x86_{32,64} ) +inherit autotools flag-o-matic multilib multilib-build toolchain-funcs wrapper + +WINE_GECKO=2.47.2 +WINE_MONO=7.0.0 + +if [[ ${PV} == *9999 ]]; then + inherit git-r3 + EGIT_REPO_URI="https://gitlab.winehq.org/wine/wine.git" +else + (( $(ver_cut 2) )) && WINE_SDIR=$(ver_cut 1).x || WINE_SDIR=$(ver_cut 1).0 + SRC_URI="https://dl.winehq.org/wine/source/${WINE_SDIR}/wine-${PV}.tar.xz" + S="${WORKDIR}/wine-${PV}" + KEYWORDS="-* ~amd64 ~x86" +fi + +DESCRIPTION="Free implementation of Windows(tm) on Unix, without external patchsets" +HOMEPAGE="https://www.winehq.org/" + +LICENSE="LGPL-2.1+ BSD-2 IJG MIT 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 ldap +mingw +mono netapi nls odbc openal + opencl +opengl osmesa pcap perl pulseaudio samba scanner +sdl + selinux +ssl +truetype udev udisks +unwind usb v4l +vkd3d +vulkan + +xcomposite xinerama" +REQUIRED_USE=" + X? ( truetype ) + crossdev-mingw? ( mingw )" # bug #551124 for truetype + +# tests are non-trivial to run, can hang easily, don't play well with +# sandbox, and several need real opengl/vulkan or network access +RESTRICT="test" + +# `grep WINE_CHECK_SONAME configure.ac` + if not directly linked +WINE_DLOPEN_DEPEND=" + X? ( + x11-libs/libXcursor[${MULTILIB_USEDEP}] + x11-libs/libXfixes[${MULTILIB_USEDEP}] + x11-libs/libXi[${MULTILIB_USEDEP}] + x11-libs/libXrandr[${MULTILIB_USEDEP}] + x11-libs/libXrender[${MULTILIB_USEDEP}] + x11-libs/libXxf86vm[${MULTILIB_USEDEP}] + opengl? ( + media-libs/libglvnd[X,${MULTILIB_USEDEP}] + osmesa? ( media-libs/mesa[osmesa,${MULTILIB_USEDEP}] ) + ) + xcomposite? ( x11-libs/libXcomposite[${MULTILIB_USEDEP}] ) + xinerama? ( x11-libs/libXinerama[${MULTILIB_USEDEP}] ) + ) + cups? ( net-print/cups[${MULTILIB_USEDEP}] ) + fontconfig? ( media-libs/fontconfig[${MULTILIB_USEDEP}] ) + kerberos? ( virtual/krb5[${MULTILIB_USEDEP}] ) + netapi? ( net-fs/samba[${MULTILIB_USEDEP}] ) + odbc? ( dev-db/unixODBC[${MULTILIB_USEDEP}] ) + sdl? ( media-libs/libsdl2[haptic,joystick,${MULTILIB_USEDEP}] ) + ssl? ( net-libs/gnutls:=[${MULTILIB_USEDEP}] ) + truetype? ( media-libs/freetype[${MULTILIB_USEDEP}] ) + udisks? ( sys-apps/dbus[${MULTILIB_USEDEP}] ) + v4l? ( media-libs/libv4l[${MULTILIB_USEDEP}] ) + vulkan? ( media-libs/vulkan-loader[${MULTILIB_USEDEP}] )" +WINE_COMMON_DEPEND=" + ${WINE_DLOPEN_DEPEND} + X? ( + x11-libs/libX11[${MULTILIB_USEDEP}] + x11-libs/libXext[${MULTILIB_USEDEP}] + ) + alsa? ( media-libs/alsa-lib[${MULTILIB_USEDEP}] ) + capi? ( net-libs/libcapi:=[${MULTILIB_USEDEP}] ) + gphoto2? ( media-libs/libgphoto2:=[${MULTILIB_USEDEP}] ) + gstreamer? ( + dev-libs/glib:2[${MULTILIB_USEDEP}] + media-libs/gst-plugins-base:1.0[${MULTILIB_USEDEP}] + media-libs/gstreamer:1.0[${MULTILIB_USEDEP}] + ) + ldap? ( net-nds/openldap:=[${MULTILIB_USEDEP}] ) + openal? ( media-libs/openal[${MULTILIB_USEDEP}] ) + opencl? ( virtual/opencl[${MULTILIB_USEDEP}] ) + pcap? ( net-libs/libpcap[${MULTILIB_USEDEP}] ) + pulseaudio? ( media-libs/libpulse[${MULTILIB_USEDEP}] ) + scanner? ( media-gfx/sane-backends[${MULTILIB_USEDEP}] ) + udev? ( virtual/libudev:=[${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}] ) + vkd3d? ( >=app-emulation/vkd3d-1.2[${MULTILIB_USEDEP}] )" +RDEPEND=" + ${WINE_COMMON_DEPEND} + app-emulation/wine-desktop-common + dos? ( games-emulation/dosbox ) + gecko? ( app-emulation/wine-gecko:${WINE_GECKO}[${MULTILIB_USEDEP}] ) + gstreamer? ( media-plugins/gst-plugins-meta:1.0[${MULTILIB_USEDEP}] ) + mono? ( app-emulation/wine-mono:${WINE_MONO} ) + perl? ( + dev-lang/perl + dev-perl/XML-LibXML + ) + samba? ( net-fs/samba[winbind] ) + selinux? ( sec-policy/selinux-wine ) + udisks? ( sys-fs/udisks:2 )" +DEPEND=" + ${WINE_COMMON_DEPEND} + sys-kernel/linux-headers + X? ( x11-base/xorg-proto )" +BDEPEND=" + dev-lang/perl + sys-devel/bison + sys-devel/flex + virtual/pkgconfig + mingw? ( !crossdev-mingw? ( dev-util/mingw64-toolchain[${MULTILIB_USEDEP}] ) ) + nls? ( sys-devel/gettext )" +IDEPEND="app-eselect/eselect-wine" + +QA_TEXTRELS="usr/lib/*/wine/i386-unix/*.so" # uses -fno-PIC -Wl,-z,notext + +PATCHES=( + "${FILESDIR}"/${PN}-7.0-llvm-libunwind.patch + "${FILESDIR}"/${PN}-7.0-noexecstack.patch +) + +pkg_pretend() { + [[ ${MERGE_TYPE} == binary ]] && return + + 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 + 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:" + eerror + eerror " crossdev --target ${mingw}" + eerror + eerror "For more information, please see: https://wiki.gentoo.org/wiki/Mingw" + die "USE=crossdev-mingw is enabled, but ${mingw}-gcc was not found" + fi + done + fi +} + +src_prepare() { + # sanity check, bumping these has a history of oversights + local geckomono=$(sed -En '/^#define (GECKO|MONO)_VER/{s/[^0-9.]//gp}' \ + dlls/appwiz.cpl/addons.c || die) + if [[ ${WINE_GECKO}$'\n'${WINE_MONO} != "${geckomono}" ]]; then + local gmfatal= + [[ ${PV} == *9999 ]] && gmfatal=nonfatal + ${gmfatal} die -n "gecko/mono mismatch in ebuild, has: " ${geckomono} " (please file a bug)" + fi + + default + + # ensure .desktop calls this variant + slot + sed -i "/^Exec=/s/wine /${P} /" loader/wine.desktop || die + + # always update for patches (including user's wrt #432348) + eautoreconf + tools/make_requests || die # perl +} + +src_configure() { + WINE_PREFIX=/usr/lib/${P} + WINE_DATADIR=/usr/share/${P} + + local conf=( + --prefix="${EPREFIX}"${WINE_PREFIX} + --datadir="${EPREFIX}"${WINE_DATADIR} + --includedir="${EPREFIX}"/usr/include/${P} + --libdir="${EPREFIX}"${WINE_PREFIX} + --mandir="${EPREFIX}"${WINE_DATADIR}/man + $(use_enable gecko mshtml) + $(use_enable mono mscoree) + --disable-tests + $(use_with X x) + $(use_with alsa) + $(use_with capi) + $(use_with cups) + $(use_with fontconfig) + $(use_with gphoto2 gphoto) + $(use_with gstreamer) + $(use_with kerberos gssapi) + $(use_with kerberos krb5) + $(use_with ldap) + $(use_with mingw) + $(use_with netapi) + $(use_with nls gettext) + $(use_with openal) + $(use_with opencl) + $(use_with opengl) + $(use_with osmesa) + --without-oss # media-sound/oss is not packaged (OSSv4) + $(use_with pcap) + $(use_with pulseaudio pulse) + $(use_with scanner sane) + $(use_with sdl) + $(use_with ssl gnutls) + $(use_with truetype freetype) + $(use_with udev) + $(use_with udisks dbus) # dbus is only used for udisks + $(use_with unwind) + $(use_with usb) + $(use_with v4l v4l2) + $(use_with vkd3d) + $(use_with vulkan) + $(use_with xcomposite) + $(use_with xinerama) + $(usev !odbc ac_cv_lib_soname_odbc=) + ) + + tc-ld-force-bfd #867097 + use custom-cflags || strip-flags # can break in obscure ways, also no lto + use crossdev-mingw || PATH=${BROOT}/usr/lib/mingw64-toolchain/bin:${PATH} + + # build using upstream's way (--with-wine64) + # order matters: configure+compile 64->32, install 32->64 + local -i bits + for bits in $(usev abi_x86_64 64) $(usev abi_x86_32 32); do + ( + einfo "Configuring ${PN} for ${bits}bits in ${WORKDIR}/build${bits} ..." + + mkdir ../build${bits} || die + cd ../build${bits} || die + + # CROSSCC_amd64/x86 are unused by Wine, but recognized here for users + if (( bits == 64 )); then + : "${CROSSCC:=${CROSSCC_amd64:-x86_64-w64-mingw32-gcc}}" + conf+=( --enable-win64 ) + elif use amd64; then + conf+=( + $(usev abi_x86_64 --with-wine64=../build64) + TARGETFLAGS=-m32 # for widl + ) + # _setup is optional, but use over Wine's auto-detect (+#472038) + multilib_toolchain_setup x86 + fi + : "${CROSSCC:=${CROSSCC_x86:-i686-w64-mingw32-gcc}}" + + # use *FLAGS for mingw, but strip unsupported (e.g. --hash-style=gnu) + if use mingw; then + : "${CROSSCFLAGS:=$(CC=${CROSSCC} test-flags-CC ${CFLAGS:--O2})}" + : "${CROSSLDFLAGS:=$( + filter-flags '-fuse-ld=*' + CC=${CROSSCC} test-flags-CCLD ${LDFLAGS})}" + export CROSS{CC,{C,LD}FLAGS} + fi + + ECONF_SOURCE=${S} econf "${conf[@]}" + ) + done +} + +src_compile() { + use abi_x86_64 && emake -C ../build64 # do first + use abi_x86_32 && emake -C ../build32 +} + +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 + fi + + use perl || rm "${ED}"${WINE_DATADIR}/man/man1/wine{dump,maker}.1 \ + "${ED}"${WINE_PREFIX}/bin/{function_grep.pl,wine{dump,maker}} || die + + # create variant wrappers for eselect-wine + local bin + for bin in "${ED}"${WINE_PREFIX}/bin/*; do + 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 + dostrip -x ${WINE_PREFIX}/wine/{i386,x86_64}-windows + use debug || + find "${ED}"${WINE_PREFIX}/wine/*-windows -regex '.*\.\(a\|dll\|exe\)' \ + -exec $(usex abi_x86_64 x86_64 i686)-w64-mingw32-strip --strip-unneeded {} + || die + fi + + dodoc ANNOUNCE AUTHORS README* documentation/README* +} + +wine-eselect() { + ebegin "${1^}ing ${P} using eselect-wine" + eselect wine ${1} ${P} && + eselect wine ${1} --${PN#wine-} ${P} && + eselect wine update --if-unset && + eselect wine update --${PN#wine-} --if-unset + eend ${?} || die -n "eselect failed, may need to manually handle ${P}" +} + +pkg_postinst() { + wine-eselect register +} + +pkg_prerm() { + nonfatal wine-eselect deregister +}