# 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