热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python移植到arm的单板_移植Python到ARM9(S3C2440)开发板

我需要在Arm9的s3c2440CPU上运行python,以下是我的编译过程。host编译环境:ubuntu7.04,gcc4.2.1,arm-linu

我需要在Arm9的s3c2440 CPU上运行python,以下是我的编译过程。

host编译环境:

ubuntu 7.04, gcc 4.2.1, arm-linux-gcc 3.3.2

要cross compile的程序:

sqlite 3.5.6,

python 2.5.1

编译sqlite

我推荐使用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的编译和安装了。

编译python

先去http://www.python.org/download/下载最新版本的python源代码,我这里下载的是:

http://www.python.org/ftp/python/2.5.1/Python-2.5.1.tar.bz2

先把python解压缩:

tar jxf Python-2.5.1.tar.bz2

cd Python-2.5.1

编译pc版本的语法解析器

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

mkdir build.pc

cd build.pc

../configure

make Parser/pgen

然后ls Parser一下,应该就能看到有pgen了。

修改configure

configure在检测编译器的printf是否支持%zd的时候,如果发现是在cross compile,就直接不干活了。这还了得?

把这一部分的检测代码去掉。这段代码起始于

echo "$as_me:$LINENO: checking for %zd printf() format support" >&5

echo $ECHO_N "checking for %zd printf() format support... $ECHO_C" >&6

if test "$cross_compiling" = yes; then

结束于

cat >>confdefs.h <

#define PY_FORMAT_SIZE_T "z"

_ACEOF

else

echo "$as_me: program exited with status $ac_status" >&5

echo "$as_me: failed program was:" >&5

sed &#39;s/^/| /&#39; conftest.$ac_ext >&5

( exit $ac_status )

echo "$as_me:$LINENO: result: no" >&5

echo "${ECHO_T}no" >&6

fi

rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext

fi

把这两段以及中间的内容都删除掉就可以了。

编译arm版本的python

有了语法解析器&#xff0c;就可以开始编译arm版本的python了。

mkdir ../build.arm

cd ../build.arm

../configure --prefix&#61;/home/leojay/test/arm-system-working/rootfs --disable-ipv6 --host&#61;arm-linux --enable-shared

先创建一个用于编译的目录build.arm&#xff0c;再对python做一些配置&#xff0c;如安装目录&#xff0c;不要ipv6&#xff0c;使用arm-linux的编译器&#xff0c;生成动态链接库。

修改Makefile

之后就要对Makefile做一些修改&#xff0c;把

OPT&#61; -DNDEBUG -g -O3 -Wall -Wstrict-prototypes

一行中&#xff0c;去掉-g&#xff0c;我们不要debug python&#xff0c;-O3改为-O2&#xff0c;空间紧张O2就可以了。

PGEN&#61; Parser/pgen$(EXE)

一行的下面加上

PGEN_HOST&#61; ../build.pc/Parser/pgen$(EXE)

表明我们在HOST上运行的pgen

在要使用PGEN的地方改为PGEN_HOST:

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)

-$(PGEN) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

改为&#xff1a;

$(GRAMMAR_H) $(GRAMMAR_C): $(PGEN) $(GRAMMAR_INPUT)

-$(PGEN_HOST) $(GRAMMAR_INPUT) $(GRAMMAR_H) $(GRAMMAR_C)

修改所有使用新生成的python的地方。

所有如 ./$(BUILDPYTHON) 的地方&#xff0c;都改为python

如&#xff1a;

platform: $(BUILDPYTHON)

$(RUNSHARED) ./$(BUILDPYTHON) -E -c &#39;import sys ; from distutils.util import get_platform ; print get_platform()&#43;"-"&#43;sys.version[0:3]&#39; >platform

改为

platform: $(BUILDPYTHON)

$(RUNSHARED) python -E -c &#39;import sys ; from distutils.util import get_platform ; print get_platform()&#43;"-"&#43;sys.version[0:3]&#39; >platform

这种地方比较多&#xff0c;大家小心修改。

修改setup.py

setup.py负责编译python的各个扩展模块。但是&#xff0c;由于python完全没有考虑cross compile&#xff0c;所以要做一些修改。

build_extension函数&#xff1a;

这个函数在编译了所有的extension后&#xff0c;会去 load这些刚编译好的extension&#xff0c; 但我们在i686的电脑上显然不能load&#xff0c;所以要跳过这些操作。 在 build_ext.build_extension(self, ext)后面直接写一个return&#xff0c;不做load。

detect_modules函数&#xff1a;

函数的前两行是把/usr/local加到搜索目录中&#xff0c;我们的cross compiler一般不会直接安装在 /usr/local里面的&#xff0c;所以这两行去掉&#xff1a;

