1 q5 b! ^, \! t9 u: P
% M8 g) p6 u ^: \2 O. J/ N7 Q
MySQL没有专门针对ARM的版本,移植到ARM没有官方文档可参考,因为MySQL5.5之后,编译是用的cmake不再使用./configure,因此,只好倒回支持./configure的版本来用,这里使用了文档上的5.1.51版本。进行如下步骤完成移植: 6 {# U7 D4 ]8 d; o7 o' j9 N" n# T) x( B- T# Q' G- _- }4 p
1) 下载mysql5.1.51 7 G4 z8 Y% ]3 x% {# a8 v& F2 b; a5 P! q2 W/ z$ p
2) 安装编译器:用的是4.3.2的交叉编译器。gcc之类的都是ubuntu10.10自带的。7 F9 ?4 y/ d8 O) d. _: z7 y9 m
8 p9 U: Q% G' C! i; t2 t* E$ ~# [
3) 编译PC版本的mysql备用 , a4 V+ |0 m7 L9 l0 |
a) 解压mysql-5.1.51到/opt/mysql-5.1.51: tar zxvf mysql-5.1.51.tar.gz . f$ r9 {# B& } m* O * O* B9 I0 p7 c5 f+ j b) cd mysql-5.1.51 $ k* i2 J% a. W! z
c) ./configure -prefix=/usr/local/mysql - _ `1 C c% P1 @ ^ [0 P+ q/ `' B9 | d) make 注意,这里无需运行make install,以为主要是为了用pc版本里的gen_lex_hash库。(注意一定要先make后,再去修改文件夹名称) 1 _& c z; q3 m' f
; I# o9 P$ w# h3 u0 r8 Z: B
e) 将文件夹mysql-5.1.51改名为mysql-5.1.51-pc备用。(将gen_lex_hash单独备份保存一下) / Q, q" Z( X6 b. _% F5 b: h: @4 I! B5 J f) 文档上说这里会出错,但我在编译的过程中没有碰到,唯一的问题是编译了arm版本的,重新通过改文件夹的名字回头编译pc版本的时候会报错。 ; v+ C5 V2 O: S( y; X
" M& o) r8 m: B d$ `4 z
2 h0 T T( B* B0 h
4) 编译arm版本的ncurses $ `3 a* Q. q9 h5 }( D, W& H/ A a) 下载ncurses-5.9.tar.gz( ]- \4 d; }0 J8 x
' X' V t1 `: q6 h7 G
b) 解压到/opt/中:tar zxvf ncurses-5.9.tar.gz ! C$ J1 q- D1 }7 W
# j0 k1 p/ l; M3 F
c) cd ncurses-5.6 ) }, b" K" u, y" m- } d) ./configure –host=arm-linux -prefix=/usr/local/ncurse –enable-static % [$ g! e( S6 C; F
3 D* ]* J" m! r& S) T) e. I2 P e) make 6 t# n+ V) Z c, R" T7 j
f) make install之所以安装这个,是因为对mysql的交叉编译过程需要该库的支持2 @0 s& j& o- ~+ Z f
5 i6 o+ Q0 U, q) e (此步在用sudo make install时出错,原因是环境变量和原来不同了,解决办法:sudo -i;make install) " S$ l7 J# h4 }* h# J' T 6 j$ N; r5 d3 h) ]! L5 E+ [ 9 j' }' v$ n. J7 e; G- P
2 _3 B- `) E) P2 u( z5) 编译arm版本的mysql _! O8 W4 Y, `; h9 N1 W0 M
a) tar zxvf mysql-5.1.51.tar.gz 9 X2 U, @) Q2 e2 K4 g7 l 5 |) \7 u" y# K. L ]' c' W! O$ c* F b) cd mysql-5.1.51 . }. M3 ~0 @/ {, I9 R
c) 修改配置文件:打开configure,可以使用gedit configure 分别在第26453行、 48175行、 48282行、 48485行附近有类似代码: ( v! u7 n9 I. ^3 N' g4 } if test "$cross_compiling" = yes; then 8 G+ r( [# U/ R1 o6 e { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} ; E' T1 @. D, ~) _
{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross ! | f- O$ u( a$ v& ], b; r5 J( Y. F0 v$ J
compiling See \`config.log' for more details." >&5 2 p9 j9 P- t. F6 i/ I( w) U+ D3 A
$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} & U$ }3 Y r5 j6 u8 I& `. i9 J
{ (exit 1); exit 1; }; }; } 5 s- n( t4 A! s" k; ]
) e" L5 K( U2 f4 f; B9 v' U) z
Else & {/ E3 \7 o' B; ]. P6 u4 | L# h8 @. K3 b% ?1 A1 p' f% |( c/ m
将这些代码改为: / t7 T4 s' a. |7 U if test "$cross_compiling" = yes; then " D5 G _/ S( Q( M1 Z9 ]7 a4 N+ y. {! ~+ Q1 b) `! `4 }
echo “skip …..!” & K2 s" I1 ?3 G; E7 } [% M
4 o1 _3 E2 {1 w
#{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 #$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} # D Q8 P" m# \) B0 K+ u
#{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling See \`config.log' for more details." >&5 - w: e9 D9 Q. f" H* `+ }- v
#$as_echo "$as_me: error: cannot run test program while cross compiling See \`config.log' for more details." >&2;} / g( z1 |6 _4 @6 E
#{ (exit 1); exit 1; }; }; } 5 p3 n# S+ F9 s6 e1 X& n 0 ?5 n# `% L: m% b8 B6 O1 A Else F9 G, C: r0 o6 b- a" X
3 v7 m: H, X+ ^, ? c, a& O8 `* F- R
一定注意,这样的代码有4部分,要全部改掉。 2 H) o- x$ y3 @# f$ ~+ k8 Q d) 配置,直接套用了人家的配置方式:$ S3 `0 q( p2 j d' P
2 w4 R* m9 U& q6 @4 ^ ./configure --host=arm-linux --enable-static --with-named-curses-libs=/usr/local/ncurse/lib/libncurses.a --prefix=/usr/local/mysql --without-debug --without-docs --without-man --without-bench --with-charset=gb2312 --with-extra-charsets=ascii,latin1,utf8 8 h( a8 w2 V: Y# M/ R4 ^; k( o: [- r , c' S; O7 F% L- Y e) 修改opt/mysql-5.1.51/sql/sql_parse.cc:在5646行之前添加#define STACK_DIRECTION 1 ( f, S' }3 V5 O0 T$ s
如果不修改该语句,则会出现如下错误:sql_parse.cc:5646:21: operator '<' has no left operand,原因是宏变量STACK_DIRECTION没有定义初值,arm中定义STACK_DIRECTION为1。 & x5 e$ X! n& M* y 注意:这里的“#define STACK_DIRECTION 1”一句,不能随便加在sql_parse.cc的开头处,而应该根据出错信息的提示添加在相应的行上,我所遇到的行号和别人文档上所遇到的行号并不相同。 : E3 i8 ?5 z( A# ?5 _7 t/ y f) 复制PC版本的gen_lex_hash文件到当前文件夹:% ^0 O0 [; x3 O( h0 m: ^% S
# o% K. }1 c* ~ cp /opt/mysql-5.1.51-pc/sql/gen_lex_hash sql/ / Q4 s7 L/ ^. N# i5 a9 i+ ~
6 X2 D5 W9 |+ |- i' L7 q" p; U) r
touch –m sql/gen_lex_hash 7 @' S7 O0 h- U4 \9 v* d: F1 i* O
cp /opt/mysql-5.1.51-pc/sql/ lex_hash.h sql/ 6 [5 }6 B+ I$ M( P ' k, M, X/ c o1 P, v. @ touch –m sql/ lex_hash.h ; Q# C: @2 j4 q9 F/ d" m, N
否则会出现错误: ( k* E1 r0 r5 [& |- i
make[2]: Leaving directory `/opt/mysql-5.5.3-m3/sql' ./gen_lex_hash > lex_hash.h-t * j$ N4 L; n! w3 y+ L5 N3 [* C" b
/bin/sh: ./gen_lex_hash: cannot execute binary file 因为arm版的无法在pc上运行。 ' P$ p8 B4 }0 X* R7 K7 [4 u. w0 z5 b8 v- D) g; _
注意:别人的文档上说只要拷贝gen_lex_hash即可,但我试了好多次,都仍然会出现上面的报错信息,把lex_hash.h也拷贝过来后,就不再报错了。另外,touch一定要做,原因就是让编译器不要再编译覆盖拷贝过来的文件了。 2 e' r. N$ U0 R- G& ^4 c ) e! E# N* s7 I9 b9 G$ E g) Make : L2 k4 V! X7 N+ j8 l* U; X. f" ?
, Y& {9 ~5 ?' @1 [2 g' J- ^
h) Make install ' U j6 H8 a& H. G+ K5 l; ?. @/ h% ]8 i6 o, L Y4 h
& j7 R6 u6 a2 D( G8 n7 T! E6) 移植相应文件到ARM平台 5 K$ l% h, x( i a) 拷贝pc的/usr/local/mysql到开发板的相同目录 * C: B: ]' h; E6 L 我使用了nfs调试,所以需要使用如下指令: 6 M6 z/ h, }3 M) g1 Z( }, p
cp -r /usr/local/mysql /opt/EmbedSky/root_nfs/usr/local/mysql ' a! P9 u3 v, o% f# [9 C b) 把编译出的arm的mysql库打包备份一下,考到主机的目录里: ! j2 N9 K, m$ i
tar –zcvf mysql-arm-5.1.51.tar.gz mysql % K/ f9 B1 V& ?0 U6 Y( {$ Q+ \
c) 到源码中拷贝配置文件模版 Copies files from one location to another. 配置文件模版) e) I# W6 x+ W' S5 W! O6 {7 m8 i
cp /opt/mysql-5.1.51/support-files/my-medium.cnf /opt/EmbedSky/root_nfs/etc/my.cnf (这里的目录指的是nfs调试的路径设置),这里的my.cnf存放的路径是按照手册上的建议,前面编译pc版本的MySQL 中所述的路径并非全局配置。该文档的注释中说:“# You can copy this file to /etc/my.cnf to set global options, mysql-data-dir/my.cnf to set server-specific options (in this installation this directory is /usr/local/mysql/var) or ~/.my.cnf to set user-specific options.”该配置文件的修改详见mysql5.1的英文手册的4.2.3.3. Using Option Files节中的叙述。 1 F9 D9 X Q8 o: m! ~) g + e9 G0 J2 E. w2 q7 T 数据目录是在:/var/lib/mysql (默认)" M- r" N# }; \* o- P+ j. [
2 N' M; J" S& H; `/ v' K 安装目录是在:/usr/local/mysql (默认)0 d7 a [$ ?6 L* {
试图反注释了关于InnoDB的一些配置,其它没有动。但是修改了这些设置后,报错,于是又改了回来。 ) l. v8 U& P& y5 B: a
d) 运行mysql_install_db(参见手册的2.13. Post-Installation Setup and Testing) ! t- _7 [1 }# X6 j# L% y cd /usr/local/mysql/bin(开发板路径),运行mysql_install_db -u root 结果出现了如下错误:Neither host 'EmbedSky' nor 'localhost' could be looked up with /usr/local/mysql/bin/resolveip Please configure the 'hostname' command to return a correct hostname. If you want to solve this at a later stage, restart this script with the --force option 这主要的原因是开发板环境中的hostname是EmbedSky,而不是通常的Federa14等,所以mysql自动认为可能在该操作系统中的运行会不兼容,有两种办法解决: 5 c' @. G' i* B/ [
第一种,运行hostname fedora14,就是欺骗一下hostname;) T( U5 I9 F: a' j1 r0 I1 j