第13回目のノータブルコードでは、collectdをビルドするときに印象に残ったconfigure.ac
のコードを紹介します。
collectd
はサーバーの情報を収集するのに便利なフリーソフトウェアです。
プラグインを有効にすることで様々なシステム情報を収集できるようになっています。
プラグインをPerl、Python、Luaといったスクリプト言語で記述することもできます。
印象に残ったconfigure.ac
のコードは、Lua
を有効にしてビルドしようとしたときに気づいたものです。
collectd
では、Lua
の各種バージョンを自動検出するようにしています。
具体的には以下のバージョンを検出するようにしています。
-
Lua 5.3
-
Lua 5.2
-
Lua 5.1
実際にライブラリーを検出するのには、PKG_CHECK_MODULES
を使っています。
どれくらい頑張って検出しようとしているかというと、これぐらい頑張っています。
PKG_CHECK_MODULES([LUA], [lua],
[with_liblua="yes"],
[
PKG_CHECK_MODULES([LUA], [lua-5.3],
[with_liblua="yes"],
[
PKG_CHECK_MODULES([LUA], [lua5.3],
[with_liblua="yes"],
[
PKG_CHECK_MODULES([LUA], [lua53],
[with_liblua="yes"],
[
PKG_CHECK_MODULES([LUA], [lua-5.2],
[with_liblua="yes"],
[
PKG_CHECK_MODULES([LUA], [lua5.2],
[with_liblua="yes"],
[
PKG_CHECK_MODULES([LUA], [lua52],
[with_liblua="yes"],
[
PKG_CHECK_MODULES([LUA], [lua-5.1],
[with_liblua="yes"],
[
PKG_CHECK_MODULES([LUA], [lua5.1],
[with_liblua="yes"],
[
PKG_CHECK_MODULES([LUA], [lua51],
[with_liblua="yes"],
[with_liblua="no (pkg-config cannot find liblua)"]
)
]
)
]
)
]
)
]
)
]
)
]
)
]
)
]
)
]
)
Lua
には、JITコンパイラであるLuaJIT
という実装もあります。
上記のコード片では、LuaJIT
は自動的に検出できません。
しかし、次のように LIBLUA_PKG_CONFIG_NAME
を指定することでLuaJIT
を有効にできるようになっています。
# --with-liblua {{{
AC_ARG_VAR([LIBLUA_PKG_CONFIG_NAME], [Name of liblua used by pkg-config])
if test "x$LIBLUA_PKG_CONFIG_NAME" != "x"
then
PKG_CHECK_MODULES([LUA], [$LIBLUA_PKG_CONFIG_NAME],
[with_liblua="yes"],
[with_liblua="no"]
)
else
LuaJIT
の場合、.pc
ファイルが luajit.pc
なので、LIBLUA_PKG_CONFIG_NAME=luajit
を指定してconfigure
を実行すればよいです。
$ ./configure LIBLUA_PKG_CONFIG_NAME=luajit
このようにして、configure.ac
で明示的に自動検出するようになっていなくても、pkg-config
をサポートしている実装であれば有効にできるように配慮されています。
以上、複数の処理系やバージョンを考慮してライブラリーを検出できるようにしているコードの紹介でした。