How to build MySQL 8.0.11 on Mac (and Debug with Visual Studio Code)

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