參考
https://datko.net/2013/05/10/cross-compiling-python-3-3-1-for-beaglebone-arm-angstrom/
平台
主機: ubuntu14.04 64bit
開發板: qemu + aarch64 (參考: http://www.cnblogs.com/pengdonglin137/p/6442583.html)
工具鏈:
aarch64-linux-gnu-gcc (gcc version 4.9.1 20140529) 用於編譯aarch64上面運行的程序
arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320) 用於編譯aarch32上面運行的程序
Python版本: Python-3.6.0
概述
前面幾篇博文介紹了Python2.7.13的交叉編譯,在編譯前需要給Python源碼打上用於交叉編譯的patch,從Python-3.3.1開始,就不需要再打什么patch了,只需要在configure的時候指定--build和--host參數即可。
下面我們以aarch64和aarch32為例說明。
正文
一、編譯PC上面用的Python
因為在交叉編譯的時候需要在PC上面運行對應版本的Python程序,所以我們需要先編譯和安裝PC上面用的Python,下面是命令:
1 #!/bin/bash 2 3 ../Python-3.6.0/configure 4 5 make -j8 6 sudo make install
默認,Python3.6.0會被安裝到/usr/local下面。
二、交叉編譯
1、配置 mk1_conf.sh
-
aarch32
1 #!/bin/bash 2 3 export PATH=/home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin:$PATH 4 5 ../Python-3.6.0/configure \ 6 --host=arm-none-linux-gnueabi \ 7 --build=armv7 \ 8 --prefix=`pwd` \ 9 --enable-ipv6 \ 10 --enable-shared \ 11 ac_cv_file__dev_ptmx="yes" \ 12 ac_cv_file__dev_ptc="no" \ 13 LDFLAGS="-L/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/lib" \ 14 CPPFLAGS="-I/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/include"
其中--build表示編譯出來的程序運行的CPU架構,--host是交叉編譯工具鏈。這里我已經吧sqlite3的lib和include添加上了,所以生成的python3是支持sqlite3的。
-
aarch64
1 #!/bin/bash 2 3 export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin:$PATH 4 5 ../Python-3.6.0/configure \ 6 --host=aarch64-linux-gnu \ 7 --build=aarch64 \ 8 --prefix=`pwd` \ 9 --enable-ipv6 \ 10 --enable-shared \ 11 ac_cv_file__dev_ptmx="yes" \ 12 ac_cv_file__dev_ptc="no" \ 13 LDFLAGS="-L/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/lib" \ 14 CPPFLAGS="-I/home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/include"
只需要替換運行的CPU架構為aarch64,然后設置對應的工具鏈即可,別忘了還有sqlite3的相關路徑的修改。
2、編譯和安裝 mk2_make.sh
這里沒有什么好說的,下面是腳本內容:
-
aarch32
1 #!/bin/bash 2 3 export PATH=/home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin:$PATH 4 5 make -j4 6 make install
-
aarch64
1 #!/bin/bash 2 3 export PATH=/home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin:$PATH 4 5 make -j4 6 make install
3、制作ramdisk
為了便於在python2和python3之間的切換,適當修改mk_ramdisk.sh如下:
-
aarch32
1 #!/bin/bash 2 3 sudo rm -rf rootfs 4 sudo rm -rf tmpfs 5 sudo rm -rf ramdisk* 6 7 sudo mkdir rootfs 8 sudo cp ../busybox-1.24.2/_install/* rootfs/ -raf 9 10 sudo mkdir -p rootfs/proc/ 11 sudo mkdir -p rootfs/sys/ 12 sudo mkdir -p rootfs/tmp/ 13 sudo mkdir -p rootfs/root/ 14 sudo mkdir -p rootfs/var/ 15 sudo mkdir -p rootfs/mnt/ 16 17 sudo cp etc rootfs/ -arf 18 19 sudo cp -arf ../arm-2014.05/arm-none-linux-gnueabi/libc/lib rootfs/ 20 21 ver=3 22 sudo mkdir -p rootfs/usr 23 pushd rootfs/usr 24 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/lib . 25 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/include . 26 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/bin . 27 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${ver}/aarch32/share . 28 sudo /home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin/arm-none-linux-gnueabi-strip lib/python* 29 popd 30 31 #sqlite 32 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/bin/* rootfs/bin/ 33 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/include/* rootfs/include/ 34 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch32/lib/* rootfs/lib/ 35 sudo strip rootfs/bin/sqlite3 36 37 sudo mkdir -p rootfs/dev/ 38 sudo mknod rootfs/dev/tty1 c 4 1 39 sudo mknod rootfs/dev/tty2 c 4 2 40 sudo mknod rootfs/dev/tty3 c 4 3 41 sudo mknod rootfs/dev/tty4 c 4 4 42 sudo mknod rootfs/dev/console c 5 1 43 sudo mknod rootfs/dev/null c 1 3 44 45 sudo rm -rf rootfs/lib/*.a 46 sudo rm -rf rootfs/lib/*.la 47 sudo /home/pengdonglin/src/qemu/aarch32/arm-2014.05/bin/arm-none-linux-gnueabi-strip rootfs/lib/* 48 49 sudo mkdir -p rootfs/tools 50 sudo cp ./other_tools/* rootfs/tools 51 52 sudo mkdir -p rootfs/lib/modules/4\.10\.0\+ 53 54 sudo dd if=/dev/zero of=ramdisk bs=1M count=150 55 sudo mkfs.ext4 -F ramdisk 56 57 sudo mkdir -p tmpfs 58 sudo mount -t ext4 ramdisk ./tmpfs/ -o loop 59 sudo cp -raf rootfs/* tmpfs/ 60 sudo umount tmpfs 61 62 sudo gzip --best -c ramdisk > ramdisk.gz 63 sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
如果提示空間不足的話,可以將dd命令的count參數擴大,同時不要忘了將kernel配置里的ramdisk的大小也擴大:
1 Device Drivers ---> 2 3 [*] Block devices ---> 4 5 (153600) Default RAM disk size (kbytes)
這里將ramdisk的大小修改為了150MB,然后重新編譯kernel
-
aarch64
1 #!/bin/bash 2 3 sudo rm -rf rootfs 4 sudo rm -rf tmpfs 5 sudo rm -rf ramdisk* 6 7 sudo mkdir rootfs 8 sudo cp ../busybox-1.24.2/_install/* rootfs/ -raf 9 10 sudo mkdir -p rootfs/proc/ 11 sudo mkdir -p rootfs/sys/ 12 sudo mkdir -p rootfs/tmp/ 13 sudo mkdir -p rootfs/root/ 14 sudo mkdir -p rootfs/var/ 15 sudo mkdir -p rootfs/mnt/ 16 17 sudo cp etc rootfs/ -arf 18 sudo mkdir -p rootfs/lib 19 20 sudo cp -arf ../gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/aarch64-linux-gnu/libc/lib/aarch64-linux-gnu/* rootfs/lib/ 21 22 sudo rm rootfs/lib/*.a 23 sudo ../gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-strip rootfs/lib/* 24 25 version=3 26 sudo mkdir -p rootfs/usr 27 pushd rootfs/usr 28 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/lib . 29 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/include . 30 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/bin . 31 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/Python${version}/aarch64/share . 32 sudo /home/pengdonglin/src/qemu/aarch64/gcc-linaro-aarch64-linux-gnu-4.9-2014.07_linux/bin/aarch64-linux-gnu-strip lib/python* 33 popd 34 35 #sqlite 36 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/bin/* rootfs/bin/ 37 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/include/* rootfs/include/ 38 sudo cp -raf /home/pengdonglin/src/qemu/python_cross_compile/SQlite/aarch64/lib/* rootfs/lib/ 39 sudo strip rootfs/bin/sqlite3 40 41 sudo mkdir -p rootfs/dev/ 42 sudo mknod rootfs/dev/tty1 c 4 1 43 sudo mknod rootfs/dev/tty2 c 4 2 44 sudo mknod rootfs/dev/tty3 c 4 3 45 sudo mknod rootfs/dev/tty4 c 4 4 46 sudo mknod rootfs/dev/console c 5 1 47 sudo mknod rootfs/dev/null c 1 3 48 49 sudo mkdir -p rootfs/lib/modules/4\.10\.0\+ 50 51 pushd rootfs/lib 52 sudo ln -sf ld-2.19-2014.07.so ld-linux-aarch64.so.1 53 popd 54 55 sudo mkdir -p rootfs/tools 56 sudo cp ./other_tools/* rootfs/tools 57 58 sudo dd if=/dev/zero of=ramdisk bs=1M count=200 59 sudo mkfs.ext4 -F ramdisk 60 61 sudo mkdir -p tmpfs 62 sudo mount -t ext4 ramdisk ./tmpfs/ -o loop 63 sudo cp -raf rootfs/* tmpfs/ 64 sudo umount tmpfs 65 66 sudo gzip --best -c ramdisk > ramdisk.gz 67 sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
這里將ramdisk的大小設置為了200MB,同時修改kernel配置:
1 Device Drivers ---> 2 3 [*] Block devices ---> 4 5 (204800) Default RAM disk size (kbytes)
然后重新編譯kernel。
4、測試
在板子起來后,運行:
python3 /usr/lib/python3.6/test/test___all__.py
-
aarch32
1 [root@vexpress ]# python3 /usr/lib/python3.6/test/test___all__.py 2 __phello__.foo 3 _bootlocale 4 _collections_abc 5 _compat_pickle 6 _compression 7 _dummy_thread 8 ... ... 9 . 10 ---------------------------------------------------------------------- 11 Ran 1 test in 15.731s 12 OK
-
aarch64
1 [root@aarch64 ]# python3 /usr/lib/python3.6/test/test___all__.py 2 [ 20.347974] random: python3: uninitialized urandom read (24 bytes read) 3 [ 21.049645] random: fast init done 4 __phello__.foo 5 _bootlocale 6 _collections_abc 7 _compat_pickle 8 _compression 9 _dummy_thread 10 _markupbase 11 ... ... 12 . 13 ---------------------------------------------------------------------- 14 Ran 1 test in 10.745s 15 OK
完