1. 程式人生 > >mips交叉編譯移植python

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

 

完成手工。。。