Porting wine to amd64 on NetBSD, second evaluation report
This report was written by Naveen Narayanan as part of Google Summer of Code 2019.
This report encompasses the progress of the project during the second coding period.
WINE on amd64
As getting Wine to work with WoW64 support was of foremost
importance, my focus was on compat32 dependency packages without
which Wine's functionality would be limited and more importantly
untestable. Initially, being unaware of what to expect, I just
wanted Wine to run, at the earliest. So, with outmost support from
mentors, the consensus was to install libs from 32-bit packages to
${PREFIX}/lib/32
and ignore everything else that came with the
respective packages.
I had most of the compat32 packages ready after a couple of
days. And it was time we gave Wine a whirl. Well, the build was
successful. However, I had problems with 32-bit Xorg. The
applications which came packaged with Wine worked fine, but, other
Microsoft Windows applications like notepad++, Mario etc had a
hard time running. Additionally, I noticed that fontconfig went
wild and crashed spewing errors symptomatic of Wine (32-bit) not
playing nice with the fontconfig lib that came with 32-bit Xorg
package. On top of this, I found that build failed on certain
machines due to unavailability of headers. This made us reconsider
our decision to install 32-bit libs to ${PREFIX}/lib/32
and ignore
everything else which included headers and binaries.
Ultimately, we realized that it was time we found a proper
solution to the problem of where 32-bit packages should be
installed on NetBSD amd64 and then, we eventually settled on
${PREFIX}/emul/netbsd32/
. It seemed logical, and I
got on with the task of adapting the respective Makefiles of
dependency packages to install
to ${PREFIX}/emul/netbsd32/
. Additionally, I packaged
fontconfig (32-bit) in high hopes that Wine would behave
appropriately with the former. Wine build was successful. However,
I noticed that Wine wasn't linking against the fontconfig libs
from my package but against the ones which came with 32-bit Xorg
package. Later, I realized, after consulting with mentors, that
pkgsrc doesn't search for pkgconfig files (*.pc)
in ${PREFIX}/emul/netbsd32/lib
by default. pkgsrc
sets
_PKG_CONFIG_LIBDIR appropriately based
on ${LIBABISUFFIX}
. As you can see, it doesn't search
for .pc files in ${PREFIX}/emul/netbsd32/lib
and
hence, pkgconfig couldn't get the right flags for fontconfig
package. On the other hand, Wine configure script found fontconfig
libs provided by 32-bit Xorg package against which it linked
wine. A kludgy workaround was to use configure args for the
respective libs thereby, obviating configure from finding the
wrong libs. Finally, with the help of aforementioned kludgy
workarounds, we were able to build Wine and successfully run Mario
and Lua (32-bit binaries).
How to run Wine on NetBSD -current
- Build -current distribution.
- Compile -current kernel with USER_LDT enabled and SVS disabled.
- Install kernel and distribution.
- Clone wip repo.
-
cd /usr/pkgsrc/wip/wine64; make install
-
export LD_LIBRARY_PATH=/usr/pkg/emul/netbsd32/lib; wine mario.exe
Future Plans
Wine requires the kernel option USER_LDT to be able to run 32-bit applications on amd64 - facilitated by WoW64. Presently, this feature isn't enabled by default on NetBSD and hence, the kernel has to be compiled with USER_LDT enabled. This also warrants the kernel option SVS to be disabled currently owing to compatability issues. Work is being done to resolve the conflict which would apparently allow USER_LDT to be enabled by default in the GENERIC kernel.
pkgsrc
can be made to search for pkgconf config files in
${PREFIX}/emul/netbsd32/lib
by setting
_PKG_CONFIG_LIBDIR to
${BUILDLINK_DIR}${LIBABIPREFIX}/lib${LIBABISUFFIX}
as
per @maya's suggestion. It might take some more thought and time
before we finalize it.
Summary
Presently, Wine on amd64 is in test phase. It seems to work fine
with caveats like LD_LIBRARY_PATH which has to be set as 32-bit
Xorg libs don't have ${PREFIX}/emul/netbsd32/lib
in its rpath
section. The latter is due to us extracting 32-bit libs from
tarballs in lieu of building 32-bit Xorg on amd64. As previously
stated, pkgsrc doesn't search for pkgconfig files in
${PREFIX}/emul/netbsd32/lib
which might have inadvertent effects
that I am unaware of as of now. I shall be working on these issues
during the final coding period. I would like to thank @leot, @maya
and @christos for saving me from shooting myself in the foot
many a time. I, admittedly, have had times when multiple
approaches, which all seemed right at that time, perplexed me. I
believe those are times when having a mentor counts, and I have
been lucky enough to have really good ones. Once again, thanks to
Google for this wonderful opportunity.