@@ -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 >
@@ -320,6 +320,7 @@ <h3 id="freetype">FreeType</h3>
320320< li > To install on an apt-based Linux, try running < code > sudo apt-get install libfreetype6-dev</ code > .</ li >
321321< li > To install on an rpm-based Linux, try running < code > sudo yum install freetype-devel</ code > .</ li >
322322< li > To install on Alpine Linux, try running < code > sudo apk add freetype-dev</ code > .</ li >
323+ < li > To install on macOS, try running < code > brew install freetype</ code > .</ li >
323324</ ul >
324325< p > Use < code > --with-freetype-include=<path></ code > and < code > --with-freetype-lib=<path></ code > if < code > configure</ code > does not automatically locate the platform FreeType files.</ p >
325326< h3 id ="cups "> CUPS</ h3 >
@@ -628,7 +629,7 @@ <h4 id="x11-1">X11</h4>
628629cp: cannot stat `arm-linux-gnueabihf/libXt.so': No such file or directory</ code > </ pre > </ li >
629630< 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 >
630631</ ul >
631- < h3 id ="creating-and-using-sysroots- with-qemu-deboostrap " > Creating And Using Sysroots With qemu-deboostrap </ h3 >
632+ < h3 id ="cross-compiling- with-debian-sysroots " > Cross compiling with Debian sysroots </ h3 >
632633< 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 >
633634< p > For example, cross-compiling to AArch64 from x86_64 could be done like this:</ p >
634635< ul >
@@ -638,75 +639,133 @@ <h3 id="creating-and-using-sysroots-with-qemu-deboostrap">Creating And Using Sys
638639< pre > < code > sudo qemu-debootstrap \
639640 --arch=arm64 \
640641 --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 \
642+ --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 \
642643 --resolve-deps \
643644 buster \
644645 ~/sysroot-arm64 \
645646 http://httpredir.debian.org/debian/</ code > </ pre > </ li >
646647< li > < p > Make sure the symlinks inside the newly created chroot point to proper locations:</ p >
647648< pre > < code > sudo chroot ~/sysroot-arm64 symlinks -cr .</ code > </ pre > </ li >
648649< 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/
650+ < pre > < code > sh ./configure \
651+ --openjdk-target=aarch64-linux-gnu \
652+ --with-sysroot=~/sysroot-arm64
656653make images
657654ls build/linux-aarch64-server-release/</ code > </ pre > </ li >
658655</ ul >
659656< p > The build does not create new files in that chroot, so it can be reused for multiple builds without additional cleanup.</ p >
657+ < p > The build system should automatically detect the toolchain paths and dependencies, but sometimes it might require a little nudge with:</ p >
658+ < ul >
659+ < li > < p > Native compilers: override < code > CC</ code > or < code > CXX</ code > for < code > ./configure</ code > </ p > </ li >
660+ < li > < p > Freetype lib location: override < code > --with-freetype-lib</ code > , for example < code > ${sysroot}/usr/lib/${target}/</ code > </ p > </ li >
661+ < li > < p > Freetype includes location: override < code > --with-freetype-include</ code > for example < code > ${sysroot}/usr/include/freetype2/</ code > </ p > </ li >
662+ < li > < p > X11 libraries location: override < code > --x-libraries</ code > , for example < code > ${sysroot}/usr/lib/${target}/</ code > </ p > </ li >
663+ </ ul >
660664< p > Architectures that are known to successfully cross-compile like this are:</ p >
661665< table >
662666< thead >
663667< tr class ="header ">
664668< 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 >
669+ < th style ="text-align: left; "> Debian tree</ th >
670+ < th style ="text-align: left; "> Debian arch</ th >
668671< th style ="text-align: left; "> < code > --openjdk-target=...</ code > </ th >
672+ < th > < code > --with-jvm-variants=...</ code > </ th >
669673</ tr >
670674</ thead >
671675< tbody >
672676< tr class ="odd ">
673677< td style ="text-align: left; "> x86</ td >
674- < td style ="text-align: left; "> default</ td >
675- < td style ="text-align: left; "> default</ td >
678+ < td style ="text-align: left; "> buster</ td >
676679< td style ="text-align: left; "> i386</ td >
677680< td style ="text-align: left; "> i386-linux-gnu</ td >
681+ < td > (all)</ td >
678682</ tr >
679683< 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 >
684+ < td style ="text-align: left; "> arm</ td >
685+ < td style ="text-align: left; "> buster</ td >
683686< td style ="text-align: left; "> armhf</ td >
684687< td style ="text-align: left; "> arm-linux-gnueabihf</ td >
688+ < td > (all)</ td >
685689</ tr >
686690< tr class ="odd ">
687691< 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 >
692+ < td style ="text-align: left; "> buster</ td >
690693< td style ="text-align: left; "> arm64</ td >
691694< td style ="text-align: left; "> aarch64-linux-gnu</ td >
695+ < td > (all)</ td >
692696</ tr >
693697< 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 >
698+ < td style ="text-align: left; "> ppc64le</ td >
699+ < td style ="text-align: left; "> buster</ td >
697700< td style ="text-align: left; "> ppc64el</ td >
698701< td style ="text-align: left; "> powerpc64le-linux-gnu</ td >
702+ < td > (all)</ td >
699703</ tr >
700704< tr class ="odd ">
701705< 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 >
706+ < td style ="text-align: left; "> buster</ td >
704707< td style ="text-align: left; "> s390x</ td >
705708< td style ="text-align: left; "> s390x-linux-gnu</ td >
709+ < td > (all)</ td >
710+ </ tr >
711+ < tr class ="even ">
712+ < td style ="text-align: left; "> mipsle</ td >
713+ < td style ="text-align: left; "> buster</ td >
714+ < td style ="text-align: left; "> mipsel</ td >
715+ < td style ="text-align: left; "> mipsel-linux-gnu</ td >
716+ < td > zero</ td >
717+ </ tr >
718+ < tr class ="odd ">
719+ < td style ="text-align: left; "> mips64le</ td >
720+ < td style ="text-align: left; "> buster</ td >
721+ < td style ="text-align: left; "> mips64el</ td >
722+ < td style ="text-align: left; "> mips64el-linux-gnueabi64</ td >
723+ < td > zero</ td >
724+ </ tr >
725+ < tr class ="even ">
726+ < td style ="text-align: left; "> armel</ td >
727+ < td style ="text-align: left; "> buster</ td >
728+ < td style ="text-align: left; "> arm</ td >
729+ < td style ="text-align: left; "> arm-linux-gnueabi</ td >
730+ < td > zero</ td >
731+ </ tr >
732+ < tr class ="odd ">
733+ < td style ="text-align: left; "> ppc</ td >
734+ < td style ="text-align: left; "> sid</ td >
735+ < td style ="text-align: left; "> powerpc</ td >
736+ < td style ="text-align: left; "> powerpc-linux-gnu</ td >
737+ < td > zero</ td >
738+ </ tr >
739+ < tr class ="even ">
740+ < td style ="text-align: left; "> ppc64be</ td >
741+ < td style ="text-align: left; "> sid</ td >
742+ < td style ="text-align: left; "> ppc64</ td >
743+ < td style ="text-align: left; "> powerpc64-linux-gnu</ td >
744+ < td > (all)</ td >
745+ </ tr >
746+ < tr class ="odd ">
747+ < td style ="text-align: left; "> m68k</ td >
748+ < td style ="text-align: left; "> sid</ td >
749+ < td style ="text-align: left; "> m68k</ td >
750+ < td style ="text-align: left; "> m68k-linux-gnu</ td >
751+ < td > zero</ td >
752+ </ tr >
753+ < tr class ="even ">
754+ < td style ="text-align: left; "> alpha</ td >
755+ < td style ="text-align: left; "> sid</ td >
756+ < td style ="text-align: left; "> alpha</ td >
757+ < td style ="text-align: left; "> alpha-linux-gnu</ td >
758+ < td > zero</ td >
759+ </ tr >
760+ < tr class ="odd ">
761+ < td style ="text-align: left; "> sh4</ td >
762+ < td style ="text-align: left; "> sid</ td >
763+ < td style ="text-align: left; "> sh4</ td >
764+ < td style ="text-align: left; "> sh4-linux-gnu</ td >
765+ < td > zero</ td >
706766</ tr >
707767</ tbody >
708768</ table >
709- < p > Additional architectures might be supported by Debian/Ubuntu Ports.</ p >
710769< h3 id ="building-for-armaarch64 "> Building for ARM/aarch64</ h3 >
711770< 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 >
712771< h3 id ="building-for-musl "> Building for musl</ h3 >
0 commit comments