CMakeを使ってビルドをする
PHPのエクステンション開発と管理をする際に、configure&makeを使う代わりに、CMakeを使う方法を紹介します。CMake自身はPHPエクステンションをビルドするためだけに用意されたシステムではないので、非常に広範囲のことができますが、今回は、今までの例で作成してきたPHPのエクステンションをCMakeを使ってビルドする方法に限定し、説明を行います。
これまでのconfigure&makeを使う場合、開発上何が問題点となるでしょうか。
- ソースが管理されているディレクトリに大量の中間ファイルを作成するので、ソース管理を行う際に必要のないファイルを管理下に入れてしまう
- ソースを編集する際にも余計なファイルがあるので、そのファイルを見つける際にもストレスが発生する
しかし、CMakeでビルドする際は、余計なファイルをソース上に展開せずにビルドができるので非常に都合がよいのです。
CMakeを使っての開発では、以下のような流れで開発をしていきます。
- CMakeLists.txtファイルを編集(config.m4の編集に相当します)
- ビルド用のフォルダを作成
- cmakeコマンドを実行(phpzieとconfigureを行っている操作に相当します)
- makeを実行
このように最初の行程はあまり変わらなく見えますが、CMakeLists.txtファイルを編集しても、大抵は再度makeをすれば問題ありませんので開発がスムーズに行えます。また、config.m4ファイルを使用する場合に比べてその内容もシンプルなので、一度覚えてしまえば、より開発をスムーズに行えることでしょう。
CMakeのインストール
CMakeはyumを使って簡単にインストールできますので、その方法を紹介します。
# yum install cmake
以上で終了です。MySQLなどをソースからインストールしている場合には、すでにシステム上にCMakeがインストールされている場合もあります。最近はライブラリのビルド方法としてCMakeを利用するケースも増えていますので、さまざまなライブラリをビルドする必要がある場合には、CMakeのビルドシステムについても知っておいて損はないでしょう。
CMakeTexts.txtの作成
ほかのライブラリに依存しないシンプルな形式のCMakeLists.txtファイルを紹介します。この形が基本になるので、あとはこの形式をもとに変更をしていけば、より複雑なプロジェクトにも対応が可能です。
下のリストはerrchkという名称でエクステンションを作成するときのサンプルです。これだけの記述で済みますので、非常に見通しが良いことが分かると思います。
cmake_minimum_required(VERSION 2.6) // ……(1) PROJECT(errchk C) // ……(2) include(FindPHP5.cmake) // ……(3) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) // ……(4) add_definitions(-DPHP_ATOM_INC -DHAVE_CONFIG_H ) // ……(5) INCLUDE_DIRECTORIES(${PHP5_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}) // ……(6) ADD_LIBRARY(errchk MODULE errchk.c) // ……(7) SET_TARGET_PROPERTIES(errchk PROPERTIES PREFIX "") // ……(8)
FindPHP5.cmakeファイルはインターネット上を検索するといろいろと見つかりますが、今回はサンプルコードに付属しているものを利用する前提です。
- CMakeLists.txtファイルのバージョンを指定しています。固定でほぼ問題ありません。
- このプロジェクトの名前と使用言語であるC言語を指定しています。ここはプロジェクト名だけが変えれば問題ありません。
- FindPHP5.cmakeファイルはPHPのビルドする際の基本的な設定を行います。CMakeではデフォルトでPHP5用の設定がないので、そのファイルを用意する必要があります。
- config.hというファイルがコンパイル時に必要になるのですが、通常はconfigureを行った際に作成されるものです。そこで、一度だけconfigureを行い、そのファイルをconfig.h.cmakeという名前にリネームしてそのファイルを利用するように指定します。
- ビルド時のオプションを指定します。こちらも通常は固定で問題ありません。
- コンパイル時にincludeとして指定するファイルのパスを指定します。こちらも通常は固定で問題ありません。
- PHPのエクステンションsoを作るための指定です。モジュール名と、エクステンションで使用するC言語のソースを指定します。
- 通常はlib***.soというファイル名でモジュールを作成するのですが、この指定でlibという接頭辞をなくしています。
CMakeでのビルド作業
CMakeでビルドする際、通常はビルド用のディレクトリを作成するが一般的です。CMakeはビルドに必要な中間ファイルを含めて、そのディレクトリに配下に作成するのであとで削除するのも非常に簡単になります。これが、Automake&Autoconfを用いた既存のPHPのビルド方法と大きく違うところで、開発者にとっては非常に助かります。
実際にビルドをしてみます。
$ export PATH=/usr/local/php-ext/bin:$PATH // ……(1) $ cd errchk // ……(2) $ mkdir tmp $ cd tmp $ cmake .. // ……(3) $ make
(1)は、php-configというプログラムを見つけるためにサーチパスを設定しています。先のFindPHP5.cmakeというファイルは、php-configプログラムを使ってビルドする環境を自動的に設定します。従って、ビルドしたい環境を指定するためにもっとも最初に意図したphp-configファイルが見つかるように指定しています。(2)では実際にビルドをするためのディレクトリを作成します。(3)で、1つ上のディレクトリにあるCMakeLists.txtを使ってビルドします。ビルドに成功したら同じディレクトリにerrchk.soが生成されます。
最近のPHPのエクステンションの動向
PHPのエクステンションは、多くが既存のライブラリのブリッジとして広まってきました。また、これからもその動向は変わらないと思います。しかしながら、PhalconといったZend FrameworkやCakePHPのようなフレームワークの領域までPHPのエクステンションが現れました。そのキャッチコピーには、速度とリソース消費量に利点があると記述されています。PHPのエクステンションを記述していると、PHPとC言語の行き来で非常にたくさんのメモリコピーをしていることは実感します。C言語側で多くの処理ができるようになれば、それらのメモリは必要なくなるのでリソース消費量が少なくなることは納得できます。
Phalconでは、REST形式でのリクエストに特化したMicroApplicationというフレームワークが用意されており、AjaxやHTML5が普及していく中、PHPもHTMLだけではなくjsonを取得するためのシンプルで軽量なリクエストを大量に受ける必要がでてきた結果だと思います。そのため、このようなPHPのエクステンション形式のフレームワークが需要が出てきているのだと思います。
最後に
今回で、PHPエクステンション作成の連載は終了ですが、PHPのエクステンションはマニュアルが十分にない中で、どこから手を付けていいのか分からないケースが多々あります。そのような場合に、本連載がその手助けになれば筆者としても大変喜ばしいことです。
また、最近ではスマートフォンの普及により、マルチプラットフォームでの開発の重要性が高くなってきました。そのような状況の中で、PHPのエンジニアがC言語を身近に感じてもらえる環境としても、エクステンションは非常によいきっかけとも思います。
なお、筆者はC言語で開発をする際に既存のネイティブライブラリの使い方などを調べる際に、そのライブラリの使い方が今1つ分からない場合、PHPのソースを見てライブラリの使い方を調べることもありました。このようなことができるのはPHPが大変普及しており、また、多くのライブラリをサポートしているからです。PHPのエクステンションが皆様の世界をより広めるきっかけになれば幸いです。