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
358 multilib-minimal_src_configure
361 multilib_src_configure() {
363 --prefix="${MY_PREFIX}"
364 --datarootdir="${MY_DATAROOTDIR}"
365 --datadir="${MY_DATADIR}"
366 --docdir="${MY_DOCDIR}"
367 --includedir="${MY_INCLUDEDIR}"
368 --libdir="${EPREFIX}/usr/$(get_libdir)/wine-${WINE_VARIANT}"
369 --libexecdir="${MY_LIBEXECDIR}"
370 --localstatedir="${MY_LOCALSTATEDIR}"
371 --mandir="${MY_MANDIR}"
372 --sysconfdir=/etc/wine
377 $(use_with ncurses curses)
378 $(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 $(use_enable mono mscoree)
391 $(use_with mp3 mpg123)
393 $(use_with nls gettext)
401 $(use_with pulseaudio pulse)
402 $(use_with threads pthread)
403 $(use_with scanner sane)
405 $(use_enable test tests)
406 $(use_with truetype freetype)
413 $(use_with xcomposite)
419 local PKG_CONFIG AR RANLIB
420 # Avoid crossdev's i686-pc-linux-gnu-pkg-config if building wine32 on amd64; #472038
421 # set AR and RANLIB to make QA scripts happy; #483342
422 tc-export PKG_CONFIG AR RANLIB
425 if [[ ${ABI} == amd64 ]]; then
426 myconf+=( --enable-win64 )
428 myconf+=( --disable-win64 )
431 # Note: using --with-wine64 results in problems with multilib.eclass
432 # CC/LD hackery. We're using separate tools instead.
440 multilib_src_test() {
441 # FIXME: win32-only; wine64 tests fail with "could not find the Wine loader"
442 if [[ ${ABI} == x86 ]]; then
443 if [[ $(id -u) == 0 ]]; then
444 ewarn "Skipping tests since they cannot be run under the root user."
445 ewarn "To run the test ${MY_PN} suite, add userpriv to FEATURES in make.conf"
449 WINEPREFIX="${T}/.wine-${ABI}" \
454 multilib_src_install_all() {
455 local DOCS=( ANNOUNCE AUTHORS README )
457 local locale_doc="documentation/README.$1"
458 [[ ! -e ${locale_doc} ]] || DOCS+=( ${locale_doc} )
460 plocale_for_each_locale add_locale_docs
463 find "${ED}" -name *.la -delete || die
465 if ! use perl ; then # winedump calls function_grep.pl, and winemaker is a perl script
466 rm "${D%/}${MY_PREFIX}"/bin/{wine{dump,maker},function_grep.pl} \
467 "${D%/}${MY_MANDIR}"/man1/wine{dump,maker}.1 || die
470 # Remove wineconsole if neither backend is installed #551124
471 if ! use X && ! use ncurses; then
472 rm "${D%/}${MY_PREFIX}"/bin/wineconsole* || die
473 rm "${D%/}${MY_MANDIR}"/man1/wineconsole* || die
475 rm "${D%/}${MY_PREFIX}/$(get_libdir)"/wine/{,fakedlls/}wineconsole.exe* || die
477 multilib_foreach_abi rm_wineconsole
480 use abi_x86_32 && pax-mark psmr "${D%/}${MY_PREFIX}"/bin/wine{,-preloader} #255055
481 use abi_x86_64 && pax-mark psmr "${D%/}${MY_PREFIX}"/bin/wine64{,-preloader}
483 if use abi_x86_64 && ! use abi_x86_32; then
484 dosym wine64 "${MY_PREFIX}"/bin/wine # 404331
485 dosym wine64-preloader "${MY_PREFIX}"/bin/wine-preloader
488 # Failglob for binloops, shouldn't be necessary, but including to stay safe
489 eshopts_push -s failglob #615218
490 # Make wrappers for binaries for handling multiple variants
491 # Note: wrappers instead of symlinks because some are shell which use basename
493 for b in "${D%/}${MY_PREFIX}"/bin/*; do
494 make_wrapper "${b##*/}-${WINE_VARIANT}" "${MY_PREFIX}/bin/${b##*/}"
500 eselect wine register ${P}
501 if [[ ${PN} == "wine-vanilla" ]]; then
502 eselect wine register --vanilla ${P} || die
505 eselect wine update --all --if-unset || die
507 xdg_desktop_database_update
510 ewarn "Without Wine Gecko, wine prefixes will not have a default"
511 ewarn "implementation of iexplore. Many older windows applications"
512 ewarn "rely upon the existence of an iexplore implementation, so"
513 ewarn "you will likely need to install an external one, like via winetricks"
516 ewarn "Without Wine Mono, wine prefixes will not have a default"
517 ewarn "implementation of .NET. Many windows applications rely upon"
518 ewarn "the existence of a .NET implementation, so you will likely need"
519 ewarn "to install an external one, like via winetricks"
524 eselect wine deregister ${P}
525 if [[ ${PN} == "wine-vanilla" ]]; then
526 eselect wine deregister --vanilla ${P} || die
529 eselect wine update --all --if-unset || die
533 xdg_desktop_database_update