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
完成手工。。。