From ab483254ea0305cddea665065d5e40ae7a42ee1a Mon Sep 17 00:00:00 2001 From: WANG Rui Date: Wed, 3 Apr 2024 14:44:29 +0800 Subject: [PATCH] Upgrade qemu and integrate qemu-user runners for loongarch64-linux-gnu --- .changes/1466.json | 5 ++++ README.md | 2 +- .../Dockerfile.loongarch64-unknown-linux-gnu | 16 ++++++++++ docker/qemu.sh | 29 +++++++++++++++++++ targets.toml | 2 ++ 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 .changes/1466.json diff --git a/.changes/1466.json b/.changes/1466.json new file mode 100644 index 000000000..a93ff497e --- /dev/null +++ b/.changes/1466.json @@ -0,0 +1,5 @@ +{ + "type": "added", + "description": "Upgrade qemu and integrate qemu-user runners for loongarch64-linux-gnu", + "issues": [1467] +} diff --git a/README.md b/README.md index 113d96b2b..60fa68ca6 100644 --- a/README.md +++ b/README.md @@ -224,7 +224,7 @@ terminate. | `i686-linux-android` [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ | | `i686-pc-windows-gnu` | N/A | 9.4 | ✓ | N/A | ✓ | | `i686-unknown-linux-gnu` | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ | -| `loongarch64-unknown-linux-gnu` | 2.36 | 13.2.0 | ✓ | N/A | | +| `loongarch64-unknown-linux-gnu` | 2.36 | 13.2.0 | ✓ | 8.2.2 | ✓ | | `mips-unknown-linux-gnu` | 2.30 | 9.4.0 | ✓ | 6.1.0 | ✓ | | `mips-unknown-linux-musl` | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ | | `mips64-unknown-linux-gnuabi64` | 2.30 | 9.4.0 | ✓ | 6.1.0 | ✓ | diff --git a/docker/Dockerfile.loongarch64-unknown-linux-gnu b/docker/Dockerfile.loongarch64-unknown-linux-gnu index b55d3c0c4..58340b4ae 100644 --- a/docker/Dockerfile.loongarch64-unknown-linux-gnu +++ b/docker/Dockerfile.loongarch64-unknown-linux-gnu @@ -19,15 +19,31 @@ RUN /crosstool-ng.sh loongarch64-unknown-linux-gnu.config 5 ENV PATH /x-tools/loongarch64-unknown-linux-gnu/bin/:$PATH +COPY deny-debian-packages.sh / +RUN TARGET_ARCH=loong64 /deny-debian-packages.sh + +COPY qemu.sh / +RUN /qemu.sh loongarch64 + +COPY qemu-runner base-runner.sh / COPY toolchain.cmake /opt/toolchain.cmake ENV CROSS_TOOLCHAIN_PREFIX=loongarch64-unknown-linux-gnu- +ENV CROSS_SYSROOT=/x-tools/loongarch64-unknown-linux-gnu/loongarch64-unknown-linux-gnu/sysroot/ +ENV CROSS_TARGET_RUNNER="/qemu-runner loongarch64" ENV CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_GNU_LINKER="$CROSS_TOOLCHAIN_PREFIX"gcc \ + CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_GNU_RUNNER="$CROSS_TARGET_RUNNER" \ AR_loongarch64_unknown_linux_gnu="$CROSS_TOOLCHAIN_PREFIX"ar \ CC_loongarch64_unknown_linux_gnu="$CROSS_TOOLCHAIN_PREFIX"gcc \ CXX_loongarch64_unknown_linux_gnu="$CROSS_TOOLCHAIN_PREFIX"g++ \ CMAKE_TOOLCHAIN_FILE_loongarch64_unknown_linux_gnu=/opt/toolchain.cmake \ + BINDGEN_EXTRA_CLANG_ARGS_loongarch64_unknown_linux_gnu="--sysroot=$CROSS_SYSROOT -idirafter/usr/include" \ + QEMU_LD_PREFIX="$CROSS_SYSROOT" \ + RUST_TEST_THREADS=1 \ CROSS_CMAKE_SYSTEM_NAME=Linux \ CROSS_CMAKE_SYSTEM_PROCESSOR=loongarch64 \ CROSS_CMAKE_CRT=gnu \ CROSS_CMAKE_OBJECT_FLAGS="-ffunction-sections -fdata-sections -fPIC" + +RUN mv $CROSS_SYSROOT/lib/* $CROSS_SYSROOT/lib64/ +RUN sed -e "s#@DEFAULT_QEMU_LD_PREFIX@#$QEMU_LD_PREFIX#g" -i /qemu-runner diff --git a/docker/qemu.sh b/docker/qemu.sh index 562491af7..bef061369 100755 --- a/docker/qemu.sh +++ b/docker/qemu.sh @@ -109,6 +109,25 @@ build_static_pixman() { rm -rf "${td}" } +build_static_slirp() { + local version=4.1.0 + + local td + td="$(mktemp -d)" + + pushd "${td}" + + curl --retry 3 -sSfL "https://gitlab.freedesktop.org/slirp/libslirp//-/archive/v${version}/libslirp-v${version}.tar.gz" -O + tar -xzf "libslirp-v${version}.tar.gz" + meson setup -Ddefault_library=static libslirp-v${version} build + ninja -C build + install -m 644 ./build/libslirp.a /usr/lib64/ + + popd + + rm -rf "${td}" +} + main() { local version=5.1.0 @@ -180,6 +199,16 @@ main() { if_ubuntu install_packages ninja-build fi + # if we have python3.8+, we can install qemu 8.2.2, which needs ninja-build, + # meson, python3-pip and libslirp-dev. + # ubuntu 16.04 only provides python3.5, so remove when we have a newer qemu. + is_ge_python38=$(python3 -c "import sys; print(int(sys.version_info >= (3, 8)))") + if [[ "${is_ge_python38}" == "1" ]]; then + if_ubuntu version=8.2.2 + if_ubuntu install_packages ninja-build meson python3-pip libslirp-dev + if_ubuntu build_static_slirp + fi + local td td="$(mktemp -d)" diff --git a/targets.toml b/targets.toml index f2e01f89c..2ed7123b2 100644 --- a/targets.toml +++ b/targets.toml @@ -120,6 +120,8 @@ os = "ubuntu-latest" cpp = true dylib = true std = true +run = true +runners = "qemu-user" [[target]] target = "mips-unknown-linux-gnu"