Python交叉編譯和移植
1、交叉編譯之前要確定PC上安裝對應版本的python
3、解壓 tar xjvf Python-2.7.tar.bz2
4、由於在編譯python的時候,需要先編譯一個叫pgen的程式出來,用於生成語法解析器,所以要先生成一個pc版本的pgen:
mkdir build.pc
cd build.pc
../configure
make Parser/pgen
然後ls Parser一下,應該就能看到有pgen了。
5、配置:
./configure --prefix=/home/pub/johnny/xbmc/python_install --host=mips-linux-gnu "CC=mips-linux-gnu-gcc -EL" "CFLAGS=-EL" "LDFLAGS=-EL" --enable-shared --disable-readline --disable-dynamic-extensions
6、修改setup.py
detect_modules函式:
函式的前兩行是把/usr/local加到搜尋目錄中,我們的cross compiler一般不會直接安裝在 /usr/local裡面的,所以這兩行去掉:
add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
7、之後就要對Makefile做一些修改:
(1)把
# OPT= -DNDEBUG -g -O3 -Wall -Wstrict-prototypes
OPT= -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
一行中,去掉-g,我們不要debug python,-O3改為-O2,空間緊張O2就可以了。
(2)在:
PGEN= Parser/pgen$(EXE)
一行的下面加上:
PGEN_HOST= build.pc/Parser/pgen$(EXE)
表明我們在HOST上執行的pgen。
(3)在要使用PGEN的地方改為PGEN_HOST:
$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
改為:
$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)
-$(PGEN_HOST) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)
(4)修改所有使用新生成的python的地方。
所有如 ./$(BUILDPYTHON) 的地方,都改為python,如:
platform: $(BUILDPYTHON)
$(RUNSHARED) ./$(BUILDPYTHON) -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform
改為:
platform: $(BUILDPYTHON)
$(RUNSHARED) python -E -c 'import sys ; from distutils.util import get_platform ; print get_platform()+"-"+sys.version[0:3]' >platform
這種地方比較多,共16處,需小心修改。
8、make 出現錯誤:
Include/pyport.h:243: error: #error "This platform's pyconfig.h needs to define PY_FORMAT_LONG_LONG"
修改pyconfig.h: 找到#undef PY_FORMAT_LONG_LONG 處加:#define PY_FORMAT_LONG_LONG "ll"
9、再次make還是有錯誤,把Lib、Tools和Module目錄copy到上一級目錄
10、make,make install
11、在開發板上通過nfs進入到當前路徑執行./python,成功;
12、編譯測試程式:
mips-linux-gnu-gcc -EL test.c -L. -lpython2.7
#include "./Include/Python.h"
int main()
{
printf("1111\n");
Py_Initialize();
PyRun_SimpleString("print 'hi,python!'");
Py_Finalize();
return 0;
}
13、執行測試程式
14、只能通過nfs來再開發板上執行,目前還沒有找到完全移植到開發板上的辦法;