ci: add riscv64-linux build via cross-compilation on ubuntu-24.04

Rework from native RISE runner to standard ubuntu-24.04 runner with
CMake cross-compilation, following alexcrichton's preference.

Changes:
- ci/docker/Dockerfile.riscv64-linux: Ubuntu 24.04 with
  crossbuild-essential-riscv64; sets CC/CXX to riscv64-linux-gnu-gcc
  so CMake detects cross-compilation and LLVM builds a native tablegen
  before cross-compiling the rest of the toolchain.
- ci/docker-build.sh: use artifact-specific Dockerfile if one exists
  (ci/docker/Dockerfile.<artifact>), fall back to default; make the
  wasmtime volume mount conditional on WASI_SDK_CI_SKIP_SYSROOT.
- .github/workflows/main.yml: new riscv64-linux matrix entry on
  ubuntu-24.04 with cross_cmake_args (-DCMAKE_SYSTEM_NAME=Linux
  -DCMAKE_SYSTEM_PROCESSOR=riscv64 -DWASI_SDK_LLDB=OFF) and
  WASI_SDK_CI_SKIP_SYSROOT=1; handle cross_cmake_args in the cmake
  flags step.

WASI_SDK_CI_SKIP_SYSROOT=1: the cross-compiled clang runs on riscv64,
not on the x86_64 build host, so the wasm sysroot step is skipped.
WASI_SDK_LLDB=OFF: avoids cross-compiling libedit/libxml2 in this
first iteration; can be re-enabled as a follow-up.

Closes #607

Signed-off-by: Bruno Verachten <gounthar@gmail.com>
pull/621/head
Bruno Verachten 5 months ago
parent 249054e542
commit 0d34ab143a
No known key found for this signature in database
GPG Key ID: E7EAD7209D3ECCD3

@ -28,6 +28,16 @@ jobs:
- artifact: arm64-linux
os: ubuntu-22.04-arm
- artifact: riscv64-linux
os: ubuntu-24.04
rust_target: riscv64-unknown-linux-gnu
cross_cmake_args: >-
-DCMAKE_SYSTEM_NAME=Linux
-DCMAKE_SYSTEM_PROCESSOR=riscv64
-DWASI_SDK_LLDB=OFF
env:
WASI_SDK_CI_SKIP_SYSROOT: 1
- artifact: arm64-macos
os: macos-14
rust_target: aarch64-apple-darwin
@ -85,6 +95,9 @@ jobs:
rustup target add ${{ matrix.rust_target }}
cmake_args="$cmake_args -DRUST_TARGET=${{ matrix.rust_target }}"
fi
if [ "${{ matrix.cross_cmake_args }}" != "" ]; then
cmake_args="$cmake_args ${{ matrix.cross_cmake_args }}"
fi
echo WASI_SDK_CI_TOOLCHAIN_CMAKE_ARGS="$cmake_args" >> $GITHUB_ENV
shell: bash

@ -15,8 +15,13 @@ fi
set -x
# Build the Docker imager
docker build --tag wasi-sdk-builder ci/docker
# Build the Docker image. Use an artifact-specific Dockerfile if one exists
# (e.g. ci/docker/Dockerfile.riscv64-linux), otherwise use the default.
dockerfile=ci/docker/Dockerfile
if [ -f "ci/docker/Dockerfile.$1" ]; then
dockerfile="ci/docker/Dockerfile.$1"
fi
docker build --tag wasi-sdk-builder --file "$dockerfile" ci/docker
# Perform the build in `/src`. The current directory is mounted read-write at
# this location as well. To ensure that container-created files are reasonable
@ -34,9 +39,11 @@ args="$args --volume $ccache_dir:/ccache:Z --env CCACHE_DIR=/ccache"
# Inherit some tools from the host into this container. This ensures that the
# decision made on CI of what versions to use is the canonical source of truth
# for theset ools
# for these tools.
args="$args --volume `rustc --print sysroot`:/rustc:ro"
args="$args --volume $(dirname $(which wasmtime)):/wasmtime:ro"
if [ "${WASI_SDK_CI_SKIP_SYSROOT:-}" != "1" ]; then
args="$args --volume $(dirname $(command -v wasmtime)):/wasmtime:ro"
fi
# Pass through some env vars that `build.sh` reads
args="$args --env WASI_SDK_CI_TOOLCHAIN_CMAKE_ARGS"

@ -0,0 +1,30 @@
# Ubuntu 24.04 is used here (rather than AlmaLinux 8) because it has
# riscv64 cross-compilation packages in its repositories.
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
ca-certificates \
crossbuild-essential-riscv64 \
clang \
lld \
python3 \
git \
unzip \
cmake \
ninja-build \
ccache \
&& rm -rf /var/lib/apt/lists/*
# Set the cross-compiler as the default so that cmake picks it up via CC/CXX
# and sets CMAKE_CROSSCOMPILING=TRUE, which causes LLVM to build a native
# tablegen before cross-compiling the rest of the toolchain.
ENV CC=riscv64-linux-gnu-gcc
ENV CXX=riscv64-linux-gnu-g++
# Cargo needs an explicit linker when cross-compiling for riscv64.
ENV CARGO_TARGET_RISCV64_UNKNOWN_LINUX_GNU_LINKER=riscv64-linux-gnu-gcc
# Tell programs to cache in a location that both isn't a `--volume` mounted root
# and isn't `/root` in the container as that won't be writable during the build.
ENV XDG_CACHE_HOME=/tmp/cache
Loading…
Cancel
Save