それが僕には楽しかったんです。

僕と MySQL と時々 MariaDB

MySQL 8.0.29 以下をビルドできない場合がある

はじめに

ちょいと調子が戻ってきたので MySQL で検証したいことを検証しようとビルドを元気に進めていたら、仕事用の macOS マシンでビルドできないならまだしも Ubuntu 系統の OS でビルドできない場合があるというまさかの事態にぶち当たったのでメモがてら残す。

ビルド

で、ビルドを試みた。

$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.28.tar.gz
$ tar xzvf mysql-boost-8.0.28.tar.gz
$ cd mysql-boost-8.0.28
$ mkdir build && cd $_
$ cmake ../ -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=../boost

問題の躓きポイント

するとこれである

Cannot find appropriate system libraries for WITH_SSL=system.
Make sure you have specified a supported SSL version. 
Valid options are : 
system (use the OS openssl library), 
yes (synonym for system), 
</path/to/custom/openssl/installation>

CMake Error at cmake/ssl.cmake:61 (MESSAGE):
  Please install the appropriate openssl developer package.

libssl-dev も入っていて実態もある中でこれが出るともうだめだ、ということでインターネットの海をさまよっていると同じ状態に陥っている以下の記事を見つけた

日々の覚書: ConoHaの上でひたすらMySQLをビルドする 2021

どうやら OpenSSL (か、それ相当) のバージョンをうまく検出できてないっぽい。
実際エラーメッセージの上に出ているログを見ていると

-- OPENSSL_MAJOR_VERSION = 
-- OPENSSL_MINOR_VERSION = 
-- OPENSSL_FIX_VERSION = 

となっているので、本当にバージョンが見つけられていない様子。

OpenSSL 系を探っている cmake は cmake/ssl.cmake にあるのでひとまずそれを見る。
mysql-8.0.28 のタグでその cmake ファイルを探して見てみるとこのあたりが怪しそうな雰囲気がある。

https://github.com/mysql/mysql-server/blob/mysql-8.0.28/cmake/ssl.cmake#L216-L227

OPENSSL_VERSION_NUMBER なるものから、それぞれ Major, Minor Fix バージョンを抜き出している。

と、ここまでわかったので /usr/include/openssl/opensslv.h を見てみると、yoku さんのブログ記事にあるようにバージョンの実装が変更されたことがわかる。

/* Synthesize OPENSSL_VERSION_NUMBER with the layout 0xMNN00PPSL */
# ifdef OPENSSL_VERSION_PRE_RELEASE
#  define _OPENSSL_VERSION_PRE_RELEASE 0x0L
# else
#  define _OPENSSL_VERSION_PRE_RELEASE 0xfL
# endif
# define OPENSSL_VERSION_NUMBER          \
    ( (OPENSSL_VERSION_MAJOR<<28)        \
      |(OPENSSL_VERSION_MINOR<<20)       \
      |(OPENSSL_VERSION_PATCH<<4)        \
      |_OPENSSL_VERSION_PRE_RELEASE )

どこからならビルドできるのか

8.0.29 もだめそう。
https://github.com/mysql/mysql-server/blob/mysql-8.0.29/cmake/ssl.cmake#L228-L239

8.0.30 はいけそう。
https://github.com/mysql/mysql-server/blob/mysql-8.0.30/cmake/ssl.cmake#L113-L135

確かに手元の opensslv.h を見ているとそれぞれ OPENSSL_VERSION_MAJOR, OPENSSL_VERSION_MINOR, OPENSSL_VERSION_PATCH が存在するのでそれを見るように修正が入っていた。
ので、 8.0.30 をビルドしてみると成功したのでどうやらそういうことらしい。

コメントをみるに、OpenSSL version3 未満 (ただし、1.0.0 以上でないと最低要件は満たさない)では 8.0.28 もビルドできる様子はあるが 3 以上は上述の理由でビルドできないっぽい。

まとめ

8.0.29 以下のビルドでは OpenSSL のバージョンが 3 以上だとコケる