連載
» 2012年03月08日 00時00分 公開

仕事で使える魔法のLAMP(46):CMakeでMySQLをビルドしてみる

前回、MySQLののビルドには「CMake」というツールを使うことを紹介し、その準備をしました。今回はひとまずMySQLをビルドしてみます(編集部)

[山口晴広,株式会社イメージズ・アンド・ワーズ]

ひとまずCMakeを使ってみる

 前回説明しましたが、現在のMySQLはWindowsなど多様なOSに対応しているため、configureスクリプトではなくCMakeというビルドツールを採用していると説明しました。そして、MySQLをインストールする方法として、パッケージ管理システムを使う方法、CMakeの公式バイナリを使う方法、そしてソースコードからビルドしてインストールする方法を紹介しました。今回は実際にCMakeを使って、MySQLをビルドしてみましょう。

 Linuxにおいては、CMakeはconfigureスクリプトに代わるものと考えてよいでしょう。CMakeを実行するときは、configureスクリプトを使うときと同様に、インストール先やビルド時に組み込む機能を指定します。実行すると、必要な外部ソフトウェアや環境をチェックしてくれます。configureについては第1112回で解説していますので、そちらも参照してください。

 使い方も大体同じです。インストール先などはコマンドラインの引数で指定します。コンパイラを環境変数で指定するところも同じです。configureスクリプトと異なるのは、引数にソースコードのディレクトリを必ず指定しなければならないという点です。

 まずは特別な設定をせず、標準状態のままで全体の流れを確認してみましょう。MySQLのソースコードを任意のディレクトリに展開し、そのディレクトリをカレントディレクトリとして、次のコマンドを実行します。

$ cmake .

 引数の「.」が、ソースコードが存在するディレクトリを指定している部分です。カレントディレクトリなので「.」となっています。もちろんほかのディレクトリを指定することもできますが、ここでは話を単純にするためにカレントディレクトリを使うことにして進めます。

 実行するとすると次のようなメッセージが現れます。システムをチェックしている様子を表しています。

$ cmake .
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Looking for SHM_HUGETLB
-- Looking for SHM_HUGETLB - found
-- MySQL 5.5.21
-- Looking for sys/types.h
-- Looking for sys/types.h - found
(略)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/atmarkit/src/mysql-5.5.21

 無事cmakeの実行が終了すると、Makefileなどのコンパイルに必要なファイルが生成されます。configureスクリプトの実行が成功したときと同じ状態です。後は「make」と「make install」を実行するだけです。CMakeを使ってソフトウェアをビルドする際の基本的な流れは上記の通りです。

 念のため、ソースコードをカレントディレクトリではないディレクトリに置いた場合について、少し説明しておきます。例えばソースコードを「~/mysql-5.5.21」に展開したとします。次のようなコマンドを実行してみてください。

$ mkdir ~/build
$ cd ~/build
$ cmake ~/mysql5.5.21

 ソースコードを展開したディレクトリのほかに、「~/build」というディレクトリを作り、このディレクトリをカレントディレクトリとして、引数に~/mysql-5.5.21を指定してcmakeを実行しています。

 この後でmakeを実行すると、~/buildディレクトリにバイナリが生成され、~/mysql5.5.21ディレクトリは、ソースコードを展開した状態のまま、一切変化しません。開発版のコードをバージョン管理システムから取り出してビルドするときなど、ソースコードディレクトリを変更したくないときに使う方法です。

外部ソフトウェアを揃えてやり直し

 先に、cmakeを使う基本的な方法を見て頂くために、エラーが発生しないと仮定して見て頂きました。しかし、本連載で使ってきた環境で実際にcmakeを実行してみると、次のように途中で失敗します。

