How to build MySQL 8.0.25 on Mac (and Debug with Visual Studio Code)
こんにちわ。せじまです。今回はちょうゆるふわです。
はじめに
How to build MySQL 8.0.11 on Mac (and Debug with Visual Studio Code) を公開したころ、 macOSはHigh Sierraでしたが、2021年5月現在、最新のmacOSはBig Sur(11.3.1)となりました。私が私物のMacBook Pro 16inchで試している限り、Big Surは久々の大型アップデートなのもあってか、まだ用途によっては stable じゃないのでは?という印象があります。
先日、私物のMacを11.3.1にあげてから Xcode を最新版にアップデートしようとしたら、何度やっても kernel panic が発生するので、Xcodeをアンインストールし、Command line tools for Xcodeだけ入れるなどして、ようやく 8.0.25 がビルドできました。
私の記憶が確かならば、少なくとも、 MySQL 5.7 に関しては、 5.7.33 以降は Big Sur でビルドにコケるような気がしてるんですが、原因が特定できたらそのうちまたバグレポートしようかなぁと思うなどしています。
まぁそういう感じで、時期によって MySQL のビルドに失敗したり何かの問題に出くわしたりするというのは、しばしば発生しえます。Macに限った話ではなく、「Windowsでビルドに失敗しますぞ」的なバグレポートを、私は過去に何度か上げたことがありました。
- Bug #91672 MySQL8.0 fails to compile on Windows with OpenSSL 1.1.0.
- Bug #100868 Can't build mysqlx plugin on Visual Studio 2019
ちなみに、いずれも最新のMySQL8.0では修正されています。
あと、2021年5月の時点では、 -DDOWNLOAD_BOOST オプションが機能しません。
まぁ、ビルドに限らず不具合見つかったら、バグレポートして、みんなで改善していけば良いですよね。MySQL は OSS なんですから。
How to build MySQL 8.0.25 on macOS Big Sur(11.3.1)
とりあえず今回は Big Sur で試しました。
余談ですが、私はMySQLビルドしたいので、Macは Intel Mac 使い続けてるんですが、そろそろ M1 Mac でもビルドしてデバッガで動かせるようになっているんでしょうか。 M1 Mac お持ちの方でどなたか試された方がいらっしゃるなら、 blog に書いていただくか、ご連絡いただけますと幸甚です。
Homebrew のインストール
Homebrewのインストールについては公式サイトを参照してください。
MySQL 8.0 Reference Manual の 2.9.2 Source Installation Prerequisites に
1 2 |
macOS: XCode 9; but only the version Oracle uses to build binary packages is guaranteed to be supported. |
とあります。8.0.11をビルドした頃、公式ドキュメントには
1 2 |
Clang: 3.4 or higher (Xcode 7 on macOS) |
と書いてあったので、特定のバージョンのMySQLは、特定のバージョンのXcodeじゃないとビルドできないとかありそうな気がしますねー。
(ここ数ヶ月Homebrewの新規インストールはしてないですが)Homebrew がインストールされる過程で Xcode Command Line Tools がインストールされるでしょうから、clangのインストールはそれで良しとします。
openssl のインストール
Windowsのときはいろいろ悩まされましたが、Macでは何も難しいことはなく
1 2 |
$ brew install openssl |
します。
CMake のインストール
https://cmake.org/download/ からダウンロードしてもよいのですが、
1 2 |
$ brew install cmake |
で最新の cmake インストールしても 8.0.25 はビルドできましたので、 Homebrew に頼ってしまって良い気がします。
MySQL 8.0 GA のソースコードをダウンロード
https://dev.mysql.com/downloads/mysql/
からMySQL Community Server 8.0 GAの最新版の Generic Linux (Architecture Independent), Compressed TAR Archive
Includes Boost Headers をダウンロードします。現時点で最新は mysql-boost-8.0.25.tar.gz です。
今回はとりあえず
/Users/${USER}/src
配下でビルドするとして、ターミナルで
1 2 3 4 |
$ mkdir ~/src $ cd ~/Downloads $ tar zxvf mysql-boost-8.0.25.tar.gz -C ~/src |
としておきます。
CMake
ターミナルで
1 2 3 4 5 6 |
$ cd ~/src/mysql-8.0.25 $ mkdir bld $ cd bld $ cmake .. -DWITH_DEBUG=1 -DWITH_BOOST=../boost $ make |
します。 メモリ32GB以上あるなら、スワップ使うかもしれませんが
1 2 |
$ make -j |
しても完走すると思います。
MySQL 8.0 の新しいバージョンがリリースされるたびに、私は私物の MacBook Pro 16inch で cmake 叩いた後、風呂に入る前に make -j で放置してます。
Visual Studio Code のダウンロード
あとは https://code.visualstudio.com/ から Mac 版の Visual Studio Code をダウンロードして、Visual Studio Code で ~/src/mysql-8.0.25 を開いていただけば良いでしょう。
Visual Studio Code でデバッグ
デバッグまで試してみましょう。
datadir の初期化
1 2 3 4 5 6 |
$ cd ~/src/mysql-8.0.25/bld $ mkdir {etc,data} $ echo '[mysqld]' > etc/my.cnf $ echo "basedir=`pwd`" >> etc/my.cnf $ echo "datadir=`pwd`/data" >> etc/my.cnf $ bin/mysqld --defaults-file=etc/my.cnf --initialize |
rootのパスワードは、初期化時のログに出力されます。初期化が終わったら
1 2 |
$ ./bin/mysqld --defaults-file=etc/my.cnf & $ ./bin/mysql -u root -p |
でログインできることを確認し、SET PASSWORDで適当なパスワードに変更するなどして、SHUTDOWNしておきましょう。
c_cpp_properties.json, launch.json
私は Mac においては最小限の設定として、次のようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
$ cat .vscode/c_cpp_properties.json { "configurations": [ { "name": "Mac", "includePath": [ "/usr/local/Cellar/openssl@1.1/1.1.1k/include", "${workspaceFolder}/bld/include", "${workspaceFolder}/**" ], "defines": [ "MYSQL_SERVER=1", "MUTEX_EVENT=1", "ENABLED_DEBUG_SYNC=1" ], "compilerPath": "/usr/bin/clang", "cStandard": "c99", "cppStandard": "c++14", "intelliSenseMode": "clang-x64" } ], "version": 4 } $ |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
$ cat .vscode/launch.json { // Use IntelliSense to learn about possible attributes. // Hover to view descriptions of existing attributes. // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "(lldb) ", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/bld/bin/mysqld", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": false, "MIMode": "lldb" } ] } $ |
Mac では includePath に OpenSSL のパスを追加しています。 brew upgrade して openssl のバージョンが変わるとここのパスが変わるので、ここ意識する必要があるのは少々残念な気もしています。
あとはメニューの Run -> Start Debugging で普通にデバッグできます。ここまで来ると、 Mac だろうと WSL2 だろうと、いずれの環境でも Visual Studio Code 使う分には、同じような感覚でデバッグできると思います。
おわりに
今回は Mac 上で MySQL8.0.25をデバッグビルドして Visual Studio Code でソースコード読める環境を整えつつ、 Visual Studio Code 経由でデバッグもできそうだってところまで確認してみました。
つい最近までは、Mac で Visual Studio Code 使ってデバッガで追いかけると、ちょっとした挙動を調べるときは大変便利だったのですが、さいきんは WSL2 上でも gdb で MySQL 8.0 のデバッグできそうな気がしてるので、必ずしもMacじゃなくていいかなぁという気はしています。
ただ、 M1 Mac でも MySQL 8.0 をデバッグビルドしてデバッガで動かせるようになったなら、 Apple Silicon だとどれくらい快適に動かせるか、どれくらい速くビルドが完走するか関心があります。
また、経験上、 Mac も Windows も、時期によっては最新のMySQLのビルドにコケる場合があったりするので、一つの環境に固執せず、いつでもMySQLをデバッグできる環境を用意しておきたいなと思う次第であります。
ついでに言いますと、個人的に、 Tiger Lake はナカナカ高性能で久しぶりに良い x86 だと感じているので、 Tiger Lake の Chromebook がこなれた価格で買えるようになってきたら、また Chromebook で MySQL をビルドするようになるかもしれません。