昨夜奇想,手头有块mini2440的开发板,闲着也是闲着,何不把它拿来当HTTP服务器用呢?

目前mini2440已经移植好了内核和根文件系统(busybox),基本运行环境已经具备了。所需到工作只不过是移植WEB服务器、PHP插件、数据库(拟用MYSQL)。比较一番,WEB服务器自然选择lighttpd。于是紧张的移植工作开始了。

首先自然是下载lighttpd的源代码并解压缩了:

接着,看了看lighttpd的文档,确定交叉编译的配置参数为-host=HOST_ARCH。这里的HOST_ARCH名义上就是你的目标系统架构,实际上就是交叉编译工具链的前缀。我用的是CodeSourcery的工具链,因此为了方便,直接在这里设置为-host=arm-none-linux-gnueabi。这样以来我们其实只要添加好工具链的目录到PATH变量即可,不用再另外设置一堆什么CC、AR、LD这类的变量。

另外,为了减少编译时间和提高运行效率,我们决定禁用一些类如ipv6、lfs之类的特性。确定好编译参数,就开始配置了:

配置开始,不出所料,出现了错误提示,内容大抵是说找不到pcre的头文件。可是仔细一看,/usr/include/里面是有的啊。我想大抵是交叉工具链的缘故吧(此问题也已解决,参加文末的附二)。遂把这个头文件复制到交叉工具链中:

此问题已解决,不执行上面到指令,执行下面这一条,将编译得到的头文件复制到工具链搜索路径:

继续配置,又出现错误提示说什么找不到zlib、bzip的头文件或者是库之类的。这次还给出了提示,可以通过使用–without-zlib、–without-bzip2选项分别取消zlib、bzip的依赖。大概两个是可选依赖吧!为了加快脚步,我们暂且放过这俩组件,按照提示加上这两个选项。

继续配置,这下就没出什么问题了,然后开始编译。

结果如我所料,刚才虽然解决了pcre头文件的问题,可这一次面对pcre到库文件,就不行了。因为库文件是平台相关的,PC上这个libpcre.so是x86的。没办法,只能重新编译一个新的pcre库了。遂:

参数就不再解释了,和上面一样。只不过host参数前面是两个-(该死的POSIX命令参数规则),后面两个enable是参考ArchLinux上的,看不顺眼就当没看见。需要注意安装的时候千万不要直接安装到PC上,而必须安装到目标板上。因为pcre是一个很重要到库,如果错误可能会导致一些程序(如vi)无法运行。然后用它临时替换掉PC上的pcre库,编译完了替换回来。(这个问题也已经解决,现在不用替换PC上的pcre库了,详情参考文末的附录一)

问题已经解决了,就不要执行上面的指令了,而是直接将编译好的库复制(或链接)到工具链的搜索目录:

这个时候编译安装lighttpd就没什么问题了,同样注意把他安装到临时目录,便于移植到目标板上。

这样就大功告成啦!把两个临时目录里编译好了到程序复制到开发板到根目录即可。切记把pcre到库复制过去!

++++++++++++++附录一+++++++++++++

后来经测试发现,这样编译出来的程序,运行的时候老提示说Illegal instruction。后来经Kasim兄指点,并查阅CodeSourcery的文档(gettiing-stared.pdf,第3.2.1节)后,找出了病因。

原来是因为CodeSourcery(我想大多数应该都是)工具链中,默认编译参数中march是armv5te,而mini2440所用CPU为S3C2440,基于armv4t内核的,虽然CodeSourcery也支持该CPU,但是要修改默认参数为-march=armv4t。

实际上为了方便,我们只需要在编译前设置一下CFLAGS这个环境变量即可(否则那么多Makefile里那么多gcc命令行,难道一个个加?)

++++++++++++++附录二+++++++++++++

另外,对于前面提到了无奈的解决找不到libpcre,采用暂时替代主系统对应库到方法,在CodeSourcery的文档(gettiing-stared.pdf,第3.2.1节)中,也找到了解决方案。

根据文档内容,默认的搜索库路径为:

对于march=armv4t库路径有所不同:

对于march=armv7-a,库搜索路径则为:

但头文件的搜索目录就简单多了,不管那一种架构(即不管march),搜索路径都是依次为:

所以解决方法自然是将编译好的pcre库头文件放到上面所说的头文件搜索目录中,将库安装到目标板根目录,同时安装到具体架构的库搜索目录中。