MySQL Shell のソースコードを CentOS 7 でビルドするのはいろいろ面倒で、以前も記事を書きました。
いつのまにか依存関係が変わったようで、以前の手順ではビルドできなくなってました。 どんどん難易度が上がってく。。。
MySQL Server をビルドする
MySQL Shell をビルドするには、MySQL Server も事前にビルドしておく必要があります。
$ sudo yum install git wget openssl-devel ncurses-devel epel-release \ http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-2-3.el7.centos.noarch.rpm \ http://mirror.centos.org/centos/7/extras/x86_64/Packages/centos-release-scl-rh-2-3.el7.centos.noarch.rpm $ sudo yum install --enablerepo='epel' cmake3 $ sudo yum install devtoolset-11-gcc*
$ wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.34.tar.gz $ tar xvfz mysql-8.0.34.tar.gz
全部をビルドする必要はありません。Shell に必要なライブラリだけビルドしましょう。
$ scl enable devtoolset-11 bash $ cd mysql-8.0.34 $ mkdir bld; cd bld $ cmake3 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp/boost -Dprotobuf_BUILD_SHARED_LIBS=OFF .. $ cmake3 --build . --target mysqlclient $ cmake3 --build . --target mysqlxclient
必要なライブラリをビルドする
libssh と antlr4 は必要なバージョンのRPMがどこからも提供されていないので、自分でソースからビルドする必要がありました。うはー。
$ sudo yum install libuuid libuuid-devel $ git clone https://github.com/antlr/antlr4.git $ git checkout -b v4.10.1 refs/tags/v4.10.1 $ cd runtime/Cpp/ $ mkdir bld; cd bld $ cmake3 .. $ make Install the project... -- Install configuration: "Release" -- Up-to-date: /usr/local/include -- Installing: /usr/local/include/gmock -- Installing: /usr/local/include/gmock/gmock-actions.h -- Installing: /usr/local/include/gmock/gmock-cardinalities.h -- Installing: /usr/local/include/gmock/gmock-function-mocker.h -- Installing: /usr/local/include/gmock/gmock-matchers.h -- Installing: /usr/local/include/gmock/gmock-more-actions.h -- Installing: /usr/local/include/gmock/gmock-more-matchers.h -- Installing: /usr/local/include/gmock/gmock-nice-strict.h -- Installing: /usr/local/include/gmock/gmock-spec-builders.h -- Installing: /usr/local/include/gmock/gmock.h -- Installing: /usr/local/include/gmock/internal -- Installing: /usr/local/include/gmock/internal/custom -- Installing: /usr/local/include/gmock/internal/custom/README.md -- Installing: /usr/local/include/gmock/internal/custom/gmock-generated-actions.h -- Installing: /usr/local/include/gmock/internal/custom/gmock-matchers.h <snip>
$ wget https://git.libssh.org/projects/libssh.git/snapshot/libssh-0.9.2.tar.gz $ tar xvfz libssh-0.9.2.tar.gz $ cd libssh-0.9.2 $ mkdir bld; cd bld $ cmake3 .. $ make $ sudo make install Install the project... -- Install configuration: "" -- Installing: /usr/local/lib64/pkgconfig/libssh.pc -- Installing: /usr/local/lib64/cmake/libssh/libssh-config-version.cmake -- Installing: /usr/local/include/libssh/callbacks.h -- Installing: /usr/local/include/libssh/libssh.h -- Installing: /usr/local/include/libssh/ssh2.h -- Installing: /usr/local/include/libssh/legacy.h -- Installing: /usr/local/include/libssh/libsshpp.hpp -- Installing: /usr/local/include/libssh/sftp.h -- Installing: /usr/local/include/libssh/server.h -- Installing: /usr/local/lib64/libssh.so.4.8.3 -- Installing: /usr/local/lib64/libssh.so.4 -- Installing: /usr/local/lib64/libssh.so -- Installing: /usr/local/lib64/cmake/libssh/libssh-config.cmake -- Installing: /usr/local/lib64/cmake/libssh/libssh-config-noconfig.cmake
Python 3.8 もビルドします。RH SCL に Python 3.8 のRPMが存在するのですが、それを使おうとすると余計ややこしかったです。
デフォルトの configure
オプションだと、mysqlsh
コマンドの内部で python module をロードする際に undefined symbol: PyFloat_Type
エラーが出ます。--enable-shared
して、共有ライブラリありでビルドすると回避できるようです。
$ sudo yum install libffi-devel $ wget https://www.python.org/ftp/python/3.8.18/Python-3.8.18.tgz $ tar xvfz Python-3.8.18.tgz $ cd Python-3.8.18 $ ./configure --enable-shared $ make $ sudo make install
MySQL shell に必要な pip モジュールを入れます。
$ LD_LIBRARY_PATH=/usr/local/lib/ pip3.8 install certifi pyYAML
MySQL Shell をビルドする
$ sudo yum install libcurl libcurl-devel patchelf $ wget https://dev.mysql.com/get/Downloads/MySQL-Shell/mysql-shell-8.0.34-src.tar.gz $ tar xvfz mysql-shell-8.0.34-src.tar.gz
cmake3
中 に patchelf
が Permission denied
コケるので、パーミッションを変えて雑に回避しておく。
-- Executing: /usr/bin/patchelf --remove-rpath;/usr/local/lib64/libantlr4-runtime.so.4.10.1 -- Executing: /usr/bin/patchelf --set-rpath;$ORIGIN;/usr/local/lib64/libantlr4-runtime.so.4.10.1 patchelf: open: Permission denied $ sudo chmod 666 /usr/local/lib64/libantlr4-runtime.so.4.10.1 /usr/local/lib64/libssh.so.4.8.3
MySQL Shell の python モードを使えるようにビルドします(HAVE_PYTHON=1
)。
$ cd mysql-shell-8.0.34-src $ mkdir bld; cd bld $ cmake3 \ -DMYSQL_BUILD_DIR=$HOME/mysql-8.0.34/bld/ \ -DMYSQL_SOURCE_DIR=$HOME/mysql-8.0.34/ \ -DProtobuf_INCLUDE_DIR=$HOME/mysql-8.0.34/extra/protobuf/protobuf-3.19.4/src/ \ -DBUNDLED_ANTLR_DIR=/usr/local/ \ -DBUNDLED_SSH_DIR=/usr/local/ \ -DBUNDLED_PYTHON_DIR=/usr/local/ \ -DHAVE_PYTHON=1 .. $ make $ sudo make install
めでたし、めでたし。
[vagrant@localhost bld]$ mysqlsh MySQL Shell 8.0.34 Copyright (c) 2016, 2023, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type '\help' or '\?' for help; '\quit' to exit. MySQL Py >