diff --git a/eclass/wine.eclass b/eclass/wine.eclass new file mode 100644 index 0000000000000..b82dd469c191d --- /dev/null +++ b/eclass/wine.eclass @@ -0,0 +1,413 @@ +# Copyright 2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: wine.eclass +# @MAINTAINER: +# Wine +# @AUTHOR: +# Ionen Wolkens +# @SUPPORTED_EAPIS: 8 +# @BLURB: Common functions for app-emuluation/wine-* ebuilds +# @DESCRIPTION: +# Given the large amount of Wine ebuilds (and variants) that need +# duplicated code, this is used to offload the more complex bits +# (primarily toolchain and slotting) and leave ebuilds to only need +# to deal with dependencies and configure options like any other. +# +# Note to overlays: this can be used to package other variants of +# Wine, but there is currently no garantee that eclass changes may +# not break these ebuilds now and then without real warnings + +case ${EAPI} in + 8) ;; + *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; +esac + +if [[ -z ${_WINE_ECLASS} ]]; then +_WINE_ECLASS=1 + +inherit autotools flag-o-matic multilib prefix toolchain-funcs wrapper + +# @ECLASS_VARIABLE: WINE_USEDEP +# @DESCRIPTION: +# Meant be used like multilib-build.eclass' MULTILIB_USEDEP. Handled +# specially here given Wine ebuilds are not *really* multilib and are +# abusing abi_x86_* with some specific requirements. +# +# TODO: when the *new* wow64 mode (aka USE=wow64) is mature enough to +# be preferred over abi_x86_32, this should be removed and support for +# 32bit-only-on-64bit be dropped matching how /no-multilib/ handles it +readonly WINE_USEDEP="abi_x86_32(-)?,abi_x86_64(-)?" + +IUSE=" + +abi_x86_32 +abi_x86_64 crossdev-mingw custom-cflags + +mingw +strip wow64 +" +REQUIRED_USE=" + || ( abi_x86_32 abi_x86_64 arm64 ) + crossdev-mingw? ( mingw ) + wow64? ( abi_x86_64 !abi_x86_32 ) +" + +BDEPEND=" + || ( + sys-devel/binutils:* + llvm-core/lld:* + ) + dev-lang/perl + mingw? ( + !crossdev-mingw? ( + dev-util/mingw64-toolchain[${WINE_USEDEP}] + wow64? ( dev-util/mingw64-toolchain[abi_x86_32] ) + ) + ) + !mingw? ( + llvm-core/clang:*[${WINE_USEDEP}] + strip? ( llvm-core/llvm:* ) + ) +" +IDEPEND=">=app-eselect/eselect-wine-2" + +# @ECLASS_VARIABLE: WINE_SKIP_INSTALL +# @DESCRIPTION: +# Array of files to delete from the installation relative +# to ${ED}, must be set before running wine_src_install. +WINE_SKIP_INSTALL=() + +# @FUNCTION: wine_pkg_pretend +# @DESCRIPTION: +# Verifies if crossdev-mingw is used properly, ignored if +# ``MINGW_BYPASS`` is set. +wine_pkg_pretend() { + [[ ${MERGE_TYPE} == binary ]] && return + + if use crossdev-mingw && [[ ! -v MINGW_BYPASS ]]; then + local arches=( + $(usev abi_x86_64 x86_64) + $(usev abi_x86_32 i686) + $(usev wow64 i686) + $(usev arm64 aarch64) + ) + + local mingw + for mingw in "${arches[@]/%/-w64-mingw32}"; 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 +} + +# @FUNCTION: wine_src_prepare +# @DESCRIPTION: +# Apply various minor adjustments, run eautoreconf, make_requests, and +# perform a version mismatch sanity check if WINE_GECKO and WINE_MONO +# are set. +# +# If need more than make_requests, it should be either handled in +# the ebuild or (for users) optionally through portage hooks, e.g. +# +# @CODE +# echo "post_src_prepare() { tools/make_specfiles || die; }" \ +# > /etc/portage/env/app-emulation/wine-vanilla +# @CODE +wine_src_prepare() { + default + + if [[ ${WINE_GECKO} && ${WINE_MONO} ]]; then + # 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= + has live ${PROPERTIES} && gmfatal=nonfatal + ${gmfatal} die -n "gecko/mono mismatch in ebuild, has: " ${geckomono} " (please file a bug)" + fi + fi + + if tc-is-clang && use mingw; then + # -mabi=ms was ignored by