ARM용 크로스 변환¶
Note
안타깝게도 여기에 있는 정보는 이제 역사적 가치만 있습니다. Scratchbox는 더 이상 작동하지 않습니다. 그러나 chroot와 setarch linux32 pypy rpython/bin/rpython ...를 사용하면 aarch64 머신에서 ARM32 변환이 가능한 것으로 보입니다.
여기서는 크로스 컴파일 툴체인을 사용하여 RPython 변환기로 인터프리터를 ARM 대상으로 변환하는 데 필요한 설정과 따라야 할 단계를 설명합니다.
ARM용 RPython 프로그램을 변환하려면 일반적인 변환 절차에 따라 ARM 기기에서 직접 변환하는 방법이 있습니다. 안타깝게도 대부분의 ARM 기기에서는 이 방법을 현실적으로 사용하기 어렵습니다. 다른 방법은 크로스 컴파일 툴체인을 사용하여 크로스 변환하는 것입니다.
크로스 변환을 하려면 더 강력한(보통 x86) 머신에서 변환을 실행하고, 크로스 컴파일러로 생성된 C 코드를 컴파일하여 ARM용 바이너리를 생성합니다. 이 작업을 할 때는 몇 가지 제약 사항이 있습니다. 특히 현재는 변환 호스트와 대상 플랫폼으로 Linux만 지원합니다(Ubuntu에서 테스트됨). 또한 변환을 실행하려면 32비트 환경이 필요합니다. 이는 32비트 호스트에서 하거나 32비트 chroot 안에서 할 수 있습니다.
요구 사항¶
Linux 기반 호스트에서 ARM 기반 Linux 타깃으로 교차 변환하는 데 필요한 도구는 다음과 같습니다.
- PyPy 체크아웃(default 브랜치)입니다.
- GCC ARM 크로스 컴파일러(Ubuntu에서는
gcc-arm-linux-gnueabi package에 해당)가 필요하지만, 다른 툴체인도 작동할 것입니다. - Scratchbox 2, 크로스 컴파일 엔진(
scratchbox2Ubuntu 패키지)입니다. - 32비트 PyPy 또는 Python입니다.
- 그리고 ARM 기반 chroot를 만들려면 다음 패키지(또는 이에 해당하는 패키지)를 설치해야 합니다:
debootstrapschrootbinfmt-supportqemu-systemqemu-user-static
- 위의 의존성은 여기에 나열된 일반적인 변환용 의존성 외에 추가로 필요한 것입니다.
Qemu 기반 ARM chroot 만들기¶
먼저 PyPy나 다른 인터프리터를 변환하는 데 필요한 패키지와 의존성을 담은 rootfs를 만들어야 합니다. 파일은 /srv/chroot/precise_arm에 둔다고 가정하겠습니다.
다음을 호출하여 rootfs를 생성하십시오:
mkdir -p /srv/chroot/precise_arm
qemu-debootstrap --variant=buildd --arch=armel precise /srv/chroot/precise_arm/ http://ports.ubuntu.com/ubuntu-ports/
다음으로, qemu-arm-static 바이너리를 rootfs에 복사하십시오.
cp /usr/bin/qemu-arm-static /srv/chroot/precise_arm/usr/bin/qemu-arm-static
설정과 관리를 쉽게 하기 위해 rootfs를 가리키는 schroot를 만들겠습니다. /etc/schroot/schroot.conf에 있는 schroot 설정 파일에 (아래와 같은) 설정 블록을 추가해야 합니다.
[precise_arm]
directory=/srv/chroot/precise_arm
users=USERNAME
root-users=USERNAME
groups=users
aliases=default
type=directory
chroot 안에서 모든 것이 제대로 동작하는지 확인하려면 schroot -c precise_arm을 실행해 보십시오. qemu-arm으로 ARM 바이너리를 실행하는 schroot 환경에서 셸이 시작되어야 합니다. chroot 안에서 uname -m을 실행하면 armv7l과 같은 결과가 나와야 합니다. 이는 ARM 시스템을 에뮬레이션하고 있음을 보여 줍니다.
apt 소스를 설정하고 다음 패키지를 설치하려면 root 사용자로 schroot를 시작하십시오:
schroot -c precise_arm -u root
echo "deb http://ports.ubuntu.com/ubuntu-ports/ precise main universe restricted" > /etc/apt/sources.list
apt-get update
apt-get install libffi-dev libgc-dev python-dev build-essential libncurses5-dev libbz2-dev
이제 모든 의존성이 갖추어졌을 것이므로 schroot 환경을 종료할 수 있습니다.
scratchbox2 설정하기¶
scratchbox를 설정하려면 앞서 만든 rootfs의 루트 디렉터리로 cd해야 합니다. 그 위치에서 sb2 설정 도구를 호출할 수 있으며, 이 도구는 현재 디렉터리를 scratchbox2 환경의 기본 디렉터리로 사용합니다.
cd /srv/chroot/precise_arm
sb2-init -c `which qemu-arm` ARM `which arm-linux-gnueabi-gcc`
이렇게 하면 ARM이라는 이름의 scratchbox2 기반 환경이 만들어집니다. 이 환경은 scratchbox 안에서 호출한 gcc를 scratchbox 밖의 arm-linux-gnueabi-gcc로 연결합니다. 이제 제대로 동작하는 크로스 컴파일 툴체인이 준비되었을 것이므로, ARM용 프로그램의 크로스 변환을 시작할 수 있습니다.
변환¶
모든 사전 단계를 수행했으므로 이제 ARM용 프로그램을 교차 변환할 수 있을 것입니다. 더 큰 프로젝트에 적용하기 전에 이 최소한의 타깃을 사용하여 설정을 테스트할 수 있습니다.
변환기가 scratchbox 환경을 사용하는 방법을 알 수 있도록, 변환기를 시작하기 전에 환경 변수 두 개를 설정해야 합니다. SB2 환경 변수가 rootfs를 가리키도록 설정해야 하며, SB2OPT에는 sb2 명령의 명령줄 옵션이 들어 있어야 합니다. rootfs가 /srv/chroot/precise_arm 폴더에 있고 scratchbox 환경의 이름이 “ARM”이라면, 변수는 다음과 같이 정의합니다.
export SB2=/srv/chroot/precise_arm
export SB2OPT='-t ARM'
설정이 끝나면 변환기를 호출할 수 있습니다. 예를 들어 이 파일을 저장하십시오
def main(args):
print "Hello World"
return 0
def target(*args):
return main, None
그리고 변환기를 호출합니다
pypy ~/path_to_pypy_checkout/rpython/bin/rpython -O2 --platform=arm target.py
모든 것이 올바르게 동작했다면 ARM 바이너리가 생성될 것입니다. 이 바이너리를 ARM chroot 안이나 ARM 기기에서 실행하면 "Hello World"가 출력될 것입니다.
JIT를 포함한 전체 Python PyPy 인터프리터를 변환하려면 pypy/goal 디렉터리로 이동(cd)한 뒤 다음을 호출하면 됩니다.
pypy <path to rpython>/rpython/bin/rpython -Ojit --platform=arm targetpypystandalone.py