RISC-V 的交叉翻译¶
本文档介绍如何将 RPython 翻译成 RISC-V 64 位后端。
创建 Ubuntu RISC-V 64 位 Chroot¶
本节介绍如何在 x86 主机上设置 RISC-V 64 位 chroot。如果您想直接在 RISC-V 64 位板上开发,可以跳过本节。
首先,我们必须在主机上安装以下依赖项
debootstrap
– Debian 工具,用于在目录中创建 Debian/Ubuntu 根文件系统。schroot
– 一个 chroot 管理守护进程,帮助我们在 chroot 之间切换。qemu-user-static
– 二进制翻译器,允许我们在 x86-64 上运行 RISC-V 64 位可执行文件。binfmt-support
– 一个实用程序包,帮助 Linux 内核为 RISC-V 64 位可执行文件调用qemu-user-static
。ubuntu-keyring
– Ubuntu 存档的公钥。
运行以下命令安装所有这些
sudo apt-get install debootstrap qemu-user-static binfmt-support schroot
# For non-Ubuntu host:
sudo apt-get install ubuntu-keyring
其次,我们必须决定在哪里设置 chroot。在下面的示例中,将使用 /srv/chroot/rv64_ubuntu_24_04
现在,我们通过调用创建根文件系统
sudo mkdir -p /srv/chroot
sudo debootstrap --arch=riscv64 \
--keyring /usr/share/keyrings/ubuntu-archive-keyring.gpg \
--include=ubuntu-keyring \
noble \
/srv/chroot/rv64_ubuntu_24_04 \
http://ports.ubuntu.com/ubuntu-ports
# Rename /etc/resolv.conf so that schroot can copy the host resolv.conf
# into chroot.
sudo mv /srv/chroot/rv64_ubuntu_24_04/etc/resolv.conf{,.bak}
第三,创建一个 default_shm
schroot 配置文件,允许使用信号量和共享内存
sudo cp /etc/schroot/default /etc/schroot/default_shm
# Uncomment shm fstab lines
sudo sed -i 's_#/run_/run_g' /etc/schroot/default_shm/fstab
sudo sed -i 's_#/dev/shm_/dev/shm_g' /etc/schroot/default_shm/fstab
第四,我们为刚刚创建的根文件系统创建一个 schroot
配置文件。以下命令在 /etc/schroot/chroot.d/rv64_ubuntu_24_04
创建一个配置文件
echo "[rv64_ubuntu_24_04]
description=Ubuntu Noble (24.04) RISC-V
directory=/srv/chroot/rv64_ubuntu_24_04
root-users=$(whoami)
users=$(whoami)
type=directory
profile=default_shm" | sudo tee /etc/schroot/chroot.d/rv64_ubuntu_24_04
现在,您可以使用以下命令测试 chroot
schroot -l
您应该看到输出
chroot:rv64_ubuntu_24_04
您可以使用以下命令进入 chroot
schroot -c rv64_ubuntu_24_04
在 chroot 内部,如果您运行 uname -m
,您应该看到 riscv64
$ uname -m
riscv64
您可以使用 -u root
选项以 root
用户身份进入 chroot
schroot -c rv64_ubuntu_24_04 -u root
当您想要将 Debian 软件包安装到 chroot 时,有时可能需要这样做。
构建用于引导的 CPython 2.7¶
要运行 RPython 工具链,我们需要一个 Python 2.7 实现。本节介绍如何从其源代码构建 CPython 2.7。如果您已经拥有 python2.7
,可以跳过本节。
注意
CPython 2.7 不再受支持也不再维护。以下说明基于我在 2024 年初的实验。如有必要,请调整它们。
首先,安装 CPython 的构建依赖项
schroot -c rv64_ubuntu_24_04 -u root -- apt-get install \
build-essential gcc gdb g++ \
libbz2-dev libdb-dev libexpat1-dev libffi-dev libgdbm-dev \
libncursesw5-dev libreadline-dev libsqlite3-dev libssl-dev \
libtinfo-dev tk-dev zlib1g-dev
其次,创建 CPython 的最终安装目录
schroot -c rv64_ubuntu_24_04 -u root -- mkdir /opt/python2
schroot -c rv64_ubuntu_24_04 -u root -- \
chown $(whoami):$(whoami) /opt/python2
第三,克隆已修补的 CPython 2.7 存储库
git clone https://github.com/loganchien/cpython27-deprecated -b release_27
cd cpython27-deprecated
第四,在 chroot 中构建 CPython 2.7
schroot -c rv64_ubuntu_24_04
$ ./configure --prefix=/opt/python2 \
--enable-shared \
--enable-optimizations \
--with-system-ffi LDFLAGS="-Wl,-rpath,/opt/python2/lib"
$ make -j8
$ make install -j8
第五,设置 Python 包
$ export PATH=/opt/python2/bin:$PATH
$ python2.7 -mensurepip
$ python2.7 -mpip install -U pip wheel
现在,您应该拥有一个足够用于 RPython 翻译的 CPython 2.7。
使用 RPython 工具链¶
首先,安装 PyPy 开发的依赖项
schroot -c rv64_ubuntu_24_04 -u root -- apt-get install \
build-essential pkg-config libbz2-dev libexpat1-dev libffi-dev \
libgc-dev libgdbm-dev liblzma-dev libncurses5-dev libncursesw5-dev \
libsqlite3-dev libssl-dev tk-dev zlib1g-dev
此外,要通过所有测试套件,您必须使用 git 构建 PyPy
schroot -c rv64_ubuntu_24_04 -u root -- apt-get install git
其次,安装 PyPy 开发的 Python 包
schroot -c rv64_ubuntu_24_04
$ export PATH=/opt/python2/bin:$PATH
$ cd /path/to/pypy/source/tree
$ python2.7 -mpip install -r requirements.txt
翻译 Hello World 示例¶
创建一个包含以下内容的 target.py
文件
def main(args):
print "Hello World"
return 0
def target(*args):
return main, None
并调用翻译器
$ python2.7 rpython/bin/rpython -O2 target.py
如果一切正常,这应该会生成一个 RISC-V 64 位二进制文件。在 RISC-V 64 位上运行此二进制文件应该会产生输出 Hello World
。
翻译 PyPy 解释器¶
运行以下命令以使用 JIT 编译器翻译完整的 PyPy 解释器
$ cd pypy/goal
$ python2.7 ../../rpython/bin/rpython --opt=jit targetpypystandalone.py
$ PYTHONPATH=../.. ./pypy-c ../../lib_pypy/pypy_tools/build_cffi_imports.py
$ cd ../..
$ python2.7 pypy/tool/release/package.py --archive-name=pypy-VER-PLATFORM