1 # Copyright 1999-2020 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 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"
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 "${PATCHDIR}/patches/${MY_PN}-1.5.26-winegcc.patch" #260726
143 "${PATCHDIR}/patches/${MY_PN}-1.9.5-multilib-portage.patch" #395615
144 "${PATCHDIR}/patches/${MY_PN}-1.6-memset-O3.patch" #480508
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_INCLUDEDIR="${EPREFIX}/usr/include/wine-${WINE_VARIANT}"
276 MY_LIBEXECDIR="${EPREFIX}/usr/libexec/wine-${WINE_VARIANT}"
277 MY_LOCALSTATEDIR="${EPREFIX}/var/wine-${WINE_VARIANT}"
278 MY_MANDIR="${MY_DATADIR}/man"
282 if [[ ${PV} == "9999" ]] ; then
283 EGIT_CHECKOUT_DIR="${S}" git-r3_src_unpack
288 l10n_find_plocales_changes "${S}/po" "" ".po"
295 for patch in ${PATCHES_BIN[@]}; do
296 patchbin --nogit < "${patch}" || die
300 local md5="$(md5sum server/protocol.def)"
306 # Modification of the server protocol requires regenerating the server requests
307 if [[ "$(md5sum server/protocol.def)" != "${md5}" ]]; then
308 einfo "server/protocol.def was patched; running tools/make_requests"
309 tools/make_requests || die #432348
311 sed -i '/^UPDATE_DESKTOP_DATABASE/s:=.*:=true:' tools/Makefile.in || die
312 if ! use run-exes; then
313 sed -i '/^MimeType/d' loader/wine.desktop || die #117785
316 # Edit wine.desktop to work for specific variant
317 sed -e "/^Exec=/s/wine /wine-${WINE_VARIANT} /" -i loader/wine.desktop || die
319 # hi-res default icon, #472990, https://bugs.winehq.org/show_bug.cgi?id=24652
320 cp "${PATCHDIR}/files/oic_winlogo.ico" dlls/user32/resources/ || die
322 l10n_get_locales > po/LINGUAS || die # otherwise wine doesn't respect LINGUAS
324 # Fix manpage generation for locales #469418 and abi_x86_64 #617864
326 # Duplicate manpages input files for wine64
328 for f in loader/*.man.in; do
329 cp ${f} ${f/wine/wine64} || die
331 # Add wine64 manpages to Makefile
332 if use abi_x86_64; then
333 sed -i "/wine.man.in/i \
334 \\\twine64.man.in \\\\" loader/Makefile.in || die
335 sed -i -E 's/(.*wine)(.*\.UTF-8\.man\.in.*)/&\
336 \164\2/' loader/Makefile.in || die
342 sed -i "/${loc}\.UTF-8\.man\.in/d" "${file}" || die
346 l10n_for_each_disabled_locale_do rm_man_file "${f}"
347 done < <(find -name "Makefile.in" -exec grep -q "UTF-8.man.in" "{}" \; -print)
351 wine_compiler_check || die
353 export LDCONFIG=/bin/true
354 use custom-cflags || strip-flags
356 multilib-minimal_src_configure
359 multilib_src_configure() {
361 --prefix="${MY_PREFIX}"
362 --datarootdir="${MY_DATAROOTDIR}"
363 --datadir="${MY_DATADIR}"
364 --includedir="${MY_INCLUDEDIR}"
365 --libdir="${EPREFIX}/usr/$(get_libdir)/wine-${WINE_VARIANT}"
366 --libexecdir="${MY_LIBEXECDIR}"
367 --localstatedir="${MY_LOCALSTATEDIR}"
368 --mandir="${MY_MANDIR}"
369 --sysconfdir=/etc/wine
374 $(use_with ncurses curses)
375 $(use_with udisks dbus)
376 $(use_with fontconfig)
377 $(use_with ssl gnutls)
378 $(use_enable gecko mshtml)
379 $(use_with gphoto2 gphoto)
382 $(use_with gstreamer)
385 $(use_with kerberos krb5)
387 $(use_enable mono mscoree)
388 $(use_with mp3 mpg123)
390 $(use_with nls gettext)
398 $(use_with pulseaudio pulse)
399 $(use_with threads pthread)
400 $(use_with scanner sane)
402 $(use_enable test tests)
403 $(use_with truetype freetype)
410 $(use_with xcomposite)
416 local PKG_CONFIG AR RANLIB
417 # Avoid crossdev's i686-pc-linux-gnu-pkg-config if building wine32 on amd64; #472038
418 # set AR and RANLIB to make QA scripts happy; #483342
419 tc-export PKG_CONFIG AR RANLIB
422 if [[ ${ABI} == amd64 ]]; then
423 myconf+=( --enable-win64 )
425 myconf+=( --disable-win64 )
428 # Note: using --with-wine64 results in problems with multilib.eclass
429 # CC/LD hackery. We're using separate tools instead.
437 multilib_src_test() {
438 # FIXME: win32-only; wine64 tests fail with "could not find the Wine loader"
439 if [[ ${ABI} == x86 ]]; then
440 if [[ $(id -u) == 0 ]]; then
441 ewarn "Skipping tests since they cannot be run under the root user."
442 ewarn "To run the test ${MY_PN} suite, add userpriv to FEATURES in make.conf"
446 WINEPREFIX="${T}/.wine-${ABI}" \
451 multilib_src_install_all() {
452 local DOCS=( ANNOUNCE AUTHORS README )
454 local locale_doc="documentation/README.$1"
455 [[ ! -e ${locale_doc} ]] || DOCS+=( ${locale_doc} )
457 l10n_for_each_locale_do add_locale_docs
460 prune_libtool_files --all
462 if ! use perl ; then # winedump calls function_grep.pl, and winemaker is a perl script
463 rm "${D%/}${MY_PREFIX}"/bin/{wine{dump,maker},function_grep.pl} \
464 "${D%/}${MY_MANDIR}"/man1/wine{dump,maker}.1 || die
467 # Remove wineconsole if neither backend is installed #551124
468 if ! use X && ! use ncurses; then
469 rm "${D%/}${MY_PREFIX}"/bin/wineconsole* || die
470 rm "${D%/}${MY_MANDIR}"/man1/wineconsole* || die
472 rm "${D%/}${MY_PREFIX}/$(get_libdir)"/wine/{,fakedlls/}wineconsole.exe* || die
474 multilib_foreach_abi rm_wineconsole
477 use abi_x86_32 && pax-mark psmr "${D%/}${MY_PREFIX}"/bin/wine{,-preloader} #255055
478 use abi_x86_64 && pax-mark psmr "${D%/}${MY_PREFIX}"/bin/wine64{,-preloader}
480 if use abi_x86_64 && ! use abi_x86_32; then
481 dosym wine64 "${MY_PREFIX}"/bin/wine # 404331
482 dosym wine64-preloader "${MY_PREFIX}"/bin/wine-preloader
485 # Failglob for binloops, shouldn't be necessary, but including to stay safe
486 eshopts_push -s failglob #615218
487 # Make wrappers for binaries for handling multiple variants
488 # Note: wrappers instead of symlinks because some are shell which use basename
490 for b in "${D%/}${MY_PREFIX}"/bin/*; do
491 make_wrapper "${b##*/}-${WINE_VARIANT}" "${MY_PREFIX}/bin/${b##*/}"
497 eselect wine register ${P}
498 if [[ ${PN} == "wine-vanilla" ]]; then
499 eselect wine register --vanilla ${P} || die
502 eselect wine update --all --if-unset || die
504 xdg_desktop_database_update
507 ewarn "Without Wine Gecko, wine prefixes will not have a default"
508 ewarn "implementation of iexplore. Many older windows applications"
509 ewarn "rely upon the existence of an iexplore implementation, so"
510 ewarn "you will likely need to install an external one, like via winetricks"
513 ewarn "Without Wine Mono, wine prefixes will not have a default"
514 ewarn "implementation of .NET. Many windows applications rely upon"
515 ewarn "the existence of a .NET implementation, so you will likely need"
516 ewarn "to install an external one, like via winetricks"
521 eselect wine deregister ${P}
522 if [[ ${PN} == "wine-vanilla" ]]; then
523 eselect wine deregister --vanilla ${P} || die
526 eselect wine update --all --if-unset || die
530 xdg_desktop_database_update