8305118: Add RISC-V related content to building.md

Reviewed-by: erikj
This commit is contained in:
Guoxiong Li 2023-04-07 00:58:36 +00:00
parent 314e9b3dcc
commit ce6e7461dc
2 changed files with 72 additions and 7 deletions

View File

@ -134,6 +134,8 @@ id="toc-cross-compiling-with-debian-sysroots">Cross compiling with
Debian sysroots</a></li> Debian sysroots</a></li>
<li><a href="#building-for-armaarch64" <li><a href="#building-for-armaarch64"
id="toc-building-for-armaarch64">Building for ARM/aarch64</a></li> id="toc-building-for-armaarch64">Building for ARM/aarch64</a></li>
<li><a href="#building-for-risc-v" id="toc-building-for-risc-v">Building
for RISC-V</a></li>
<li><a href="#building-for-musl" id="toc-building-for-musl">Building for <li><a href="#building-for-musl" id="toc-building-for-musl">Building for
musl</a></li> musl</a></li>
<li><a href="#verifying-the-build" <li><a href="#verifying-the-build"
@ -1376,10 +1378,10 @@ No such file or directory cp: cannot stat
Debian sysroots</h3> Debian sysroots</h3>
<p>Fortunately, you can create sysroots for foreign architectures with <p>Fortunately, you can create sysroots for foreign architectures with
tools provided by your OS. On Debian/Ubuntu systems, one could use tools provided by your OS. On Debian/Ubuntu systems, one could use
<code>qemu-deboostrap</code> to create the <em>target</em> system <code>debootstrap</code> to create the <em>target</em> system chroot,
chroot, which would have the native libraries and headers specific to which would have the native libraries and headers specific to that
that <em>target</em> system. After that, we can use the cross-compiler <em>target</em> system. After that, we can use the cross-compiler on the
on the <em>build</em> system, pointing into chroot to get the build <em>build</em> system, pointing into chroot to get the build
dependencies right. This allows building for foreign architectures with dependencies right. This allows building for foreign architectures with
native compilation speed.</p> native compilation speed.</p>
<p>For example, cross-compiling to AArch64 from x86_64 could be done <p>For example, cross-compiling to AArch64 from x86_64 could be done
@ -1389,7 +1391,7 @@ like this:</p>
<code>apt install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu</code></p></li> <code>apt install g++-aarch64-linux-gnu gcc-aarch64-linux-gnu</code></p></li>
<li><p>Create chroot on the <em>build</em> system, configuring it for <li><p>Create chroot on the <em>build</em> system, configuring it for
<em>target</em> system: <em>target</em> system:
<code>sudo qemu-debootstrap \ --arch=arm64 \ --verbose \ --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 \ --resolve-deps \ buster \ ~/sysroot-arm64 \ http://httpredir.debian.org/debian/</code></p></li> <code>sudo debootstrap \ --arch=arm64 \ --verbose \ --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 \ --resolve-deps \ buster \ ~/sysroot-arm64 \ http://httpredir.debian.org/debian/ # If the target architecture is `riscv64`, # the path should be `debian-ports` instead of `debian`.</code></p></li>
<li><p>Make sure the symlinks inside the newly created chroot point to <li><p>Make sure the symlinks inside the newly created chroot point to
proper locations: proper locations:
<code>sudo chroot ~/sysroot-arm64 symlinks -cr .</code></p></li> <code>sudo chroot ~/sysroot-arm64 symlinks -cr .</code></p></li>
@ -1516,6 +1518,13 @@ are:</p>
<td style="text-align: left;">sh4-linux-gnu</td> <td style="text-align: left;">sh4-linux-gnu</td>
<td>zero</td> <td>zero</td>
</tr> </tr>
<tr class="even">
<td style="text-align: left;">riscv64</td>
<td style="text-align: left;">sid</td>
<td style="text-align: left;">riscv64</td>
<td style="text-align: left;">riscv64-linux-gnu</td>
<td>(all)</td>
</tr>
</tbody> </tbody>
</table> </table>
<h3 id="building-for-armaarch64">Building for ARM/aarch64</h3> <h3 id="building-for-armaarch64">Building for ARM/aarch64</h3>
@ -1525,6 +1534,21 @@ profiles are available using <code>--with-abi-profile</code>:
arm-vfp-sflt, arm-vfp-hflt, arm-sflt, armv5-vfp-sflt, armv6-vfp-hflt. 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 Note that soft-float ABIs are no longer properly supported by the
JDK.</p> JDK.</p>
<h3 id="building-for-risc-v">Building for RISC-V</h3>
<p>The RISC-V community provides a basic <a
href="https://github.com/riscv-collab/riscv-gnu-toolchain">GNU compiler
toolchain</a>, but the <a href="#External-Library-Requirements">external
libraries</a> required by OpenJDK complicate the building process. The
placeholder <code>&lt;toolchain-installed-path&gt;</code> shown below is
the path where you want to install the toolchain.</p>
<ul>
<li><p>Install the RISC-V GNU compiler toolchain:
<code>git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain cd riscv-gnu-toolchain ./configure --prefix=&lt;toolchain-installed-path&gt; make linux export PATH=&lt;toolchain-installed-path&gt;/bin:$PATH</code></p></li>
<li><p>Cross-compile all the required libraries:
<code># An example for libffi git clone https://github.com/libffi/libffi cd libffi ./configure --host=riscv64-unknown-linux-gnu --prefix=&lt;toolchain-installed-path&gt;/sysroot/usr make make install</code></p></li>
<li><p>Configure and build OpenJDK:
<code>bash configure \ --with-boot-jdk=$BOOT_JDK \ --openjdk-target=riscv64-linux-gnu \ --with-sysroot=&lt;toolchain-installed-path&gt;/sysroot \ --with-toolchain-path=&lt;toolchain-installed-path&gt;/bin \ --with-extra-path=&lt;toolchain-installed-path&gt;/bin make images</code></p></li>
</ul>
<h3 id="building-for-musl">Building for musl</h3> <h3 id="building-for-musl">Building for musl</h3>
<p>Just like it's possible to cross-compile for a different CPU, it's <p>Just like it's possible to cross-compile for a different CPU, it's
possible to cross-compile for musl libc on a glibc-based <em>build</em> possible to cross-compile for musl libc on a glibc-based <em>build</em>

