想要在 ARM 上编译一套 Apache+PHP+MySQL 的系统:
所用系统:
Ubuntu10.04 LTS
编译环境:
Gcc-4.4.3
Arm-linux-gcc-4.5.1
所需源码:
Apache-1.3.39.tar.gz
Mysql-5.1.32.tar.gz
Php-5.2.9.tar.gz
Zlib-1.2.5.tar.gz
Libxml2-2.7.7.tar.gz
一、编译 Mysql
1, 解压到/usr/local/,得到 mysql-5.1.32,先进行本地编译。输入命令:
#./configure –prefix=/usr/local/mysql
#make
编译完成后将其改名为 mysql-pc 备用。(注意不要#make install)
2,Configure
再次解压 mysql-5.1.32.tar.gz,得到 mysql-5.1.32,进入目录,修改 configure 文件
# vim configure
注释以下代码:
21948 #if test"$cross_compiling" = yes; then
21949 # { { $as_echo"$as_me:$LINENO: error: in \`$ac_pwd':" >&5
21950 #$as_echo "$as_me:error: in \`$ac_pwd':" >&2;}
21951 #{ { $as_echo "$as_me:$LINENO:error: cannot run test program while cross compiling
21952 #See \`config.log' for moredetails." >&5
21953 #$as_echo "$as_me:error: cannot run test program while cross compiling
21954 #See \`config.log' for moredetails." >&2;}
21955 # { (exit1); exit 1; }; }; }
21956 #else
22025 #fi
30317 # if test"$cross_compiling" = yes; then
30318 # { { $as_echo"$as_me:$LINENO: error: in \`$ac_pwd':" >&5
30319 #$as_echo "$as_me:error: in \`$ac_pwd':" >&2;}
30320 #{ { $as_echo "$as_me:$LINENO:error: cannot run test program while cross compiling
30321 #See \`config.log' for moredetails." >&5
30322 #$as_echo "$as_me:error: cannot run test program while cross compiling
30323 #See \`config.log' for moredetails." >&2;}
30324 # { (exit1); exit 1; }; }; }
30325 #else
30408 #fi
保存退出。
# configure --host=arm-linux--prefix=/usr/local/mysql
2, Make
#export PATH=/opt/FriendlyARM/toolchain
#make
出现关于 do_abi_check 错误。
网上查了下,发现是由于 gcc 版本太高与 mysql 有冲突造成的。于是编辑 Makefile,找到编
译 do_abi_check 的部分,并将后面编译分操作全部隐掉。保存并退出。
# make
出现错误
make[2]: Leaving directory `/home/zhaowg/mysql-pc/sql'
./gen_lex_hash > lex_hash.h-t
/bin/sh: ./gen_lex_hash: cannotexecute binary file
make[1]: *** [lex_hash.h] 错误 126
这是由于编译的 arm 类型的程序不能在 PC 上运行造成的,于是前面做的准备工作派上用场
了:
# cp ../mysql-pc/sql/gen_lex_hashsql/
# make
sql_parse.cc:5432:21: operator'<' has no left operand
make[3]: *** [sql_parse.o] 错误 1
检查 sql_parse.cc 的 5432 行,发现 宏变量 STACK_DIRECTION 没有定义初值,网上查找资
料发现 arm 中定义 STACK_DIRECTION 为 1,于是在文件开头加上一行:
# define STACK_DIRECTION 1
保存退出。
# make
完成
4、makeinstall all
# make install all
一定是 makeinstall all,只是 make install 的话只会编译库,一些可执行程序是不会编的。
会停在
make
make[4]: Entering directory`/home/zhaowg/mysql-pc/mysql-test'
INSTALL_TO_DIR="/usr/local/mysql/mysql-test"install_test_files
一段时间,不要以为出错了,耐心等一会!
二、编译 Apache
总体上需要两个步骤:
1、编译本机代码
2、利用本机代码进行交叉编译
这是因为在编译 apache 时,需要使用编译生成的工具制作后续编译使用的头文件,交叉编
译工具没法在本地运行,因此需要本地编译生成的工具。将 apache-1.3.39 分别解压到
/root/workspace/Apache/source/(本地编译用),/root/workspace/Apache/arm/(交叉编译用):
#cd /root/workspace/Apache/source/apache-1.3.39/src
注意一定是 src 目录
#./configure 所有参数都默认
#make
应该没什么问题,默认的安装目录为/usr/local/apache,我们这里不用安装。 准备交叉编译:
#cd /root/workspace/arm/apache-1.3.39
先修更新环境变量,在命令行下键入:#export PATH=/opt/ gcc-4.3.2-glibc-2.7/bin:$PATH
运行 arm-vfp-linux-gnu-gcc -v 可以查看环境变量已修改
#export CC=arm-linux-gcc
#./configure--prefix=/usr/local/apache
修改 src/main/Makefile 这个文件:
uri_delims.h: gen_uri_delims
./gen_uri_delims>uri_delims.h
test_char.h: gen_test_char
./gen_test_char>test_char.h
修改为 uri_delims.h: gen_uri_delims
/home/liubonan/source/apache-1.3.39/src/main/gen_uri_delims>uri_delims.h
test_char.h: gen_test_char
/home/liubonan/source/apache-1.3.39/src/main/gen_test_char>test_char.h
这里借用了刚才编译生成的本机代码里的工具,然后
#make
#make install
最后将/usr/local/apache 拷贝到板子上的/usr/local/ 以上所有步骤都是在 root 权限下执行的,
修改/usr/local/apache/conf/httpd.conf User nobody Groupnobody
#cd /usr/local/apache/bin
三、编译 PHP:
方法基本与之前相同。先编译本地 PHP,在交叉编译 PHP。
1,编译本地 PHP 程序:
将 PHP 解压之后,进入,键入命令:
#./configure
#make
编译完成之后不要键入 make install,程序留着备用。
2, 交叉编译 PHP 程序:
将上面编译完成的目录修改为 mysql-pc,然后再解压 mysql,进入相关目录。
1) 编译 zlib
#export CC=arm-linux-gcc
#./configure --sahred --prefix=/opt/FriendlyARM/toolchain/4.5.1/arm-none-linux-gnueabi
#make
#make install
(编译的安装路径一定是交叉编译器的安装路径,否则在编译 PHP 时会报找不到)
2) 编译 libxml2
#export CC=arm-linux-gcc
#./configure
--prefix=/opt/FriendlyARM/toolchain/4.5.1/arm-none-linux-gnueabi
#make
#make install
(安装到/usr/local/arm/4.5.1/arm-linux 下的原因同上)
--host=arm-linux
3) 编译 PHP
(1) #CC=arm-linux-gcc
#./configure --host=arm-linux
--prefix=/usr/local/php
--enable-pdo
--with-mysql=/usr/local/mysql/
--with-mysqli=/usr/local/mysql/bin/mysql_config
--with-pdo-mysql
--with-zlib=/opt/FriendlyARM/toolchain/4.5.1/arm-none-linux-gnueabi
--without-iconv
其中--with-mysql 是 arm 版的 mysql 的安装目录
--with-mysqli 是 mysql 的一个配置文件的文件名
--with-zlib 就是 arm 的交叉编译工具的目录
过程中我遇到个问题,就是无论怎么设置都找不到 mysql_config 文件,但查到在相关的目录
下该文件确实存在。后来在王上查了资料,说是需要将 mysql_config 文件复制到/usr/bin 目
录下才行,于是照做,竟然通过了。幸运啊!
(2) #make
这个没啥说的,编译时间有些长,耐心等待吧。
(3)#make install
这里会出现问题,说是不能验证 php 程序。这很正常,编译完成的是 arm 版的程序自然在
PC 机上运行不过,这是之前编译的程序就派上用处了。先将 mysql/sapi/cli/php 程序改名为
php_bak,再将 mysql-pc/sapi/cli/php 程序复制到/mysql/sapi/cli 目录下,再执行#make install。
成功安装。
(3) 将 php_bak 程序复制到 php 的安装目录,改名为 php 覆盖掉之前的程序。再将 PHP 源码
包中 php-5.2.9.ini-dist 文件复制到/usr/local/php/lib 下并改名为 php.ini。
(4) 因为 php 和 php-cgi 两个程序稍微有点大,于是用 arm-linux-strip 把 bin 目录下的 php 和
php-cgi 进行 strip。键入命令:
#arm-linux-strip php
#arm-linux-strip php-cgi
再看一下大小,是不是小多啦!
(5) 现在可以将 php 文件拷贝到 arm 板上的/usr/local 目录下用了。不过要想让 php 动态调用
mysql 还需要编译个插件
(6)最后修改 arm 板上 apache 的配置文件 httpd.conf。添加如下语句:
DirectoryIndex index.php
DirectoryIndex index.php3
DirectoryIndex index.phtml
ScriptAlias /php5/ "/usr/local/php-arm/bin/"
# 注意"/usr/local/php-arm/bin/" 中最后一个"/"不可少
AllowOverride None
Options None
Order allow,deny
Allow from all
AddType application/x-httpd-php .php3
AddType application/x-httpd-php .php
AddType application/x-httpd-php .phtml
Action application/x-httpd-php "/php5/php-cgi"
四、再次编译 mySQL 以支持 PHP 动态调用:
进入 Mysql 带的扩展库的目录,运行:
#/usr/local/php/bin/phpize
#./configure--with-php-config=/usr/local/php/bin/php-config
#make
#makeinstall
然后在会有这个文件
usr/local/php/lib/php/extensions/debug-non-zts-20060613/pdo_mysql.so
增加到配置文件 php.ini 里:
# viphp.ini
在最后加入
extension=pdo_mysql.so