Ads 468x60px

##EasyReadMore##

22 5月, 2013

交叉編譯 mini6410 用的python

選擇適合的版本下載

http://www.python.org/ftp/python/

以python 2.7.2.版本做範例

tar -xvzf Python-2.7.2.tgz

cd Python-2.7.2

由于在编译python的时候,需要先编译一个叫pgen的程序出来,用于生成语法解析器,所以我们要先生成一个pc版本的pgen:

一些基礎常識:

./configure
這個步驟就是在建立 Makefile 這個檔案囉!通常程式開發者會寫一支 scripts 來檢查你的 Linux 系統、相關的軟體屬性等等,這個步驟相當的重要, 因為未來你的安裝資訊都是這一步驟內完成的!另外,這個步驟的相關資訊應該要參考一下該目錄下的 README 或 INSTALL 相關的檔案!
make clean
make 會讀取 Makefile 中關於 clean 的工作。這個步驟不一定會有,但是希望執行一下,因為他可以去除目標檔案!因為誰也不確定原始碼裡面到底有沒有包含上次編譯過的目標檔案 (*.o) 存在,所以當然還是清除一下比較妥當的。 至少等一下新編譯出來的執行檔我們可以確定是使用自己的機器所編譯完成的嘛!
make
make 會依據 Makefile 當中的預設工作進行編譯的行為!編譯的工作主要是進行 gcc 來將原始碼編譯成為可以被執行的 object files ,但是這些 object files 通常還需要一些函式庫之類的 link 後,才能產生一個完整的執行檔!使用 make 就是要將原始碼編譯成為可以被執行的可執行檔,而這個可執行檔會放置在目前所在的目錄之下, 尚未被安裝到預定安裝的目錄中;
make install
通常這就是最後的安裝步驟了,make 會依據 Makefile 這個檔案裡面關於

如果要編入tkinter 的話要先修改::

vim Setup.dist

把下面的東西 uncomment 掉


-L/usr/lib \
-I/usr/include/tcl8.5 \
ltk8.5 -ltcl8.5 \
-lX11

接下來開始產生PC端的主程式

./configure
make python Parser/pgen
mv python hostpython
mv Parser/pgen Parser/hostpgen
make distclean

下載一個適用你pyhton版本的patch檔:

應用該patch檔:

patch -p1 < Python-2.7.2-xcompile.patch

如果你是使用x86或64位元的主機就要加上 x86_64-linux-gnu

CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib ./configure --host=arm-linux --build=x86_64-linux-gnu --prefix=/python

make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-linux-gcc -shared" CROSS_COMPILE=arm-linux- CROSS_COMPILE_TARGET=yes HOSTARCH=ppc-linux BUILDARCH=x86_64-linux-gnu

make install HOSTPYTHON=./hostpython BLDSHARED="arm-linux-gcc -shared" CROSS_COMPILE=arm-linux- CROSS_COMPILE_TARGET=yes prefix=~/Python-2.7.2/_install

編譯出來的檔案會在 ~/Python-2.7.2/_install.

複製編譯出來的檔案到arm的機子上:

cp python ~/Python-3.2.2/_install/bin

壓成zip檔以節省複製的時間

cd _install/lib/python2.7
zip -r -y python27.zip .

複製 _install/bin/python 到目標的 /usr/bin 目錄下

複製 python27.zip 到 /usr/lib 目錄下:

cd /usr/
unzip python27.zip

config lib-dynload site-packages

設定 PYTHONHOME 環境變數到 /usr/ 後你就可以使用python了.

編譯sqlite
先去 http://www.sqlite.org/download.html 下載最新的sqlite源代碼,我這裡用的是3.5.6版本的。

我推薦使用amalgamation版本的源代碼,這個代碼只有幾個文件而已,編譯起來方便,而且據說 編譯器好的話,還可能編譯出更高效的代碼。 我下載的是

http://www.sqlite.org/sqlite-amalgamation-3.5.6.tar.gz
先運行以下幾步:

tar zxf sqlite-amalgamation-3.5.6.tar.gz
cd sqlite-3.5.6
./configure --host=arm-linux --prefix=/usr/local/arm/3.3.2 --enable-shared --disable-readline --disable-dynamic-extensions


以上是把sqlite解壓縮,然後做一些配置,這裡,我希望sqlite到時候安裝到/usr/local/arm/3.3.2裡,要生成動態鏈接庫,不要readline,不要sqlite的動態擴展。

然後編輯Makefile,把CFLAG和CXXFLAG中的-g去掉,我們不用debug sqlite。

接下來就可以編譯和安裝sqlite了:

make
make install這一步就完成了sqlite的編譯和安裝了。

