How to build MySQL 8.0.25 on Windows
こんにちわ。せじまです。ひさびさにゆるふわです。
はじめに
以前、WindowsやMacで MySQLをビルドしてソースコード読む記事を書かせていただきましたが、早いもので、あれからもう3年近く経とうとしています。
その間、WSL2がリリースされるなどしたり、MySQLも8.0.12~8.0.25がリリースされるなど、いろいろ変わってきましたので、備忘録的に、MySQLのデバッグビルド周りを久々にメモしておこうかと思いました。
対象としては
- Windows上で Visual Studio で MySQL 8.0.25 をデバッグビルドし、ソースコードを読んでみる
- WSL2上で MySQL 8.0.25 をデバッグビルドし、 Windows上の Visual Studio Code を使って gdb 経由で動かしてみる
- macOS 11.3.1 上でMySQL 8.0.25 をデバッグビルドし、 Visual Studio Code を使って lldb 経由で動かしてみる
といったあたりを考えており、今回から三回に渡って、それぞれ書いていこうかと思います。Windows or WSL2 or macOSでデバッグビルドできるようになれば、全人類のうち、MySQLをデバッグビルドできる割合が飛躍的に増大すると思いますから、色々捗るのではないでしょうか。
今回、 Chrome OS は取り上げていませんが、さいきんの Chromebook では Crostini が使えて、 Crostini では普通に Visual Studio Code をインストールしてGUIで使えます。よって、ハイスペックな Chromebook をお持ちの方は、 Chromebook 上で MySQL をビルドしてソースコード読むのもアリかもしれません。私も、一時期は私物のHP Chromebook x2でMySQL8.0をデバッグビルドしていました。ただ、いかんせん eMMC だとビルドの際 disk I/O が遅いのと、Core i5-7Y54で vscode はいささか重かったので、そのうち、CorostiniはEmacsの実行環境として使うだけになってしまいました。
ChromebookでMySQLのソースコードを読みたい方は、 eMMC ではなくSSDを内蔵したハイエンドモデルの購入を検討されるのがよろしいかなと思います。DRAMは16GB以上を推奨します。
個人的に、本格的にMySQLのソースコードを読むなら、Linuxでアレコレ動かせる環境を用意しつつ、(めんどうですが)Windows上で Visual Studio 使って読むのが便利かなぁと思うなどしてますが、まぁ自分にとって一番使いやすい環境で読んで頂くのが一番良いと思います。
あるいは、ノートPCやデスクトップPCにUbuntu等インストールして、GUIでLinux使われるのであれば、それもMySQLのソースコード読むのには適してるのかもと思いますが、仕事で使うにはちょっと使いにくいかもですね。
How to build MySQL 8.0.25 on Windows 10
先ずはVisual Studio 2019以降を準備してください。MySQL8.0.16からC++14準拠になりました。また、MySQL 8.0.20 から、Visual Studio 2019以降じゃないと、MySQL8.0はWindowsでビルドできなくなりました。個人用途であれば、Visual Studio Community Edition で良いと思います。
MySQL 8.0 GA のソースコードをダウンロード
https://dev.mysql.com/downloads/mysql/
からMySQL Community Server 8.0 GAの最新版のソースコード、 Windows (Architecture Independent), ZIP Archive をダウンロードします。現時点で最新は mysql-8.0.25.zipです。今回は
$HOME\source\mysql\mysql-8.0.25
を作業フォルダにしてみました。
Windows使う上での課題として、特定のフォルダ配下はセキュリティソフトの監視対象だったり、indexingの対象になっていてindexingが重いなぁってことがあったりするので、そのへんがめんどくさい方は、そのへんめんどくさくないパスを確保して作業していただけばよろしいかと思います。
WSL2をインストールする
後述しますが、日本語環境のWindows10でMySQLをビルドするなら、一部のソースコードにBOMつけるのが手っ取り早いと思います。WSL2使わなくても良いかもしれませんが使うほうが楽なので、公式ドキュメントを参照するなどして、WSL2をインストールされたほうが無難かと思います。
BOMつける
WSL2でUbuntuいれて apt-get install nkf すれば、次のようなワンライナーでBOMつけられます。
1 2 |
$ find . -type f | egrep '\.(c|cc|cpp|h|hpp)$' | xargs -n 1 file | grep UTF | grep -v BOM | cut -d':' -f 1 | xargs -n 1 nkf --overwrite --oc=UTF-8-BOM |
仮に $HOME が C:\Users\takanori.sejima であれば、
1 2 |
$ cd /mnt/c/Users/takanori.sejima/source/mysql/mysql-8.0.25 |
してから find ... していただけばよいでしょう。
CMake & bison のインストール
CMake はもちろんのこと、 sql_yacc.yy などをコンパイルするために bison for Windows が必須なので、2.9.2 Source Installation Prerequisites を参考にしつつそれぞれインストールします。
bison をインストールする上で、一つ注意事項があります。前述したURLに、次のような記述があります。
1 2 3 4 |
bison 2.1 or higher, available from http://www.gnu.org/software/bison/. (Version 1 is no longer supported.) Use the latest version of bison where possible; if you experience problems, upgrade to a later version, rather than revert to an earlier one. bison is available from http://www.gnu.org/software/bison/. bison for Windows can be downloaded from http://gnuwin32.sourceforge.net/packages/bison.htm. Download the package labeled “Complete package, excluding sources”. On Windows, the default location for bison is the C:\Program Files\GnuWin32 directory. Some utilities may fail to find bison because of the space in the directory name. Also, Visual Studio may simply hang if there are spaces in the path. You can resolve these problems by installing into a directory that does not contain a space (for example C:\GnuWin32). |
C:\Program Files 配下にはインストールしないようにしましょう。ここはハマりどころです。
OpenSSLのインストール
Reference Manual の6.3.3.2 Creating SSL Certificates and Keys Using openssl
- Example 3: Creating SSL Files on Windowsにある通り、http://www.slproweb.com/products/Win32OpenSSL.html からlightじゃないパッケージを持ってきてインストールします。現時点では Win64 OpenSSL v1.1.1k で良いでしょう。
Windowsで64bit版のOpenSSLをインストールする際、 インストール先はデフォルトの
C:\OpenSSL-Win64
になるとします。
ドキュメントのWITH_SSLオプションの説明にある通り、Windowsだとそのパスは勝手にチェックしてもらえるので楽です。
${WITH_SSL_PATH}/bin 配下にある DLL を探してコピーしていますので、インストール時にきかれる
Copy OpenSSL DLL files to
は
The OpenSSL binaries (/bin) directory
にします。
CMake
OpenSSLインストールしたら、CLIからCMake叩きます。コマンドプロンプトでも良いんですが、私はpowershellをよく使ってます。powershellひらいて
1 2 3 |
> cd $HOME\source\mysql\mysql-8.0.25 > mkdir bld > cd bld |
して、
1 |
PS C:\Users\takanori.sejima\source\mysql\mysql-8.0.25\bld> cmake .. -DWITH_DEBUG=1 -G "Visual Studio 16 2019" -DDOWNLOAD_BOOST=1 -DWITH_BOOST=C:\Users\takanori.sejima\source\boost -DWITH_SSL=C:\OpenSSL-Win64\ |
とすればOKです・・・
と言いたいところですが、そうは問屋がおろしません。
先日、dl.bintray.com が閉鎖されたようで、2021年5月の時点をもって、新規に -DDOWNLOAD_BOOST=1 すると失敗します。私は Bintray が閉鎖される前にたまたまダウンロードできていたので、難を逃れましたが。
さくっとバグレポートしておきました。
LinuxだとGeneric Linux (Architecture Independent), Compressed TAR Archive Includes Boost Headersという tar ball が提供されているのでこれを使えばよいのですが、Windows向けでは提供されていません。
MySQL 8.0.26でfixされるそうなので、Visual Studioでビルドしたいけど数ヶ月くらいなら待てるという方は、8.0.26を待つのが楽ちんだと思います。
8.0.26 のリリースが待てない方は、www.boost.org からダウンロードすれば良いのではと思います。 windows 向けのファイルをダウンロードして展開しつつ
1 |
> cmake .. -DWITH_DEBUG=1 -G "Visual Studio 16 2019" -DWITH_SSL=C:\OpenSSL-Win64 -DWITH_BOOST=C:\Users\takanori.sejima\source\boost\ |
などしてください。WITH_BOOSTオプションについては公式ドキュメントで解説されています。
再度BOMつける
仮に $HOME が C:\Users\takanori.sejima であれば、WSL2側で
1 2 |
$ cd /mnt/c/Users/takanori.sejima/source/mysql/mysql-8.0.25/bld |
してから
1 2 |
$ find . -type f | egrep '\.(c|cc|cpp|h|hpp)$' | xargs -n 1 file | grep UTF | grep -v BOM | cut -d':' -f 1 | xargs -n 1 nkf --overwrite --oc=UTF-8-BOM |
で、$HOME\source\mysql\mysql-8.0.25\bld 配下で再度BOMをつけます。
MySQLは、 *.zip や *.tar.gz で配布されているソースコードだけでビルドしているのではなく、各環境に応じて、 bld\include 配下に mysqld_error.h など生成しています。
bld 配下でBOMつけ直さなくてもビルド通るかもしれませんが、MySQLのマイナーバージョンによっては、ビルド通ったり通らなかったりしてもおかしくはないので(それくらいマイナーバージョンアップで修正が入ることもあるので)、私は習慣的に、 bld 配下で生成された時点で 、念のため BOM 付け直すようにしています。
ビルドする。されど日本語環境では失敗する。
あとは、$HOME\source\mysql\mysql-8.0.25\bld 配下に生成されたMySQL.slnを、Visual Studio で開いてビルドしましょう。
しかし、初回は必ず失敗します。ビルドしていくプロセスの中で、またしてもヘッダファイルを生成しているからです。
MySQL 8.0.25 では、 bld\scripts\sql_commands_help_data.h にBOMつけ直す必要がありました。
再度BOMつけてビルドし直す。
bld\scripts\sql_commands_help_data.h にBOMを付け直せば、今度はビルドが完走します。
8.0.25 以外では、他のファイルにもBOM付けないとビルドが通らないかもしれません。めんどくさいときは、いっそ、 find ... で bld 配下にまるごとBOM付けてしまえば良いかなと思うなどします。
どうしてこんなにめんどくさいのに Visual Studio でMySQLをビルドするのか
私はMySQLのソースコードを読むとき、 Visual Studio Code ではなく Visual Studio を使うことが多いのですが、理由は2つあります。
- Call Hierarchyが優秀
- Visual Studio Code の c_cpp_properties.jsonでdefinesをメンテナンスするのがややめんどくさい。
Visual Studio Code が広く普及した昨今、IntelliSenseが優秀なのは広く知られていると思うのですが、IntelliSenseとCall Hierarchyの双方を同時に使えるのが便利なので、私は、 Windows 上の Visual Studio で MySQL のソースコードを読むことが多いです。一時期は Mac で Visual Studio Code 使うことも検討したのですが、結局、Call Hierarchyが楽なので Windows に戻ってきてしまいました。
おわりに
6年くらい前、とある InnoDB 開発者の方が「(ソースコード書くときは別だけど)MySQLのソースコード読むときは Eclipse の CVE 使っている」と仰られていました。当時、 Emacs で MySQL のソースコード読むのはなかなか骨が折れるなと私は感じていたんですが、なるほど読むときだけIDE使うのもアリかぁその方がC++読みやすいもんねと深く納得し、それ以来、何を使ってMySQLのソースコード読むのが便利かなぁと、模索するようになりました。
現状、 Call Hierarchy 使える分、 Visual Studio は Visual Studio Code より楽だなぁと思ったりしてるんですが、 Windows/Mac/Linux 問いませんので、他にも良さそうなIDE等ありましたら、ご連絡いただけると幸いです。