1 # Copyright 1999-2020 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
6 PLOCALES="ar ast bg ca cs da de el en en_US eo es fa fi fr he hi hr hu it ja ko lt ml nb_NO nl or pa pl pt_BR pt_PT rm ro ru si sk sl sr_RS@cyrillic sr_RS@latin sv ta te th tr uk wa zh_CN zh_TW"
9 inherit autotools eapi7-ver estack eutils flag-o-matic gnome2-utils l10n ltprune multilib multilib-minimal pax-utils toolchain-funcs virtualx xdg-utils
14 if [[ ${PV} == "9999" ]] ; then
15 EGIT_REPO_URI="https://source.winehq.org/git/wine.git"
22 SRC_URI="https://dl.winehq.org/wine/source/${MAJOR_V}.x/${MY_P}.tar.xz"
23 KEYWORDS="-* ~amd64 ~x86"
25 S="${WORKDIR}/${MY_P}"
27 STAGING_P="wine-staging-${PV}"
28 STAGING_DIR="${WORKDIR}/${STAGING_P}"
30 PATCHDIR="${WORKDIR}/gentoo-wine-patches"
32 DESCRIPTION="Free implementation of Windows(tm) on Unix, with Wine-Staging patchset"
33 HOMEPAGE="https://www.winehq.org/"
35 https://dev.gentoo.org/~sarnex/distfiles/wine/gentoo-wine-patches-${GWP_V}.tar.xz
38 if [[ ${PV} == "9999" ]] ; then
39 STAGING_EGIT_REPO_URI="https://github.com/wine-staging/wine-staging.git"
42 staging? ( https://github.com/wine-staging/wine-staging/archive/v${PV}.tar.gz -> ${STAGING_P}.tar.gz )"
47 IUSE="+abi_x86_32 +abi_x86_64 +alsa capi cups custom-cflags dos elibc_glibc +faudio +fontconfig +gecko gphoto2 gsm gssapi gstreamer +jpeg kerberos kernel_FreeBSD +lcms ldap +mono mp3 ncurses netapi nls odbc openal opencl +opengl osmesa oss +perl pcap pipelight +png prelink pulseaudio +realtime +run-exes samba scanner sdl selinux +ssl staging test themes +threads +truetype udev +udisks v4l vaapi vkd3d vulkan +X +xcomposite xinerama +xml"
48 REQUIRED_USE="|| ( abi_x86_32 abi_x86_64 )
50 elibc_glibc? ( threads )
52 pipelight? ( staging )
56 vkd3d? ( vulkan )" # osmesa-opengl #286560 # X-truetype #551124
58 # FIXME: the test suite is unsuitable for us; many tests require net access
59 # or fail due to Xvfb's opengl limitations.
64 x11-libs/libXcursor[${MULTILIB_USEDEP}]
65 x11-libs/libXext[${MULTILIB_USEDEP}]
66 x11-libs/libXfixes[${MULTILIB_USEDEP}]
67 x11-libs/libXrandr[${MULTILIB_USEDEP}]
68 x11-libs/libXi[${MULTILIB_USEDEP}]
69 x11-libs/libXxf86vm[${MULTILIB_USEDEP}]
71 alsa? ( media-libs/alsa-lib[${MULTILIB_USEDEP}] )
72 capi? ( net-libs/libcapi[${MULTILIB_USEDEP}] )
73 cups? ( net-print/cups:=[${MULTILIB_USEDEP}] )
74 faudio? ( app-emulation/faudio:=[${MULTILIB_USEDEP}] )
75 fontconfig? ( media-libs/fontconfig:=[${MULTILIB_USEDEP}] )
76 gphoto2? ( media-libs/libgphoto2:=[${MULTILIB_USEDEP}] )
77 gsm? ( media-sound/gsm:=[${MULTILIB_USEDEP}] )
78 gssapi? ( virtual/krb5[${MULTILIB_USEDEP}] )
80 media-libs/gstreamer:1.0[${MULTILIB_USEDEP}]
81 media-plugins/gst-plugins-meta:1.0[${MULTILIB_USEDEP}]
83 jpeg? ( virtual/jpeg:0=[${MULTILIB_USEDEP}] )
84 kerberos? ( virtual/krb5:0=[${MULTILIB_USEDEP}] )
85 lcms? ( media-libs/lcms:2=[${MULTILIB_USEDEP}] )
86 ldap? ( net-nds/openldap:=[${MULTILIB_USEDEP}] )
87 mp3? ( >=media-sound/mpg123-1.5.0[${MULTILIB_USEDEP}] )
88 ncurses? ( >=sys-libs/ncurses-5.2:0=[${MULTILIB_USEDEP}] )
89 netapi? ( net-fs/samba[netapi(+),${MULTILIB_USEDEP}] )
90 nls? ( sys-devel/gettext[${MULTILIB_USEDEP}] )
91 odbc? ( dev-db/unixODBC:=[${MULTILIB_USEDEP}] )
92 openal? ( media-libs/openal:=[${MULTILIB_USEDEP}] )
93 opencl? ( virtual/opencl[${MULTILIB_USEDEP}] )
95 virtual/glu[${MULTILIB_USEDEP}]
96 virtual/opengl[${MULTILIB_USEDEP}]
98 osmesa? ( >=media-libs/mesa-13[osmesa,${MULTILIB_USEDEP}] )
99 pcap? ( net-libs/libpcap[${MULTILIB_USEDEP}] )
100 png? ( media-libs/libpng:0=[${MULTILIB_USEDEP}] )
101 pulseaudio? ( media-sound/pulseaudio[${MULTILIB_USEDEP}] )
102 scanner? ( media-gfx/sane-backends:=[${MULTILIB_USEDEP}] )
103 sdl? ( media-libs/libsdl2:=[haptic,joystick,${MULTILIB_USEDEP}] )
104 ssl? ( net-libs/gnutls:=[${MULTILIB_USEDEP}] )
105 staging? ( sys-apps/attr[${MULTILIB_USEDEP}] )
107 dev-libs/glib:2[${MULTILIB_USEDEP}]
108 x11-libs/cairo[${MULTILIB_USEDEP}]
109 x11-libs/gtk+:3[${MULTILIB_USEDEP}]
111 truetype? ( >=media-libs/freetype-2.0.0[${MULTILIB_USEDEP}] )
112 udev? ( virtual/libudev:=[${MULTILIB_USEDEP}] )
113 udisks? ( sys-apps/dbus[${MULTILIB_USEDEP}] )
114 v4l? ( media-libs/libv4l[${MULTILIB_USEDEP}] )
115 vaapi? ( x11-libs/libva[X,${MULTILIB_USEDEP}] )
116 vkd3d? ( app-emulation/vkd3d[${MULTILIB_USEDEP}] )
117 vulkan? ( media-libs/vulkan-loader[${MULTILIB_USEDEP}] )
118 xcomposite? ( x11-libs/libXcomposite[${MULTILIB_USEDEP}] )
119 xinerama? ( x11-libs/libXinerama[${MULTILIB_USEDEP}] )
121 dev-libs/libxml2[${MULTILIB_USEDEP}]
122 dev-libs/libxslt[${MULTILIB_USEDEP}]
125 RDEPEND="${COMMON_DEPEND}
126 app-emulation/wine-desktop-common
127 >app-eselect/eselect-wine-0.3
128 !app-emulation/wine:0
129 dos? ( >=games-emulation/dosbox-0.74_p20160629 )
130 gecko? ( app-emulation/wine-gecko:2.47.1[abi_x86_32?,abi_x86_64?] )
131 mono? ( app-emulation/wine-mono:4.9.4 )
137 realtime? ( sys-auth/rtkit )
139 samba? ( >=net-fs/samba-3.0.25[winbind] )
140 selinux? ( sec-policy/selinux-wine )
141 udisks? ( sys-fs/udisks:2 )"
143 # tools/make_requests requires perl
144 DEPEND="${COMMON_DEPEND}
146 >=sys-kernel/linux-headers-2.6
149 X? ( x11-base/xorg-proto )
150 prelink? ( sys-devel/prelink )
155 xinerama? ( x11-base/xorg-proto )"
157 # These use a non-standard "Wine" category, which is provided by
158 # /etc/xdg/applications-merged/wine.menu
159 QA_DESKTOP_FILE="usr/share/applications/wine-browsedrive.desktop
160 usr/share/applications/wine-notepad.desktop
161 usr/share/applications/wine-uninstaller.desktop
162 usr/share/applications/wine-winecfg.desktop"
165 "${PATCHDIR}/patches/${MY_PN}-5.0-winegcc.patch" #260726
166 "${PATCHDIR}/patches/${MY_PN}-4.7-multilib-portage.patch" #395615
167 "${PATCHDIR}/patches/${MY_PN}-5.0-memset-O3.patch" #480508
168 "${PATCHDIR}/patches/${MY_PN}-2.0-multislot-apploader.patch" #310611
172 # https://bugs.gentoo.org/show_bug.cgi?id=635222
173 if [[ ${#PATCHES_BIN[@]} -ge 1 ]] || [[ ${PV} == 9999 ]]; then
174 DEPEND+=" dev-util/patchbin"
177 wine_compiler_check() {
178 [[ ${MERGE_TYPE} = "binary" ]] && return 0
183 if use abi_x86_64 && [[ $(gcc-major-version) = 5 && $(gcc-minor-version) -le 2 ]]; then
184 ebegin "Checking for gcc-5 ms_abi compiler bug"
185 $(tc-getCC) -O2 "${PATCHDIR}/files/pr66838.c" -o "${T}"/pr66838 || die
186 # Run in subshell to prevent "Aborted" message
187 ( "${T}"/pr66838 || false ) >/dev/null 2>&1
189 eerror "64-bit wine cannot be built with gcc-5.1 or initial patchset of 5.2.0"
190 eerror "due to compiler bugs; please re-emerge the latest gcc-5.2.x ebuild,"
191 eerror "or use gcc-config to select a different compiler version."
192 eerror "See https://bugs.gentoo.org/549768"
198 if use abi_x86_64 && [[ $(gcc-major-version) = 5 && $(gcc-minor-version) = 3 ]]; then
199 ebegin "Checking for gcc-5-3 stack realignment compiler bug"
200 # Compile in subshell to prevent "Aborted" message
201 ( $(tc-getCC) -O2 -mincoming-stack-boundary=3 "${PATCHDIR}/files/pr69140.c" -o "${T}"/pr69140 ) >/dev/null 2>&1
203 eerror "Wine cannot be built with this version of gcc-5.3"
204 eerror "due to compiler bugs; please re-emerge the latest gcc-5.3.x ebuild,"
205 eerror "or use gcc-config to select a different compiler version."
206 eerror "See https://bugs.gentoo.org/574044"
213 # Ensure compiler support
214 if use abi_x86_64; then
215 ebegin "Checking for 64-bit compiler with builtin_ms_va_list support"
216 # Compile in subshell to prevent "Aborted" message
217 ( $(tc-getCC) -O2 "${PATCHDIR}/files/builtin_ms_va_list.c" -o "${T}"/builtin_ms_va_list >/dev/null 2>&1)
219 eerror "This version of $(tc-getCC) does not support builtin_ms_va_list, can't enable 64-bit wine"
221 eerror "You need gcc-4.4+ or clang 3.8+ to build 64-bit wine"
228 wine_build_environment_check() {
229 [[ ${MERGE_TYPE} = "binary" ]] && return 0
231 if use abi_x86_64; then
232 if tc-is-gcc && [[ $(gcc-major-version) -lt 4 || ( $(gcc-major-version) -eq 4 && $(gcc-minor-version) -lt 4 ) ]]; then
233 eerror "You need gcc-4.4+ to compile 64-bit wine"
235 elif tc-is-clang && [[ $(clang-major-version) -lt 3 || ( $(clang-major-version) -eq 3 && $(clang-minor-version) -lt 8 ) ]]; then
236 eerror "You need clang-3.8+ to compile 64-bit wine"
240 if tc-is-gcc && [[ $(gcc-major-version) -eq 5 && $(gcc-minor-version) -le 3 ]]; then
241 ewarn "GCC-5.0-5.3 suffered from compiler bugs and are no longer supported by"
242 ewarn "Gentoo's Toolchain Team. If your ebuild fails the compiler checks in"
243 ewarn "the configure phase, either update your compiler or switch to <5.0 || >=5.4"
245 if tc-is-gcc && [[ $(gcc-major-version) -eq 5 && $(gcc-minor-version) -eq 4 ]]; then
246 if has "-march=i686" ${CFLAGS} && ! has "-mtune=generic" ${CFLAGS}; then
247 ewarn "Compilation can hang with CFLAGS=\"-march=i686\". You can temporarily work"
248 ewarn "around this by adding \"-mtune=generic\" to your CFLAGS for wine."
249 ewarn "See package.env in man 5 portage for more information on how to do this."
250 ewarn "See https://bugs.gentoo.org/show_bug.cgi?id=613128 for more details"
254 if use abi_x86_32 && use opencl && [[ "$(eselect opencl show 2> /dev/null)" == "intel" ]]; then
255 eerror "You cannot build wine with USE=opencl because intel-ocl-sdk is 64-bit only."
256 eerror "See https://bugs.gentoo.org/487864 for more details."
262 wine_env_vcs_vars() {
263 local pn_live_var="${PN//[-+]/_}_LIVE_COMMIT"
264 local pn_live_val="${pn_live_var}"
265 eval pn_live_val='$'${pn_live_val}
266 if [[ ! -z ${pn_live_val} ]]; then
268 eerror "Because of the multi-repo nature of ${MY_PN}, ${pn_live_var}"
269 eerror "cannot be used to set the commit. Instead, you may use the"
270 eerror "environment variables:"
271 eerror " EGIT_OVERRIDE_COMMIT_WINE"
272 eerror " EGIT_OVERRIDE_COMMIT_WINE_STAGING_WINE_STAGING"
277 if [[ ! -z ${EGIT_COMMIT} ]]; then
278 eerror "Commits must now be specified using the environment variables:"
279 eerror " EGIT_OVERRIDE_COMMIT_WINE"
280 eerror " EGIT_OVERRIDE_COMMIT_WINE_STAGING_WINE_STAGING"
287 wine_build_environment_check || die
290 if use oss && ! use kernel_FreeBSD; then
291 if ! has_version ">=media-sound/oss-4"; then
292 eerror "You cannot build wine with USE=oss without having support from a"
293 eerror "FreeBSD kernel or >=media-sound/oss-4 (only available through external repos)"
301 wine_build_environment_check || die
302 wine_env_vcs_vars || die
304 WINE_VARIANT="${PN#wine}-${PV}"
305 WINE_VARIANT="${WINE_VARIANT#-}"
307 MY_PREFIX="${EPREFIX}/usr/lib/wine-${WINE_VARIANT}"
308 MY_DATAROOTDIR="${EPREFIX}/usr/share/wine-${WINE_VARIANT}"
309 MY_DATADIR="${MY_DATAROOTDIR}"
310 MY_DOCDIR="${EPREFIX}/usr/share/doc/${PF}"
311 MY_INCLUDEDIR="${EPREFIX}/usr/include/wine-${WINE_VARIANT}"
312 MY_LIBEXECDIR="${EPREFIX}/usr/libexec/wine-${WINE_VARIANT}"
313 MY_LOCALSTATEDIR="${EPREFIX}/var/wine-${WINE_VARIANT}"
314 MY_MANDIR="${MY_DATADIR}/man"
318 if [[ ${PV} == "9999" ]] ; then
319 EGIT_CHECKOUT_DIR="${S}" git-r3_src_unpack
321 local CURRENT_WINE_COMMIT=${EGIT_VERSION}
323 EGIT_CHECKOUT_DIR="${STAGING_DIR}" EGIT_REPO_URI="${STAGING_EGIT_REPO_URI}" git-r3_src_unpack
325 local COMPAT_WINE_COMMIT=$("${STAGING_DIR}/patches/patchinstall.sh" --upstream-commit) || die
327 if [[ "${CURRENT_WINE_COMMIT}" != "${COMPAT_WINE_COMMIT}" ]]; then
328 einfo "The current Staging patchset is not guaranteed to apply on this WINE commit."
329 einfo "If src_prepare fails, try emerging with the env var WINE_COMMIT."
330 einfo "Example: EGIT_OVERRIDE_COMMIT_WINE=${COMPAT_WINE_COMMIT} emerge -1 wine"
337 l10n_find_plocales_changes "${S}/po" "" ".po"
344 for patch in ${PATCHES_BIN[@]}; do
345 patchbin --nogit < "${patch}" || die
349 local md5="$(md5sum server/protocol.def)"
352 ewarn "Applying the Wine-Staging patchset. Any bug reports to the"
353 ewarn "Wine bugzilla should explicitly state that staging was used."
355 local STAGING_EXCLUDE=""
356 use pipelight || STAGING_EXCLUDE="${STAGING_EXCLUDE} -W Pipelight"
358 # Launch wine-staging patcher in a subshell, using eapply as a backend, and gitapply.sh as a backend for binary patches
359 ebegin "Running Wine-Staging patch installer"
361 set -- DESTDIR="${S}" --backend=eapply --no-autoconf --all ${STAGING_EXCLUDE}
362 cd "${STAGING_DIR}/patches"
363 source "${STAGING_DIR}/patches/patchinstall.sh"
365 eend $? || die "Failed to apply Wine-Staging patches"
372 # Modification of the server protocol requires regenerating the server requests
373 if [[ "$(md5sum server/protocol.def)" != "${md5}" ]]; then
374 einfo "server/protocol.def was patched; running tools/make_requests"
375 tools/make_requests || die #432348
377 sed -i '/^UPDATE_DESKTOP_DATABASE/s:=.*:=true:' tools/Makefile.in || die
378 if ! use run-exes; then
379 sed -i '/^MimeType/d' loader/wine.desktop || die #117785
382 # Edit wine.desktop to work for specific variant
383 sed -e "/^Exec=/s/wine /wine-${WINE_VARIANT} /" -i loader/wine.desktop || die
385 # hi-res default icon, #472990, https://bugs.winehq.org/show_bug.cgi?id=24652
386 cp "${PATCHDIR}/files/oic_winlogo.ico" dlls/user32/resources/ || die
388 l10n_get_locales > po/LINGUAS || die # otherwise wine doesn't respect LINGUAS
390 # Fix manpage generation for locales #469418 and abi_x86_64 #617864
392 # Duplicate manpages input files for wine64
394 for f in loader/*.man.in; do
395 cp ${f} ${f/wine/wine64} || die
397 # Add wine64 manpages to Makefile
398 if use abi_x86_64; then
399 sed -i "/wine.man.in/i \
400 \\\twine64.man.in \\\\" loader/Makefile.in || die
401 sed -i -E 's/(.*wine)(.*\.UTF-8\.man\.in.*)/&\
402 \164\2/' loader/Makefile.in || die
408 sed -i "/${loc}\.UTF-8\.man\.in/d" "${file}" || die
412 l10n_for_each_disabled_locale_do rm_man_file "${f}"
413 done < <(find -name "Makefile.in" -exec grep -q "UTF-8.man.in" "{}" \; -print)
417 wine_compiler_check || die
419 export LDCONFIG=/bin/true
420 use custom-cflags || strip-flags
422 multilib-minimal_src_configure
425 multilib_src_configure() {
427 --prefix="${MY_PREFIX}"
428 --datarootdir="${MY_DATAROOTDIR}"
429 --datadir="${MY_DATADIR}"
430 --docdir="${MY_DOCDIR}"
431 --includedir="${MY_INCLUDEDIR}"
432 --libdir="${EPREFIX}/usr/$(get_libdir)/wine-${WINE_VARIANT}"
433 --libexecdir="${MY_LIBEXECDIR}"
434 --localstatedir="${MY_LOCALSTATEDIR}"
435 --mandir="${MY_MANDIR}"
436 --sysconfdir="${EPREFIX}/etc/wine"
441 $(use_with ncurses curses)
442 $(use_with udisks dbus)
444 $(use_with fontconfig)
445 $(use_with ssl gnutls)
446 $(use_enable gecko mshtml)
447 $(use_with gphoto2 gphoto)
450 $(use_with gstreamer)
453 $(use_with kerberos krb5)
455 --without-mingw # linux LDFLAGS leak in mingw32: bug #685172
456 $(use_enable mono mscoree)
457 $(use_with mp3 mpg123)
459 $(use_with nls gettext)
467 $(use_with pulseaudio pulse)
468 $(use_with threads pthread)
469 $(use_with scanner sane)
471 $(use_enable test tests)
472 $(use_with truetype freetype)
479 $(use_with xcomposite)
485 use staging && myconf+=(
487 $(use_with themes gtk3)
491 local PKG_CONFIG AR RANLIB
492 # Avoid crossdev's i686-pc-linux-gnu-pkg-config if building wine32 on amd64; #472038
493 # set AR and RANLIB to make QA scripts happy; #483342
494 tc-export PKG_CONFIG AR RANLIB
497 if [[ ${ABI} == amd64 ]]; then
498 myconf+=( --enable-win64 )
500 myconf+=( --disable-win64 )
503 # Note: using --with-wine64 results in problems with multilib.eclass
504 # CC/LD hackery. We're using separate tools instead.
512 multilib_src_test() {
513 # FIXME: win32-only; wine64 tests fail with "could not find the Wine loader"
514 if [[ ${ABI} == x86 ]]; then
515 if [[ $(id -u) == 0 ]]; then
516 ewarn "Skipping tests since they cannot be run under the root user."
517 ewarn "To run the test ${MY_PN} suite, add userpriv to FEATURES in make.conf"
521 WINEPREFIX="${T}/.wine-${ABI}" \
526 multilib_src_install_all() {
527 local DOCS=( ANNOUNCE AUTHORS README )
529 local locale_doc="documentation/README.$1"
530 [[ ! -e ${locale_doc} ]] || DOCS+=( ${locale_doc} )
532 l10n_for_each_locale_do add_locale_docs
535 prune_libtool_files --all
537 if ! use perl ; then # winedump calls function_grep.pl, and winemaker is a perl script
538 rm "${D%/}${MY_PREFIX}"/bin/{wine{dump,maker},function_grep.pl} \
539 "${D%/}${MY_MANDIR}"/man1/wine{dump,maker}.1 || die
542 # Remove wineconsole if neither backend is installed #551124
543 if ! use X && ! use ncurses; then
544 rm "${D%/}${MY_PREFIX}"/bin/wineconsole* || die
545 rm "${D%/}${MY_MANDIR}"/man1/wineconsole* || die
547 rm "${D%/}${MY_PREFIX}/$(get_libdir)"/wine/{,fakedlls/}wineconsole.exe* || die
549 multilib_foreach_abi rm_wineconsole
552 use abi_x86_32 && pax-mark psmr "${D%/}${MY_PREFIX}"/bin/wine{,-preloader} #255055
553 use abi_x86_64 && pax-mark psmr "${D%/}${MY_PREFIX}"/bin/wine64{,-preloader}
555 # Avoid double prefix from dosym and make_wrapper
556 MY_PREFIX=${MY_PREFIX#${EPREFIX}}
558 if use abi_x86_64 && ! use abi_x86_32; then
559 dosym wine64 "${MY_PREFIX}"/bin/wine # 404331
560 dosym wine64-preloader "${MY_PREFIX}"/bin/wine-preloader
563 # Failglob for binloops, shouldn't be necessary, but including to stay safe
564 eshopts_push -s failglob #615218
565 # Make wrappers for binaries for handling multiple variants
566 # Note: wrappers instead of symlinks because some are shell which use basename
568 for b in "${ED%/}${MY_PREFIX}"/bin/*; do
569 make_wrapper "${b##*/}-${WINE_VARIANT}" "${MY_PREFIX}/bin/${b##*/}"
575 eselect wine register ${P}
576 if [[ ${PN} == "wine-vanilla" ]]; then
577 eselect wine register --vanilla ${P} || die
580 eselect wine register --staging ${P} || die
584 eselect wine update --all --if-unset || die
586 xdg_desktop_database_update
589 ewarn "Without Wine Gecko, wine prefixes will not have a default"
590 ewarn "implementation of iexplore. Many older windows applications"
591 ewarn "rely upon the existence of an iexplore implementation, so"
592 ewarn "you will likely need to install an external one, like via winetricks"
595 ewarn "Without Wine Mono, wine prefixes will not have a default"
596 ewarn "implementation of .NET. Many windows applications rely upon"
597 ewarn "the existence of a .NET implementation, so you will likely need"
598 ewarn "to install an external one, like via winetricks"
603 eselect wine deregister ${P}
604 if [[ ${PN} == "wine-vanilla" ]]; then
605 eselect wine deregister --vanilla ${P} || die
608 eselect wine deregister --staging ${P} || die
612 eselect wine update --all --if-unset || die
616 xdg_desktop_database_update