On Thu, 8 Apr 2021 21:12:29 +0100, Ximin Luo <[email protected]> wrote:
> Stephen Kitt:
> > On Thu, 8 Apr 2021 13:11:46 +0100, Ximin Luo <[email protected]>
> > wrote:  
> >>> On Thu, 08 Apr 2021 01:35:49 +0100, Ximin Luo <[email protected]>
> >>> wrote:    
> >>>> Please mark gcc-mingw-w64-base "Multi-Arch: same" so that different
> >>>> architectures can be co-installed. This is necessary to support
> >>>> co-installing the i686 and x86-64 toolchain packages, both of which
> >>>> depend on this package but for their respective architectures.
> >>>>
> >>>> As far as I can tell this package has the same content on all
> >>>> architectures, so this should be safe:
> >>>> https://wiki.debian.org/MultiArch/Hints#set_Multi-Arch:_same    
> >>>
> >>> It should be, yes, but I’m curious about why you’d want to install the
> >>> packages for both architectures simultaneously. Could you explain the
> >>> scenario?  
> >>
> >> Hi, yes my scenario is to co-install both libstd-rust-dev-windows:i386
> >> and libstd-rust-dev-windows:amd64 so that my rustc can cross-compile to
> >> both 32-bit and 64-bit windows at the same time.  
> > 
> > OK, I understand. I didn’t follow that route with the GCC MinGW-w64
> > package because my initial goal (still relevant, albeit not something
> > I’ll have time to work on in the foreseeable future) was to add real
> > arches for the targets, so the library packages would ultimately have
> > been :win32 and :win64 (or something like that).
> >   
> 
> By "that route" do you mean the fact that I have a single package name
> libstd-rust-dev-windows:$arch ?
> 
> To avoid a potential misunderstanding - this works for LLVM-based compilers
> only, not GCC-based compilers like MinGW. In other words, I think what you
> are doing currently with gcc-mingw-w64 is fine (except for the missing
> Multi-Arch labels, as per this bug) and it matches how the regular gcc
> cross compilers work, i.e. they are named
> 
> gcc-$target:$host
> 
> e.g.
> gcc-powerpc-linux-gnu:{amd64, i386, .. etc}
> gcc-mingw-w64-i686-posix:{amd64, i386, .. etc}
> 
> With LLVM-based compilers such as rustc, there is no need to build a
> separate "cross compiler", rustc itself via LLVM already has the ability to
> cross-compile to any target. What you need to install however is the
> standard library for each target architecture that you want to
> cross-compile to, and this is the same regardless of whatever host
> architecture you are compiling on, so our packages are named like:
> 
> libstd-rust-dev:$target
> libstd-rust-dev-windows:$target
> 
> (The latter convention for the windows packages is a slight hack because
> "windows" isn't a Debian architecture, but it works for now.)

That’s what I’m referring to, yes; it would be possible on GCC too — we need
different compilers, but the libraries could be packaged using foreign
architectures (although support for that isn’t great, hence all the -cross
packages for the non-MinGW-w64 GCC cross-compiler packages in Debian).

> Regardless of what host architecture you are compiling from, you just need
> to install rustc:$host and libstd-rust-dev:$target.
> 
> However with a GCC-based compiler you really do need separate
> gcc-$target:$host packages. For example if you are on ARM64 and you wanted
> to cross-compile to windows i686 and x86-64, you would need to install
> gcc-mingw-w64-i686-posix:arm64 and gcc-mingw-w64-x86-64-posix:arm64, so in
> this case it is essential that you do actually have separate packages
> gcc-mingw-w64-i686-posix:$host and gcc-mingw-w64-x86-64-posix:$host, and
> don't merge them into one package name.

I’m fairly familiar with all this ;-).

> >> To do that, I need to co-install both gcc-mingw-w64-i686-posix:i386 and
> >> gcc-mingw-w64-x86-64-posix, but this is not yet possible due to this bug.
> >>
> >> Alternatively (and thinking about it, you should probably both), you can
> >> mark the compiler packages gcc-mingw-w64-*-* as "Multi-Arch: foreign" -
> >> this would e.g. allow gcc-mingw-w64-i686-posix:amd64 to satisfy the
> >> dependency from libstd-rust-dev-windows:i386 -> gcc-mingw-w64-i686-posix
> >> [no explicit architecture annotation] - without Multi-Arch: foreign, this
> >> dependency can only be satisfied by "gcc-mingw-w64-i686-posix:i386". It
> >> seems that gcc-mingw-w64-i686-posix:amd64
> >> gcc-mingw-w64-x86-64-posix:amd64 are already co-installable, so this
> >> would work for me too.
> >>
> >> Multi-Arch: foreign is what the gcc cross-compilers do, e.g.
> >> gcc-powerpc-linux-gnu. So in summary, amending my original instructions:
> >>
> >> - Multi-Arch: foreign - gcc-mingw-w64-*-*
> >> - Multi-Arch: same - gcc-mingw-w64-base - in fact the Debian QA
> >> Multi-Arch hinter[1] goes a step further, it suggests you convert this
> >> package to Architecture: all and mark it Multi-Arch: foreign; I'm not
> >> sure why this package is arch-dependent in the first place.
> >>
> >> [1]
> >> https://qa.debian.org/[email protected]&piuparts=1#gcc-mingw-w64
> >>   
> > 
> > The reason -base is arch-dependent is that it carries the changelog for
> > all the arch-dependent packages, so it has to remain arch-dependent to
> > provide binNMU changelogs. I’m somewhat reliant on binNMUs for GCC
> > updates so I’d rather keep it that way.
> >   
> >> (Note, libstd-rust-dev-windows:i386 doesn't exist in the Debian FTP
> >> archive yet, but I'm testing it locally - I'm only now just getting
> >> around to updating the rustc package to support cross-compiling to
> >> 32-bit windows after you fixed #540782, so thanks for that.)  
> > 
> > So that means all this is not for Bullseye, right? That’s somewhat
> > reassuring ;-).
> >   
> 
> Yes this is not for bullseye. It is just adding Multi-Arch: to
> debian/control though so I hope it can be done quickly. :)

OK; it might not fly for Bullseye but I’ll get it into experimental soon.

Regards,

Stephen

Attachment: pgp7DsTSQeszP.pgp
Description: OpenPGP digital signature

Reply via email to