2019年7月1日 星期一

Cross compile Python


build static python (沒有動態載入so , 目前ARM不成功 )

有些教學說還要build 一個x86的Parser/pgen 才能成功build
但我用了反而有問題..
不過流程是從以下文章 變化的
1.到https://www.python.org/ 下載你要的版本source code
我用Ubuntu 16.04.5 , 內建python 3.5 , 但下載3.7 來build 會有問題
所以版號應該跟自身已裝的python 也有關
3.5.2

arm-linux-gnueabihf-gcc 的版本會影響到ARM上要裝的glibc 版本


2.解壓縮後進到目錄

3.輸入以下指令
echo ac_cv_file__dev_ptmx=no >> config.site   
 
echo ac_cv_file__dev_ptc=no >> config.site
 
export CONFIG_SITE=config.site

4. config
$ ./configure --host=arm-linux-gnueabihf --build=x86_64-linux-gnu --target=arm-linux-gnueabihf --disable-ipv6 --enable-shared --prefix=/opt/arm_python

5.修改Module/Setup
enable zlib => 找到  #zlib zlibmodule.c xxxxxx 這行,拿掉#  (非必要)
enable ssl => # _ssl _ssl.c xxxx 這邊,拿掉#,上方有個SSL=/usr/local/lib 換成ARM 的位置(.so or .a)
enable shared => #*shared* ,拿掉#  (非必要)
其他module 在shared 模式都是enable的
只有少數module 需要enable , 如ssl zlib
若需要enable 的就拿掉# 再注意link library 到ARM的版本

SSL 有可能遇到ARM預設的版本較舊,那建議這邊cross compile 改用靜態連結SSL ARM Lib 或者覆蓋掉ARM 上的SSL Lib


6. cross build zlib and openssl 
zlib:
到 http://www.zlib.net/ 下載source code , 版本1.2.11
prefix 就看你arm 編譯器lib 位置
export CC=arm-linux-gnueabihf-gcc
export AR=arm-linux-gnueabihf-ar
$ ./configure
make
make install prefix=/usr/arm-linux-gnueabihf
openssl:
注意python 3.5.2 最高匹配到1.0.2的openssl
以下只會產生.a 檔案
$ git clone -b OpenSSL_1_0_2-stable --single-branch https://github.com/openssl/openssl.git
cd openssl
export cross=arm-linux-gnueabihf-
$ ./Configure dist
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
若要改成製作.so

修改Makefile CFLAGS 增加-fPIC

arm-linux-gnueabihf-ar -x libssl.a
arm-linux-gnueabihf-gcc -shared *.o -o libssl.so.1.0.2
(libcrypt 同上)

7.修改Makefile  (非必要)
-s 去除多餘文件
-lrt 減少無用的錯誤訊息
Makefile
CONFIGURE_LDFLAGS= -s -lrt

8.make python
install 會將產物放到/opt/arm_python
make && make install
這邊若成功會看到一堆rf -rf xxxxxx , 最後有個link 錯誤 就可以忽略
所以若ls /opt/arm_python 有檔案,就可以先試試看放到ARM上


9.打包
壓縮後用scp 傳到ARM上
cd /opt/arm_python
sudo tar cvzpf ~/arm_python.tar.gz .
scp ~/arm_python.tar.gz user@ip:/home/
ARM 上解壓縮放到目標目錄
修改python3 連結
設置PYTHONPATH 才能找到module
sudo mkdir -p /opt/arm_python
sudo tar zxvf ~/arm_python.tar.gz -c /opt/arm_python
sudo unlink /usr/bin/python3
sudo ln -s /opt/arm_python/bin/python3.5 /usr/bin/python3
 
 
echo PYTHONPATH="/opt/arm_python/lib/python3.5/dist-packages/:/usr/lib/python3/dist-packages/:/opt/arm_python/lib/python3.5/" >> /etc/environment
還要設置LD 找到/opt/arm_python/lib 目錄,才能連結到python3.5 要使用的某個.so

最後就是進到python3 
測試import math , import ssl

還要確認是不是要手動再安裝SSL
我有先用apt-get install libssl-dev

其他第三方套件可以直接copy x86上dist-packages 的內容,放到剛剛PYTHONPATH的任意位置
但要注意版本,避免語法不同

基本上import math跟ssl 成功大概就沒問題,缺的module 就是去x86 copy就行了

1 則留言:

  1. Karl 的魔法書: Cross Compile Python >>>>> Download Now

    >>>>> Download Full

    Karl 的魔法書: Cross Compile Python >>>>> Download LINK

    >>>>> Download Now

    Karl 的魔法書: Cross Compile Python >>>>> Download Full

    >>>>> Download LINK

    回覆刪除

NoSQL Redis intro

Redis是一個使用ANSI C編寫的開源、支援網路、基於記憶體、可選永續性的鍵值對儲存資料庫。 支援rdb 及aof 兩種儲存方式 From  https://zh.wikipedia.org/wiki/Redis Redis 目前擁有兩種資料...