View File

@ -1147,7 +1147,7 @@ Note that X11 is needed even if you only want to build a headless JDK.
### Cross compiling with Debian sysroots ### Cross compiling with Debian sysroots
Fortunately, you can create sysroots for foreign architectures with tools Fortunately, you can create sysroots for foreign architectures with tools
provided by your OS. On Debian/Ubuntu systems, one could use `qemu-deboostrap` to provided by your OS. On Debian/Ubuntu systems, one could use `debootstrap` to
create the *target* system chroot, which would have the native libraries and headers 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* 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 system, pointing into chroot to get the build dependencies right. This allows building
@ -1162,7 +1162,7 @@ For example, cross-compiling to AArch64 from x86_64 could be done like this:
* Create chroot on the *build* system, configuring it for *target* system: * Create chroot on the *build* system, configuring it for *target* system:
``` ```
sudo qemu-debootstrap \ sudo debootstrap \
--arch=arm64 \ --arch=arm64 \
--verbose \ --verbose \
--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 \ --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 \
@ -1170,6 +1170,8 @@ For example, cross-compiling to AArch64 from x86_64 could be done like this:
buster \ buster \
~/sysroot-arm64 \ ~/sysroot-arm64 \
http://httpredir.debian.org/debian/ http://httpredir.debian.org/debian/
# If the target architecture is `riscv64`,
# the path should be `debian-ports` instead of `debian`.
``` ```
* Make sure the symlinks inside the newly created chroot point to proper locations: * Make sure the symlinks inside the newly created chroot point to proper locations:
@ -1217,6 +1219,7 @@ Architectures that are known to successfully cross-compile like this are:
m68k sid m68k m68k-linux-gnu zero m68k sid m68k m68k-linux-gnu zero
alpha sid alpha alpha-linux-gnu zero alpha sid alpha alpha-linux-gnu zero
sh4 sid sh4 sh4-linux-gnu zero sh4 sid sh4 sh4-linux-gnu zero
riscv64 sid riscv64 riscv64-linux-gnu (all)
### Building for ARM/aarch64 ### Building for ARM/aarch64
@ -1226,6 +1229,44 @@ available using `--with-abi-profile`: arm-vfp-sflt, arm-vfp-hflt, arm-sflt,
armv5-vfp-sflt, armv6-vfp-hflt. Note that soft-float ABIs are no longer armv5-vfp-sflt, armv6-vfp-hflt. Note that soft-float ABIs are no longer
properly supported by the JDK. properly supported by the JDK.
### Building for RISC-V
The RISC-V community provides a basic
[GNU compiler toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain),
but the [external libraries](#External-Library-Requirements) required by OpenJDK
complicate the building process. The placeholder `<toolchain-installed-path>`
shown below is the path where you want to install the toolchain.
* Install the RISC-V GNU compiler toolchain:
```
git clone --recursive https://github.com/riscv-collab/riscv-gnu-toolchain
cd riscv-gnu-toolchain
./configure --prefix=<toolchain-installed-path>
make linux
export PATH=<toolchain-installed-path>/bin:$PATH
```
* Cross-compile all the required libraries:
```
# An example for libffi
git clone https://github.com/libffi/libffi
cd libffi
./configure --host=riscv64-unknown-linux-gnu --prefix=<toolchain-installed-path>/sysroot/usr
make
make install
```
* Configure and build OpenJDK:
```
bash configure \
--with-boot-jdk=$BOOT_JDK \
--openjdk-target=riscv64-linux-gnu \
--with-sysroot=<toolchain-installed-path>/sysroot \
--with-toolchain-path=<toolchain-installed-path>/bin \
--with-extra-path=<toolchain-installed-path>/bin
make images
```
### Building for musl ### Building for musl
Just like it's possible to cross-compile for a different CPU, it's possible to Just like it's possible to cross-compile for a different CPU, it's possible to