ククログ

株式会社クリアコード > ククログ > ノータブルコード13 - 複数の処理系やバージョンを考慮してライブラリーを検出できるようにする

ノータブルコード13 - 複数の処理系やバージョンを考慮してライブラリーを検出できるようにする

第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 をサポートしている実装であれば有効にできるように配慮されています。

以上、複数の処理系やバージョンを考慮してライブラリーを検出できるようにしているコードの紹介でした。