想要在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 INSTALL_TO_DIR="/usr/local/mysql/mysql-test"install_test_files
make[4]: Entering directory`/home/zhaowg/mysql-pc/mysql-test'
一段时间,不要以为出错了,耐心等一会!
二、编译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 --host=arm-linux --prefix=/opt/FriendlyARM/toolchain/4.5.1/arm-none-linux-gnueabi
#make
#make install
(安装到/usr/local/arm/4.5.1/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/" 中最后一个"/"不可少
<Directory "/usr/local/php-arm/bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
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