diff options
author | Ionen Wolkens <ionen@gentoo.org> | 2022-05-10 19:26:08 -0400 |
---|---|---|
committer | Ionen Wolkens <ionen@gentoo.org> | 2022-09-03 15:46:00 -0400 |
commit | 2e0980beada259e57077f4b99d068d3b85557d28 (patch) | |
tree | 42932c8234d1ec90f060f0c2e7aa61bd3927e49c /app-emulation/wine-proton | |
parent | app-eselect/eselect-wine: EAPI6->8, add proton variant (diff) | |
download | gentoo-2e0980beada259e57077f4b99d068d3b85557d28.tar.gz gentoo-2e0980beada259e57077f4b99d068d3b85557d28.tar.bz2 gentoo-2e0980beada259e57077f4b99d068d3b85557d28.zip |
app-emulation/wine-proton: new package, add 7.0.4
This is Valve's modified wine fork as used by Proton (includes
various workarounds for games, fsync support, etc...), which
can be used independently as a eselect'able Wine variant.
Also using a new experimental ebuild that's not based on existing
Wine ones -- may have regressions unrelated to the variant itself.
Trims some ancient unnecessary bits, skips a few things I feel the
ebuild doesn't need to handle, and change build method a bit.
Signed-off-by: Ionen Wolkens <ionen@gentoo.org>
Diffstat (limited to 'app-emulation/wine-proton')
7 files changed, 414 insertions, 0 deletions
diff --git a/app-emulation/wine-proton/Manifest b/app-emulation/wine-proton/Manifest new file mode 100644 index 000000000000..69394f0077a5 --- /dev/null +++ b/app-emulation/wine-proton/Manifest @@ -0,0 +1 @@ +DIST proton-wine-7.0-4.tar.gz 45561670 BLAKE2B 0bc3432e5aa9ca1655e76b31dcbef08febe263e07d3635d005fbc7798b3a08fa50e2e736f33b18700f187dc755f012d7e8ae3edae6a63fb433cd9b8861b747b0 SHA512 dccdf4115e2a7c92981163783f5705e78fbfa042f06123e4802251bd2c558e8b4de7e3d2e114a5d942f9493eb64fb7fdedff2e6e8b3f21ea1de1156456930d8c diff --git a/app-emulation/wine-proton/files/README.gentoo b/app-emulation/wine-proton/files/README.gentoo new file mode 100644 index 000000000000..988d28df7ddf --- /dev/null +++ b/app-emulation/wine-proton/files/README.gentoo @@ -0,0 +1,52 @@ +While this version of Wine is usable independently, it does contain some +Steam-oriented changes that may be unexpected. Notably C:\users\steamuser +is used rather than C:\users\<user-name> and it may be necessary to move +files if converting from non-proton Wine prefixes (like games' save files). + +To keep a low maintenance cost, these changes are not reverted in Gentoo +with the exception of re-enabling winemenubuilder for desktop entries. + +Also, given this Wine variant is oriented toward running games, some +normally unrelated features (e.g. ldap) may not have real upstream +(Valve) support. Because of this, some are left always disabled. + +If needed, use other variants for the more expected Wine behavior. + +--- + +Given Proton is not creating the Wine prefixes, some features are not +enabled by default and PROTON_* variables to control them are unrecognized. + +To (optionally) setup some notable defaults of Proton: +- export WINEFSYNC=1 +. Often improves performance for CPU-bound applications, recommended +. but should be left disabled if get crashes mentioning fsync errors. +. >Requires linux kernel >=5.16 if unpatched. +- export WINE_LARGE_ADDRESS_AWARE=1 +. Allows 32bit applications to access more memory, notably helps +. prevent crashes on memory-heavy applications while using dxvk below. +- WINEPREFIX=/path/to setup_dxvk.sh install --symlink +. Vulkan-based d3d9/10/11 that often provides both better performance +. and compatibility (strongly recommended). +. >Requires app-emulation/dxvk +- WINEPREFIX=/path/to setup_vkd3d_proton.sh install --symlink +. Like above, but for d3d12. Wine also supports vkd3d as-is but this +. is the modified fork used by Proton (may or may not be better). +. >Requires app-emulation/vkd3d-proton + +For some applications it may be better to disable these or do other +workarounds, see https://www.protondb.com/ for specific information. + +Many other proton-specific improvements / fixes are always enabled, and +some game-specific quirks are auto-enabled as needed (can see a few from +running winecfg). + +If have audio/video playback issues, note to look at GStreamer plugins. +Notably USE=ffmpeg on media-plugins/gst-plugins-meta which Proton normally +provide by default. + +--- + +If have other Wine variants installed, remember to either use `eselect wine` +to select this variant or call it as wine-proton. Note other available +variants may be auto-selected when removing/replacing a selected slot. diff --git a/app-emulation/wine-proton/files/wine-proton-7.0.4-llvm-libunwind.patch b/app-emulation/wine-proton/files/wine-proton-7.0.4-llvm-libunwind.patch new file mode 100644 index 000000000000..0086fa5e0353 --- /dev/null +++ b/app-emulation/wine-proton/files/wine-proton-7.0.4-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 +@@ -1370,3 +1370,3 @@ + +-#ifdef __APPLE__ ++#if defined(__APPLE__) || defined(_LIBUNWIND_VERSION) || defined(____LIBUNWIND_CONFIG_H__) + rc = unw_getcontext( &unw_context ); diff --git a/app-emulation/wine-proton/files/wine-proton-7.0.4-noexecstack.patch b/app-emulation/wine-proton/files/wine-proton-7.0.4-noexecstack.patch new file mode 100644 index 000000000000..92aa0b4b5c5d --- /dev/null +++ b/app-emulation/wine-proton/files/wine-proton-7.0.4-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-proton/files/wine-proton-7.0.4-restore-menubuilder.patch b/app-emulation/wine-proton/files/wine-proton-7.0.4-restore-menubuilder.patch new file mode 100644 index 000000000000..760340791060 --- /dev/null +++ b/app-emulation/wine-proton/files/wine-proton-7.0.4-restore-menubuilder.patch @@ -0,0 +1,14 @@ +Without Steam there is no launcher by default, users with more custom +setups may not need this but others will want access to desktop entries. +--- a/configure.ac ++++ b/configure.ac +@@ -3683,2 +3683,3 @@ + WINE_CONFIG_MAKEFILE(programs/winefile) ++WINE_CONFIG_MAKEFILE(programs/winemenubuilder) + WINE_CONFIG_MAKEFILE(programs/winemine) +--- a/loader/wine.inf.in ++++ b/loader/wine.inf.in +@@ -5630,2 +5630,3 @@ + [Services] ++HKLM,%CurrentVersion%\RunServices,"winemenubuilder",2,"%11%\winemenubuilder.exe -a -r" + HKLM,"System\CurrentControlSet\Services\Eventlog\Application",,16 diff --git a/app-emulation/wine-proton/metadata.xml b/app-emulation/wine-proton/metadata.xml new file mode 100644 index 000000000000..e0ea57df1f22 --- /dev/null +++ b/app-emulation/wine-proton/metadata.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd"> +<pkgmetadata> + <maintainer type="person"> + <email>ionen@gentoo.org</email> + <name>Ionen Wolkens</name> + </maintainer> + <maintainer type="project"> + <email>wine@gentoo.org</email> + <name>Wine</name> + </maintainer> + <use> + <flag name="crossdev-mingw"> + Use <pkg>sys-devel/crossdev</pkg> for the toolchain rather than + <pkg>dev-util/mingw64-toolchain</pkg> (requires manual setting up) + </flag> + <flag name="gecko">Enable mshtml support using <pkg>app-emulation/wine-gecko</pkg></flag> + <flag name="mono">Enable .NET support using <pkg>app-emulation/wine-mono</pkg></flag> + <flag name="osmesa">Enable off-screen rendering (OpenGL in bitmaps) support</flag> + <flag name="perl">Install helpers that require perl (winedump/winemaker)</flag> + <flag name="sdl">Enable gamepad support using <pkg>media-libs/libsdl2</pkg></flag> + <flag name="vkd3d">Enable DirectX 12 support using <pkg>app-emulation/vkd3d</pkg></flag> + </use> + <upstream> + <changelog>https://github.com/ValveSoftware/Proton/wiki/Changelog</changelog> + <remote-id type="github">ValveSoftware/wine</remote-id> + </upstream> +</pkgmetadata> diff --git a/app-emulation/wine-proton/wine-proton-7.0.4.ebuild b/app-emulation/wine-proton/wine-proton-7.0.4.ebuild new file mode 100644 index 000000000000..b78eed8c93c6 --- /dev/null +++ b/app-emulation/wine-proton/wine-proton-7.0.4.ebuild @@ -0,0 +1,303 @@ +# Copyright 2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +MULTILIB_COMPAT=( abi_x86_{32,64} ) +PYTHON_COMPAT=( python3_{8..11} ) +inherit autotools flag-o-matic multilib multilib-build \ + python-any-r1 readme.gentoo-r1 toolchain-funcs wrapper + +WINE_GECKO=2.47.3 +WINE_MONO=7.3.0 +WINE_PV=$(ver_rs 2 -) + +DESCRIPTION="Valve Software's fork of Wine" +HOMEPAGE="https://github.com/ValveSoftware/wine/" +SRC_URI="https://github.com/ValveSoftware/wine/archive/refs/tags/proton-wine-${WINE_PV}.tar.gz" +S="${WORKDIR}/${PN}-wine-${WINE_PV}" + +LICENSE="LGPL-2.1+ BSD-2 IJG MIT ZLIB gsm libpng2 libtiff" +SLOT="${PV}" +KEYWORDS="-* ~amd64 ~x86" +IUSE=" + +abi_x86_32 +abi_x86_64 +alsa crossdev-mingw custom-cflags debug + +fontconfig +gecko +gstreamer llvm-libunwind +mono nls openal + osmesa perl pulseaudio +sdl selinux +ssl udev udisks +unwind usb + v4l +vkd3d +xcomposite xinerama" + +WINE_DLOPEN_DEPEND=" + dev-libs/gmp:=[${MULTILIB_USEDEP}] + dev-libs/libgcrypt:=[${MULTILIB_USEDEP}] + media-libs/freetype[${MULTILIB_USEDEP}] + media-libs/libglvnd[X,${MULTILIB_USEDEP}] + media-libs/vulkan-loader[${MULTILIB_USEDEP}] + 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}] + fontconfig? ( media-libs/fontconfig[${MULTILIB_USEDEP}] ) + osmesa? ( media-libs/mesa[osmesa,${MULTILIB_USEDEP}] ) + sdl? ( media-libs/libsdl2[haptic,joystick,${MULTILIB_USEDEP}] ) + ssl? ( net-libs/gnutls:=[${MULTILIB_USEDEP}] ) + udisks? ( sys-apps/dbus[${MULTILIB_USEDEP}] ) + v4l? ( media-libs/libv4l[${MULTILIB_USEDEP}] ) + xcomposite? ( x11-libs/libXcomposite[${MULTILIB_USEDEP}] ) + xinerama? ( x11-libs/libXinerama[${MULTILIB_USEDEP}] )" +WINE_COMMON_DEPEND=" + ${WINE_DLOPEN_DEPEND} + x11-libs/libX11[${MULTILIB_USEDEP}] + x11-libs/libXext[${MULTILIB_USEDEP}] + alsa? ( media-libs/alsa-lib[${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}] + ) + openal? ( media-libs/openal[${MULTILIB_USEDEP}] ) + pulseaudio? ( media-libs/libpulse[${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 + 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 + ) + selinux? ( sec-policy/selinux-wine ) + udisks? ( sys-fs/udisks:2 )" +DEPEND=" + ${WINE_COMMON_DEPEND} + sys-kernel/linux-headers + x11-base/xorg-proto" +BDEPEND=" + ${PYTHON_DEPS} + dev-lang/perl + sys-devel/bison + sys-devel/flex + virtual/pkgconfig + nls? ( sys-devel/gettext ) + !crossdev-mingw? ( dev-util/mingw64-toolchain[${MULTILIB_USEDEP}] )" +IDEPEND=">=app-eselect/eselect-wine-1.2.2-r1" + +QA_TEXTRELS="usr/lib/*/wine/i386-unix/*.so" # uses -fno-PIC -Wl,-z,notext + +PATCHES=( + "${FILESDIR}"/${PN}-7.0.4-llvm-libunwind.patch + "${FILESDIR}"/${PN}-7.0.4-noexecstack.patch + "${FILESDIR}"/${PN}-7.0.4-restore-menubuilder.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 + type -P ${mingw}-gcc >/dev/null && continue + 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" + eerror "--> Note that mingw builds are default for ${PN} even without this USE." + die "USE=crossdev-mingw is enabled, but ${mingw}-gcc was not found" + 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)" + [[ ${WINE_GECKO}$'\n'${WINE_MONO} == "${geckomono}" ]] || + die "gecko/mono mismatch, has:" ${geckomono} + + default + + # ensure .desktop calls this variant + slot + sed -i "/^Exec=/s/wine /${P} /" loader/wine.desktop || die + + # similarly to staging, append to `wine --version` for identification + sed -i "s/wine_build[^1]*1/& (Proton-${WINE_PV})/" configure.ac || die + + # source has outdated auto-generated files, update like Proton's Makefile + eautoreconf + tools/make_requests || die # perl + dlls/winevulkan/make_vulkan -x vk.xml || die # python +} + +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 + + # upstream (Valve) doesn't really support misc configurations (e.g. + # adds vulkan code not always guarded by --with-vulkan), so force + # some major options that are typically needed by games either way + --with-freetype + --with-mingw # needed by many, notably Blizzard titles + --with-opengl + --with-vulkan + --with-x + + # ...and disable most options unimportant for games and unused by + # Proton rather than expose as volatile USEs with little support + --disable-tests # does not build and is disabled in Proton's Makefile + --without-capi + --without-cups + --without-gphoto + --without-gssapi + --without-krb5 + --without-ldap + --without-netapi + --without-opencl + --without-pcap + --without-sane + ac_cv_lib_soname_odbc= + + $(use_enable gecko mshtml) + $(use_enable mono mscoree) + $(use_with alsa) + $(use_with fontconfig) + $(use_with gstreamer) + $(use_with nls gettext) + $(use_with openal) + $(use_with osmesa) + --without-oss # media-sound/oss is not packaged + $(use_with pulseaudio pulse) + $(use_with sdl) + $(use_with ssl gnutls) + $(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 xcomposite) + $(use_with xinerama) + ) + + 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 (+bug 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) + : "${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} + + 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, quotes are + # enough to prevent bug #615218 if it somehow happens + 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) + 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 + + dodoc ANNOUNCE AUTHORS README* documentation/README* + readme.gentoo_create_doc +} + +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_preinst() { + has_version ${CATEGORY}/${PN} && WINE_HAD_ANY_SLOT= +} + +pkg_postinst() { + wine-eselect register + + [[ -v WINE_HAD_ANY_SLOT ]] || readme.gentoo_print_elog +} + +pkg_prerm() { + nonfatal wine-eselect deregister +} |