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では何も難しいことはなく

します。現時点では 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するとして、ターミナルで

としておきます。

CMake

ターミナルで

します。 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 の初期化

--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 を使って

でログインします。パスワードは

で適当に書き換えると良いでしょう。

ブレークポイント設定してみる

では実際にブレークポイント設定してみましょう。 手始めにsql/sql_parse.cc:1103 の do_command() あたりがわかりやすいのではないでしょうか。
Visual Studio Code でブレークポイントを設定し、

とでも打ってみましょう。ブレークポイントにヒットするのが確認できるはずです。

おわりに

今回は 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の新機能などに関する話を書きたいと思います。