进入python源码目录,执行:
./configure
编译python和Parser/pgen
make python Parser/pgen将X86版本的python可执行文件备份为python_for_build
mv python python_for_build将X86版本的pgen可执行文件配备为pgen_for_build
mv Parser/pgen Parser/pgen_for_build清理编译好的项目文件,这一步是为了后面的交叉编译做准备
makedistclean
整个步骤最重要的就是保存好python和pgen这两个可执行文件,因为之后在交叉编译Python时需要用到这两个文件。
第二步:给python源码打上交叉编译补丁
我的python版本是2.7.3,所以补丁也需要打上对应的版本补丁,
Python-2.6.6-xcompile.patch
Python-2.7.2-xcompile.patch
Python-2.7.3-xcompile.patch
Python-3.1.1-xcompile.patch
Python-3.1.2-xcompile.patch
Python-3.1.3-xcompile.patch
Python-3.2.2-xcompile.patch
共享在我的云盘里http://pan.baidu.com/s/1cJ1c7s。
进入python源码目录,执行
patch -p1 < Python-2.7.3-xcompile.patch这时显示如下,则表示打补丁成功
第三步:交叉编译python
配置- CC为指定C交叉编译器,
- CXX为指定C++交叉编译器,
- AR为ar工具
- RANLIB为ranlib工具
- Host为目标主机
- Build为编译环境主机
- Prefix为安装位置
配置命令如下:(32位就是build=x86-linux-gnu64位就是build=x86_64-linux-gnu )
CC=arm-linux-gccCXX=arm-linux-g++AR=arm-linux-arRANLIB=arm-linux-ranlib./configure--host=arm-linux --build=x86_64-linux-gnu--prefix=/opt/python-arm/
自己机器上对应的参数修改一下
编译
编译命令如下(不同编译器需要修改相应的arm-linux位置):
makeHOSTPYTHON=./python_for_buildHOSTPGEN=./Parser/pgen_for_buildBLDSHARED="arm-linux-gcc-shared"CROSS_COMPILE=arm-linux- CROSS_COMPILE_TARGET=yesHOSTARCH=arm-linux BUILDARCH=x86_64-linux-gnu
安装同编译,具体如下:
makeinstallHOSTPYTHON=./python_for_buildBLDSHARED="arm-linux-gcc-shared"CROSS_COMPILE=arm-linux- CROSS_COMPILE_TARGET=yes --prefix=/opt/python-arm/
最后会在prefix指定的目录下有新生成的文件和文件夹,主要文件夹是/bin,/include,/lib,/share。把他们都复制到目标机器的/usr目录下。最后在目标机上执行一下命令可以检查python环境是否完整。
python/usr/lib/python2.7/test/test___all___.py
常见错误
按以上方法进行移植时我没有遇到错误,但是之前我按其他方法进行移植时遇到了一下错误,这里记录一下。
- 编译时遇到过如下错误
编辑pyconfig.h文件,找到#undef PY_FORMAT_LONG_LONG,添加一行#define PY_FORMAT_LONG_LONG “ll”
- 在目标机器上运行test时遇到如下错误
在执行的过程中发现所有的python自带的py/pyc库文件找不到,是由于PYTHONHOME指定的路径有问题,和PYTHONHOME下文件架构有问题,一定为:${PYTHONHOME}/lib/python2.7。一般我们将编译好的文件夹(bin,lib,include,share)直接复制到usr下,是没有这个问题的(PYTHON库会放到/usr/lib/python2.7里面)。