diff -r 1e332d63bd96 -r fa378e035b81 doc/building.md --- a/doc/building.md Fri Aug 24 08:17:23 2018 +0200 +++ b/doc/building.md Fri Aug 24 09:38:11 2018 +0200 @@ -1018,6 +1018,51 @@ * If the X11 libraries are not properly detected by `configure`, you can point them out by `--with-x`. +### Creating And Using Sysroots With qemu-deboostrap + +Fortunately, you can create sysroots for foreign architectures with tools +provided by your OS. On Debian/Ubuntu systems, one could use `qemu-deboostrap` to +create the *target* system chroot, which would have the native libraries and headers +specific to that *target* system. After that, we can use the cross-compiler on the *build* +system, pointing into chroot to get the build dependencies right. This allows building +for foreign architectures with native compilation speed. + +For example, cross-compiling to AArch64 from x86_64 could be done like this: + + * Install cross-compiler on the *build* system: +``` +apt install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu +``` + + * Create chroot on the *build* system, configuring it for *target* system: +``` +sudo qemu-debootstrap --arch=arm64 --verbose \ + --include=fakeroot,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng12-dev \ + --resolve-deps jessie /chroots/arm64 http://httpredir.debian.org/debian/ +``` + + * Configure and build with newly created chroot as sysroot/toolchain-path: +``` +CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ sh ./configure --openjdk-target=aarch64-linux-gnu --with-sysroot=/chroots/arm64/ --with-toolchain-path=/chroots/arm64/ +make images +ls build/linux-aarch64-normal-server-release/ +``` + +The build does not create new files in that chroot, so it can be reused for multiple builds +without additional cleanup. + +Architectures that are known to successfully cross-compile like this are: + + Target `CC` `CXX` `--arch=...` `--openjdk-target=...` + ------------ ------------------------- --------------------------- ------------ ---------------------- + x86 default default i386 i386-linux-gnu + armhf gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf armhf arm-linux-gnueabihf + aarch64 gcc-aarch64-linux-gnu g++-aarch64-linux-gnu arm64 aarch64-linux-gnu + ppc64el gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu ppc64el powerpc64le-linux-gnu + s390x gcc-s390x-linux-gnu g++-s390x-linux-gnu s390x s390x-linux-gnu + +Additional architectures might be supported by Debian/Ubuntu Ports. + ### Building for ARM/aarch64 A common cross-compilation target is the ARM CPU. When building for ARM, it is