mita2 database life

主にMySQLに関するメモです

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

yoku0825さんが、CentOS8 で MySQL 8.0 をビルドする記事を書いていました。 CentOS8でもビルドするために、あれこれインストールしないといけないようです。

yoku0825.blogspot.com

CentOS7インストール直後の状態では色々足りない

最近のMySQLはビルドに最新の開発ツール(cmakeやgcc)を要求してきます。 EPEL等の追加のリポジトリから、色々インストールしなければビルドできません。

手順を忘れないようにメモしておきたいと思います。

CentOS7 だと cmake時に、以下のようなエラーに出くわします。

まず、cmake が古いと、

$ cmake -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp/boost ..
<snip>
-- Running cmake version 2.8.12.2
CMake Warning at CMakeLists.txt:43 (MESSAGE):
  Please use cmake3 rather than cmake on this platform

gccもCentOS7のデフォルトのものだと古いと、

$ cmake3 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp/boost ..
<snip>
CMake Error at cmake/os/Linux.cmake:59 (MESSAGE):
  GCC 5.3 or newer is required (-dumpversion says 4.8.5)
Call Stack (most recent call first):
  CMakeLists.txt:442 (INCLUDE)

openssl-devel, ncurses-devel が必要

$ cmake3 ..
<snip>
-- Looking for SHA512_DIGEST_LENGTH
-- Looking for SHA512_DIGEST_LENGTH - not found
--
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:65 (MESSAGE):
  Please install the appropriate openssl developer package.

Call Stack (most recent call first):
  cmake/ssl.cmake:293 (FATAL_SSL_NOT_FOUND_ERROR)
  CMakeLists.txt:1181 (MYSQL_CHECK_SSL)
-- Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readline.cmake:71 (MESSAGE):
  Curses library not found.  Please install appropriate package,

      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.
Call Stack (most recent call first):
  cmake/readline.cmake:100 (FIND_CURSES)
  cmake/readline.cmake:194 (MYSQL_USE_BUNDLED_EDITLINE)
  CMakeLists.txt:1185 (MYSQL_CHECK_EDITLINE)

開発ツールをインストールする

openssl と ncurses は特に追加のリポジトリを必要としません。CentOS7標準のRPMパッケージをインストールするだけです。

$ sudo yum install openssl-devel ncurses-devel 

cmakeの バージョン3以上 は CentOS7 のデフォルトのリポジトリにはないため、epel を利用します。

$ sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum install --enablerepo='epel' cmake3 

同じくgcc 5.3以上もデフォルトのリポジトリに存在しないため、Software Collection から新しめのバージョンのものをインストールします。

$ sudo yum install -y 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 devtoolset-7-gcc*
<snip>
Dependencies Resolved

================================================================================================================================================================================
 Package                                                 Arch                            Version                                  Repository                               Size
================================================================================================================================================================================
Installing:
 devtoolset-7-gcc                                        x86_64                          7.3.1-5.16.el7                           centos-sclo-rh                           29 M
 devtoolset-7-gcc-c++                                    x86_64                          7.3.1-5.16.el7                           centos-sclo-rh                           11 M
 devtoolset-7-gcc-gdb-plugin                             x86_64                          7.3.1-5.16.el7                           centos-sclo-rh                          124 k
 devtoolset-7-gcc-gfortran                               x86_64                          7.3.1-5.16.el7                           centos-sclo-rh                           11 M
 devtoolset-7-gcc-plugin-devel                           x86_64                          7.3.1-5.16.el7                           centos-sclo-rh                          1.3 M
Installing for dependencies:
 devtoolset-7-binutils                                   x86_64                          2.28-11.el7                              centos-sclo-rh                          5.3 M
 devtoolset-7-libquadmath-devel                          x86_64                          7.3.1-5.16.el7                           centos-sclo-rh                          154 k
 devtoolset-7-libstdc++-devel                            x86_64                          7.3.1-5.16.el7                           centos-sclo-rh                          2.5 M
 devtoolset-7-runtime                                    x86_64                          7.1-4.el7                                centos-sclo-rh                           20 k
 gmp-devel                                               x86_64                          1:6.0.0-15.el7                           centos-base                             181 k
 libgfortran4                                            x86_64                          8.3.1-2.1.1.el7                          centos-base                             686 k
 libmpc-devel                                            x86_64                          1.0.1-3.el7                              centos-base                              32 k
 libquadmath                                             x86_64                          4.8.5-39.el7                             centos-base                             190 k
 mpfr-devel                                              x86_64                          3.1.1-4.el7                              centos-base                              68 k
 scl-utils                                               x86_64                          20130529-19.el7                          centos-base                              24 k

Transaction Summary
================================================================================================================================================================================
Install  5 Packages (+10 Dependent packages)

/opt/rh/devtoolset-7 以下にインストールされました。

$ /opt/rh/devtoolset-7/root/bin/gcc -v
Using built-in specs.
COLLECT_GCC=/opt/rh/devtoolset-7/root/bin/gcc
COLLECT_LTO_WRAPPER=/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/opt/rh/devtoolset-7/root/usr --mandir=/opt/rh/devtoolset-7/root/usr/share/man --infodir=/opt/rh/devtoolset-7/root/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --enable-plugin --with-linker-hash-style=gnu --enable-initfini-array --with-default-libstdcxx-abi=gcc4-compatible --with-isl=/builddir/build/BUILD/gcc-7.3.1-20180303/obj-x86_64-redhat-linux/isl-install --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)

パスを通すために scl enable を実行します。

$ scl enable devtoolset-7 bash
$ which gcc
/opt/rh/devtoolset-7/root/usr/bin/gcc

ビルドする

-j オプションを付けると並列でコンパイルできて、高速です。しかし、並列だとビルドが途中でコケてしまうんですよね(たぶん、メモリ不足が原因)。 自分は以下のように、コケたら、並列度を落として再実行するようにしてます。

$ cd <mysqlのソースディレクトリ>

$ mkdir build; cd build
$ cmake3 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/tmp/boost ..

$ make -j 8 || make -j 6 || make -j 4 || make