[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Fake cross-toolchains via multiarch

[ Originally sent to d-d@l.d.o, but resending an updated version to
  d-c@l.d.o, as people here might have missed the initial mail. ]


I've been using this locally for some time to “cross-build” to i386,
and to cheaply test cross-build support in packages; and have been
meaning to publish it, but was prompted to do it now, due to some
recent bugs filed against dpkg to support multilib style

Mutlilib is IMO a hack that should just disappear in Debian at least at
the packaging level, not necessarily on the gcc support level; it needs
special casing and can confuse the build systems because it's not really
transparent (for example «gcc -m32 -dumpmachin» does not print the
correct triplet). Instead I present a fake cross-toolchain (currently
based on basic gcc multilib support) but “deceiving” gcc to use the
multiarch files instead.

For example to use an amd64 → i486 fake cross-toolchain you do:

  $ dpkg --print-architecture
  $ apt-get install libgcc-4.8-dev:i386 libc6-dev:i386
  $ ln -s ../../i486-linux-gnu/4.8 /usr/lib/gcc/x86_64-linux-gnu/4.8/32
  $ ./gen-cross amd64
  $ cp x86_64-linux-gnu-* /usr/local/bin

And then you could, for example, use it like this when building packages:

  $ CC=i486-linux-gnu-gcc dpkg-buildpackage -ai386

(I'm still pondering if dpkg-buildpackage should set the cross-toolchain
environment variables, probably it should.)

Beware that if you have the libmudflap0-4.8-dev packages installed,
they ship the alternative multilib files on the native package, so
you'll need to get the 32 directory out of the way («mv 32 32-old»
will do but dpkg might overwrite files there on upgrade). I've filed
719885 for that (which is fixed now with the removal of the packages).

Here's the git repo for people to play with, I'll happily take patches
for other fake cross-toolchains. And I could even consider turning this
into a package if people demanded it.



Reply to: