RISC-V용 크로스 변환

이 문서는 RPython을 RISC-V 64비트 백엔드로 변환하는 방법을 설명합니다.

Ubuntu RISC-V 64비트 Chroot 만들기

이 절에서는 x86 호스트에서 RISC-V 64비트 chroot를 설정하는 방법을 설명합니다. RISC-V 64비트 보드에서 직접 개발하려는 경우에는 이 절을 건너뛰어도 됩니다.

먼저 호스트에 다음 의존성을 설치해야 합니다:

  • debootstrap – 디렉터리에 Debian/Ubuntu 루트 파일 시스템을 생성하는 Debian 도구입니다.
  • 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

chroot에 Debian 패키지를 설치하려는 경우에 이것이 필요할 때가 있습니다.

부트스트래핑용 CPython 2.7 빌드

RPython 툴체인을 실행하려면 Python 2.7 구현체가 필요합니다. 이 절에서는 CPython 2.7을 소스 코드에서 빌드하는 방법을 설명합니다. 이미 python2.7이 있다면 이 절을 건너뛰어도 됩니다.

Note

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 개발에 필요한 the dependencies를 설치하십시오:

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