add_dir_to_list(self.compiler.library_dirs, &#39;/usr/local/lib&#39;)

add_dir_to_list(self.compiler.include_dirs, &#39;/usr/local/include&#39;)

lib_dirs, inc_dirs的设定中&#xff0c;把中括号里的那些都去掉。 以下所有模块都不要&#xff1a;

cmath, ctypes, _testcapi, pwd, grp, spwd, mmap, audioop, p_w_picpathop, rgbimg, readline,

ssl, openssl, bdb, dbm, termios, nsl, ncurses, bz2, linuxaudiodev, ossaudiodev, tkinter

由于python本身的问题&#xff0c;现在ctypes还不能在除i386以外的机器上运行&#xff0c;所以ctypes也去掉 编译sqlite的地方&#xff1a;

for d in inc_dirs &#43; sqlite_inc_paths:

改为&#xff1a;

for d in [&#39;/usr/local/arm/3.3.2/include&#39;]:

因为我的sqlite3安装在这里&#xff0c;如果这里不改的话&#xff0c;setup.py会在我的电脑上找sqlite

main函数&#xff1a;

setup函数调用的时候&#xff0c;把要安装的scripts那一部分去掉

之后就可以make && make install了。

裁减python

python完全安装后&#xff0c;实在是很大&#xff0c;所以&#xff0c;要把一些肯定用不上的库去掉。 所以&#xff0c;再附上我的裁减脚本 cleanpy.sh

注意&#xff0c;由于我的python程序都运行在python -OO的参数下&#xff0c;所有的.py和.pyc都不需要&#xff0c; 只要有.pyo就可以了。所以&#xff0c;这个脚本会把所有的.py和.pyc都删除掉。

大家可以根据自己的需要做调整。



推荐阅读
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • 在Python 3环境中,当无法连接互联网时,可以通过下载离线模块包来实现模块的安装。具体步骤包括:首先从PyPI网站下载所需的模块包,然后将其传输到目标环境,并使用`pip install`命令进行本地安装。此方法不仅适用于单个模块,还支持依赖项的批量安装,确保开发环境的完整性和一致性。 ... [详细]
  • 开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用
    开发心得:深入探讨Servlet、Dubbo与MyBatis中的责任链模式应用 ... [详细]
  • 在Hive中合理配置Map和Reduce任务的数量对于优化不同场景下的性能至关重要。本文探讨了如何控制Hive任务中的Map数量,分析了当输入数据超过128MB时是否会自动拆分,以及Map数量是否越多越好的问题。通过实际案例和实验数据,本文提供了具体的配置建议,帮助用户在不同场景下实现最佳性能。 ... [详细]
  • 探讨 `org.openide.windows.TopComponent.componentOpened()` 方法的应用及其代码实例分析 ... [详细]
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
  • 探索 PHP 8.0 的重大更新:轻松获取年度月份数据
    PHP 8.0 引入了多项重要更新,包括增强的类型系统、全新的 JIT 编译器以及联合类型等特性。这些改进不仅提升了性能,还简化了开发流程。本文将重点介绍如何利用 PHP 8.0 的新功能轻松获取年度和月份数据,为开发者提供更高效、更简洁的解决方案。 ... [详细]
  • Linux学习精华:程序管理、终端种类与命令帮助获取方法综述 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • 在 PySimpleGUI 中实现异步功能的详细指南 ... [详细]
  • Norton Partition Magic 中 PHP 函数 error_reporting(E_ALL ^ E_NOTICE) 的详细解析与应用
    在 Windows 环境下,通过具体示例分析了 `Norton Partition Magic` 中 `PHP` 函数 `error_reporting(E_ALL ^ E_NOTICE)` 的详细解析与应用。该函数用于控制错误报告级别,例如在从 PHP 4.3.0 升级到 4.3.1 后,程序出现多处错误的原因及解决方法。本文深入探讨了错误报告配置对程序稳定性的影响,并提供了实用的调试技巧。 ... [详细]
  • 本文深入探讨了数据库性能优化与管理策略,通过实例分析和理论研究,详细阐述了如何有效提升数据库系统的响应速度和处理能力。文章首先介绍了数据库性能优化的基本原则和常用技术,包括索引优化、查询优化和存储管理等。接着,结合实际应用场景,讨论了如何利用容器化技术(如Docker)来部署和管理数据库,以提高系统的可扩展性和稳定性。最后,文章还提供了具体的配置示例和最佳实践,帮助读者在实际工作中更好地应用这些策略。 ... [详细]
  • 在处理大规模并发请求时,传统的多线程或多进程模型往往无法有效解决性能瓶颈问题。尽管它们在处理小规模任务时能提升效率,但在高并发场景下,系统资源的过度消耗和上下文切换的开销会显著降低整体性能。相比之下,Python 的 `asyncio` 模块通过协程提供了一种轻量级且高效的并发解决方案。本文将深入解析 `asyncio` 模块的原理及其在实际应用中的优化技巧,帮助开发者更好地利用协程技术提升程序性能。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 本文介绍了如何使用Hive分析用户最长连续登录天数的方法。首先对数据进行排序,然后计算相邻日期之间的差值,接着按用户ID分组并累加连续登录天数,最后求出每个用户的最大连续登录天数。此外,还探讨了该方法在其他领域的应用,如股票市场中最大连续涨停天数的分析。 ... [详细]
author-avatar
茶香未散尽_385_312
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有