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 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}"
28 PATCHDIR="${WORKDIR}/gentoo-wine-patches"
30 DESCRIPTION="Free implementation of Windows(tm) on Unix, without external patchsets"
31 HOMEPAGE="https://www.winehq.org/"
33 https://dev.gentoo.org/~sarnex/distfiles/wine/gentoo-wine-patches-${GWP_V}.tar.xz
38 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 +png prelink pulseaudio +realtime +run-exes samba scanner sdl selinux +ssl test +threads +truetype udev +udisks +unwind v4l vkd3d vulkan +X +xcomposite xinerama +xml"
39 REQUIRED_USE="|| ( abi_x86_32 abi_x86_64 )
41 elibc_glibc? ( threads )
44 vkd3d? ( vulkan )" # osmesa-opengl #286560 # X-truetype #551124
46 # FIXME: the test suite is unsuitable for us; many tests require net access
47 # or fail due to Xvfb's opengl limitations.
52 x11-libs/libXcursor[${MULTILIB_USEDEP}]
53 x11-libs/libXext[${MULTILIB_USEDEP}]
54 x11-libs/libXfixes[${MULTILIB_USEDEP}]
55 x11-libs/libXrandr[${MULTILIB_USEDEP}]
56 x11-libs/libXi[${MULTILIB_USEDEP}]
57 x11-libs/libXxf86vm[${MULTILIB_USEDEP}]
59 alsa? ( media-libs/alsa-lib[${MULTILIB_USEDEP}] )
60 capi? ( net-libs/libcapi[${MULTILIB_USEDEP}] )
61 cups? ( net-print/cups:=[${MULTILIB_USEDEP}] )
62 faudio? ( app-emulation/faudio:=[${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 unwind? ( sys-libs/libunwind[${MULTILIB_USEDEP}] )
97 v4l? ( media-libs/libv4l[${MULTILIB_USEDEP}] )
98 vkd3d? ( app-emulation/vkd3d[${MULTILIB_USEDEP}] )
99 vulkan? ( media-libs/vulkan-loader[${MULTILIB_USEDEP}] )
100 xcomposite? ( x11-libs/libXcomposite[${MULTILIB_USEDEP}] )
101 xinerama? ( x11-libs/libXinerama[${MULTILIB_USEDEP}] )
103 dev-libs/libxml2[${MULTILIB_USEDEP}]
104 dev-libs/libxslt[${MULTILIB_USEDEP}]
107 RDEPEND="${COMMON_DEPEND}
108 app-emulation/wine-desktop-common
109 >app-eselect/eselect-wine-0.3
110 !app-emulation/wine:0
111 dos? ( >=games-emulation/dosbox-0.74_p20160629 )
112 gecko? ( app-emulation/wine-gecko:2.47.1[abi_x86_32?,abi_x86_64?] )
113 mono? ( app-emulation/wine-mono:4.9.4 )
119 realtime? ( sys-auth/rtkit )
121 samba? ( >=net-fs/samba-3.0.25[winbind] )
122 selinux? ( sec-policy/selinux-wine )
123 udisks? ( sys-fs/udisks:2 )"
125 # tools/make_requests requires perl
126 DEPEND="${COMMON_DEPEND}
128 >=sys-kernel/linux-headers-2.6
131 X? ( x11-base/xorg-proto )
132 prelink? ( sys-devel/prelink )
133 xinerama? ( x11-base/xorg-proto )"
135 # These use a non-standard "Wine" category, which is provided by
136 # /etc/xdg/applications-merged/wine.menu
137 QA_DESKTOP_FILE="usr/share/applications/wine-browsedrive.desktop
138 usr/share/applications/wine-notepad.desktop
139 usr/share/applications/wine-uninstaller.desktop
140 usr/share/applications/wine-winecfg.desktop"
143 "${PATCHDIR}/patches/${MY_PN}-5.0-winegcc.patch" #260726
144 "${PATCHDIR}/patches/${MY_PN}-4.7-multilib-portage.patch" #395615
145 "${PATCHDIR}/patches/${MY_PN}-2.0-multislot-apploader.patch" #310611
149 # https://bugs.gentoo.org/show_bug.cgi?id=635222
150 if [[ ${#PATCHES_BIN[@]} -ge 1 ]] || [[ ${PV} == 9999 ]]; then
151 DEPEND+=" dev-util/patchbin"
154 wine_compiler_check() {
155 [[ ${MERGE_TYPE} = "binary" ]] && return 0
160 if use abi_x86_64 && [[ $(gcc-major-version) = 5 && $(gcc-minor-version) -le 2 ]]; then
161 ebegin "Checking for gcc-5 ms_abi compiler bug"
162 $(tc-getCC) -O2 "${PATCHDIR}/files/pr66838.c" -o "${T}"/pr66838 || die
163 # Run in subshell to prevent "Aborted" message
164 ( "${T}"/pr66838 || false ) >/dev/null 2>&1
166 eerror "64-bit wine cannot be built with gcc-5.1 or initial patchset of 5.2.0"
167 eerror "due to compiler bugs; please re-emerge the latest gcc-5.2.x ebuild,"
168 eerror "or use gcc-config to select a different compiler version."
169 eerror "See https://bugs.gentoo.org/549768"
175 if use abi_x86_64 && [[ $(gcc-major-version) = 5 && $(gcc-minor-version) = 3 ]]; then
176 ebegin "Checking for gcc-5-3 stack realignment compiler bug"
177 # Compile in subshell to prevent "Aborted" message
178 ( $(tc-getCC) -O2 -mincoming-stack-boundary=3 "${PATCHDIR}/files/pr69140.c" -o "${T}"/pr69140 ) >/dev/null 2>&1
180 eerror "Wine cannot be built with this version of gcc-5.3"
181 eerror "due to compiler bugs; please re-emerge the latest gcc-5.3.x ebuild,"
182 eerror "or use gcc-config to select a different compiler version."
183 eerror "See https://bugs.gentoo.org/574044"
190 # Ensure compiler support
191 if use abi_x86_64; then
192 ebegin "Checking for 64-bit compiler with builtin_ms_va_list support"
193 # Compile in subshell to prevent "Aborted" message
194 ( $(tc-getCC) -O2 "${PATCHDIR}/files/builtin_ms_va_list.c" -o "${T}"/builtin_ms_va_list >/dev/null 2>&1)
196 eerror "This version of $(tc-getCC) does not support builtin_ms_va_list, can't enable 64-bit wine"
198 eerror "You need gcc-4.4+ or clang 3.8+ to build 64-bit wine"
205 wine_build_environment_check() {
206 [[ ${MERGE_TYPE} = "binary" ]] && return 0
208 if use abi_x86_64; then
209 if tc-is-gcc && [[ $(gcc-major-version) -lt 4 || ( $(gcc-major-version) -eq 4 && $(gcc-minor-version) -lt 4 ) ]]; then
210 eerror "You need gcc-4.4+ to compile 64-bit wine"
212 elif tc-is-clang && [[ $(clang-major-version) -lt 3 || ( $(clang-major-version) -eq 3 && $(clang-minor-version) -lt 8 ) ]]; then
213 eerror "You need clang-3.8+ to compile 64-bit wine"
217 if tc-is-gcc && [[ $(gcc-major-version) -eq 5 && $(gcc-minor-version) -le 3 ]]; then
218 ewarn "GCC-5.0-5.3 suffered from compiler bugs and are no longer supported by"
219 ewarn "Gentoo's Toolchain Team. If your ebuild fails the compiler checks in"
220 ewarn "the configure phase, either update your compiler or switch to <5.0 || >=5.4"
222 if tc-is-gcc && [[ $(gcc-major-version) -eq 5 && $(gcc-minor-version) -eq 4 ]]; then
223 if has "-march=i686" ${CFLAGS} && ! has "-mtune=generic" ${CFLAGS}; then
224 ewarn "Compilation can hang with CFLAGS=\"-march=i686\". You can temporarily work"
225 ewarn "around this by adding \"-mtune=generic\" to your CFLAGS for wine."
226 ewarn "See package.env in man 5 portage for more information on how to do this."
227 ewarn "See https://bugs.gentoo.org/show_bug.cgi?id=613128 for more details"
231 if use abi_x86_32 && use opencl && [[ "$(eselect opencl show 2> /dev/null)" == "intel" ]]; then
232 eerror "You cannot build wine with USE=opencl because intel-ocl-sdk is 64-bit only."
233 eerror "See https://bugs.gentoo.org/487864 for more details."
239 wine_env_vcs_vars() {
240 local pn_live_var="${PN//[-+]/_}_LIVE_COMMIT"
241 local pn_live_val="${pn_live_var}"
242 eval pn_live_val='$'${pn_live_val}
243 if [[ ! -z ${EGIT_COMMIT} ]]; then
244 eerror "Commits must now be specified using the environmental variables"
245 eerror "EGIT_OVERRIDE_COMMIT_WINE"
252 wine_build_environment_check || die
255 if use oss && ! use kernel_FreeBSD; then
256 if ! has_version ">=media-sound/oss-4"; then
257 eerror "You cannot build wine with USE=oss without having support from a"
258 eerror "FreeBSD kernel or >=media-sound/oss-4 (only available through external repos)"
266 wine_build_environment_check || die
267 wine_env_vcs_vars || die
269 WINE_VARIANT="${PN#wine}-${PV}"
270 WINE_VARIANT="${WINE_VARIANT#-}"
272 MY_PREFIX="${EPREFIX}/usr/lib/wine-${WINE_VARIANT}"
273 MY_DATAROOTDIR="${EPREFIX}/usr/share/wine-${WINE_VARIANT}"
274 MY_DATADIR="${MY_DATAROOTDIR}"
275 MY_DOCDIR="${EPREFIX}/usr/share/doc/${PF}"
276 MY_INCLUDEDIR="${EPREFIX}/usr/include/wine-${WINE_VARIANT}"
277 MY_LIBEXECDIR="${EPREFIX}/usr/libexec/wine-${WINE_VARIANT}"
278 MY_LOCALSTATEDIR="${EPREFIX}/var/wine-${WINE_VARIANT}"
279 MY_MANDIR="${MY_DATADIR}/man"
283 if [[ ${PV} == "9999" ]] ; then
284 EGIT_CHECKOUT_DIR="${S}" git-r3_src_unpack
289 l10n_find_plocales_changes "${S}/po" "" ".po"
296 for patch in ${PATCHES_BIN[@]}; do
297 patchbin --nogit < "${patch}" || die
301 local md5="$(md5sum server/protocol.def)"
307 # Modification of the server protocol requires regenerating the server requests
308 if [[ "$(md5sum server/protocol.def)" != "${md5}" ]]; then
309 einfo "server/protocol.def was patched; running tools/make_requests"
310 tools/make_requests || die #432348
312 sed -i '/^UPDATE_DESKTOP_DATABASE/s:=.*:=true:' tools/Makefile.in || die
313 if ! use run-exes; then
314 sed -i '/^MimeType/d' loader/wine.desktop || die #117785
317 # Edit wine.desktop to work for specific variant
318 sed -e "/^Exec=/s/wine /wine-${WINE_VARIANT} /" -i loader/wine.desktop || die
320 # hi-res default icon, #472990, https://bugs.winehq.org/show_bug.cgi?id=24652
321 cp "${PATCHDIR}/files/oic_winlogo.ico" dlls/user32/resources/ || die
323 l10n_get_locales > po/LINGUAS || die # otherwise wine doesn't respect LINGUAS
325 # Fix manpage generation for locales #469418 and abi_x86_64 #617864
327 # Duplicate manpages input files for wine64
329 for f in loader/*.man.in; do
330 cp ${f} ${f/wine/wine64} || die
332 # Add wine64 manpages to Makefile
333 if use abi_x86_64; then
334 sed -i "/wine.man.in/i \
335 \\\twine64.man.in \\\\" loader/Makefile.in || die
336 sed -i -E 's/(.*wine)(.*\.UTF-8\.man\.in.*)/&\
337 \164\2/' loader/Makefile.in || die
343 sed -i "/${loc}\.UTF-8\.man\.in/d" "${file}" || die
347 l10n_for_each_disabled_locale_do rm_man_file "${f}"
348 done < <(find -name "Makefile.in" -exec grep -q "UTF-8.man.in" "{}" \; -print)
352 wine_compiler_check || die
354 export LDCONFIG=/bin/true
355 use custom-cflags || strip-flags
357 multilib-minimal_src_configure
360 multilib_src_configure() {
362 --prefix="${MY_PREFIX}"
363 --datarootdir="${MY_DATAROOTDIR}"
364 --datadir="${MY_DATADIR}"
365 --docdir="${MY_DOCDIR}"
366 --includedir="${MY_INCLUDEDIR}"
367 --libdir="${EPREFIX}/usr/$(get_libdir)/wine-${WINE_VARIANT}"
368 --libexecdir="${MY_LIBEXECDIR}"
369 --localstatedir="${MY_LOCALSTATEDIR}"
370 --mandir="${MY_MANDIR}"
371 --sysconfdir="${EPREFIX}/etc/wine"
376 $(use_with ncurses curses)
377 $(use_with udisks dbus)
379 $(use_with fontconfig)
380 $(use_with ssl gnutls)
381 $(use_enable gecko mshtml)
382 $(use_with gphoto2 gphoto)
385 $(use_with gstreamer)
388 $(use_with kerberos krb5)
390 --without-mingw # linux LDFLAGS leak in mingw32: bug #685172
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)
415 $(use_with xcomposite)
421 local PKG_CONFIG AR RANLIB
422 # Avoid crossdev's i686-pc-linux-gnu-pkg-config if building wine32 on amd64; #472038
423 # set AR and RANLIB to make QA scripts happy; #483342
424 tc-export PKG_CONFIG AR RANLIB
427 if [[ ${ABI} == amd64 ]]; then
428 myconf+=( --enable-win64 )
430 myconf+=( --disable-win64 )
433 # Note: using --with-wine64 results in problems with multilib.eclass
434 # CC/LD hackery. We're using separate tools instead.
442 multilib_src_test() {
443 # FIXME: win32-only; wine64 tests fail with "could not find the Wine loader"
444 if [[ ${ABI} == x86 ]]; then
445 if [[ $(id -u) == 0 ]]; then
446 ewarn "Skipping tests since they cannot be run under the root user."
447 ewarn "To run the test ${MY_PN} suite, add userpriv to FEATURES in make.conf"
451 WINEPREFIX="${T}/.wine-${ABI}" \
456 multilib_src_install_all() {
457 local DOCS=( ANNOUNCE AUTHORS README )
459 local locale_doc="documentation/README.$1"
460 [[ ! -e ${locale_doc} ]] || DOCS+=( ${locale_doc} )
462 l10n_for_each_locale_do add_locale_docs
465 prune_libtool_files --all
467 if ! use perl ; then # winedump calls function_grep.pl, and winemaker is a perl script
468 rm "${D%/}${MY_PREFIX}"/bin/{wine{dump,maker},function_grep.pl} \
469 "${D%/}${MY_MANDIR}"/man1/wine{dump,maker}.1 || die
472 # Remove wineconsole if neither backend is installed #551124
473 if ! use X && ! use ncurses; then
474 rm "${D%/}${MY_PREFIX}"/bin/wineconsole* || die
475 rm "${D%/}${MY_MANDIR}"/man1/wineconsole* || die
477 rm "${D%/}${MY_PREFIX}/$(get_libdir)"/wine/{,fakedlls/}wineconsole.exe* || die
479 multilib_foreach_abi rm_wineconsole
482 use abi_x86_32 && pax-mark psmr "${D%/}${MY_PREFIX}"/bin/wine{,-preloader} #255055
483 use abi_x86_64 && pax-mark psmr "${D%/}${MY_PREFIX}"/bin/wine64{,-preloader}
485 # Avoid double prefix from dosym and make_wrapper
486 MY_PREFIX=${MY_PREFIX#${EPREFIX}}
488 if use abi_x86_64 && ! use abi_x86_32; then
489 dosym wine64 "${MY_PREFIX}"/bin/wine # 404331
490 dosym wine64-preloader "${MY_PREFIX}"/bin/wine-preloader
493 # Failglob for binloops, shouldn't be necessary, but including to stay safe
494 eshopts_push -s failglob #615218
495 # Make wrappers for binaries for handling multiple variants
496 # Note: wrappers instead of symlinks because some are shell which use basename
498 for b in "${ED%/}${MY_PREFIX}"/bin/*; do
499 make_wrapper "${b##*/}-${WINE_VARIANT}" "${MY_PREFIX}/bin/${b##*/}"
505 eselect wine register ${P}
506 if [[ ${PN} == "wine-vanilla" ]]; then
507 eselect wine register --vanilla ${P} || die
510 eselect wine update --all --if-unset || die
512 xdg_desktop_database_update
515 ewarn "Without Wine Gecko, wine prefixes will not have a default"
516 ewarn "implementation of iexplore. Many older windows applications"
517 ewarn "rely upon the existence of an iexplore implementation, so"
518 ewarn "you will likely need to install an external one, like via winetricks"
521 ewarn "Without Wine Mono, wine prefixes will not have a default"
522 ewarn "implementation of .NET. Many windows applications rely upon"
523 ewarn "the existence of a .NET implementation, so you will likely need"
524 ewarn "to install an external one, like via winetricks"
529 eselect wine deregister ${P}
530 if [[ ${PN} == "wine-vanilla" ]]; then
531 eselect wine deregister --vanilla ${P} || die
534 eselect wine update --all --if-unset || die
538 xdg_desktop_database_update