How to build MySQL 8.0.11 on Mac (and Debug with Visual Studio Code)
こんにちわ。せじまです。今回はちょうゆるふわです。
はじめに
Macユーザの皆様はMySQLのソースコードを読むとき、何を使って読まれているでしょうか。
前回の記事を公開した後、 Visual Studio Code 推しの知人から「コード読むならVisual Studio ではなく、Visual Studio Codeでも良いのでは?」との指摘を受け、いろいろ試したのですが
- git clone しただけの MySQL のソースコードで Visual Studio Code の context-aware な IntelliSense が充分に機能しないのは、 mysqld_error.h などのヘッダが存在しないため
- mysqld_error.h などは、まず comp_err をビルドして comp_err によって生成する必要がある。
- いちど mysqld をビルドしてしまえば、 mysqld_error.h などのヘッダが揃っているので、 Visual Studio Code の IntelliSense が機能して、Visual Studio Code でも変数の型の解決などが機能するようになり、 IntelliSense 活用しつつMySQLのソースコード読める。
といったことのようなので、今回ついでに
- macOS 上で Clang で MySQL8.0.11 をデバッグビルドして(mysqld_error.hなどを生成した後) Visual Studio Code (for Mac) で MySQLのソースコードを読んでみる。
- せっかくデバッグビルドしたので、 Visual Studio Code 上で mysqld をデバッグしてみる。
という、ちょうゆるふわな記事を記録としていちおう残しておこうかな、と思いました。
Windowsと違って、UNIXであるMacでは、 MySQL 8.0.11 をビルドするのに何も困らないので、記事を書くのも気がひけるくらいなのですが、WindowsでもMacでも Visual Studio Code で MySQL のソースコードを読めると、将来PCを買い換えるとき(主に私が)捗るので、せっかくなので書いておきます。
How to build MySQL 8.0.11 on macOS High Sierra
とりあえず今回は High Sierra で試してみました。High Sierra が動くなら、だいたいの環境でビルドできると思います。
※試しに自宅で眠ってたMacBook Air (11-inch, Late 2010)でもビルドしてみましたが、めっちゃ時間かかりましたけどビルドはできました。
Homebrew のインストール
Homebrewのインストールについては公式サイトを参照してください。
MySQL 8.0 Reference Manual の Source Installation System Requirements に
Clang: 3.4 or higher (Xcode 7 on macOS)
とありますが、 Homebrew がインストールされる過程で Xcode Command Line Tools がインストールされるでしょうから、clangのインストールはそれで良しとします。
openssl のインストール
Windowsのときはいろいろ悩まされましたが、Macでは何も難しいことはなく
1 2 |
$ brew install openssl |
します。現時点では OpenSSL 1.0.2 がインストールされました。ビルドするだけなら 1.1.0 であることに拘る必要はないので、このまま続けます。
CMake のインストール
https://cmake.org/download/ からCMakeをダウンロードしてインストールします。
今回はcmake-3.12.0-Darwin-x86_64.dmgをインストールしてみました。
MySQL 8.0 GA のソースコードをダウンロード
https://dev.mysql.com/downloads/mysql/
からMySQL Community Server 8.0 GAの最新版のGeneric Linux (Architecture Independent), Compressed TAR Archiveをダウンロードします。現時点で最新はmysql-8.0.11.tar.gzです。
今回はとりあえず
/Users/${USER}/src
配下でbuildするとして、ターミナルで
1 2 3 4 |
$ mkdir ~/src $ cd ~/Downloads $ tar zxvf mysql-8.0.11.tar.gz -C ~/src |
としておきます。
CMake
ターミナルで
1 2 3 4 5 6 |
$ cd ~/src/mysql-8.0.11 $ mkdir bld $ cd bld $ /Applications/CMake.app/Contents/bin/cmake .. -DWITH_DEBUG=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=~/src/boost $ make |
します。 make は -j で複数のjobを実行されても良いでしょう。
Visual Studio Code のダウンロード
あとは https://code.visualstudio.com/ から Mac 版の Visual Studio Code をダウンロードして、Visual Studio Code で ~/src/mysql-8.0.11 を開いていただけば良いでしょう。
そして、 C/C++ の機能拡張と(他にあれば)お好みの機能拡張をインストールしていただき、IntelliSense のパースが終わるのをしばし待つだけです。
試しに、みんな大好きInnoDBの、Adaptive Hash Indexに関する storage/innobase/btr/btr0sea.cc の btr_search_hash_on_insert() の 1817 行あたりで、ビルド後にどれくらい便利になるか比較してみましょう。
同じ名前の変数の型が単に列挙されるだけでなく、 cursor->index が dict_index_t のポインタであることが明確にわかるようになりました。もちろん、ショートカットで定義に移動することも可能です。
Visual Studio Code でデバッグ
せっかくデバッグビルドしたので、 Visual Studio Code を使って mysqld をデバッグするところまでやってみましょう。
datadir の初期化
1 2 3 4 5 6 |
$ cd ~/src/mysql-8.0.11/bld $ mkdir {etc,data} $ echo '[mysqld]' > etc/my.cnf $ echo "basedir=/Users/${USER}/src/mysql-8.0.11/bld" >> etc/my.cnf $ echo "datadir=/Users/${USER}/src/mysql-8.0.11/bld/data" >> etc/my.cnf $ bin/mysqld --defaults-file=etc/my.cnf --initialize |
--initialize を実行すると、 root@localhost の temporary password が出力されます。
launch.jsonの修正とデバッグの開始
とりあえずデバッグは lldb でやるとして、Visual Studio Code 側の launch.json の program とargs は、次のように書き換えます。
"program": "${workspaceFolder}/bld/bin/mysqld",
"args": ["--defaults-file=${workspaceFolder}/bld/etc/my.cnf"],
launch.json が準備できたら、 Visual Studio Code のメニューから [デバッグ] > [デバッグの開始] を実行します。
ここまで来たら、さきほど initialize したときに表示された temporary password を使って
1 2 3 |
$ cd ~/src/mysql-8.0.11/bld $ ./bin/mysql -u root -p |
でログインします。パスワードは
1 |
mysql> ALTER USER root@'localhost' IDENTIFIED BY ...; |
で適当に書き換えると良いでしょう。
ブレークポイント設定してみる
では実際にブレークポイント設定してみましょう。 手始めにsql/sql_parse.cc:1103 の do_command() あたりがわかりやすいのではないでしょうか。
Visual Studio Code でブレークポイントを設定し、
1 |
mysql> select 1; |
とでも打ってみましょう。ブレークポイントにヒットするのが確認できるはずです。
おわりに
今回は Mac 上で MySQL8.0.11をデバッグビルドして Visual Studio Code でソースコード読める環境を整えつつ、 Visual Studio Code 経由でデバッグもできそうだってところまで確認してみました。これでMacユーザの皆様方も、MySQLのデバッグが捗ってしょうがないですね!
WindowsはVisual Studio or Visual Studio Code、MacはVisual Studio Codeでソースコード読んだりデバッグしたりできるとなると、WindowsだろうとMacだろうと、どちらの環境でも同じような操作体系のIDEでMySQLと向き合えるので、便利な時代になったもんだなぁとしみじみ思います。MySQL5.6 や 5.7 のころ、VisualStudioでMySQLのソースコード読むために、私は好んでWindows使ってましたが、いまならMacもアリかなぁと感じています。
次回こそはMySQL8.0の新機能などに関する話を書きたいと思います。