Skip to content

Commit 7879adb

Browse files
committedApr 21, 2021
8265343: Update Debian-based cross-compilation recipes
Reviewed-by: erikj
1 parent 98cb81b commit 7879adb

File tree

2 files changed

+115
-44
lines changed

2 files changed

+115
-44
lines changed
 

‎doc/building.html

+84-26
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ <h1 class="title">Building the JDK</h1>
7676
<li><a href="#specifying-the-target-platform">Specifying the Target Platform</a></li>
7777
<li><a href="#toolchain-considerations">Toolchain Considerations</a></li>
7878
<li><a href="#native-libraries">Native Libraries</a></li>
79-
<li><a href="#creating-and-using-sysroots-with-qemu-deboostrap">Creating And Using Sysroots With qemu-deboostrap</a></li>
79+
<li><a href="#cross-compiling-with-debian-sysroots">Cross compiling with Debian sysroots</a></li>
8080
<li><a href="#building-for-armaarch64">Building for ARM/aarch64</a></li>
8181
<li><a href="#building-for-musl">Building for musl</a></li>
8282
<li><a href="#verifying-the-build">Verifying the Build</a></li>
@@ -628,7 +628,7 @@ <h4 id="x11-1">X11</h4>
628628
cp: cannot stat `arm-linux-gnueabihf/libXt.so&#39;: No such file or directory</code></pre></li>
629629
<li><p>If the X11 libraries are not properly detected by <code>configure</code>, you can point them out by <code>--with-x</code>.</p></li>
630630
</ul>
631-
<h3 id="creating-and-using-sysroots-with-qemu-deboostrap">Creating And Using Sysroots With qemu-deboostrap</h3>
631+
<h3 id="cross-compiling-with-debian-sysroots">Cross compiling with Debian sysroots</h3>
632632
<p>Fortunately, you can create sysroots for foreign architectures with tools provided by your OS. On Debian/Ubuntu systems, one could use <code>qemu-deboostrap</code> to create the <em>target</em> system chroot, which would have the native libraries and headers specific to that <em>target</em> system. After that, we can use the cross-compiler on the <em>build</em> system, pointing into chroot to get the build dependencies right. This allows building for foreign architectures with native compilation speed.</p>
633633
<p>For example, cross-compiling to AArch64 from x86_64 could be done like this:</p>
634634
<ul>
@@ -638,75 +638,133 @@ <h3 id="creating-and-using-sysroots-with-qemu-deboostrap">Creating And Using Sys
638638
<pre><code>sudo qemu-debootstrap \
639639
--arch=arm64 \
640640
--verbose \
641-
--include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng-dev \
641+
--include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng-dev,libffi-dev \
642642
--resolve-deps \
643643
buster \
644644
~/sysroot-arm64 \
645645
http://httpredir.debian.org/debian/</code></pre></li>
646646
<li><p>Make sure the symlinks inside the newly created chroot point to proper locations:</p>
647647
<pre><code>sudo chroot ~/sysroot-arm64 symlinks -cr .</code></pre></li>
648648
<li><p>Configure and build with newly created chroot as sysroot/toolchain-path:</p>
649-
<pre><code>CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ sh ./configure \
650-
--openjdk-target=aarch64-linux-gnu \
651-
--with-sysroot=~/sysroot-arm64 \
652-
--with-toolchain-path=~/sysroot-arm64 \
653-
--with-freetype-lib=~/sysroot-arm64/usr/lib/aarch64-linux-gnu/ \
654-
--with-freetype-include=~/sysroot-arm64/usr/include/freetype2/ \
655-
--x-libraries=~/sysroot-arm64/usr/lib/aarch64-linux-gnu/
649+
<pre><code>sh ./configure \
650+
--openjdk-target=aarch64-linux-gnu \
651+
--with-sysroot=~/sysroot-arm64
656652
make images
657653
ls build/linux-aarch64-server-release/</code></pre></li>
658654
</ul>
659655
<p>The build does not create new files in that chroot, so it can be reused for multiple builds without additional cleanup.</p>
656+
<p>The build system should automatically detect the toolchain paths and dependencies, but sometimes it might require a little nudge with:</p>
657+
<ul>
658+
<li><p>Native compilers: override <code>CC</code> or <code>CXX</code> for <code>./configure</code></p></li>
659+
<li><p>Freetype lib location: override <code>--with-freetype-lib</code>, for example <code>${sysroot}/usr/lib/${target}/</code></p></li>
660+
<li><p>Freetype includes location: override <code>--with-freetype-include</code> for example <code>${sysroot}/usr/include/freetype2/</code></p></li>
661+
<li><p>X11 libraries location: override <code>--x-libraries</code>, for example <code>${sysroot}/usr/lib/${target}/</code></p></li>
662+
</ul>
660663
<p>Architectures that are known to successfully cross-compile like this are:</p>
661664
<table>
662665
<thead>
663666
<tr class="header">
664667
<th style="text-align: left;">Target</th>
665-
<th style="text-align: left;"><code>CC</code></th>
666-
<th style="text-align: left;"><code>CXX</code></th>
667-
<th style="text-align: left;"><code>--arch=...</code></th>
668+
<th style="text-align: left;">Debian tree</th>
669+
<th style="text-align: left;">Debian arch</th>
668670
<th style="text-align: left;"><code>--openjdk-target=...</code></th>
671+
<th><code>--with-jvm-variants=...</code></th>
669672
</tr>
670673
</thead>
671674
<tbody>
672675
<tr class="odd">
673676
<td style="text-align: left;">x86</td>
674-
<td style="text-align: left;">default</td>
675-
<td style="text-align: left;">default</td>
677+
<td style="text-align: left;">buster</td>
676678
<td style="text-align: left;">i386</td>
677679
<td style="text-align: left;">i386-linux-gnu</td>
680+
<td>(all)</td>
678681
</tr>
679682
<tr class="even">
680-
<td style="text-align: left;">armhf</td>
681-
<td style="text-align: left;">gcc-arm-linux-gnueabihf</td>
682-
<td style="text-align: left;">g++-arm-linux-gnueabihf</td>
683+
<td style="text-align: left;">arm</td>
684+
<td style="text-align: left;">buster</td>
683685
<td style="text-align: left;">armhf</td>
684686
<td style="text-align: left;">arm-linux-gnueabihf</td>
687+
<td>(all)</td>
685688
</tr>
686689
<tr class="odd">
687690
<td style="text-align: left;">aarch64</td>
688-
<td style="text-align: left;">gcc-aarch64-linux-gnu</td>
689-
<td style="text-align: left;">g++-aarch64-linux-gnu</td>
691+
<td style="text-align: left;">buster</td>
690692
<td style="text-align: left;">arm64</td>
691693
<td style="text-align: left;">aarch64-linux-gnu</td>
694+
<td>(all)</td>
692695
</tr>
693696
<tr class="even">
694-
<td style="text-align: left;">ppc64el</td>
695-
<td style="text-align: left;">gcc-powerpc64le-linux-gnu</td>
696-
<td style="text-align: left;">g++-powerpc64le-linux-gnu</td>
697+
<td style="text-align: left;">ppc64le</td>
698+
<td style="text-align: left;">buster</td>
697699
<td style="text-align: left;">ppc64el</td>
698700
<td style="text-align: left;">powerpc64le-linux-gnu</td>
701+
<td>(all)</td>
699702
</tr>
700703
<tr class="odd">
701704
<td style="text-align: left;">s390x</td>
702-
<td style="text-align: left;">gcc-s390x-linux-gnu</td>
703-
<td style="text-align: left;">g++-s390x-linux-gnu</td>
705+
<td style="text-align: left;">buster</td>
704706
<td style="text-align: left;">s390x</td>
705707
<td style="text-align: left;">s390x-linux-gnu</td>
708+
<td>(all)</td>
709+
</tr>
710+
<tr class="even">
711+
<td style="text-align: left;">mipsle</td>
712+
<td style="text-align: left;">buster</td>
713+
<td style="text-align: left;">mipsel</td>
714+
<td style="text-align: left;">mipsel-linux-gnu</td>
715+
<td>zero</td>
716+
</tr>
717+
<tr class="odd">
718+
<td style="text-align: left;">mips64le</td>
719+
<td style="text-align: left;">buster</td>
720+
<td style="text-align: left;">mips64el</td>
721+
<td style="text-align: left;">mips64el-linux-gnueabi64</td>
722+
<td>zero</td>
723+
</tr>
724+
<tr class="even">
725+
<td style="text-align: left;">armel</td>
726+
<td style="text-align: left;">buster</td>
727+
<td style="text-align: left;">arm</td>
728+
<td style="text-align: left;">arm-linux-gnueabi</td>
729+
<td>zero</td>
730+
</tr>
731+
<tr class="odd">
732+
<td style="text-align: left;">ppc</td>
733+
<td style="text-align: left;">sid</td>
734+
<td style="text-align: left;">powerpc</td>
735+
<td style="text-align: left;">powerpc-linux-gnu</td>
736+
<td>zero</td>
737+
</tr>
738+
<tr class="even">
739+
<td style="text-align: left;">ppc64be</td>
740+
<td style="text-align: left;">sid</td>
741+
<td style="text-align: left;">ppc64</td>
742+
<td style="text-align: left;">powerpc64-linux-gnu</td>
743+
<td>(all)</td>
744+
</tr>
745+
<tr class="odd">
746+
<td style="text-align: left;">m68k</td>
747+
<td style="text-align: left;">sid</td>
748+
<td style="text-align: left;">m68k</td>
749+
<td style="text-align: left;">m68k-linux-gnu</td>
750+
<td>zero</td>
751+
</tr>
752+
<tr class="even">
753+
<td style="text-align: left;">alpha</td>
754+
<td style="text-align: left;">sid</td>
755+
<td style="text-align: left;">alpha</td>
756+
<td style="text-align: left;">alpha-linux-gnu</td>
757+
<td>zero</td>
758+
</tr>
759+
<tr class="odd">
760+
<td style="text-align: left;">sh4</td>
761+
<td style="text-align: left;">sid</td>
762+
<td style="text-align: left;">sh4</td>
763+
<td style="text-align: left;">sh4-linux-gnu</td>
764+
<td>zero</td>
706765
</tr>
707766
</tbody>
708767
</table>
709-
<p>Additional architectures might be supported by Debian/Ubuntu Ports.</p>
710768
<h3 id="building-for-armaarch64">Building for ARM/aarch64</h3>
711769
<p>A common cross-compilation target is the ARM CPU. When building for ARM, it is useful to set the ABI profile. A number of pre-defined ABI profiles are available using <code>--with-abi-profile</code>: arm-vfp-sflt, arm-vfp-hflt, arm-sflt, armv5-vfp-sflt, armv6-vfp-hflt. Note that soft-float ABIs are no longer properly supported by the JDK.</p>
712770
<h3 id="building-for-musl">Building for musl</h3>

‎doc/building.md

+31-18
Original file line numberDiff line numberDiff line change
@@ -1089,7 +1089,7 @@ Note that X11 is needed even if you only want to build a headless JDK.
10891089
* If the X11 libraries are not properly detected by `configure`, you can
10901090
point them out by `--with-x`.
10911091
1092-
### Creating And Using Sysroots With qemu-deboostrap
1092+
### Cross compiling with Debian sysroots
10931093
10941094
Fortunately, you can create sysroots for foreign architectures with tools
10951095
provided by your OS. On Debian/Ubuntu systems, one could use `qemu-deboostrap` to
@@ -1110,7 +1110,7 @@ For example, cross-compiling to AArch64 from x86_64 could be done like this:
11101110
sudo qemu-debootstrap \
11111111
--arch=arm64 \
11121112
--verbose \
1113-
--include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng-dev \
1113+
--include=fakeroot,symlinks,build-essential,libx11-dev,libxext-dev,libxrender-dev,libxrandr-dev,libxtst-dev,libxt-dev,libcups2-dev,libfontconfig1-dev,libasound2-dev,libfreetype6-dev,libpng-dev,libffi-dev \
11141114
--resolve-deps \
11151115
buster \
11161116
~/sysroot-arm64 \
@@ -1124,31 +1124,44 @@ For example, cross-compiling to AArch64 from x86_64 could be done like this:
11241124
11251125
* Configure and build with newly created chroot as sysroot/toolchain-path:
11261126
```
1127-
CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ sh ./configure \
1128-
--openjdk-target=aarch64-linux-gnu \
1129-
--with-sysroot=~/sysroot-arm64 \
1130-
--with-toolchain-path=~/sysroot-arm64 \
1131-
--with-freetype-lib=~/sysroot-arm64/usr/lib/aarch64-linux-gnu/ \
1132-
--with-freetype-include=~/sysroot-arm64/usr/include/freetype2/ \
1133-
--x-libraries=~/sysroot-arm64/usr/lib/aarch64-linux-gnu/
1127+
sh ./configure \
1128+
--openjdk-target=aarch64-linux-gnu \
1129+
--with-sysroot=~/sysroot-arm64
11341130
make images
11351131
ls build/linux-aarch64-server-release/
11361132
```
11371133
11381134
The build does not create new files in that chroot, so it can be reused for multiple builds
11391135
without additional cleanup.
11401136
1141-
Architectures that are known to successfully cross-compile like this are:
1137+
The build system should automatically detect the toolchain paths and dependencies, but sometimes
1138+
it might require a little nudge with:
1139+
1140+
* Native compilers: override `CC` or `CXX` for `./configure`
1141+
1142+
* Freetype lib location: override `--with-freetype-lib`, for example `${sysroot}/usr/lib/${target}/`
11421143
1143-
Target `CC` `CXX` `--arch=...` `--openjdk-target=...`
1144-
------------ ------------------------- --------------------------- ------------- -----------------------
1145-
x86 default default i386 i386-linux-gnu
1146-
armhf gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf armhf arm-linux-gnueabihf
1147-
aarch64 gcc-aarch64-linux-gnu g++-aarch64-linux-gnu arm64 aarch64-linux-gnu
1148-
ppc64el gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu ppc64el powerpc64le-linux-gnu
1149-
s390x gcc-s390x-linux-gnu g++-s390x-linux-gnu s390x s390x-linux-gnu
1144+
* Freetype includes location: override `--with-freetype-include` for example `${sysroot}/usr/include/freetype2/`
1145+
1146+
* X11 libraries location: override `--x-libraries`, for example `${sysroot}/usr/lib/${target}/`
1147+
1148+
Architectures that are known to successfully cross-compile like this are:
11501149
1151-
Additional architectures might be supported by Debian/Ubuntu Ports.
1150+
Target Debian tree Debian arch `--openjdk-target=...` `--with-jvm-variants=...`
1151+
------------ ------------ ------------- ------------------------ --------------
1152+
x86 buster i386 i386-linux-gnu (all)
1153+
arm buster armhf arm-linux-gnueabihf (all)
1154+
aarch64 buster arm64 aarch64-linux-gnu (all)
1155+
ppc64le buster ppc64el powerpc64le-linux-gnu (all)
1156+
s390x buster s390x s390x-linux-gnu (all)
1157+
mipsle buster mipsel mipsel-linux-gnu zero
1158+
mips64le buster mips64el mips64el-linux-gnueabi64 zero
1159+
armel buster arm arm-linux-gnueabi zero
1160+
ppc sid powerpc powerpc-linux-gnu zero
1161+
ppc64be sid ppc64 powerpc64-linux-gnu (all)
1162+
m68k sid m68k m68k-linux-gnu zero
1163+
alpha sid alpha alpha-linux-gnu zero
1164+
sh4 sid sh4 sh4-linux-gnu zero
11521165
11531166
### Building for ARM/aarch64
11541167

0 commit comments

Comments
 (0)
Please sign in to comment.