mips交叉编译移植python

1、准备

https://www.python.org/ 官网上下载最新的Python-2.7.15.tgz

由于需要zlib和sqlite3因此分别去官网下载

sqlite-autoconf-3250300.tar.gz

zlib-1.2.1.2.tar.gz

2、编译sqlite3

cd sqlite-autoconf-3250300
./configure --host=mips64el-linux --build=x86_64-redhat-linux --prefix=/home/chentao/work/project/Z2-KERNEL-t/rootfs/rootfs_fs/fsxxx/usr

make

make install

其中:--prefix=xxx为指定编译完成安装路径,一般为制作的根文件系统的usr目录下

3、编译zlib

由于zlib编译不支持--host的方式指定交叉编译。

CC=mips64el-linux-gcc ./confiure --shared --prefix=/home/chentao/work/project/Z2-KERNEL-t/rootfs/rootfs_fs/fsxxx/usr

make

mak install

4、编译python

由于mips环境运行的时候 import ctypes会出现问题,提示未实现某函数这里需要修改模块编译

diff -r 656543a2ad75 Modules/_ctypes/libffi/fficonfig.py.in
--- a/Modules/_ctypes/libffi/fficonfig.py.in    Mon Mar 02 23:32:02 2015 -0800
+++ b/Modules/_ctypes/libffi/fficonfig.py.in    Tue Mar 03 15:21:00 2015 +0000
@@ -5,7 +5,7 @@
 
 ffi_platforms = {
     'MIPS_IRIX': ['src/mips/ffi.c', 'src/mips/o32.S', 'src/mips/n32.S'],
-    'MIPS_LINUX': ['src/mips/ffi.c', 'src/mips/o32.S'],
+    'MIPS_LINUX': ['src/mips/ffi.c', 'src/mips/o32.S', 'src/mips/n32.S'],
     'X86': ['src/x86/ffi.c', 'src/x86/sysv.S', 'src/x86/win32.S'],
     'X86_FREEBSD': ['src/x86/ffi.c', 'src/x86/freebsd.S'],
     'X86_WIN32': ['src/x86/ffi.c', 'src/x86/win32.S'],

讲其中 'MIPS_LINUX': ['src/mips/ffi.c', 'src/mips/o32.S'] 替换为 'MIPS_LINUX': ['src/mips/ffi.c', 'src/mips/o32.S', 'src/mips/n32.S']

1> 编译pc版本需要生成一些必要工具

cd Python-2.7.15
 mkdir build-pc
 cd build-pc
 ../configure CC=gcc CXX=g++ AR=ar RANLIB=ranlib LDFLAGS="-L/usr/lib -L/usr/lib64 -L/usr/local/lib -L/usr/local/lib64" CFLAGS="-I/usr/include -I/usr/local/include"
 make 

2>交叉编译mips版本

cd Python-2.7.15
 mkdir build-mips

../configure --host=mips64el-linux --build=x86_64-redhat-linux --prefix=/home/chentao/work/project/Z2-KERNEL-t/rootfs/rootfs_fs/fsxxx/usr --disable-ipv6  PGEN_FOR_BUILD=../build-pc/Parse/pgen CFLAGS="-I/home/chentao/work/project/Z2-KERNEL-t/rootfs/rootfs_fs/fsxxx/usr/include " LDFLAGS=-L/home/chentao/work/project/Z2-KERNEL-t/rootfs/rootfs_fs/fsxxx/usr/lib --enable-shared

需要修改根目录下生成的setup.py

加入zlib detect_modules模块中zlib探测需要的路径:

 # You can upgrade zlib to version 1.1.4 yourself by going to
        # http://www.gzip.org/zlib/
        inc_dirs += ["/home/chentao/work/project/Z2-KERNEL-t/rootfs/rootfs_fs/fsxxx/usr/include"] #加入zlib头文件路径
        zlib_inc = find_file('zlib.h', [], inc_dirs)
        have_zlib = False
        if zlib_inc is not None:
            zlib_h = zlib_inc[0] + '/zlib.h'
            version = '"0.0.0"'
            version_req = '"1.1.3"'
            if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h):
                zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
            fp = open(zlib_h)
            while 1:
                line = fp.readline()
                if not line:
                    break
                if line.startswith('#define ZLIB_VERSION'):
                    version = line.split()[2]
                    break
            #if version >= version_req: #由于我的zlib版本为1.2.1.2已经大于1.1.3故降这里注释
            lib_dirs += ['/home/chentao/work/code/zlib-1.2.1.2/_INSTALL/lib']
            print(lib_dirs)
            if (self.compiler.find_library_file(lib_dirs, 'z')):
                if host_platform == "darwin":
                    zlib_extra_link_args = ('-Wl,-search_paths_first',)
                else:
                    zlib_extra_link_args = ()
                exts.append( Extension('zlib', ['zlibmodule.c'],
                                           libraries = ['z'],
                                           extra_link_args = zlib_extra_link_args))
                have_zlib = True
            else:
                missing.append('zlib')
            #此处注释与上面版本判断相对应
            #else: 
            #    missing.append('zlib')
        else:
            missing.append('zlib')

主要是加入头文件的路径。以及由于版本为1.2.1了已经满足了1.1.3所以讲版本判断也注释掉

sqlite3的模块探测也要加入,如下

 # We hunt for #define SQLITE_VERSION "n.n.n"
        # We need to find >= sqlite version 3.0.8
        sqlite_incdir = sqlite_libdir = None
        sqlite_inc_paths = [ '/usr/include',
                             '/usr/include/sqlite',
                             '/usr/include/sqlite3',
                             '/usr/local/include',
                             '/usr/local/include/sqlite',
                             '/usr/local/include/sqlite3',
                           ]
        if cross_compiling:
            sqlite_inc_paths = ['/home/chentao/work/project/Z2-KERNEL-t/rootfs/rootfs_fs/fsxxx/usr/include']
        MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
     

此处主要是再cross_compiling里面加入sqlite的头文件路径


 make 
 make install

完成手工。。。

猜你喜欢

转载自blog.csdn.net/you5522393/article/details/83892645