On Tue, Jan 27, 2026 at 02:29:25AM +0000, Sam James wrote:
> James Le Cuirot <[email protected]> writes:
> 
> > We do not support installing Wine for other architectures, so we assume
> > that Wine can do its own CPU emulation.
> >
> > The sandbox cannot handle Wine and emits a warning even if you allow all
> > writes, so it needs to be disabled.
> >
> > Unlike Linux shared libraries, Windows DLLs are placed in bin rather
> > than lib, so we need to include that in WINEPATH. lib has been included
> > too, just in case.
> >
> > binfmt_misc supports Windows binaries, but there is no point in
> > supporting that combination here, as Wine would need to be installed
> > locally regardless. This cannot be extended into a container like it can
> > with QEMU.
> >
> > This has been tested with i686-w64-mingw32 from crossdev against
> > dev-vcs/git[iconv] after dropping the iconv cross patch.
> >
> > Signed-off-by: James Le Cuirot <[email protected]>
> > ---
> >  eclass/sysroot.eclass | 16 +++++++++++++++-
> >  1 file changed, 15 insertions(+), 1 deletion(-)
> >
> > I was quite surprised to find that winepath itself runs under Wine. I don't
> > like that much and thought it was reasonable to convert these particular 
> > paths
> > by hand.
> >
> > I also realised that libgcc is important here after finding that zstd.exe 
> > would
> > not run without it in the WINEPATH.
> >
> > diff --git a/eclass/sysroot.eclass b/eclass/sysroot.eclass
> > index 0fae642bf593c..3d710f4917419 100644
> > --- a/eclass/sysroot.eclass
> > +++ b/eclass/sysroot.eclass
> > @@ -80,7 +80,21 @@ sysroot_make_run_prefixed() {
> >             fi
> >     fi
> >
> > -   if [[ ${QEMU_ARCH} == $(qemu_arch "${CBUILD}") ]]; then
> > +   if [[ ${CHOST} = *-mingw32 ]]; then
> > +           if ! type -P wine >/dev/null; then
> > +                   einfo "Wine not found. Continuing without ${SCRIPT##*/} 
> > wrapper."
> > +                   return 1
> > +           fi
> > +
> > +           # UNIX paths can work, but programs will not expect this in 
> > %PATH%.
> > +           local 
> > winepath="Z:${LIBGCC};Z:${MYEROOT}/bin;Z:${MYEROOT}/usr/bin;Z:${MYEROOT}/$(get_libdir);Z:${MYEROOT}/usr/$(get_libdir)"
> > +
> > +           # Assume that Wine can do its own CPU emulation.
> > +           install -m0755 /dev/stdin "${SCRIPT}" <<-EOF || die
> 
> (What about my '-' question?)
> 
> > +                   #!/bin/sh
> > +                   SANDBOX_ON=0 LD_PRELOAD= 
> > WINEPATH="\${WINEPATH}\${WINEPATH+;};${winepath//\//\\}" exec wine "\${@}"
> 
> shellcheck sez:
> SC3060 (warning): In POSIX sh, string replacement is undefined.

I think shellcheck iz wrong. The replacement happens in the Bash context, not
the /bin/sh context.

> 
> > +           EOF
> > +   elif [[ ${QEMU_ARCH} == $(qemu_arch "${CBUILD}") ]]; then
> >             # glibc: ld.so is a symlink, ldd is a binary.
> >             # musl: ld.so doesn't exist, ldd is a symlink.
> >             local DLINKER candidate



Reply via email to