Windows上でのMySQLビルド方法・MySQL5.6+VC2010Express 編

 以前、「Windows上でのMySQLビルド方法まとめ」というエントリで、Visual Studio 2005 Express を使って MySQL 5.1 をビルドする方法を紹介しました。
 あれから2年半が経過し、MySQLのバージョンも Visual Studio のバージョンも進んでいるので、改めて最新のビルド方法を紹介したいと思います*1

目的

 自分で mysqld と mysql クライアントをビルドして、mysqldの動作をブレークポイント置いたりして確認できるようにする。
 →実環境で使うバイナリを作成することが目的ではなく、ステップ実行などで処理の流れを追えるような「学習のための」ビルド環境を作ることが目的。

今回の特徴と方針

 前回のエントリ時には、configure.js を使って構成設定を行いましたが、MySQL 5.5, 5.6 では、これがなくなり、cmake によって実施します。
 また、前回、国際対応のための文字コードで苦労したので(今回のバージョンでも、日本語cp932のWindows環境で同様の問題が発生します*2 )。この問題を避けるため、今回は初めから、OSのロケーションを「日本語」以外のものにして、ビルドを行うことにしました。

(1)環境の準備

 今回は、VM Ware 上の Windows 7 Home を使用しました。
必要なソフトは以下のものです。

 ・bison
 ・cmake
 ・Visual C++ 2010 Express

bison

 「bison for windows」 あたりのキーワードで検索して
http://gnuwin32.sourceforge.net/packages/libintl.htm
から、binary bison-2.4.1-setup.exe をダウンロード
(*.zip をダウンロードしてもよいが、libiconv2 などライブラリをいくつか追加でダウンロードする必要があるので、特にこだわりがなければ、この「Complete package, except sources」を使うとラク)
 今回は、インストール先 C:\bin\bison とした。


 自動でPATHの設定はされないので、C:\bin\bison\bin をパスに追加しておく。
