1 # Copyright 1999-2021 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
6 PLOCALES="ar 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 multilib multilib-minimal pax-utils plocale toolchain-funcs virtualx xdg-utils
14 if [[ ${PV} == "9999" ]] ; then
15 EGIT_REPO_URI="https://source.winehq.org/git/wine.git"
23 SRC_URI="https://dl.winehq.org/wine/source/${MAJOR_V}.${MINOR_V}/${MY_P}.tar.xz"
24 KEYWORDS="-* ~amd64 ~x86"
26 S="${WORKDIR}/${MY_P}"
29 PATCHDIR="${WORKDIR}/gentoo-wine-patches"
31 DESCRIPTION="Free implementation of Windows(tm) on Unix, without external patchsets"
32 HOMEPAGE="https://www.winehq.org/"
34 https://dev.gentoo.org/~np-hardass/distfiles/wine/gentoo-wine-patches-${GWP_V}.tar.xz
39 IUSE="+abi_x86_32 +abi_x86_64 +alsa capi cups custom-cflags dos elibc_glibc +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 +png prelink pulseaudio +realtime +run-exes samba scanner sdl selinux +ssl test +threads +truetype udev +udisks v4l vkd3d vulkan +X +xcomposite xinerama +xml"
40 REQUIRED_USE="|| ( abi_x86_32 abi_x86_64 )
42 elibc_glibc? ( threads )
45 vkd3d? ( vulkan )" # osmesa-opengl #286560 # X-truetype #551124
47 # FIXME: the test suite is unsuitable for us; many tests require net access
48 # or fail due to Xvfb's opengl limitations.
53 x11-libs/libXcursor[${MULTILIB_USEDEP}]
54 x11-libs/libXext[${MULTILIB_USEDEP}]
55 x11-libs/libXfixes[${MULTILIB_USEDEP}]
56 x11-libs/libXrandr[${MULTILIB_USEDEP}]
57 x11-libs/libXi[${MULTILIB_USEDEP}]
58 x11-libs/libXxf86vm[${MULTILIB_USEDEP}]
60 alsa? ( media-libs/alsa-lib[${MULTILIB_USEDEP}] )
61 capi? ( net-libs/libcapi[${MULTILIB_USEDEP}] )
62 cups? ( net-print/cups:=[${MULTILIB_USEDEP}] )
63 fontconfig? ( media-libs/fontconfig:=[${MULTILIB_USEDEP}] )
64 gphoto2? ( media-libs/libgphoto2:=[${MULTILIB_USEDEP}] )
65 gsm? ( media-sound/gsm:=[${MULTILIB_USEDEP}] )
66 gssapi? ( virtual/krb5[${MULTILIB_USEDEP}] )
68 media-libs/gstreamer:1.0[${MULTILIB_USEDEP}]
69 media-plugins/gst-plugins-meta:1.0[${MULTILIB_USEDEP}]
71 jpeg? ( virtual/jpeg:0=[${MULTILIB_USEDEP}] )
72 kerberos? ( virtual/krb5[${MULTILIB_USEDEP}] )
73 lcms? ( media-libs/lcms:2=[${MULTILIB_USEDEP}] )
74 ldap? ( net-nds/openldap:=[${MULTILIB_USEDEP}] )
75 mp3? ( >=media-sound/mpg123-1.5.0[${MULTILIB_USEDEP}] )
76 ncurses? ( >=sys-libs/ncurses-5.2:0=[${MULTILIB_USEDEP}] )
77 netapi? ( net-fs/samba[netapi(+),${MULTILIB_USEDEP}] )
78 nls? ( sys-devel/gettext[${MULTILIB_USEDEP}] )
79 odbc? ( dev-db/unixODBC:=[${MULTILIB_USEDEP}] )
80 openal? ( media-libs/openal:=[${MULTILIB_USEDEP}] )
81 opencl? ( virtual/opencl[${MULTILIB_USEDEP}] )
83 virtual/glu[${MULTILIB_USEDEP}]
84 virtual/opengl[${MULTILIB_USEDEP}]
86 osmesa? ( >=media-libs/mesa-13[osmesa,${MULTILIB_USEDEP}] )
87 pcap? ( net-libs/libpcap[${MULTILIB_USEDEP}] )
88 png? ( media-libs/libpng:0=[${MULTILIB_USEDEP}] )
89 pulseaudio? ( media-sound/pulseaudio[${MULTILIB_USEDEP}] )
90 scanner? ( media-gfx/sane-backends:=[${MULTILIB_USEDEP}] )
91 sdl? ( media-libs/libsdl2:=[haptic,joystick,${MULTILIB_USEDEP}] )
92 ssl? ( net-libs/gnutls:=[${MULTILIB_USEDEP}] )
93 truetype? ( >=media-libs/freetype-2.0.0[${MULTILIB_USEDEP}] )
94 udev? ( virtual/libudev:=[${MULTILIB_USEDEP}] )
95 udisks? ( sys-apps/dbus[${MULTILIB_USEDEP}] )
96 v4l? ( media-libs/libv4l[${MULTILIB_USEDEP}] )
97 vkd3d? ( app-emulation/vkd3d[${MULTILIB_USEDEP}] )
98 vulkan? ( media-libs/vulkan-loader[${MULTILIB_USEDEP}] )
99 xcomposite? ( x11-libs/libXcomposite[${MULTILIB_USEDEP}] )
100 xinerama? ( x11-libs/libXinerama[${MULTILIB_USEDEP}] )
102 dev-libs/libxml2[${MULTILIB_USEDEP}]
103 dev-libs/libxslt[${MULTILIB_USEDEP}]
106 RDEPEND="${COMMON_DEPEND}
107 app-emulation/wine-desktop-common
108 >app-eselect/eselect-wine-0.3
109 !app-emulation/wine:0
110 dos? ( >=games-emulation/dosbox-0.74_p20160629 )
111 gecko? ( app-emulation/wine-gecko:2.47[abi_x86_32?,abi_x86_64?] )
112 mono? ( app-emulation/wine-mono:4.7.5 )
118 realtime? ( sys-auth/rtkit )
120 samba? ( >=net-fs/samba-3.0.25[winbind] )
121 selinux? ( sec-policy/selinux-wine )
122 udisks? ( sys-fs/udisks:2 )"
124 # tools/make_requests requires perl
125 DEPEND="${COMMON_DEPEND}
127 >=sys-kernel/linux-headers-2.6
130 X? ( x11-base/xorg-proto )
131 prelink? ( sys-devel/prelink )
132 xinerama? ( x11-base/xorg-proto )"
134 # These use a non-standard "Wine" category, which is provided by
135 # /etc/xdg/applications-merged/wine.menu
136 QA_DESKTOP_FILE="usr/share/applications/wine-browsedrive.desktop
137 usr/share/applications/wine-notepad.desktop
138 usr/share/applications/wine-uninstaller.desktop
139 usr/share/applications/wine-winecfg.desktop"
142 "$FILESDIR/$PV-configure-fixes.patch"
143 "${PATCHDIR}/patches/${MY_PN}-1.5.26-winegcc.patch" #260726
144 "${PATCHDIR}/patches/${MY_PN}-1.9.5-multilib-portage.patch" #395615
145 "${PATCHDIR}/patches/${MY_PN}-1.6-memset-O3.patch" #480508
146 "${PATCHDIR}/patches/${MY_PN}-2.0-multislot-apploader.patch" #310611
150 # https://bugs.gentoo.org/show_bug.cgi?id=635222
151 if [[ ${#PATCHES_BIN[@]} -ge 1 ]] || [[ ${PV} == 9999 ]]; then
152 DEPEND+=" dev-util/patchbin"
155 wine_compiler_check() {
156 [[ ${MERGE_TYPE} = "binary" ]] && return 0
161 if use abi_x86_64 && [[ $(gcc-major-version) = 5 && $(gcc-minor-version) -le 2 ]]; then
162 ebegin "Checking for gcc-5 ms_abi compiler bug"
163 $(tc-getCC) -O2 "${PATCHDIR}/files/pr66838.c" -o "${T}"/pr66838 || die
164 # Run in subshell to prevent "Aborted" message
165 ( "${T}"/pr66838 || false ) >/dev/null 2>&1
167 eerror "64-bit wine cannot be built with gcc-5.1 or initial patchset of 5.2.0"
168 eerror "due to compiler bugs; please re-emerge the latest gcc-5.2.x ebuild,"
169 eerror "or use gcc-config to select a different compiler version."
170 eerror "See https://bugs.gentoo.org/549768"
176 if use abi_x86_64 && [[ $(gcc-major-version) = 5 && $(gcc-minor-version) = 3 ]]; then
177 ebegin "Checking for gcc-5-3 stack realignment compiler bug"
178 # Compile in subshell to prevent "Aborted" message
179 ( $(tc-getCC) -O2 -mincoming-stack-boundary=3 "${PATCHDIR}/files/pr69140.c" -o "${T}"/pr69140 ) >/dev/null 2>&1
181 eerror "Wine cannot be built with this version of gcc-5.3"
182 eerror "due to compiler bugs; please re-emerge the latest gcc-5.3.x ebuild,"
183 eerror "or use gcc-config to select a different compiler version."
184 eerror "See https://bugs.gentoo.org/574044"
191 # Ensure compiler support
192 if use abi_x86_64; then
193 ebegin "Checking for 64-bit compiler with builtin_ms_va_list support"
194 # Compile in subshell to prevent "Aborted" message
195 ( $(tc-getCC) -O2 "${PATCHDIR}/files/builtin_ms_va_list.c" -o "${T}"/builtin_ms_va_list >/dev/null 2>&1)
197 eerror "This version of $(tc-getCC) does not support builtin_ms_va_list, can't enable 64-bit wine"
199 eerror "You need gcc-4.4+ or clang 3.8+ to build 64-bit wine"
206 wine_build_environment_check() {
207 [[ ${MERGE_TYPE} = "binary" ]] && return 0
209 if use abi_x86_64; then
210 if tc-is-gcc && [[ $(gcc-major-version) -lt 4 || ( $(gcc-major-version) -eq 4 && $(gcc-minor-version) -lt 4 ) ]]; then
211 eerror "You need gcc-4.4+ to compile 64-bit wine"
213 elif tc-is-clang && [[ $(clang-major-version) -lt 3 || ( $(clang-major-version) -eq 3 && $(clang-minor-version) -lt 8 ) ]]; then
214 eerror "You need clang-3.8+ to compile 64-bit wine"
218 if tc-is-gcc && [[ $(gcc-major-version) -eq 5 && $(gcc-minor-version) -le 3 ]]; then
219 ewarn "GCC-5.0-5.3 suffered from compiler bugs and are no longer supported by"
220 ewarn "Gentoo's Toolchain Team. If your ebuild fails the compiler checks in"
221 ewarn "the configure phase, either update your compiler or switch to <5.0 || >=5.4"
223 if tc-is-gcc && [[ $(gcc-major-version) -eq 5 && $(gcc-minor-version) -eq 4 ]]; then
224 if has "-march=i686" ${CFLAGS} && ! has "-mtune=generic" ${CFLAGS}; then
225 ewarn "Compilation can hang with CFLAGS=\"-march=i686\". You can temporarily work"
226 ewarn "around this by adding \"-mtune=generic\" to your CFLAGS for wine."
227 ewarn "See package.env in man 5 portage for more information on how to do this."
228 ewarn "See https://bugs.gentoo.org/show_bug.cgi?id=613128 for more details"
232 if use abi_x86_32 && use opencl && [[ "$(eselect opencl show 2> /dev/null)" == "intel" ]]; then
233 eerror "You cannot build wine with USE=opencl because intel-ocl-sdk is 64-bit only."
234 eerror "See https://bugs.gentoo.org/487864 for more details."
240 wine_env_vcs_vars() {
241 local pn_live_var="${PN//[-+]/_}_LIVE_COMMIT"
242 local pn_live_val="${pn_live_var}"
243 eval pn_live_val='$'${pn_live_val}
244 if [[ ! -z ${EGIT_COMMIT} ]]; then
245 eerror "Commits must now be specified using the environmental variables"
246 eerror "EGIT_OVERRIDE_COMMIT_WINE"
253 wine_build_environment_check || die
256 if use oss && ! use kernel_FreeBSD; then
257 if ! has_version ">=media-sound/oss-4"; then
258 eerror "You cannot build wine with USE=oss without having support from a"
259 eerror "FreeBSD kernel or >=media-sound/oss-4 (only available through external repos)"
267 wine_build_environment_check || die
268 wine_env_vcs_vars || die
270 WINE_VARIANT="${PN#wine}-${PV}"
271 WINE_VARIANT="${WINE_VARIANT#-}"
273 MY_PREFIX="${EPREFIX}/usr/lib/wine-${WINE_VARIANT}"
274 MY_DATAROOTDIR="${EPREFIX}/usr/share/wine-${WINE_VARIANT}"
275 MY_DATADIR="${MY_DATAROOTDIR}"
276 MY_DOCDIR="${EPREFIX}/usr/share/doc/${PF}"
277 MY_INCLUDEDIR="${EPREFIX}/usr/include/wine-${WINE_VARIANT}"
278 MY_LIBEXECDIR="${EPREFIX}/usr/libexec/wine-${WINE_VARIANT}"
279 MY_LOCALSTATEDIR="${EPREFIX}/var/wine-${WINE_VARIANT}"
280 MY_MANDIR="${MY_DATADIR}/man"
284 if [[ ${PV} == "9999" ]] ; then
285 EGIT_CHECKOUT_DIR="${S}" git-r3_src_unpack
290 plocale_find_changes "${S}/po" "" ".po"
297 for patch in ${PATCHES_BIN[@]}; do
298 patchbin --nogit < "${patch}" || die
302 local md5="$(md5sum server/protocol.def)"
308 # Modification of the server protocol requires regenerating the server requests
309 if [[ "$(md5sum server/protocol.def)" != "${md5}" ]]; then
310 einfo "server/protocol.def was patched; running tools/make_requests"
311 tools/make_requests || die #432348
313 sed -i '/^UPDATE_DESKTOP_DATABASE/s:=.*:=true:' tools/Makefile.in || die
314 if ! use run-exes; then
315 sed -i '/^MimeType/d' loader/wine.desktop || die #117785
318 # Edit wine.desktop to work for specific variant
319 sed -e "/^Exec=/s/wine /wine-${WINE_VARIANT} /" -i loader/wine.desktop || die
321 # hi-res default icon, #472990, https://bugs.winehq.org/show_bug.cgi?id=24652
322 cp "${PATCHDIR}/files/oic_winlogo.ico" dlls/user32/resources/ || die
324 plocale_get_locales > po/LINGUAS || die # otherwise wine doesn't respect LINGUAS
326 # Fix manpage generation for locales #469418 and abi_x86_64 #617864
328 # Duplicate manpages input files for wine64
330 for f in loader/*.man.in; do
331 cp ${f} ${f/wine/wine64} || die
333 # Add wine64 manpages to Makefile
334 if use abi_x86_64; then
335 sed -i "/wine.man.in/i \
336 \\\twine64.man.in \\\\" loader/Makefile.in || die
337 sed -i -E 's/(.*wine)(.*\.UTF-8\.man\.in.*)/&\
338 \164\2/' loader/Makefile.in || die
344 sed -i "/${loc}\.UTF-8\.man\.in/d" "${file}" || die
348 plocale_for_each_disabled_locale rm_man_file "${f}"
349 done < <(find -name "Makefile.in" -exec grep -q "UTF-8.man.in" "{}" \; -print)
353 wine_compiler_check || die
355 export LDCONFIG=/bin/true
356 use custom-cflags || strip-flags
357 append-flags -fcommon
359 multilib-minimal_src_configure
362 multilib_src_configure() {
364 --prefix="${MY_PREFIX}"
365 --datarootdir="${MY_DATAROOTDIR}"
366 --datadir="${MY_DATADIR}"
367 --docdir="${MY_DOCDIR}"
368 --includedir="${MY_INCLUDEDIR}"
369 --libdir="${EPREFIX}/usr/$(get_libdir)/wine-${WINE_VARIANT}"
370 --libexecdir="${MY_LIBEXECDIR}"
371 --localstatedir="${MY_LOCALSTATEDIR}"
372 --mandir="${MY_MANDIR}"
373 --sysconfdir=/etc/wine
378 $(use_with ncurses curses)
379 $(use_with udisks dbus)
380 $(use_with fontconfig)
381 $(use_with ssl gnutls)
382 $(use_enable gecko mshtml)
383 $(use_with gphoto2 gphoto)
386 $(use_with gstreamer)
389 $(use_with kerberos krb5)
391 $(use_enable mono mscoree)
392 $(use_with mp3 mpg123)
394 $(use_with nls gettext)
402 $(use_with pulseaudio pulse)
403 $(use_with threads pthread)
404 $(use_with scanner sane)
406 $(use_enable test tests)
407 $(use_with truetype freetype)
414 $(use_with xcomposite)
420 local PKG_CONFIG AR RANLIB
421 # Avoid crossdev's i686-pc-linux-gnu-pkg-config if building wine32 on amd64; #472038
422 # set AR and RANLIB to make QA scripts happy; #483342
423 tc-export PKG_CONFIG AR RANLIB
426 if [[ ${ABI} == amd64 ]]; then
427 myconf+=( --enable-win64 )
429 myconf+=( --disable-win64 )
432 # Note: using --with-wine64 results in problems with multilib.eclass
433 # CC/LD hackery. We're using separate tools instead.
441 multilib_src_test() {
442 # FIXME: win32-only; wine64 tests fail with "could not find the Wine loader"
443 if [[ ${ABI} == x86 ]]; then
444 if [[ $(id -u) == 0 ]]; then
445 ewarn "Skipping tests since they cannot be run under the root user."
446 ewarn "To run the test ${MY_PN} suite, add userpriv to FEATURES in make.conf"
450 WINEPREFIX="${T}/.wine-${ABI}" \
455 multilib_src_install_all() {
456 local DOCS=( ANNOUNCE AUTHORS README )
458 local locale_doc="documentation/README.$1"
459 [[ ! -e ${locale_doc} ]] || DOCS+=( ${locale_doc} )
461 plocale_for_each_locale add_locale_docs
464 find "${ED}" -name *.la -delete || die
466 if ! use perl ; then # winedump calls function_grep.pl, and winemaker is a perl script
467 rm "${D%/}${MY_PREFIX}"/bin/{wine{dump,maker},function_grep.pl} \
468 "${D%/}${MY_MANDIR}"/man1/wine{dump,maker}.1 || die
471 # Remove wineconsole if neither backend is installed #551124
472 if ! use X && ! use ncurses; then
473 rm "${D%/}${MY_PREFIX}"/bin/wineconsole* || die
474 rm "${D%/}${MY_MANDIR}"/man1/wineconsole* || die
476 rm "${D%/}${MY_PREFIX}/$(get_libdir)"/wine/{,fakedlls/}wineconsole.exe* || die
478 multilib_foreach_abi rm_wineconsole
481 use abi_x86_32 && pax-mark psmr "${D%/}${MY_PREFIX}"/bin/wine{,-preloader} #255055
482 use abi_x86_64 && pax-mark psmr "${D%/}${MY_PREFIX}"/bin/wine64{,-preloader}
484 if use abi_x86_64 && ! use abi_x86_32; then
485 dosym wine64 "${MY_PREFIX}"/bin/wine # 404331
486 dosym wine64-preloader "${MY_PREFIX}"/bin/wine-preloader
489 # Failglob for binloops, shouldn't be necessary, but including to stay safe
490 eshopts_push -s failglob #615218
491 # Make wrappers for binaries for handling multiple variants
492 # Note: wrappers instead of symlinks because some are shell which use basename
494 for b in "${D%/}${MY_PREFIX}"/bin/*; do
495 make_wrapper "${b##*/}-${WINE_VARIANT}" "${MY_PREFIX}/bin/${b##*/}"
501 eselect wine register ${P}
502 if [[ ${PN} == "wine-vanilla" ]]; then
503 eselect wine register --vanilla ${P} || die
506 eselect wine update --all --if-unset || die
508 xdg_desktop_database_update
511 ewarn "Without Wine Gecko, wine prefixes will not have a default"
512 ewarn "implementation of iexplore. Many older windows applications"
513 ewarn "rely upon the existence of an iexplore implementation, so"
514 ewarn "you will likely need to install an external one, like via winetricks"
517 ewarn "Without Wine Mono, wine prefixes will not have a default"
518 ewarn "implementation of .NET. Many windows applications rely upon"
519 ewarn "the existence of a .NET implementation, so you will likely need"
520 ewarn "to install an external one, like via winetricks"
525 eselect wine deregister ${P}
526 if [[ ${PN} == "wine-vanilla" ]]; then
527 eselect wine deregister --vanilla ${P} || die
530 eselect wine update --all --if-unset || die
534 xdg_desktop_database_update