mysql5をネイティブ&いんちきクロスコンパイルしてみました。
/usr/local/srcディレクトリで行います
MySQLのサイトよりmysql-5.0.45.tar.gzをダウンし作業ディレクトリで展開します。ビルドは専用のディレクトリを掘ってそこでmakeすることにします(実際はスクリプトから実行しています)。インストール先は/usr/local/mysqlとし、なるべく本来のルートfsを汚さないようにmake install時には一旦別の場所にインストールして、そこかへシンボリックリンクを張ることにしました。configureのオプションはもっと考えないといけないでしょうが、取り合えずこれでチャレンジ:
cd /usr/local/src
tar xvzf mysql-5.0.45.tar.gz
rm -rf build_mysql ←ビルド用のディレクトリ
mkdir build_mysql
cd build_mysql
export LDFLAGS="-L/usr/local/develop/lib -L/usr/local/ssl/lib"
export CFLAGS="-O3 -I/usr/local/ssl/include/openssl"
export CXX=gcc
export CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti"
../mysql-5.0.45/configure \
--prefix=/usr/local/mysql \
--enable-assmbler \
--enable-thread-safe-client \
--with-mysqld-user=mysql \ ←mysqldユーザ指定
--with-charset=utf8 \
--with-extra-charsets=all \ ←文字セットは全部まとめてエイヤッ!
--with-openssl=/usr/local/ssl \
--without-debug
make
DESTDIR=/mnt/disk1/share/usr/local make install
cd /mnt/disk1/share/usr/local
chown -R mysql:mysql mysql ←rootで作業しているので一般ユーザの所有に変更(mysql用に適当にアカウントを作成)
cd /usr/local
ln -s /mnt/disk1/share/usr/local/mysql mysql
vi /etc/ld.so.conf ←/usr/local/mysql/lib/mysqlを追加
ldconfig
ネイティブでやると何時間も掛かってしまいます…、実際にはオプションを変えつつ何度もビルドしたので、いんちきクロスコンパイルで行いました(後述)。
rootのままだとテストに失敗してしまうので、先に作成したアカウントにチェンジしてから行います:
sh-2.05b$ cd /usr/local/mysql/mysql-test
sh-2.05b$ ./mysql-test-run.pl --force
Logging: ./mysql-test-run.pl --force
MySQL Version 5.0.45
Skipping ndbcluster, mysqld not compiled with ndbcluster
Setting mysqld to support SSL connections
Using MTR_BUILD_THREAD = 0
Using MASTER_MYPORT = 9306
Using MASTER_MYPORT1 = 9307
Using SLAVE_MYPORT = 9308
Using SLAVE_MYPORT1 = 9309
Using SLAVE_MYPORT2 = 9310
Using IM_PORT = 9312
Using IM_MYSQLD1_PORT = 9313
Using IM_MYSQLD2_PORT = 9314
Killing Possible Leftover Processes
Removing Stale Files
Creating Directories
Installing Master Database
Installing Master Database
Installing Slave1 Database
Saving snapshot of installed databases
=======================================================
Starting Tests in the 'main' suite
TEST RESULT TIME (ms)
-------------------------------------------------------
alias [ pass ] 140
alter_table-big [ skipped ] Test need 'big-test' option
alter_table [ pass ] 1815
:
:(中略)
:
wait_timeout [ pass ] 2255
warnings [ pass ] 476
windows [ skipped ] Test requires: 'true'
xa [ pass ] 104
-------------------------------------------------------
Stopping All Servers
Failed 6/416 tests, 98.56% were successful.
The log files in var/log may give you some hint
of what went wrong.
If you want to report this error, please read first the documentation at
http://www.mysql.com/doc/en/MySQL_test_suite.html
The servers were restarted 103 times
Spent 2468.149 seconds actually executing testcases
mysql-test-run in default mode: *** Failing the test(s): mysql mysql_upgrade mysqlbinlog mysqltest perror system_mysql_db_fix30020
mysql-test-run: *** ERROR: there were failing test cases
なんか6項目程テストに失敗しているようですが…、何がいけないんでしょうか;;
テストの全結果はこちら。
LS-GL上でのネイティブコンパイルではかなり時間が掛かるので、configure時にconfig.cacheを取ってそれを元にクロスビルドしようと思ったのですがうまくいかず、いんちきクロスコンパイルを行うことにしました。makeの直前のconfigureまでをLS-GLで行ってからbuild_mysqlのディレクトリごとクロスコンパイル環境に持っていき、ビルドしてしまいます(掟破りな方法ですがw)。LS-GL(ネイティブ)もホスト(クロス)もいずれも開発環境が/usr/local/develop配下に入っているのを利用することにします。
ホスト側の/usr/local/develop/binに既存のchmod、cp、mv、rm、ln、sed、indtallをコピーするなりリンクを貼ります。これはLS-GL側でcoreutilsを/usr/local/develop/binに入れてconfigureを行っているので、出来上がったMakefileがこのPathのまま書き込まれてしまっている為、クロス環境でmakeを通すために必要です。
更にホストの/usr/local/developにmysqlbin等適当にdirを作成してクロス用のbinutilsやgccからリンクを貼ります。これはクロス用のバイナリは全てarm-linux-none-gnueabi-???というファイル名になっているので、頭のarm-linux-none-gnueabiを外して???のみのファイル名にする為です。LS-GLにて作成されたMakefile中にはgccとかarとかなっているので、そのままmakeするとホストのx86ネイティブコンパイラが走ってしまう為、クロスコンパイル中だけmakeを騙します。
後はLS-GLの/usr/local/sslをそのままホストに持っいき、ホスト側の/usr/local/srcにmysqlのソースを展開します。これで下準備ができました:
export PATH=/usr/local/develop/mysqlbin:/usr/local/develop/bin:$PATH
make
DESTDIR=/foo/bar make install
tar cvzf mysql.tar.gz /foo/bar/usr/local/mysql/
先に細工したディレクトリが先に参照されるようにPATH設定を行ってビルドします。ビルドしながら出来上がったバイナリを実行しつつ作業が行われるようなものでは通用しませんがmysqlのテストビルドならこれで十分でしょう。後はビルド結果をLS-GLに持っていきテストします。
取り合えず、簡単ではありますが仮インストールなど
cd /usr/local/mysql/bin
./mysql_install-db --user=mysql
./mysqld-safe --user=mysql
./mysqladmin -u root password 'パスワード'
./mysql -u root -p mysql
使い物になるのか否かまだ不明ですが、取り合えずこれまで。間違いやこうすればうまく行くなどのノウハウ等送って頂けると助かります。