前回のエントリーでMySQL Shellのバグについて書きました。バグの原因を調査するために、MySQL Shellをビルドしたんですが、ビルドに苦労しました、、、 MySQL Shell をビルドするために乗り越えた障害と対応を方法をメモしておきます。
まず、MySQL Shell をビルドするには、事前にMySQL Server もビルドしておく必要があります。
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