将/usr/local/sqlite3目录下的三个文件:bin, include, lib 下的相应文件下载到开发板的usr/bin usr/lib 目录下。include目录下是sqlite的C语言API的头文件,编程时会用到。此时在nfs情况下,注意复制时有链接,采用cp -arf /……/lib /usr/操作。

注意:编译器使用arm-linux;编译的./python不能用,替换成本地python解释器时,要视本地python路径而定,一般换成python即可;setup.py的main内scripts置空即可;板上即时配置环境变量PYTHONHOME.

兩個知識點:

1、vi和vim中字符串替換方法

vi/vim 中可以使用 :s 命令來替換字符串。以前只會使用一種格式來全文替換,今天發現該命令有很多種寫法(vi 真是強大啊,還有很多需要學習),記錄幾種在此,方便以後查詢。

:s/vivian/sky/ 替換當前行第一個 vivian 為 sky
:s/vivian/sky/g 替換當前行所有 vivian 為 sky
:n,$s/vivian/sky/ 替換第 n 行開始到最後一行中每一行的第一個 vivian 為 sky
:n,$s/vivian/sky/g 替換第 n 行開始到最後一行中每一行所有 vivian 為 sky
n 為數字,若 n 為 .,表示從當前行開始到最後一行
:%s/vivian/sky/(等同於 :g/vivian/s//sky/) 替換每一行的第一個 vivian 為 sky
:%s/vivian/sky/g(等同於 :g/vivian/s//sky/g) 替換每一行中所有 vivian 為 sky
可以使用 # 作為分隔符,此時中間出現的 / 不會作為分隔符
:s#vivian/#sky/# 替換當前行第一個 vivian/ 為 sky/

2、Linux下設置環境變量

1.設置臨時環境變量(重啟後消失)

    export PYTHONHOME=/usr/lib/python2.7
    export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages
    export PATH=$PATH:$PYTHONHOME:$PYTHONPATH

設置永久環境變量

2.1所有用戶(不安全) 修 改/etc/profile(對所有用戶都是有效的)

cd /etc

vi profile

在後面添加

    export PYTHONHOME=/usr/lib/python2.7
    export PYTHONPATH=.:$PYTHONHOME:$PYTHONHOME/site-packages
    export PATH=$PATH:$PYTHONHOME:$PYTHONPATH

2.2單獨用戶 修改~/.bashrc文件。(每個用戶目錄下都有,ls -all)

cd ~ vi .bashrc

set JAVA_HOME=/usr/local/jdk export JAVA_HOME

set PATH=$PATH:$JAVA_HOME/bin export PATH

set CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export CLASSPATH

使用python
用python控制蜂鳴器
用vi將下面的內容保存成文件,命名為 pwm.py:

#!/usr/bin/python
import fcntl
fd = open('/dev/pwm', 'r')
fcntl.ioctl(fd, 1, 100)

在命令行上輸入 ./pwm.py,應該能聽到蜂鳴器響了。

用python中調用c/c++
將python-friendlyarm.tgz在PC上也解壓一份:

cd /opt/
mkdir python-arm
cd python-arm
tar xvzf ~/python-friendlyarm.tgz


寫一個c++文件api.cpp:

#include <Python.h>
class MyClass {
public: 
    int add(int x,int y) { return x+y; }  
}; 
extern "C" int add(int x,int y)  

    MyClass obj; 
    return obj.add(x,y); 


將c++編譯成動態庫:

arm-linux-g++ -fPIC api.cpp -o api.so -shared -I/opt/python-arm/include/python2.7 -I/opt/python-arm/lib/python2.7/config

將編譯生成的api.so拷到SD卡上,在你的python腳本中就可以調用它了:

#!/usr/bin/python
import ctypes
plib = ctypes.CDLL('/sdcard/api.so')
print "result: %d" %(plib.add(1,2))


http://www.360doc.com/content/10/1228/21/3404243_82155357.shtml

全手動編譯
半自動編譯
現成檔案

因為安裝後沒有 tkinter 所以

我有到python→module→setup.dist 把tkinter _tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \
-L/usr/local/lib \
-I/usr/local/include \
-ltk8.5 -ltcl8.5 \
-lX11
註解拿掉再重編一次python
make到一半卻說找不到 <tk.h>
可是我的主機上有裝tcl8.5dev 跟 tk8.5dev
不知道發生什麼問題了呢?

cat /var/lib/dpkg/info/tcl8.5-dev.list

cat /var/lib/dpkg/info/tcl8.5.shlibs
可找出 lib名稱
/usr/lib/libtcl8.5.a
/usr/lib/libtclstub8.5.a
所以是tcl8.5
查了一下…tcl是後來編出來的

locate lib<程式名稱>.so

就可以找出 lib 路徑

0 意見:

張貼留言

 
Blogger Templates