(略)
-- Check size of wint_t
-- Check size of wint_t - done
-- Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readline.cmake:83 (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:127 (FIND_CURSES)
  cmake/readline.cmake:217 (MYSQL_USE_BUNDLED_LIBEDIT)
  CMakeLists.txt:268 (MYSQL_CHECK_READLINE)
 
-- Configuring incomplete, errors occurred!

 このメッセージを読むと分かりますが、必要な外部ソフトウェアが不足していることによるエラーです。これまでも何度かあったケースですね。なお、環境によっては、すでにMySQLのビルドに必要な外部ソフトウェアが揃っているために、何事もなく成功することもあります。

 MySQLが必要とする外部ソフトウェアのうち、MySQLに付属していないncurseslibaioは、あらかじめインストールしておく必要があります。次のコマンドを実行すると、開発用パッケージをインストールできます。

$ sudo yum install ncurses-devel libaio-devel

 ncursesは、実際にはMySQLではなく、readlineが利用しているライブラリです。readlineはMySQLのコマンドラインインターフェイスでカーソル移動や履歴等の機能を実現するためのライブラリで、MySQLに付属しています。このreadlineをビルドするためにncursesの開発パッケージが必要になのです。

 第29回でreadlineをPHPで使えるようにビルドしましたが、そのときはncursesが必要なかったことに気付いた方はいらっしゃるでしょうか。PHPをビルドしたときは、OSにインストールしてあるビルド済みreadlineをPHPにリンクしたので、ncursesを用意する必要がなかったのです。MySQLではOSにインストール済みのreadlineは使わず、常にMySQLに付属するreadlineを使ってビルドしますので、ncurses-develが必要になるのです。

 なお、MySQLにはlibeditというreadlineの互換ライブラリも付属しており、readlineとlibeditのどちらを使うか選択できるようになっています。readlineはライセンスがGPLであるため、再配布の際に自由を維持するための一定の制約があります。libeditは、非GPLの互換ライブラリを作る目的で開発されたものです。MySQLには非GPLの商用版もあるためか、GPLに依存しないlibeditを使う方が標準になっています。

 libaioは、非同期I/Oの機能を提供するライブラリです。より高速なディスクアクセスやネットワーキングのために必要であると考えればよいでしょう。

 ncursesとlibaioの開発用パッケージをインストールしたら、cmakeコマンドを再び実行します。一度cmakeを実行すると「CMakeCache.txt」というファイルが残ります。これは、cmake実行時の状態を記録したものです。cmakeを再び実行するときはこのファイルを削除してください。

$ rm CMakeCache.txt
$ cmake .

 これでエラーなくcmakeを実行できるようになったはずです。

外部ソフトウェアを揃えてやり直してみる

 エラーなくcmakeを実行できたら、次はmakeを実行します。前回、CMakeをビルドするところで触れましたが、単に「make」と入力しただけで実行すると、進行の度合いと、コンパイル対象のファイルだけがコマンドラインに現れます(図1)。これはCMakeを使って生成したMakefileの特徴です。

図1 引数に何も指定せずにmakeを実行したところ。進行状況をカラフルに表示する。 図1 引数に何も指定せずにmakeを実行したところ。進行状況をカラフルに表示する。クリックすると拡大

 この表示はカラフルで見やすいものの、ビルド時にどのようなコマンドを実行しているのかがまるで分からないので、ビルドのログとしては物足りないものとなっています。makeを実行するときに、「VERBOSE=1」を引数に指定すると、ビルド状況を詳細に表示するようになります(図2)。

図2 引数にVERBOSE=1を指定してmakeを実行したところ。ビルド作業の詳細が見えるようになる。 図2 引数にVERBOSE=1を指定してmakeを実行したところ。ビルド作業の詳細が見えるようになる。クリックすると拡大

 ApacheやPHPをビルドするときは、teeコマンドでログをファイルとして保存していました。それに合わせて、cmakeとmakeを実行するときも、ログをファイルとして保存するようにしましょう。

$ cmake . 2>&1 | tee cmake_log.txt
$ make VERBOSE=1 2>&1 | tee make_log.txt

 ビルドが完了したら「sudo make install」でインストールできますが、このままの状態では「/usr/local/mysql」以下にインストールされますので注意してください。

 次回は、インストール先の指定などの設定について解説します。

著者紹介

株式会社イメージズ・アンド・ワーズ
代表取締役
山口晴広(やまぐち はるひろ)


「仕事で使える魔法のLAMP」バックナンバー

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。