Total Pageviews

Sunday 15 October 2017

为NETGEAR R6300 v2路由器编译python

前不久买了一个NETGEAR R6300 V2路由器。
大家可以在wikidevi上看到它的硬件配置:
http://wikidevi.com/wiki/Netgear_R6300_v2
CPU是Broadcom BCM47081A0 (800 MHz),我们可以在Broadcom官网上看到他的一些详细信息:
http://www.broadcom.com/products/Wireless-LAN/802.11-Wireless-LAN-Solutions/BCM4707-4708-4709
这么好的配置不用来折腾简直就是浪费。一直期待着能刷系统……直到最近,出了个R6300v2的dd-wrt固件:
http://www.myopenrouter.com/download/50404/DD-WRT-for-R6300v2/
不过还是beta版,很多功能还不怎么好,本人刷了之后最蛋疼的就是Mac OS X不能搜到dd-wrt的5G网络,但同设备的Windows却可以,非常郁闷……
不过这不是我们这次讨论的重点
我们可以在固件下载页面中找到源码,下载后我们查看Build Instructions可以发现使用的工具链是hndtools-arm-linux-2.6.36-uclibc-4.5.3,当然你也可以用你喜欢的工具链,但是可能需要重新编译一下固件了……
另外这个使用的工具链我没找到在哪里可以下,不过我倒是在github上看到了:
https://github.com/RMerl/asuswrt-merlin/tree/master/release/src-rt-6.x.4708/toolchains/hndtools-arm-linux-2.6.36-uclibc-4.5.3
当然,你也可以用buildroot自己配置一个出来……
本人一开始用错工具链搞得各种符号有问题,各种奇葩的问题。

就算是这样还是我费劲千辛万苦,去掉ctype的依赖(比如toupper等函数)之后的结果……好不容易能运行python了,但是组件…………
后来换回来之后一切非常顺利
说了这么多,我们还是来看看如何编译python吧,其实我们更需要的是编译一些python的组件,比如pyOpenSSL等
当然,我们的编译环境在Ubuntu下
编译OpenSSL的命令非常简单,关于源码下载什么的我就不说了,没意思。prefix可根据自己的需要修改
1
CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib ./Configure no-asm shared --prefix=/usr/local/arm/ssl linux-armv4
配置完成后就是make了
编译libevent和zlib也差不多:
1
2
3
CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib ./configure --prefix=/usr/local/arm/libevent --host=arm-linux
make
make install
1
2
3
CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib ./configure --prefix=/usr/local/arm/zlib
make
make install
之后就是编译python及其的组件了,我主要是参考了这里:
http://randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html
写得非常详细,我编译的版本是2.7.3。不过我没有编译SQLite就是了,主要是因为用不上……
为了让编译组件的时候能找到对应的头文件和库,我们在patch后还需要自己手工修改一下setup.py,在 detect_modules(patch过)中找好为交叉编译设置搜索路径的地方,加上我们编译的库,这里我还加上了ncurses(本来想装个 screen),但是最后事实证明,在R6300v2上的dd-wrt上完全用不上……
1
2
3
4
5
6
lib_dirs += [
    '/usr/local/arm/zlib/lib''/usr/local/arm/ssl/lib''/usr/local/arm/ncurses/lib'
    ]
inc_dirs += [
    '/usr/local/arm/zlib/include''/usr/local/arm/ssl/include''/usr/local/arm/ncurses/include/ncursesw''/usr/local/arm/ncurses/include'
    ]
然后按照那里写的方法编译就好了,主要原理就是先编译一个host的python,可以在机器上跑,其实我们可以直接用系统带的python2.7
接下来就是编译其他的python组件,弄成egg在dd-wrt上用easy_install装就好了
先准备好setuptools(目录与Python源码目录同一目录下)
下载并解压 https://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e
这不是最新版,大家想要的话可以尝试最新版
编译pyOpenSSL(目录与Python源码目录同一目录下):
1
2
3
4
5
6
cd pyOpenSSL-0.13/
OPENSSL=/usr/local/arm/ssl
PYTHONPATH=../Python-2.7.3/Lib ../Python-2.7.3/hostpython setup.py build_ext -I$OPENSSL/include -L$OPENSSL
sed -i -e "s|from distutils.core import Extension, setup|from setuptools import setup\nfrom distutils.core import Extension|g" setup.py
PYTHONPATH=../Python-2.7.3/Lib:../setuptools-0.6c11 ../Python-2.7.3/hostpython setup.py bdist_egg
mv dist/pyOpenSSL-0.13-py2.7-linux-i686.egg dist/pyOpenSSL-0.13-py2.7.egg
编译greenlet:
1
2
3
4
5
CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib gcc=arm-linux-gcc ar=arm-linux-ar ranlib=arm-linux-ranlib ld=arm-linux-ld PYTHONPATH=/usr/lib/ python setup.py build_ext -I../Python-2.7.3/Include
#这里可能需要修改/usr/bin下的ld和gcc,链接到arm-linux的,完成编译后记得改回来
sed -i -e "s|from distutils.core import Extension, setup|from setuptools import setup\nfrom distutils.core import Extension|g" setup.py
PYTHONPATH=../setuptools-0.6c11 python2.7 setup.py bdist_egg
mv dist/greenlet-0.4.1-py2.7-linux-i686.egg dist/greenlet-0.4.1-py2.7.egg
编译gevent:
1
2
3
4
5
LIBEVENT=/usr/local/arm/libevent
PYTHONPATH=../Python-2.7.3/Lib ../Python-2.7.3/hostpython setup.py build_ext -I$LIBEVENT/include -L$LIBEVENT/lib
sed -i -e "s|from distutils.core import Extension, setup|from setuptools import setup\nfrom distutils.core import Extension|g" setup.py
PYTHONPATH=../Python-2.7.3/Lib:../setuptools-0.6c11 ../Python-2.7.3/hostpython setup.py bdist_egg
mv dist/gevent-0.13.8-py2.7-linux-i686.egg dist/gevent-0.13.8-py2.7.egg
大致流程与编译pyOpenSSL相同。
最后在R6300v2的dd-wrt上用easy_install安装egg文件即可
1
2
3
4
5
python ez_setup.py
easy_install pyOpenSSL-0.13-py2.7.egg
easy_install greenlet-0.4.1-py2.7.egg
easy_install gevent-0.13.8-py2.7.egg
这样我们就安装完我们需要的组件了,这篇文章主要目的是记录一下过程,具体细节并不是非常详细,如果遇到些什么问题可以留言。
最后我又稍稍处理了一下python的lib,把.py文件全部编译成.pyo了,其实意义不是非常大,只不过是想试试而已~

在用不了screen的情况下,如果想后台运行的话就使用nohup命令吧。

No comments:

Post a Comment