(「コンピュータ」を右クリック − プロパティ − システムの詳細設定 − 環境変数 で、pathの最後あたりにでも  「;c:\bin\bison\bin」 を追加


cmake

 「cmake for windows」あたりのキーワードで検索して
http://www.cmake.org/
から、cmake-2.8.7-win32-x86.exe (Windows (Win32 Installer))
をダウンロード。(Windows ZIPでも可)
インストール中「Add CMake to the system PATH for all users」を選択。
今回は、インストール先 C:\bin\cmake とした。


Visual C++ Express 2010

 「Visual Studio 2010」 あたりで検索して、その中から Visual C++ 2010 Express をダウンロード(Webインストール)。
ダウンロードした vc_web.exe を実行してインストール。

(2)MySQLソースの準備

mysql download」あたりで検索して、
MySQL Community Server」 の中から、今回は mysql-5.6.4-m7.zip を使用することにしました。
 ダウンロード後、展開して適当なところに配置。
今回は、c:\work\mysqlbuild\mysql-5.6.4-m7\ に置いてみました

(3)OSの言語環境を変更

 ここがちょっと悔しいのですが、標準の日本語環境上のVisualC++でビルドしようとすると、言語ファイルのソースコードが読み込まれるときに、どうも、CP932に変換されてしまうという動作をしているようです。(この件については別エントリを起こそうと思っています)
 そのため、言語環境を西洋系のものに変更しておきます。


 今回、私はMySQLの歴史に経緯を表してスウエーデン語にしてみましたが、latin1 ではないようで、皆さんそれぞれそれっぽいといころで*3


 コントロールパネル − キーボードまたは入力方法の変更 − 管理

Unicodeではないプログラムの言語」にある
「システムロケールの変更」をクリックします。


 ツールや機能によっては日本語メニューの一部が化けますが*4、気にしない、気にしない。

(4)ビルド作業

 スタートメニューから Visual C++ 内にある「コマンドプロンプト」を立ち上げ(←普通のコマンドプロンプトではなくVCのです。パスなど環境変数の設定がされています)


作業フォルダに移動:

cd \work\mysqlbuild\mysql-5.6.4-m7

ビルド作業用フォルダを作り、移動:

mkdir bld
cd bld

 以下のコマンドで構成に沿ったファイル群が作成されます:

> cmake .. -G "Visual Studio 10" -DBUILD_CONFIG=mysql_release -DMYSQL_TCP_PORT=13306

 -D のところ(2つ)は、構成オプションを指定する例としてつけてみたものなので、ご自身の目的に合ったものを指定(または無指定)してください。
 指定可能な構成オプションは、MySQLマニュアルの以下のページにあります*5
http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html



 エラーがなければ、MySQL.sln ファイルができるので、ダブルクリックしてVisualStudio起動します。
 あとはお好きに。 とりあえず「デバッグ - ソリューションのビルド(F7)」でもしますか。
 

(5)動作していることの確認

 VC内の「ソリューションエクスプローラー」で
「mysqld」を右クリックして「デバッグ - 新しいインスタンス
これで mysqldが起動します。タスクマネージャで確認してみると、「mysqld」というのが実行中であることがわかります。


 コマンドプロンプトを立ち上げて、
C:\work\mysqlbuild\mysql-5.6.4-m7\bld\client\RelWithDebInfo>
に移動して(RelWithDebInfoは構成のタイプ。自身が、VCのIDE画面上部で指定した構成タイプに従ったフォルダができていると思います)、

mysql -uroot

で接続してみる。おお、つながった!この瞬間が嬉しいものです。


exitして、

mysqladmin -uroot shutdown

で、一旦サーバ終了させる。


(6)ステップ実行してみる

どこから始めていいか分からないので、とりあえず mysqldソリューションのsource files の下にある main.cc を開いてみる。main()関数があるので、まぁここには最初に来そうだろうと踏んで、その中にブレイクポイント。


 先ほど(5)と同様に「mysqld」を右クリックして「デバッグ - 新しいインスタンス」で実行を開始すると、ブレイクポイントを張ったところで止まります。
 F10キーがステップオーバー(今見ている関数の行の次の行に移動する)、
 F11キーがステップイン(呼び先関数の中身に入る)
なので、これらのファンクションキーを、自動車のハンドルのように駆使して、mysqld 起動の段取りを堪能しましょう!
 呼び先の関数の中に入るべきか、そのまま進むべきかは、KKD(経験と勘と度胸)で判断!
 飽きたら F5キーで実行を一気に継続。





最後に

 Visual Studio を使うと、ステップ実行をしたり、ソースコードに「オレオレ文字列出力」を加えたりできるので、MySQLの動作を追いやすくなります。
 MySQLサーバがどういう手順で起動されているのか、接続が来たときには何をしているのか*6レプリケーションマスタになってみてあるいはスレーブになってみてその動作を追ってみる、など、一気にMySQLと親身な関係になることができるでしょう。
 ぜひ、皆さんも「MySQL全体の動作を大づかみに理解するため」あるいは、「ある一つの機能に着目して」、ソースコードを追ってみていただきたいと思います。できれば、その結果など簡単でいいので、解説付きでブログなどで紹介していただけると嬉しく思います。読んでみたいな。
 私もまた何か試したら、ここの日記で紹介したいと思います。


画像等

MySQLVisual Studio 2010 のダウンロード


Windows の言語設定


mysqldサーバの実行


.

*1:松信嘉範氏の書籍『Webエンジニアのためのデータベース技術実践入門』で、Windows上でのMySQLビルド方法として本ブログが紹介されたことも「こりゃ最新情報を書かなければ!」と思った大きな原因です

*2:これについては後ほど別エントリで紹介したいと思います。現象としては、sql_locale.cc に utf-8 で記述されている文字列が、どうもVCの変数に入ってくる際(あるいは加工のどこかのタイミング)でcp932に変換されてしまっているようです

*3:何語にすると latin1 になるんですかね、詳しい方!

*4:たとえば秀丸エディタとか

*5:MYSQL_SERVER_SUFFIX に相当するものが見あたらなくなってしまいました。構成条件などを命名して結構便利に使っていたので残念です。

*6:これ、気持ち良くサーバ側でステップ実行していると、クライアントがタイムアウトしていることがあるので注意(笑)