mita2 database life

主にMySQLに関するメモです

MySQL Shell 8.0 を CentOS7 上でソースからビルドする

前回のエントリーでMySQL Shellのバグについて書きました。バグの原因を調査するために、MySQL Shellをビルドしたんですが、ビルドに苦労しました、、、 MySQL Shell をビルドするために乗り越えた障害と対応を方法をメモしておきます。

まず、MySQL Shell をビルドするには、事前にMySQL Server もビルドしておく必要があります。

mita2db.hateblo.jp

2つのcmakeが必要

MySQL Server 本体は cmake 3系 が必要なのですが、MySQL Shell は cmake 2 系でないと通りません。。。いつものノリでcmake3を使うとコケます。

$ cmake3 .. -DMYSQL_SOURCE_DIR=/home/user1/mysql-8.0.22/ -DMYSQL_BUILD_DIR=/home/user1/mysql-8.0.22/bld -DHAVE_PYTHON=1
<snip>
CMake Error at /usr/share/cmake3/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
  Could NOT find Protobuf: Found unsuitable version "ERROR.ERROR.ERROR", but
  required is at least "3.11.4" (found
  /home/user1/mysql-8.0.22/bld/extra/protobuf/protobuf-3.11.4/cmake/libprotobuf.a)
Call Stack (most recent call first):
  /usr/share/cmake3/Modules/FindPackageHandleStandardArgs.cmake:443 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake3/Modules/FindProtobuf.cmake:626 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  cmake/protobuf.cmake:117 (FIND_PACKAGE)
  CMakeLists.txt:414 (INCLUDE)

CentOS7の標準のcmakeは2系なので、普通にyumで入れれば大丈夫。

$ sudo yum install -y cmake
<snip>
Installed:
  cmake.x86_64 0:2.8.12.2-2.el7

Dependency Installed:
  libarchive.x86_64 0:3.1.2-14.el7_7
# ビルドに必要なヘッダファイルたちもインストール
$ sudo yum install python3-devel libcurl-devel
<snip>

python が見つからないと言われる

このバージョン(2.8.12)のcmake は、python-3.6 に対応していないようです。そのままだと「pythonが見つからん!」とエラーが出ます。

$ cd mysql-shell-8.0.22-src
$ mkdir bld
$ cd bld

$ scl enable devtoolset-7 bash
$ cmake .. -DMYSQL_SOURCE_DIR=/home/user1/mysql-8.0.22/ -DMYSQL_BUILD_DIR=/home/user1/mysql-8.0.22/bld -DHAVE_PYTHON=1
<snip>
CMake Error at /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
  (Required is at least version "3.4.3")
Call Stack (most recent call first):
  /usr/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:315 (_FPHSA_FAILURE_MESSAGE)
  /usr/share/cmake/Modules/FindPythonLibs.cmake:197 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:277 (FIND_PACKAGE)

FindPythonLibs.cmake_PYTHON3_VERSIONS に、python 3.6 を追加して回避します(もしかしたら、python を 3.4以下にダウングレードするほうが正しいのかもしれませんが、とりあえず、これで通ったので)。

$ sudo vim /usr/share/cmake/Modules/FindPythonLibs.cmake
set(_PYTHON3_VERSIONS 3.6 3.4 3.3 3.2 3.1 3.0)

MySQL Server のビルドオプションも調整が必要

cmake が終わって、make を走らせていくと、libprotobuf.a が見つからないためエラーになりました。

$ make -j 4
<snip>
Scanning dependencies of target mysqlshrec
Scanning dependencies of target mysqlsh
make[2]: *** No rule to make target `/home/user1/mysql-8.0.22/bld/extra/protobuf/protobuf-3.11.4/cmake/libprotobuf.a', needed by `bin/mysqlsh'.  Stop.
<snip>

protobuf のソースは MySQL Server 本体のほうにあります。libprotobuf を static ライブラリとしてビルドするよう、MySQL Server のビルドオプション protobuf_BUILD_SHARED_LIBS=OFF を足してビルドしなおす必要がありました。

$ cmake3 .. -DWITH_BOOST=/home/user1/mysql-8.0.22/boost  -Dprotobuf_BUILD_SHARED_LIBS=OFF
-- Running cmake version 3.17.3
-- Could NOT find Git (missing: GIT_EXECUTABLE)
-- MySQL 8.0.22

$ make -j 4